DS18B20温度报警器设计与实现(源码分享)

版权申诉
5星 · 超过95%的资源 18 下载量 146 浏览量 更新于2024-11-22 11 收藏 1.8MB ZIP 举报
资源摘要信息:"本资源包含了使用DS18B20数字温度传感器制作的温度报警器的完整源码及设计文档。该报警器可以通过键盘模块调整温度测量范围在0到50摄氏度之间,并具有+/-0.5摄氏度的测量精度。系统集成了键盘显示模块,用户可以设置温度上限和下限的报警值,并利用DS18B20传感器的越限报警功能来识别温度是否超出预设范围。该报警器具备声光报警功能,分为三级报警模式,当温度接近设定的越限值10%时,发出轻柔报警;达到设定报警值时,发出标准报警;超过越限值10%时,发出急促报警,报警方式可以采用蜂鸣器声音提示。温度的显示可以使用IIC接口的OLED显示模块或位段式LED,显示精度为2位整数和1位小数。" 知识点详细说明: 1. DS18B20数字温度传感器: - DS18B20是一款数字温度传感器,可提供9位到12位的摄氏温度测量值。 - 该传感器通过单总线(One-Wire)通信协议与微控制器连接,使用方便。 - DS18B20具有用户可配置的非挥发性报警触发器,可以用于越限报警功能。 - 它具有高精度,适合于精确的温度测量和控制应用。 2. 51单片机: - 51单片机是一种基于Intel 8051微控制器架构的单片机,广泛用于教学和工业控制。 - 它通常具有固定的程序存储器、数据存储器以及I/O端口,适用于各种嵌入式系统设计。 3. 温度报警器系统设计: - 系统设计包括温度测量、显示、用户输入和报警输出四个主要部分。 - 温度测量部分利用DS18B20传感器进行实时温度采集。 - 用户输入部分通常包括一个键盘模块,使用户能够设置温度的报警阈值。 - 显示部分用于向用户显示当前温度和报警状态,可以使用OLED或LED显示器。 - 报警输出部分通过声音和光线的变化来通知用户温度是否越限。 4. 软件编程: - main.c 文件包含整个温度报警器系统的主程序入口,负责系统流程的控制。 - temp.c 文件实现与DS18B20传感器通信的温度读取和处理逻辑。 - temp.h 文件提供DS18B20相关函数的声明,用于在main.c中调用。 - 数字温度计实验报告.docx 文档详细记录了温度报警器的设计过程、实验数据和测试结果。 5. 硬件接口: - IIC接口:一种多主机的串行通信总线,用于连接低速外围设备到主板、嵌入式系统或者手机。 - OLED显示模块:基于有机发光二极管的显示技术,支持字符和图形显示,具有低功耗特性。 - 位段式LED:用于显示数字和一些简单信息的显示设备,通常由多个LED组成,以显示位数。 6. 报警模式: - 声光报警:结合声音和光线的报警方式,用于提醒用户当前温度情况。 - 三级报警:根据温度越限的不同程度,分为轻柔、标准和急促三级,以便用户采取不同的响应措施。 以上知识点涵盖了本资源的核心内容,对于理解并实现基于DS18B20的温度报警器设计至关重要。
2015-06-06 上传
代码:#include //用AT89C51时就用这个头文件 //#include //用华邦W78E58B时必须用这个头文件 #include #include #include #include #include #include #include "LCD1602.h" ////液晶显示头文件 //sbit DQ = P3^4; //定义DQ引脚为P3.4 sbit mode=P1^3; sbit add=P1^4; sbit sub=P1^5; sbit power=P1^7; unsigned char TH=50,TL=20; unsigned char t[2],*pt; //用来存放温度值,测温程序就是通过这个数组与主函数通信的 unsigned char TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'}; //显示实时温度,上电时显示+125.00C unsigned char TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20, 0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'}; //显示温度上下限,上电时显示TH:+125 TL:+124C unsigned char code dotcode[4]={0,25,50,75}; /***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法******* 再将表值分离出十位和个位后送到十分位和百分位********************/ void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据 { if(TH>0x7F) //判断正负,如果为负温,将其转化为其绝对值 { TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码 TH=~TH; TH++; } else TempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码 if(TL>0x7f) { TempBuffer0[11]=0x2d; //0x2d为"-"的ASCII码 TL=~TL+1; } else TempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码 TempBuffer0[4]=TH/100+0x30; //分离出TH的百十个位 if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐 TempBuffer0[5]=(TH0)/10+0x30; //分离出十位 TempBuffer0[6]=(TH0)+0x30; //分离出个位 TempBuffer0[12]=TL/100+0x30; //分离出TL的百十个位 if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐 TempBuffer0[13]=(TL0)/10+0x30; //分离出十位 TempBuffer0[14]=(TL0)+0x30; //分离出个位 } void covert1(void) //将温度转换为LCD显示的数据 { unsigned char x=0x00,y=0x00; t[0]=*pt; pt++; t[1]=*pt; if(t[1]>0x07) //判断正负温度 { TempBuffer1[0]=0x2d; //0x2d为"-"的ASCII码 t[1]=~t[1]; /*下面几句把负数的补码*/ t[0]=~t[0]; /* 换算成绝对值*********/ x=t[0]+1; /***********************/ t[0]=x; /***********************/ if(x>255) /**********************/ t[1]++; /*********************/ } else TempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码 t[1]<>=4; //右移4位 x=x&0x0f; //和前面两句就是取出t[0]的高四位 t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节 if(t[1]>TH) { power=0; } if(t[1]>=2; //左移两位,以便查表 x=t[0]; y=dotcode[x]; //查表换算成实际的小数 TempBuffer1[5]=y/10+0x30; //分离出十分位 TempBuffer1[6]=y+0x30; //分离出百分位 } void delay(unsigned char i) { while(i--); } main() { bit flag1=0; bit flag2=0; //下一步扩展时可能通过这两个变量,调节上下限 power=0; //测温函数返回这个数组的头地址 while(1) { if(mode==0) { if(add==1) { flag1=0; } if(add==0&&flag1==0) { TL++; flag1=1; } if(sub==1) { flag2=0; } if(sub==0&&flag2==0&&TL>20) { TL--; flag2=1; } } if(mode==1) { if(add==1) { flag1=0; } if(add==0&&flag1==0&&TH<50) { TH++; flag1=1; } if(sub==1) { flag2=0; } if(sub==0&&flag2==0) { TH--; flag2=1; } } pt=ReadTemperature(TH,TL,0x3f); //上限温度-22,下限-24,分辨率10位,也就是0.25C //读取温度,温度值存放在一个两个字节的数组中, delay(100); covert1(); covert0(TH,TL); LCD_Initial(); //第一个参数列号,第二个为行号,为0表示第一行 //为1表示第二行,第三个参数为显示数据的首地址 LCD_Print(0,0,TempBuffer0); LCD_Print(0,1,"Cur_Temp:"); LCD_Print(10,1,TempBuffer1); } }