SHT11温度检测.1302实时时钟、1602液晶显示.doc

上传人:文库蛋蛋多 文档编号:4146782 上传时间:2023-04-07 格式:DOC 页数:23 大小:179KB
返回 下载 相关 举报
SHT11温度检测.1302实时时钟、1602液晶显示.doc_第1页
第1页 / 共23页
SHT11温度检测.1302实时时钟、1602液晶显示.doc_第2页
第2页 / 共23页
SHT11温度检测.1302实时时钟、1602液晶显示.doc_第3页
第3页 / 共23页
SHT11温度检测.1302实时时钟、1602液晶显示.doc_第4页
第4页 / 共23页
SHT11温度检测.1302实时时钟、1602液晶显示.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《SHT11温度检测.1302实时时钟、1602液晶显示.doc》由会员分享,可在线阅读,更多相关《SHT11温度检测.1302实时时钟、1602液晶显示.doc(23页珍藏版)》请在三一办公上搜索。

1、Main.c 文件#include #include #include 1302.h#include SHT11.h#include 1602.hsbit temp_H=P10;sbit temp_L=P11;sbit humi_H=P12;sbit humi_L=P13;sbit beep=P14;sbit key1=P32;sbit key2=P33;sbit key3=P34;sbit key4=P35;uchar code table=TEMP:HUMI:;uchar code table1= TEPH: HUIH:;uchar code table2= TEPL: HUIL:;uch

2、ar code table3=OK Warn;uchar TEMP,HUMI; /检测到的温度和湿度数据uchar temp_flagh=29;uchar humi_flagh=75; /温度湿度上限 uchar temp_flagl=25;uchar humi_flagl=65; /温度湿度下限 uchar num=0;/定时刷新变量uchar num1=0,num2=0,num3=0;/key1 key2 按键计数uchar flag=0; /显示时间标志uchar set_time=0; /设置时间标志void fengming(uchar x)/蜂蜜器uchar i,j;for(i=0

3、;i200;i+)beep=beep; for(j=0;jx;j+);void display_init()/显示TEMP:和HUMI:字符串uchar i;init();for(i=0;i5;i+)/显示 Time: 字样write_dat(table_time0i);write_com(0x80+0x40);/显示温湿度write_dat(T);write_dat(:);write_com(0x80+0x40+9);write_dat(H);write_dat(:);void display()uchar i;TEMP=SHT11_Convert_Tempeture14bit(SHT11_

4、Measure(0x03,55);/采集温度write_com(0x80+0x40+2); write_dat(TEMP/10+0);write_dat(TEMP%10+0);if(TEMP=temp_flagl) /判断温度是否在正常范围temp_H=1;temp_L=1;write_com(0x80+0x40+5);for(i=0;itemp_flagh)temp_H=0; /*已修改*/fengming(80);fengming(80);write_com(0x80+0x40+5);for(i=4;i8;i+)write_dat(table3i);else temp_L=0; /*已修改

5、*/fengming(80);fengming(80);write_com(0x80+0x40+5);for(i=4;i8;i+)write_dat(table3i);HUMI=SHT11_Convert_Humidity12bit(SHT11_Measure(0x05,210),TEMP);/采集湿度write_com(0x80+0x40+11); write_dat(HUMI/10+0);write_dat(HUMI%10+0);if(HUMI=humi_flagl) /判断湿度是否在正常范围humi_H=1;humi_L=1;write_com(0x80+0x40+13); /*已修改*

6、/write_dat( ); /*已修改*/for(i=0;ihumi_flagh)humi_H=0; /*已修改*/fengming(80);fengming(80);write_com(0x80+0x40+13);for(i=4;i8;i+)write_dat(table3i);else humi_L=0; /*已修改*/fengming(80);fengming(80);write_com(0x80+0x40+13);for(i=4;i8;i+)write_dat(table3i);void display1() /显示KEY1按下之后的数据uchar i;write_com(0x01)

7、;for(i=0;i6;i+)write_dat(table1i);write_dat(temp_flagh/10+0x30);write_dat(temp_flagh%10+0x30);for(i=6;i12;i+)write_dat(table1i);write_dat(humi_flagh/10+0x30);write_dat(humi_flagh%10+0x30);write_com(0x80+0x40);for(i=0;i6;i+)write_dat(table2i);write_dat(temp_flagl/10+0x30);write_dat(temp_flagl%10+0x30

8、);for(i=6;i12;i+)write_dat(table2i);write_dat(humi_flagl/10+0x30);write_dat(humi_flagl%10+0x30);void time() /时间处理uchar i;read_rtc(); /读取时间chuli_rtc(); /时间数据处理write_com(0x85); /显示温度for(i=0;i23)set_data4=0;write_dat(set_data4/10+0x30); write_dat(set_data4%10+0x30);if(num3=2) /设置分 set_data5=set_data5+1

9、;if(set_data559)set_data5=0;write_com(0x80+8);write_dat(set_data5/10+0x30); write_dat(set_data5%10+0x30);if(num3=3) /设置秒 set_data6=set_data6+1;if(set_data659)set_data6=0;write_com(0x80+11);write_dat(set_data6/10+0x30); write_dat(set_data6%10+0x30);if(num3=4)/设置年 set_data0=set_data0+1;if(set_data099)

10、set_data0=0;write_com(0x80+0x40+5);write_dat(set_data0/10+0x30); write_dat(set_data0%10+0x30);if(num3=5)/设置月 set_data2=set_data2+1;if(set_data212)set_data2=1;write_com(0x80+0x40+8);write_dat(set_data2/10+0x30); write_dat(set_data2%10+0x30);if(num3=6)/设置日 按照月份分为29,30,31天 set_data3=set_data3+1;switch

11、(set_data2)case 1:case 3:case 5:case 7:case 8:case 10: case 12: if(set_data331) set_data3=1;break;case 4:case 6:case 9:case 11: if(set_data330) set_data3=1;break;case 2: if(set_data329) set_data3=1;break;write_com(0x80+0x40+11);write_dat(set_data3/10+0x30); write_dat(set_data3%10+0x30);if(key4=0&num

12、1=2)while(key4=0);write_com(0x06);write_com(0x0c);set_time=1;/时间被设置标志位置1if(num3=1)/设置时write_com(0x80+5); set_data4=set_data4-1;if(set_data40)set_data4=23;write_dat(set_data4/10+0x30); write_dat(set_data4%10+0x30);if(num3=2) /设置分 set_data5=set_data5-1;if(set_data50)set_data5=59;write_com(0x80+8);writ

13、e_dat(set_data5/10+0x30); write_dat(set_data5%10+0x30);if(num3=3) /设置秒 set_data6=set_data6-1;if(set_data60)set_data6=59;write_com(0x80+11);write_dat(set_data6/10+0x30); write_dat(set_data6%10+0x30);if(num3=4)/设置年 set_data0=set_data0-1;if(set_data00)set_data0=99;write_com(0x80+0x40+5);write_dat(set_d

14、ata0/10+0x30); write_dat(set_data0%10+0x30);if(num3=5)/设置月 set_data2=set_data2-1;if(set_data21)set_data2=12;write_com(0x80+0x40+8);write_dat(set_data2/10+0x30); write_dat(set_data2%10+0x30);if(num3=6)/设置日 按照月份分为29,30,31天 set_data3=set_data3-1;switch (set_data2)case 1:case 3:case 5:case 7:case 8:case

15、 10: case 12: if(set_data30) set_data3=31;break;case 4:case 6:case 9:case 11: if(set_data30) set_data3=30;break;case 2: if(set_data30) set_data3=29;break;write_com(0x80+0x40+11);write_dat(set_data3/10+0x30); write_dat(set_data3%10+0x30); void int0() interrupt 0 /外部中断检测KEY1键uchar i;if(key1=0)while(ke

16、y1=0);num1+;if(num1=1) TR0=0; display1(); flag=1;if(num1=2)write_com(0x01);flag=0;write_com(0x80); /第一行for(i=0;i5;i+) /设置显示时间Time字样write_dat(table_time0i);time();write_com(0x80+0x40); /第二行for(i=0;i5;i+)/设置显示日期Data字样write_dat(table_time1i);write_dat(disp10+0);write_dat(disp11+0);write_dat(-);write_da

17、t(disp13+0);write_dat(disp14+0);write_dat(-);write_dat(disp16+0);write_dat(disp17+0);if(num1=3) num1=0,num2=0,num3=0; flag=0; TR0=1; write_com(0x01); display_init(); if(set_time=1) /若时间或者日期被改变则将改变之后的时间日期重新写入1302 uchar i,j;for(i=0;i7;i+) /由于1302中的数值是16进制所以需要将数组中的时间日期转化为16进制j=set_datai/10; /取数组十位set_d

18、atai=set_datai%10; /取数组个位set_datai=set_datai+j*16;/将个位、十位放在一起拼成16进制;write_ds1302(0x8e,0x00); /关闭写保护for(i=0;i7;i+)write_ds1302(write_datai,set_datai); /将新的时间日期写到1302对应的地址中后 即可实现日期的修改write_ds1302(0x8e,0x80); /打开写保? void init_TR0() interrupt 1 /定时器0 刷新显示TH0=(65536-50000)/256;TL0=(65536-50000)%256;num+;

19、if(num=8) /num值越大刷新越慢 越小刷新越快 过小会导致显示不出数据 num=0;display();1302.H 文件#define uint unsigned int#define uchar unsigned charsbit sck = P24; /*实时时钟时钟线引脚 */sbit io = P25; /*实时时钟数据线引脚 */sbit rst = P23; /*实时时钟复位线引脚 */uchar code table_time0=Time ;uchar code table_time1=date ;uchar disp8; /时间uchar disp18; /日期uc

20、har disp21;uchar time_data7=13,7,4,8,0,31,0;uchar write_data7=0x8c,0x8a,0x88,0x86,0x84,0x82,0x80;/DS1302年周月日时分秒寄存器地址uchar read_data7=0x8d,0x8b,0x89,0x87,0x85,0x83,0x81;/年星期月日时分秒char set_data7;void write_ds1302_byte(uchar datt)/1302写字节uchar i;for(i=0;i=1;sck=1;void write_ds1302(uchar add,uchar dat)/往

21、指定地址写数据rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);write_ds1302_byte(dat);rst=0;_nop_();sck=1;io=1;uchar read_ds1302(uchar ad) /读指定地址的数据uchar i,dat;rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(ad);for(i=0;i1;sck=0;if(io)dat=dat|0x80;sck=1;rst=0;_nop_();sck=0;_nop_

22、();io=1;sck=1;return (dat);void chuli_rtc(void) disp7=time_data6%16;/秒 disp6=time_data6/16; set_data6=time_data6/16*10+time_data6%16; disp5=0x0a; disp4=time_data5%16; disp3=time_data5/16; set_data5=time_data5/16*10+time_data5%16; /分 disp2=0x0a; disp1=time_data4%16; disp0=time_data4/16; set_data4=tim

23、e_data4/16*10+time_data4%16; /时 disp17=time_data3%16; disp16=time_data3/16; set_data3=time_data3/16*10+time_data3%16; /日 disp14=time_data2%16; disp13=time_data2/16; set_data2=time_data2/16*10+time_data2%16; /月 disp21=time_data1%16; disp20=time_data1/16; set_data1=time_data1/16*10+time_data1%16;/星期 d

24、isp11=time_data0%16; disp10=time_data0/16; set_data0=time_data0/16*10+time_data0%16;/年void set_rtc(void) /设置初始时间uchar i,j;for(i=0;i7;i+)j=time_datai/10; /去数组十位time_datai=time_datai%10; /取数组个位time_datai=time_datai+j*16;/将个位、十位放在一起;write_ds1302(0x8e,0x00); /关闭写保护for(i=0;i7;i+)write_ds1302(write_datai,

25、time_datai);write_ds1302(0x8e,0x80); /打开写保护void read_rtc(void) /读时钟 uchar i; for(i=0;i7;i+) time_datai=read_ds1302(read_datai); Sht11.h 文件sbit SHT11_SCK=P26;sbit SHT11_DATA=P27 ;void delay(uint x)uchar i;while(x-)for(i=0;i0;i-)for(j=112;j0;j-);void SHT11_Start() /SHT11启动时序SHT11_SCK=1;SHT11_DATA=1;Delay();SHT11_DATA=0;Delay();SHT11_SCK=0;Delay();SHT11_SCK=1;Delay();SHT11_DATA=1;void SHT11_End() /当接收两个8byte数据后部接收CRC校验码SHT11_DATA=1;SHT11_SCK=1;Delay();SHT11_SCK=0;Delay();void SHT11_Sendbyte(uchar dat) /向SHT11发送8bite数据uchar i;SHT11_SCK=0; Delay();for(i=0;i8;i+)if(dat&0x8

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号