基于51單片機(jī)SHT11溫濕度傳感器檢測程序
《基于51單片機(jī)SHT11溫濕度傳感器檢測程序》由會員分享,可在線閱讀,更多相關(guān)《基于51單片機(jī)SHT11溫濕度傳感器檢測程序(10頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
基于51單片機(jī)SHT11溫濕度傳感器檢測程序(含電路圖)
下面是原理圖:
下面是SHT11與MCU連接的典型電路:
下面是源代碼:
#include
2、d char #define noACK 0 #define ACK 1 #define STATUS_REG_W 0x06 #define STATUS_REG_R 0x07 #define MEASURE_TEMP 0x03 #define MEASURE_HUMI 0x05 #define RESET 0x1e enum{TEMP,HUMI}; typedefunion//定義共用同類型 { unsignedinti; floatf; } value; /*********************************************
3、*********** 位定義 ********************************************************/ sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit lcden=P2^2; sbit SCK = P1^0; sbit DATA = P1^1; /******************************************************** 變量定義 ********************************************************/ ucha
4、r table2[]="SHT11 溫濕度檢測"; uchar table3[]="溫度為: ℃"; uchar table4[]="濕度為:"; uchar table5[]="."; uchar wendu[6]; uchar shidu[6]; /******************************************************** 1ms延時函數(shù) ********************************************************/ voiddelay(intz) { intx,y; for(
5、x=z;x>0;x--) for(y=125;y>0;y--); } /******************************************************** 50us延時函數(shù) ********************************************************/ voiddelay_50us(uint t) { uint j; for(;t>0;t--) for(j=19;j>0;j--); } /*******************************************
6、************* 50ms延時函數(shù) ********************************************************/ voiddelay_50ms(uint t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } /******************************************************** 12864液晶寫指令 ********************************************************/
7、 voidwrite_12864com(uchar com) { lcdrs=0; delay_50us(1); P0=com; lcden=1; delay_50us(10); lcden=0; delay_50us(2); } /******************************************************** 12864液晶寫數(shù)據(jù) ********************************************************/ voidwrite_dat(uchar dat
8、) { lcdrs=1; lcdrw=0; delay_50us(1); P0=dat; lcden=1; delay_50us(10); lcden=0; delay_50us(2); } /******************************************************** 12864液晶初始化 ********************************************************/ voidinit12864lcd(void) { delay_50
9、ms(2); write_12864com(0x30); delay_50us(4); write_12864com(0x30); delay_50us(4); write_12864com(0x0f); delay_50us(4); write_12864com(0x01); delay_50us(240); write_12864com(0x06); delay_50us(10); write_12864com(0x0c); delay_50us(10); } /**********************
10、********************************** 12864液晶顯示函數(shù) ********************************************************/ voiddisplay1(void) { uchar i; write_12864com(0x80); for(i=0;i<18;i++) { write_dat(table2[i]); delay_50us(1); } } /******************************************
11、************** 12864液晶顯示函數(shù) ********************************************************/ voiddisplay2(void) { uchar i; write_12864com(0x90); for(i=0;i<18;i++) { write_dat(table3[i]); delay_50us(1); } } /******************************************************** 1286
12、4液晶顯示函數(shù) ********************************************************/ voiddisplay3(void) { uchar i; write_12864com(0x88); for(i=0;i<8;i++) { write_dat(table4[i]); delay_50us(1); } } /******************************************************** 12864液晶顯示函數(shù) *************
13、*******************************************/ voiddisplaywendu(void) { uchar i; write_12864com(0x94); for(i=0;i<3;i++) { write_dat(wendu[i]); delay_50us(1); } for(i=0;i<1;i++) { write_dat(table5[i]); delay_50us(1); } for(i=4;i<5;i++) { write_dat(wend
14、u[i]); delay_50us(1); } } /******************************************************** 12864液晶顯示函數(shù) ********************************************************/ voiddisplayshidu(void) { uchar i; write_12864com(0x8C); for(i=0;i<3;i++) { write_dat(shidu[i]); delay_50us(1);
15、 } for(i=0;i<1;i++) { write_dat(table5[i]); delay_50us(1); } for(i=4;i<5;i++) { write_dat(shidu[i]); delay_50us(1); } } /******************************************************** SHT11寫字節(jié)程序 ********************************************************/ chars_write
16、_byte(unsignedcharvalue) { unsignedchari,error=0; for(i=0x80;i>0;i>>=1)//高位為1,循環(huán)右移 { if(i&value) DATA=1;//和要發(fā)送的數(shù)相與,結(jié)果為發(fā)送的位 elseDATA=0; SCK=1; _nop_();_nop_();_nop_();//延時3us SCK=0; } DATA=1;//釋放數(shù)據(jù)線 SCK=1; error=DATA;//檢查應(yīng)答信號,確認(rèn)通訊正常 _nop_();_nop_();_nop_();
17、SCK=0; DATA=1; returnerror;//error=1 通訊錯誤 } /******************************************************** SHT11讀字節(jié)程序 ********************************************************/ chars_read_byte(unsignedcharack) { unsignedchari,val=0; DATA=1;//釋放數(shù)據(jù)線 for(i=0x80;i>0;i>>=1)//高位為1,循環(huán)右移
18、 { SCK=1; if(DATA) val=(val|i);//讀一位數(shù)據(jù)線的值 SCK=0; } DATA=!ack;//如果是校驗,讀取完后結(jié)束通訊 ; SCK=1; _nop_();_nop_();_nop_();//延時3us SCK=0; _nop_();_nop_();_nop_(); DATA=1;//釋放數(shù)據(jù)線 returnval; } /******************************************************** SHT11啟動傳輸 *********
19、***********************************************/ voids_transstart(void) { DATA=1; SCK=0;//準(zhǔn)備 _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0; } /*******************************************
20、************* SHT11連接復(fù)位 ********************************************************/ voids_connectionreset(void) { unsignedchari; DATA=1; SCK=0;//準(zhǔn)備 for(i=0;i<9;i++)//DATA保持高,SCK時鐘觸發(fā)9次,發(fā)送啟動傳輸,通迅即復(fù)位 { SCK=1; SCK=0; } s_transstart();//啟動傳輸 } /****************************
21、**************************** SHT11溫濕度檢測 ********************************************************/ chars_measure(unsignedchar*p_value, unsignedchar*p_checksum, unsignedcharmode) { unsigned error=0; unsignedinti; s_transstart();//啟動傳輸 switch(mode)//選擇發(fā)送命令 { caseTEMP : error+=
22、s_write_byte(MEASURE_TEMP);break;//測量溫度 caseHUMI : error+=s_write_byte(MEASURE_HUMI);break;//測量濕度 default:break; } for(i=0;i<65535;i++)if(DATA==0)break;//等待測量結(jié)束 if(DATA) error+=1;// 如果長時間數(shù)據(jù)線沒有拉低,說明測量錯誤 *(p_value) =s_read_byte(ACK);//讀第一個字節(jié),高字節(jié) (MSB) *(p_value+1)=s_read_byte(ACK)
23、;//讀第二個字節(jié),低字節(jié) (LSB) *p_checksum =s_read_byte(noACK);//read CRC校驗碼 returnerror;// error=1 通訊錯誤 } /******************************************************** SHT11溫濕度值標(biāo)度變換及溫度補(bǔ)償 ********************************************************/ voidcalc_sth10(float*p_humidity ,float*p_temperature) {
24、 constfloatC1=-4.0;// 12位濕度精度 修正公式 constfloatC2=+0.0405;// 12位濕度精度 修正公式 constfloatC3=-0.0000028;// 12位濕度精度 修正公式 constfloatT1=+0.01;// 14位溫度精度 5V條件 修正公式 constfloatT2=+0.00008;// 14位溫度精度 5V條件 修正公式 floatrh=*p_humidity;// rh: 12位 濕度 floatt=*p_temperature;// t: 14位 溫度 floatrh_li
25、n;// rh_lin: 濕度 linear值 floatrh_true;// rh_true: 濕度 ture值 floatt_C;// t_C : 溫度 ℃ t_C=t*0.01 - 40;//補(bǔ)償溫度 rh_lin=C3*rh*rh + C2*rh + C1;//相對濕度非線性補(bǔ)償 rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;//相對濕度對于溫度依賴性補(bǔ)償 if(rh_true>100)rh_true=100;//濕度最大修正 if(rh_true<0.1)rh_true=0.1;//濕度最小修正 *p_t
26、emperature=t_C;//返回溫度結(jié)果 *p_humidity=rh_true;//返回濕度結(jié)果 } /******************************************************** 主函數(shù) ********************************************************/ voidmain(void) { unsignedinttemp,humi; value humi_val,temp_val;//定義兩個共同體,一個用于濕度,一個用于溫度 unsignedcharerror;//
27、用于檢驗是否出現(xiàn)錯誤 unsignedcharchecksum;//CRC init12864lcd(); display1(); display2(); display3(); s_connectionreset();//啟動連接復(fù)位 while(1) { error=0;//初始化error=0,即沒有錯誤 error+=s_measure((unsignedchar*)&temp_val.i,&checksum,TEMP);//溫度測量 error+=s_measure((unsignedchar*)&humi_val.i
28、,&checksum,HUMI);//濕度測量 if(error!=0) s_connectionreset();////如果發(fā)生錯誤,系統(tǒng)復(fù)位 else { humi_val.f=(float)humi_val.i;//轉(zhuǎn)換為浮點數(shù) temp_val.f=(float)temp_val.i;//轉(zhuǎn)換為浮點數(shù) calc_sth10(&humi_val.f,&temp_val.f);//修正相對濕度及溫度 temp=temp_val.f*10; humi=humi_val.f*10; wendu[0]=temp/1000+0;//溫度百位
29、 wendu[1]=temp%1000/100+0;//溫度十位 wendu[2]=temp%100/10+0;//溫度個位 wendu[3]=0x2E;//小數(shù)點 wendu[4]=temp%10+0;//溫度小數(shù)點后第一位 displaywendu(); shidu[0]=humi/1000+0;//濕度百位 shidu[1]=humi%1000/100+0;//濕度十位 shidu[2]=humi%100/10+0;//濕度個位 shidu[3]=0x2E;//小數(shù)點 shidu[4]=humi%10+0;//濕度小數(shù)點后第一位 displayshidu(); } delay(800);//等待足夠長的時間,以現(xiàn)行下一次轉(zhuǎn)換 } } 相關(guān)手冊資料及源碼下載地址:基于51單片機(jī)SHT11溫濕度傳感器檢測程序相關(guān)資料
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第7課時圖形的位置練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第1課時圖形的認(rèn)識與測量1平面圖形的認(rèn)識練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)1數(shù)與代數(shù)第10課時比和比例2作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊4比例1比例的意義和基本性質(zhì)第3課時解比例練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第7課時圓柱的體積3作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第1節(jié)圓柱的認(rèn)識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊2百分?jǐn)?shù)(二)第1節(jié)折扣和成數(shù)作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊1負(fù)數(shù)第1課時負(fù)數(shù)的初步認(rèn)識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)上冊期末復(fù)習(xí)考前模擬期末模擬訓(xùn)練二作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊期末豐收園作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊易錯清單十二課件新人教版
- 標(biāo)準(zhǔn)工時講義
- 2021年一年級語文上冊第六單元知識要點習(xí)題課件新人教版
- 2022春一年級語文下冊課文5識字測評習(xí)題課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)4數(shù)學(xué)思考第1課時數(shù)學(xué)思考1練習(xí)課件新人教版