2022年DSB温度传感器电路设计 .pdf
关键词 :单片机 AT89C51;温度传感器 DS18B20;数码显示实现功能:可以测得的温度范围0125度并显示一位小数有报警功能当 15 度T30 度时红灯亮T15 度时绿灯亮有调整上下限温度功能按下相应按钮可以调整报警温度范围元件清单AT89C51 单片机芯片1 块DS18B20 温度传感器1 个4 位共阳极数码管1 块红色发光二极管1 个绿色发光二极管1 个八分之一 W 1K 电阻10 个1W 4.7K 电阻1 个弹性开关3 个名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 本方案设计的系统由单片机系统、数字温度传感器、LED 显示模块、按键控制模块、温度报警模块组成,其总体架构如下图1. 图 1 系统总体方框图DS18B20性能1 独特的单线接口仅需一个端口引脚进行通信单片机测温电路按键输入电路时钟、复位电路驱动电路显示电路报警电路名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 2 简单的多点分布应用3 无需外部器件4 可通过数据线供电5 零待机功耗6 测温范围 -55+125,以 0.5 递增7可编程的分辨率为 912位, 对应的可分辨温度分别为0.5 、0.25 、0.125和 0.06258 温度数字量转换时间200ms ,12 位分辨率时最多在750ms内把温度转换为数字9 应用包括温度控制、工业系统、消费品、温度计和任何热感测系统10 负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作。DS18B20外形及引脚说明图 3 DS18B20外形及引脚GND :地名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - DQ :单线运用的数据输入 / 输出引脚VD :可选的电源引脚存储在 18B20 的两个 8 比特的 RAM 中,二进制中的前面5 位是符号位,如果测得的温度大于0, 这 5 位为 0,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于0,这 5 位为 1,测到的数值需要取反加1 再乘于 0.0625 即可得到实际温度。 例如+125的数字输出为07D0H ,实际温度 =07D0H*0.0625=2000*0.0625=125。例如 -55的数字输出为FC90H,则应先将11 位数据位取反加1得 370H(符号位不变,也不作运算),实际温度 =370H*0.0625=880*0.0625=55。可见其中低四位为小数位。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - DS18B20温度数据表AT89C51 AT89C51 单片机 Atmel 公司的生产的AT89C51 单片机是一种低功耗/低电压、高性能的8 位单片机,内部除CPU 外,还包括 128 字节 RAM ,4 个 8 位并行 I/O 口,5 个中断优先级, 2 层中断嵌套中断,2 个 16 位可编程定时计数器,片内集成4K 字节可改变程序Flash存储器,具有低功耗,速度快,程序擦写方便等优点,完全满足本系统设计需要。单片机P22 口作为 ADC0809 转换数据的输入端。 P0 的输出信号作为数码管的显示, P2.4P2.7则作为个数码管的位选信号控制, P20,P21,作为报警装置的输出。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51R91kR101kR111kR121kR131kR141kR151kR161k25.0DQ2VCC3GND1U2DS18B20D1LED-REDR14.7kR21KD2LED-GREENR31k仿真图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 源程序#include #define uint unsigned int #define uchar unsigned char /宏定义sbit p2_4=P24; sbit p2_5=P25; sbit p2_6=P26; sbit dp=P07; sbit p2_7=P27; sbit DQ=P22; /定义 DS18B20 总线 I/O sbit SET=P31; /定义选择调整报警温度上限和下限(1 为上限,0 为上限)/*P3.2 和 P3.3为调整温度报警增加键和减少键*/ sbit HONGDENG=P20; sbit LVDENG=P21; /定义亮灯signed char m; /温度值全局变量bit sign=0; /外部中断状态标志signed char shangxian=30; /上限报警温度,默认值为30 signed char xiaxian=15; /下限报警温度,默认值为15 uchar code LEDData=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff,0 xbf; /* 延时子程序 */ void Delay(uint i) while( i- ); /* 初始化 DS18B20*/ void Init_DS18B20(void) unsigned char x=0; DQ=1; Delay(8); /稍作延时DQ=0; /单片机将 DQ 拉低Delay(80); /精确延时,大于480us DQ=1; /拉高总线Delay(14); x=DQ; /稍作延时后如果 X=0 则初始化成功, X=1 则初始化失败Delay(20); /* 读一个字节 */ unsigned char ReadOneChar(void) unsigned char i=0; unsigned char dat=0; for (i=8;i0;i-) DQ=0; /给脉冲信号dat=1; DQ=1; /给脉冲信号名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - if(DQ) dat|=0 x80; Delay(4); return(dat); /* 写一个字节 */ void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ=0; DQ=dat&0 x01; Delay(5); DQ=1; dat=1; void Tmpchange(void) /发送温度转换命令 Init_DS18B20(); WriteOneChar(0 xCC); /跳过读序号列号的操作WriteOneChar(0 x44); /启动温度转换 /* 读取温度 */ unsigned int ReadTemperature(void) unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Tmpchange(); Init_DS18B20(); WriteOneChar(0 xCC); /跳过读序号列号的操作WriteOneChar(0 xBE); /读取温度寄存器a=ReadOneChar(); /读低 8 位b=ReadOneChar(); /读高 8 位t=b; tshangxian ) HONGDENG=1; / 温度高于范围红灯亮else HONGDENG=0; if(mxiaxian) LVDENG=1; /温度低于范围绿灯亮else LVDENG=0; p2_4=0;p2_5=0;p2_6=0;p2_7=0; P0 =LEDDatad; /显示小数点后一位p2_4=1;p2_5=0;p2_6=0;p2_7=0; Delay(300); p2_4=0;p2_5=0;p2_6=0;p2_7=0; /显示个位P0 =LEDDatac; dp=0; /显示小数点p2_4=0;p2_5=1;p2_6=0;p2_7=0; Delay(300); p2_4=0;p2_5=0;p2_6=0;p2_7=0; P0 =LEDDatab; /显示十位p2_4=0;p2_5=0;p2_6=1;p2_7=0; Delay(300); p2_4=0;p2_5=0;p2_6=0;p2_7=0; P0 =LEDDataa; /显示百位p2_4=0;p2_5=0;p2_6=0;p2_7=1; Delay(300); p2_4=0;p2_5=0;p2_6=0;p2_7=0; /关闭显示disptiaozheng() uchar f,g,j,k; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - f=shangxian/10; g=shangxian%10; j=xiaxian/10; k=xiaxian%10; p2_4=0;p2_5=0;p2_6=0;p2_7=0; P0 =0 xc0; /显示 0 p2_4=1;p2_5=0;p2_6=0;p2_7=0; Delay(200); p2_4=0;p2_5=0;p2_6=0;p2_7=0; P0 =0 xc0; /显示 0 p2_4=0;p2_5=1;p2_6=0;p2_7=0; Delay(200); p2_4=0;p2_5=0;p2_6=0;p2_7=0; if(SET=1) P0 =LEDDatag; dp=0; /显示上限温度个位 else P0 =LEDDatak; dp=0; p2_4=0;p2_5=0;p2_6=1;p2_7=0; Delay(200); p2_4=0;p2_5=0;p2_6=0;p2_7=0; if(SET=1) P0 =LEDDataf; /显示上限温度十位else if(f=0) P0=0 x00; /不显示下限温度十位else P0 =LEDDataj; /显示下限温度十位 p2_4=0;p2_5=0;p2_6=0;p2_7=1; Delay(200); p2_4=0;p2_5=0;p2_6=0;p2_7=0; / 关闭显示Delay(20); /* 外部中断 0 服务程序 */ void int0(void) interrupt 0 EX0=0; /关外部中断 0 sign=1; if(SET=1) shangxian+; else xiaxian+; Delay(500); EX0=1; /* 外部中断 1 服务程序 */ void int1(void) interrupt 2 EX1=0; / 关外部中断 1 sign=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - if(SET=1) shangxian-; else xiaxian-; Delay(500); EX1=1; /* 主函数 */ void main(void) uint z; IT0=1; IT1=1; EX0=1; EX1=1; EA=1; ReadTemperature(); HONGDENG=0; LVDENG=0 ; for(z=0;z100;z+) Disp_init(); while(1) Disp_Temperature(); if(sign=1) for(z=0;z300;z+) disptiaozheng(); sign=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -