DS18B20温度传感器电路设计(参考)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关键词:单片机AT89C51;温度传感器DS18B20;数码显示
实现功能:可以测得的温度范围0~125度并显示一位小数
有报警功能当15度 (默认上限温度为30 下限温度为15) 当T>30度时红灯亮 T<15度时绿灯亮 有调整上下限温度功能按下相应按钮可以调整报警温度范围 元件清单 AT89C51单片机芯片1块 DS18B20温度传感器1个 4位共阳极数码管1块 红色发光二极管1个 绿色发光二极管1个 八分之一W 1K电阻10个 1W 4.7K电阻1个 弹性开关3个 本方案设计的系统由单片机系统、数字温度传感器、LED显示模块、按键控制模块、温度报警模块组成,其总体架构如下图1. 图1 系统总体方框图 DS18B20性能 1独特的单线接口仅需一个端口引脚进行通信 2简单的多点分布应用 3无需外部器件 4可通过数据线供电 5零待机功耗 6测温范围-55~+125℃,以0.5℃递增 7可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、 0.25℃、0.125℃和0.0625℃ 8温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字 9应用包括温度控制、工业系统、消费品、温度计和任何热感 测系统 10负压特性:电源极性接反时,传感器不会因发热而烧毁, 但不能正常工作。 DS18B20外形及引脚说明 图3 DS18B20外形及引脚 GND:地 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℃。 可见其中低四位为小数位。 DS18B20温度数据表 AT89C51 AT89C51单片机Atmel公司的生产的AT89C51单片机是一种低功耗/低电压、高性能的8位单片机,内部除CPU外,还包括128字节RAM,4个8位并行I/O口,5个中断优先级,2层中断嵌套中断,2个16位可编程定时计数器,片内集成4K字节可改变程序Flash存储器,具有低功耗,速度快,程序擦写方便等优点,完全满足本系统设计需要。单片机P2^2口作为ADC0809转换数据的输入端。P0的输出信号作为数码管的显示,P2.4~P2.7则作为4个数码管的位选信号控制,P2^0,P2^1,作为报警装置的输出。 仿真图 源程序 #include #define uint unsigned int #define uchar unsigned char //宏定义 sbit p2_4=P2^4; sbit p2_5=P2^5; sbit p2_6=P2^6; sbit dp=P0^7; sbit p2_7=P2^7; sbit DQ=P2^2; //定义DS18B20总线I/O sbit SET=P3^1; //定义选择调整报警温度上限和下限(1为上限,0为上限) /****P3.2和P3.3为调整温度报警增加键和减少键******/ sbit HONGDENG=P2^0; sbit LVDENG=P2^1; //定义亮灯 signed char m; //温度值全局变量 bit sign=0; //外部中断状态标志 signed char shangxian=30; //上限报警温度,默认值为30 signed char xiaxian=15; //下限报警温度,默认值为15 uchar code LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; /*****延时子程序*****/ 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;i>0;i--){ DQ=0; //给脉冲信号 dat>>=1; DQ=1; //给脉冲信号