SHT11温度检测.1302实时时钟、1602_液晶显示.doc_第1页
SHT11温度检测.1302实时时钟、1602_液晶显示.doc_第2页
SHT11温度检测.1302实时时钟、1602_液晶显示.doc_第3页
SHT11温度检测.1302实时时钟、1602_液晶显示.doc_第4页
SHT11温度检测.1302实时时钟、1602_液晶显示.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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:;uchar 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;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_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; /*已修改*/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); /*已修改*/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);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);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;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)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 (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&num1=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);write_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_data0/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 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(key1=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_dat(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_datai=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+;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; /日期uchar 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)/往指定地址写数据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_();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=time_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;/星期 disp11=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,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&0x80)sht11_data=1;delay();elsesht11_data=0;delay();dat=dat1;sht11_sck=1;delay();sht11_sck=0;uchar sht11_receivebyte() /从sht11接收数据uchar i;uchar dat;sht11_sck=0;delay();for(i=0;i8;i+)sht11_sck=1;delay();dat=dat1;if(sht11_data)dat=dat|0x01;delay();elsedat=dat&0xfe;delay(); sht11_sck=0;delay();sht11_data=1; /释放数据总线return(dat);void sht11_answer() /:检测sht11的响应信号(在第九个时钟周期)sht11_sck=1;delay();while(sht11_data=1);sht11_sck=0;sht11_data=1;void mcu_answer() /单片机向sht11发送应答信号sht11_sck=0;delay();sht11_data=0;delay();sht11_sck=1;delay();sht11_sck=0;delay();sht11_data=1; /释放数据总线 这条指令非常重要 不加的话导致单片机不能读取低8位void sht11_write_register(uchar command ,uchar dat) /:向sht11的状态寄存器设置/command为reg_write 0x06写寄存器sht11_start();/dat为 设置sht11的功能 可以设置检测的数据位数sht11_sendbyte(command);sht11_answer();sht11_sendbyte(dat);sht11_answer();uint sht11_measure(uchar command,uchar time) /设置sht11检测功能,并返回相应的检测结果uint dat=0;uchar data_high,data_low;sht11_start();sht11_sendby

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论