51单片机实现温湿度监测与定时报警系统设计

版权申诉
5星 · 超过95%的资源 17 下载量 101 浏览量 更新于2024-10-23 38 收藏 46KB ZIP 举报
资源摘要信息:"基于51单片机的温湿度监测+定时报警系统源码分析" 1. 系统概述 本系统旨在利用51系列单片机(STC89C51/STC89C52)开发一个集温湿度监测、时间显示、定时报警功能于一体的监测系统。系统使用DS1302实时时钟模块来保持时间的准确性和实时显示,使用DHT11传感器模块来监测环境的温度和湿度,通过LCD1602显示屏展示温湿度数据和时间等信息,并允许用户通过按键设置定时报警时间。存储设备采用24C02 ROM存储器,确保即便在断电情况下,用户之前设定的报警时间能够得到保留。 2. 核心模块介绍 - DS1302模块:DS1302是一款串行实时时钟芯片,与单片机通过三个线(时钟线、数据线、复位线)进行通信。它内置电源,即使外部断电,内置电源也能维持时钟的运行。DS1302能够提供秒、分、时、日、月、年等时间信息,并且可以对闰年进行自动调整。 - DHT11传感器:DHT11是一款含有已校准数字信号输出的温湿度传感器。它应用专用的数字模块采集技术和温湿度测量技术,确保产品具有高可靠性和卓越的长期稳定性。DHT11可以测量温度范围为0~50℃,湿度范围为20~90% RH,带有校准的数字信号输出。 - LCD1602显示屏:LCD1602是一种常见的字符型液晶显示屏,能够显示16个字符,共2行。在本系统中,LCD1602用于显示系统时间、温湿度数据、定时报警信息等。 - 24C02 EEPROM:24C02是一种电可擦可编程只读存储器,拥有2Kbit(即256字节)的存储空间。在本系统中,24C02用于存储用户设置的定时报警时间。 3. 功能实现细节 - 时间显示:系统通过编程初始化DS1302,确保时间显示的准确性。时间信息通过LCD1602显示屏实时更新,让用户能够清晰地看到当前的日期和时间。 - 温湿度监测:系统通过DHT11模块不断监测当前环境的温度和湿度,并将这些数据通过LCD1602进行实时展示。 - 定时报警设置:用户可以通过按键来设置定时报警时间。系统将用户设定的报警时间存储在24C02中,即使断电后也能保持该设定不丢失,待下次上电时继续使用。 - 报警功能:当到达用户设定的定时报警时间时,系统通过单片机控制产生报警信号,提醒用户关注当前时间或温湿度变化。 4. 编程注意事项 - 硬件连接:在编程过程中,需要注意DS1302、DHT11、LCD1602和24C02模块的正确连接。例如,DS1302的SCLK、I/O、RST引脚要与单片机的对应端口相连,DHT11的数据线连接至单片机的某个I/O口,LCD1602的数据线和控制线也要连接至单片机的相应端口,24C02的SCL和SDA线连接至单片机的I2C总线接口。 - 中断处理:在进行定时报警功能的设计时,应使用定时器中断,以保证时间的准确性和系统的稳定性。 - 数据保存:定时报警时间的保存需要对24C02进行适当的读写操作,保存和读取数据需要按照其通信协议和时序进行。 - 用户交互:按键的设计需要考虑消抖,以确保用户输入的准确性和稳定性。此外,按键与LCD1602显示内容的关联逻辑需要清晰编写,以提升用户体验。 5. 技术应用和拓展 本系统所涉及的技术不仅仅限于监测和显示温湿度,其时间管理和数据存储方面的技术也可以拓展应用至其他类似的智能设备或物联网项目中。例如,可以在系统中增加温湿度数据的记录功能,将数据存储到更大的存储器中,实现历史数据的查看;也可以加入无线模块,将数据传输到云端或智能手机APP上,进一步拓展系统的功能。这些扩展不仅能够提升系统的实用性和便捷性,还能增加其在更多领域的应用可能。
2012-10-19 上传
#include #define uchar unsigned char #define uint unsigned int sbit led=P2^5; sbit wei=P2^7; sbit duan=P2^6; sbit DQ=P2^2; uchar mazhi_duan[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; uchar mazhi_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff}; void delayl(uint n) { uint i,j; for(i=n;i>0;i--) for(j=114;j>0;j--); } void delays(uchar i) { while(i--); } bit init_DS18B20() //DS8B20初始化 { bit x; DQ=1; //DQ复位 delays(8); DQ=0; //单片机将DQ拉低 delays(75); DQ=1; //拉高总线 delays(15); x=DQ; //延时过后 若x=0则初始化成功 若x=1则初始化失败 delays(5); return x; } void write_data(uchar dat) { uchar i,temp; temp=dat; DQ=1; for(i=0;i>=1; } } uchar read_data() { uchar i,dat; DQ=1; for(i=0;i>=1; DQ=1;//配置为输入 if(DQ) dat|=0x80; delays(4); } return dat; } uint readtemp() { uchar temph,templ; uint temp; float wendu; init_DS18B20(); write_data(0xcc);//跳过ROM write_data(0x44);//启动温度转换 //delayl(100); init_DS18B20(); write_data(0xcc);//跳过ROM write_data(0xBE);//读温度 //以下读温度,低八位在前 //高8位在后 templ=read_data(); temph=read_data(); temp = (temph<<8)|templ; wendu = temp*0.625+0.5;//温度扩大10倍,四舍五入 temp = wendu;//10倍温度 return temp; } void STC_init() { P1=0x00;//关闭led led=0; //锁存 wei=0; duan=0; } void display(uchar weil,uchar duanl,bit dp) { wei=1; P0=mazhi_wei[weil-1]; wei=0; duan=1; if(dp==1) P0=(mazhi_duan[duanl]|0x80); else P0=mazhi_duan[duanl]; duan=0; } void main() { uchar i; uint wendu; STC_init(); wendu=readtemp(); delayl(500); wendu=readtemp(); delayl(500); while(1) { wendu=readtemp(); for(i=0;i<80;i++) { display(1,wendu/100,0); delayl(3); display(2,wendu0/10,1); delayl(3); display(3,wendu,0); delayl(3); } } }