嵌入式设计与开发项目-DS18B20温度传感器程序设计
- 一、实现功能
- 二、根据功能实现代码
-
- 1、主文件main.c
- 2、DS18B20的头文件“ds18b20.h”
- 3、DS18B20的源文件“ds18b20.c”
- 三、实现功能过程的注意力和学习点
-
- 1、注意点
- 2.学习知识点

一、实现功能
二、根据功能实现代码
1、主文件main.c
#include"key.h" #include"led.h" #include"lcd.h" #include"stdio.h" #include"ds18b20.h" unsigned int uiDsb_Val; unsigned char ucSec , ucSec1; unsigned char pucStr[21]; unsigned long ulTick_ms; void DSB_Proc(void); int main(void) {
SysTick_Config(72000); //定时1ms(HCLK = 72MHz) KEY_Init(); LED_Init(); STM3210B_LCD_Init(); LCD_Clear(Blue); LCD_SetBackColor(Blue); LCD_SetTextColor(White);
ds18b20_init_x();
while(1)
{
LED_Disp(ucSec);
DSB_Proc();
}
}
void DSB_Proc(void)
{
if(ucSec != ucSec1)
{
ucSec1 = ucSec;
uiDsb_Val = dsp_read();
sprintf((char*)pucStr," Temp:%5.2fC",uiDsb_Val/16.0);
LCD_DisplayStringLine(Line5,pucStr);
}
}
//SysTick 中断处理程序
void SysTick_Handler(void)
{
ulTick_ms++;
if(ulTick_ms % 1000 ==0)
ucSec++;
}
主函数分析:❤️ ❤️ ❤️
- DS18B20返回的16位二进制数 代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。,将其转换为十进制数值之后,。
- 例如:除于16等同于右移4位;
2、DS18B20的头文件“ds18b20.h”
#ifndef __DS18B20_H
#define __DS18B20_H
#include "stm32f10x.h"
#define OW_DIR_OUT() mode_output1()
#define OW_DIR_IN() mode_input1()
#define OW_OUT_LOW() (GPIO_ResetBits(GPIOA,GPIO_Pin_6))
#define OW_GET_IN() (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6))
#define OW_SKIP_ROM 0xCC
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xBE
void ds18b20_init_x(void);
unsigned int dsp_read(void);
#endif
简要分析:❤️ ❤️
- 通过宏定义 把函数封装起来,可直接使用;
- 包含对于引脚初始化和获取温室数据的函数;
3、DS18B20的源文件“ds18b20.c”
#include "stm32f10x.h"
#include "ds18b20.h"
#define delay_us(X) delay((X)*72/5)
void delay(unsigned int n)
{
while(n--);
}
void ds18b20_init_x(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
/* Configure Ports */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//
void mode_input1(void )
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void mode_output1(void )
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//
uint8_t ow_reset(void)
{
uint8_t err;
OW_DIR_OUT(); // pull OW-Pin low for 480us
OW_OUT_LOW(); // disable internal pull-up (maybe on from parasite)
delay_us(400); //about 480us
// set Pin as input - wait for clients to pull low
OW_DIR_IN(); // input
delay_us(66);
err = OW_GET_IN(); // no presence detect
// nobody pulled to low, still high
// after a delay the clients should release the line
// and input-pin gets back to high due to pull-up-resistor
delay_us(480-66);
if( OW_GET_IN() == 0 ) // short circuit
err = 1;
return err;
}
uint8_t ow_bit_io( uint8_t b )
{
OW_DIR_OUT(); // drive bus low
OW_OUT_LOW();
delay_us(1); // Recovery-Time wuffwuff was 1
if ( b ) OW_DIR_IN(); // if bit is 1 set bus high (by ext. pull-up)
#define OW_CONF_DELAYOFFSET 5
delay_us(15-1-OW_CONF_DELAYOFFSET);
if( OW_GET_IN() == 0 ) b = 0; // sample at end of read-timeslot
delay_us(60-15);
OW_DIR_IN();
return b;
}
uint8_t ow_byte_wr( uint8_t b )
{
uint8_t i = 8, j;
do
{
j = ow_bit_io( b & 1 );
b >>= 1;
if( j ) b |= 0x80;
}
while( --i );
return b;
}
//
uint8_t ow_byte_rd( void )
{
return ow_byte_wr( 0xFF );
}
//获取DS18B20温度传感器
unsigned int dsp_read(void)
{
unsigned char th,tl;
ow_reset(); //复位
ow_byte_wr(0xCC); //跳过Rom
ow_byte_wr(0x44); //转换温度
ow_reset();
ow_byte_wr(0xCC);
ow_byte_wr(0xBE); //读暂存器
tl = ow_byte_wr(0xFF); //读温度值低8位
th = ow_byte_wr(0xFF); //读温度值高8位
return (th<<8) + tl;
}
简要分析:❤️ ❤️
- 延时函数us的函数的 * 参数需要添加括号();
- 初始化端口可参考蓝桥杯-嵌入式设计与开发项目-LED指示灯程序设计
- DS18B20内部电路和时序详细介绍可参考:DS18B20温度传感器原理详解及例程代码
- 操作步骤包括: → →
三、实现功能过程的注意与学习点
1、注意点
1.获取到的温度值需要,才能转换为正确地温度值;
2、学习的知识点
- ①获取到DS18B20温度的传感器的实时数据;
- ②根据ROM命令表、功能命令表进行获取寄存器的温度数据;
- ③熟悉DS18B20温度传感器在实战中的应用;
❤️ ❤️ ❤️ ❤️ ❤️ ❤️