基于51單片機(jī)SHT11溫濕度傳感器檢測(cè)程序
《基于51單片機(jī)SHT11溫濕度傳感器檢測(cè)程序》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于51單片機(jī)SHT11溫濕度傳感器檢測(cè)程序(10頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、
基于51單片機(jī)SHT11溫濕度傳感器檢測(cè)程序(含電路圖)
下面是原理圖:
下面是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 溫濕度檢測(cè)"; uchar table3[]="溫度為: ℃"; uchar table4[]="濕度為:"; uchar table5[]="."; uchar wendu[6]; uchar shidu[6]; /******************************************************** 1ms延時(shí)函數(shù) ********************************************************/ voiddelay(intz) { intx,y; for(
5、x=z;x>0;x--) for(y=125;y>0;y--); } /******************************************************** 50us延時(shí)函數(shù) ********************************************************/ voiddelay_50us(uint t) { uint j; for(;t>0;t--) for(j=19;j>0;j--); } /*******************************************
6、************* 50ms延時(shí)函數(shù) ********************************************************/ voiddelay_50ms(uint t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } /******************************************************** 12864液晶寫(xiě)指令 ********************************************************/
7、 voidwrite_12864com(uchar com) { lcdrs=0; delay_50us(1); P0=com; lcden=1; delay_50us(10); lcden=0; delay_50us(2); } /******************************************************** 12864液晶寫(xiě)數(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寫(xiě)字節(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_();//延時(shí)3us SCK=0; } DATA=1;//釋放數(shù)據(jù)線 SCK=1; error=DATA;//檢查應(yīng)答信號(hào),確認(rèn)通訊正常 _nop_();_nop_();_nop_();
17、SCK=0; DATA=1; returnerror;//error=1 通訊錯(cuò)誤 } /******************************************************** 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;//如果是校驗(yàn),讀取完后結(jié)束通訊 ; SCK=1; _nop_();_nop_();_nop_();//延時(shí)3us SCK=0; _nop_();_nop_();_nop_(); DATA=1;//釋放數(shù)據(jù)線 returnval; } /******************************************************** SHT11啟動(dòng)傳輸 *********
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時(shí)鐘觸發(fā)9次,發(fā)送啟動(dòng)傳輸,通迅即復(fù)位 { SCK=1; SCK=0; } s_transstart();//啟動(dòng)傳輸 } /****************************
21、**************************** SHT11溫濕度檢測(cè) ********************************************************/ chars_measure(unsignedchar*p_value, unsignedchar*p_checksum, unsignedcharmode) { unsigned error=0; unsignedinti; s_transstart();//啟動(dòng)傳輸 switch(mode)//選擇發(fā)送命令 { caseTEMP : error+=
22、s_write_byte(MEASURE_TEMP);break;//測(cè)量溫度 caseHUMI : error+=s_write_byte(MEASURE_HUMI);break;//測(cè)量濕度 default:break; } for(i=0;i<65535;i++)if(DATA==0)break;//等待測(cè)量結(jié)束 if(DATA) error+=1;// 如果長(zhǎng)時(shí)間數(shù)據(jù)線沒(méi)有拉低,說(shuō)明測(cè)量錯(cuò)誤 *(p_value) =s_read_byte(ACK);//讀第一個(gè)字節(jié),高字節(jié) (MSB) *(p_value+1)=s_read_byte(ACK)
23、;//讀第二個(gè)字節(jié),低字節(jié) (LSB) *p_checksum =s_read_byte(noACK);//read CRC校驗(yàn)碼 returnerror;// error=1 通訊錯(cuò)誤 } /******************************************************** 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;//相對(duì)濕度非線性補(bǔ)償 rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;//相對(duì)濕度對(duì)于溫度依賴性補(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;//定義兩個(gè)共同體,一個(gè)用于濕度,一個(gè)用于溫度 unsignedcharerror;//
27、用于檢驗(yàn)是否出現(xiàn)錯(cuò)誤 unsignedcharchecksum;//CRC init12864lcd(); display1(); display2(); display3(); s_connectionreset();//啟動(dòng)連接復(fù)位 while(1) { error=0;//初始化error=0,即沒(méi)有錯(cuò)誤 error+=s_measure((unsignedchar*)&temp_val.i,&checksum,TEMP);//溫度測(cè)量 error+=s_measure((unsignedchar*)&humi_val.i
28、,&checksum,HUMI);//濕度測(cè)量 if(error!=0) s_connectionreset();////如果發(fā)生錯(cuò)誤,系統(tǒng)復(fù)位 else { humi_val.f=(float)humi_val.i;//轉(zhuǎn)換為浮點(diǎn)數(shù) temp_val.f=(float)temp_val.i;//轉(zhuǎn)換為浮點(diǎn)數(shù) calc_sth10(&humi_val.f,&temp_val.f);//修正相對(duì)濕度及溫度 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;//溫度個(gè)位 wendu[3]=0x2E;//小數(shù)點(diǎn) wendu[4]=temp%10+0;//溫度小數(shù)點(diǎn)后第一位 displaywendu(); shidu[0]=humi/1000+0;//濕度百位 shidu[1]=humi%1000/100+0;//濕度十位 shidu[2]=humi%100/10+0;//濕度個(gè)位 shidu[3]=0x2E;//小數(shù)點(diǎn) shidu[4]=humi%10+0;//濕度小數(shù)點(diǎn)后第一位 displayshidu(); } delay(800);//等待足夠長(zhǎng)的時(shí)間,以現(xiàn)行下一次轉(zhuǎn)換 } } 相關(guān)手冊(cè)資料及源碼下載地址:基于51單片機(jī)SHT11溫濕度傳感器檢測(cè)程序相關(guān)資料
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024《增值稅法》全文學(xué)習(xí)解讀(規(guī)范增值稅的征收和繳納保護(hù)納稅人的合法權(quán)益)
- 2024《文物保護(hù)法》全文解讀學(xué)習(xí)(加強(qiáng)對(duì)文物的保護(hù)促進(jìn)科學(xué)研究工作)
- 銷售技巧培訓(xùn)課件:接近客戶的套路總結(jié)
- 20種成交的銷售話術(shù)和技巧
- 銷售技巧:接近客戶的8種套路
- 銷售套路總結(jié)
- 房產(chǎn)銷售中的常見(jiàn)問(wèn)題及解決方法
- 銷售技巧:值得默念的成交話術(shù)
- 銷售資料:讓人舒服的35種說(shuō)話方式
- 汽車銷售績(jī)效管理規(guī)范
- 銷售技巧培訓(xùn)課件:絕對(duì)成交的銷售話術(shù)
- 頂尖銷售技巧總結(jié)
- 銷售技巧:電話營(yíng)銷十大定律
- 銷售逼單最好的二十三種技巧
- 銷售最常遇到的10大麻煩