SHT11溫度檢測.1302實時時鐘、1602液晶顯示_第1頁
SHT11溫度檢測.1302實時時鐘、1602液晶顯示_第2頁
SHT11溫度檢測.1302實時時鐘、1602液晶顯示_第3頁
SHT11溫度檢測.1302實時時鐘、1602液晶顯示_第4頁
SHT11溫度檢測.1302實時時鐘、1602液晶顯示_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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寫字節(jié)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;de

26、lay();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發(fā)送8bite數據uchar i;sht11_sck=0; delay();for(i=0;i8;i+)if(dat&0x80)sht11_data=1;delay();else

27、sht11_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 s

28、ht11_answer() /:檢測sht11的響應信號(在第九個時鐘周期)sht11_sck=1;delay();while(sht11_data=1);sht11_sck=0;sht11_data=1;void mcu_answer() /單片機向sht11發(fā)送應答信號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 com

29、mand ,uchar dat) /:向sht11的狀態(tài)寄存器設置/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. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論