DS18B20电子温度计设计与制作(含代码+仿真)

DS18B20电子温度计设计与制作

  • 一、制作要求
  • 二、温度传感器的物理原理
  • 三、设计结构框图
  • 四、Proteus 8 Professional仿真电路搭建
  • 五、相关管脚定义
  • 六、对DS18B20进行初始化
  • 七、读取温度部分
  • 八、功能设计
  • 报警设置
  • 独立键盘控制模块
  • 九、主函数部分
  • 十、最终成果展示
  • 一、制作要求

    测量范围为0℃~+100℃,测量精度为1℃,测量误差小于2℃,并利用数码管显示测量值。

    二、温度传感器的物理原理

    1.   1.随物体的热膨胀相对变化而引起的体积变化;
        2.蒸气压的温度变化;
        3.电极的温度变化;
        4.热电偶产生的电动势;
        5.光电效应;
        6.热点效应;
        7.介电常数;
        8.磁导率的温度变化;
        9.物质的变色、溶解;
       10.强性振动温度变化;
       11.热放射和热噪声;
      

    温度传感器按照敏感元件是否与被测量接触,温度传感器分为接触式和非接触式。

    1.接触式温度传感器
    常用热电阻:范围:-260~+850℃;精度:0.001℃
    管缆热电阻:范围: -20~+850℃;最高上限为1000℃;精度为0.5级
    陶瓷热电阻:范围:-200~+500℃;精度为0.3、0.15级
    超低温热电阻:两种碳电阻,可测量 -268.8~ 253℃ 272.9~ 272.99℃
    热敏电阻器:适于在高灵敏度的微小温度测量场合使用
    2.非接触式温度传感器
    辐射高温计:测量1000℃以上高温,分四种:光学高温计、比色高温计、辐射高温计和光电高温计
    光谱高温计
    超声波温度传感器
    激光温度传感器

    三、设计结构框图

    四、Proteus 8 Professional仿真电路搭建

    五、相关管脚定义

    #include<reg51.h> 
    
    unsigned char code segcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //共阴不带小数点0-9段码
    unsigned char code segcodeD[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //共阴带小数点0-9段码
    unsigned char code weixuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管对应的8位管脚
     
    sbit DQ=P2^2;           	//DS18B20选择位,将DQ位定义为P2.2引脚,读写口
    sbit Latch1=P2^7;  		  	//位锁存器定义为P2.7引脚
    sbit Latch2=P2^6;			//段锁存器定义P2.6引脚
    sbit Beep=P2^3;				//蜂鸣器定义P2.3引脚
    sbit LED_RED=P1^0;			//高温红灯定义P1.0引脚
    sbit LED_GREEN=P1^2;		//常温绿灯定义P1.2引脚
    sbit LED_BLUE=P1^3;			//低温蓝灯定义P1.3引脚
    sbit key1=P3^0;				//温度上下限切换控制定义P3.0引脚
    sbit key2=P3^1;				//键盘控制温度- 定义P3.1引脚
    sbit key3=P3^2;				//键盘控制温度+ 定义P3.2引脚
    bit fg=1;					//编译器在可寻址区分配的fg变量 
    bit flag=0;					//判断温度上下限切换标志位
    unsigned char TL=0;			//储存暂存器的温度低位	
    unsigned char TH=0;			//储存暂存器的温度高位	
    unsigned int sdata;			//储存温度
    unsigned char xiaoshu1;		//储存温度的小数第一位
    unsigned char xiaoshu2;		//储存温度的小数第二位
    unsigned char xiaoshu;		//存储温度的小数部分
    unsigned char HT=30;		//高温上限
    unsigned char LT=29;		//低温下限
    
    
    

    六、对DS18B20进行初始化

    初始化步骤
    (1)先将数据线置高电平1;
    (2)延时(该时间要求不是很严格,但是要尽可能短一点);
    (3)数据线拉到低电平0;
    (4)延时750μs(该时间范围可以在480~960 μs );
    (5)数据线拉到高电平1;
    (6)延时等待;
    (7)若CPU读到数据线上的低电平0后,还要进行延时,其延时
    的时间从发出高电平算起(第(5)步时间算起)最少要480 μs;
    (8)将数据线再次拉到高电平1后结束;

    初始化代码

    void Init_DS18B20(void) 
    {
    	unsigned int x=0;
    	DQ=1;								//置为高电平,DQ复位
    	delay(8);							//延时4ms
    	DQ=0;								//置为低电平
    	delay(80);							//延时60ms,大于480us(操作手册)
    	DQ=1;
    	delay(5);							//延时8ms
    	x=DQ;								//连续两次确保初始化成功,并判断x=0是否初始化成功,x=1则为失败
    	delay(20);							//延时4ms
    }
    /*读一个字节*/
    unsigned char ReadOneChar(void)
    {
    	unsigned char i=0; 
    	unsigned char dat=0; 
    	for(i=8;i>0;i--)
    	{
    		DQ=1;							//单片机信号
    		delay(1);						//单片机信号
    		DQ=0;							//单片机信号
    		dat>>=1; 						//dat的值右移动一位,dat的最高位写1,其他七位不变,单片机信号
    		DQ=1; 							//单片机信号
    		if(DQ)							//判断DS18B20是否被释放,DS18B20信号
    		dat|=0x80; 						//变量data的值与0x80做"或"运算,最高位1,其他位
    		delay(4);
    	}
    		return(dat);
    }
    
    /*写一个字节*/
    void WriteOneChar(unsigned char dat) 
    { 
      unsigned char i=0; 
      for(i=8;i>0;i--)
      {
       DQ=0; 
       DQ=dat&0x01; 					//与1按位运算,dat最低位为1时DQ总线为1,dat最低位为0时DQ总线为0 0x01=0000 0001=1
       delay(5); 
       DQ=1; 
       dat>>=1;							//dat的值右移动一位
      } 
      delay(4);							//延时4ms
    }
    
    

    七、读取温度部分

    读数据步骤
    (1)将数据线拉高到1;
    (2)延时2 μs;
    (3)将数据线拉低到0 ;
    (4)延时6 μs;
    (5)将数据线拉高到1;
    (6)延时4 μs;
    (7)读数据线的状态得到一个状态位,并进行数据处理;
    (8)延时30 μs;
    (9)重复(1)~(7)步骤,直到读取完一个字节;

    读取温度代码

    void ReadTemperature(void)
    {
    	Init_DS18B20();
    	WriteOneChar(0xcc);			//跳过读序号列号的操作
    	WriteOneChar(0x44);			//启动温度转换
    	delay(125);
    	Init_DS18B20();
    	WriteOneChar(0xcc);			//跳过读序号列号的操作
    	WriteOneChar(0xbe);			//启动温度转换
    	TL=ReadOneChar();			//读低8位
    	TH=ReadOneChar();			//读高8位
    	if(TH>0xf7)
    	{
    		TL=~TL+1;				//将右边的表达式按位取反+1,存放的是补码,符号位是负位,如果是8个0要做一次判断
    		TH=~TH;					//符号位是正位,不作运算
    		fg=0;
    	}
    		sdata = TL/16+TH*16;    
    		xiaoshu1 = (TL&0x0f)*10/16; 
    		xiaoshu2 = (TL&0x0f)*100/16%10;
    		xiaoshu=xiaoshu1*10+xiaoshu2;
    
    }
    

    八、功能设计

    报警设置

    实时对温度进行判读,当温度大于30度时,自动打开红色LED灯和蜂鸣器;当温度小于10度时,自动打开蓝色LED和蜂鸣器,常温状态下保持绿色LED灯显示。
    (*此处为查看红色、绿色和蓝色的LED灯亮起)

    独立键盘控制模块

    本实验采取三个独立键盘控制。第一个键盘为主控制键设置切换温度上下限+或-,第二个键盘为控制温度的下限,第三个键盘为控制温度的上限。当主控键按下第一次时,切换到温度上限控制,此时第二第三键盘钧控制低、高温度的限值+。当再次按下主控键时,则切换到温度的下限控制,此时第二第三键盘均为控制低、高温度的限值-。代码部分可以给定温度上下限的初始值。

    键盘代码部分

    void keycan()							
    {
    	if(key2==0)						//键盘key2按下
    	{
    		delay(10);					//延时消抖
    		while(key2==0);				//如果确认按下按键等待按键释放
    		if(flag==0)						
    		{
    			LT++;					//温度下限+
    		}
    		else
    		{
    			LT--;					//温度下限-
    		}
    	}
    }
    void keyscan()
    {
    	if(key3==0)						//键盘key3按下
    	{
    		delay(10);					//延时消抖
    		while(key3==0);				//如果确认按下按键等待按键释放
    		if(flag==0)					//判断现在为调节温度上限
    		{
    			HT++;					//温度上限+
    		}
    		else
    		{
    			HT--;					//温度上限-
    		}
    	}
    }
    
    

    九、主函数部分

    void main()
    {
    	while(1)
    	{
    		if(key1==0)					//键盘key1按下
    		{
    			delay(10);				//延时消抖
    			while(key1==0)			//如果确认按下按键等待按键释放
    				flag=~flag;			//取反
    		}
    		ReadTemperature();		    //调用读取
    		Led(sdata);					//显示温度
    		keycan();					//键盘key2温度下限控制
    		keyscan();					//键盘key3温度上限控制
    	if(sdata>HT)					//判断温度在高于上限时
    	{
    		Beep=0;						//蜂鸣器响起
    		LED_RED=0;					//红色LED灯亮起
    		LED_BLUE=1;					//蓝色LED灯关闭
    		LED_GREEN=1;				//绿色LED灯关闭
    		}
    	else if(sdata<LT)				//判断温度在低于下限时
    	{
    		Beep=0;						//蜂鸣器响起
    		LED_RED=1;					//红色LED灯亮起
    		LED_BLUE=0;					//蓝色LED灯亮起
    		LED_GREEN=1;				//绿色LED灯关闭
    	}
    	else							//常温下
    	{
    		Beep=1;						//蜂鸣器关闭
    		LED_RED=1;					//红色LED灯关闭
    		LED_BLUE=1;					//蓝色LED灯关闭
    		LED_GREEN=0;				//绿色LED灯亮起
    	}
    	}
    }
    

    十、最终成果展示

    DS18B20温度传感器自动启动完毕后,将自动获取并显示当前温度。

    物联沃分享整理
    物联沃-IOTWORD物联网 » DS18B20电子温度计设计与制作(含代码+仿真)

    发表评论