知方号

知方号

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

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

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

一、制作要求

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

二、温度传感器的物理原理 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 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);//延时4msDQ=0;//置为低电平delay(80);//延时60ms,大于480us(操作手册)DQ=1;delay(5);//延时8msx=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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。