在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于51單片機(jī)SHT11溫濕度傳感器檢測程序(含電路圖)

            基于51單片機(jī)SHT11溫濕度傳感器檢測程序(含電路圖)

            作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
            下面是原理圖:

            本文引用地址:http://www.biyoush.com/article/201611/318569.htm

            下面是SHT11與MCU連接的典型電路:

            下面是源代碼:

            1. #include
            2. #include
            3. /********************************************************
            4. 宏定義
            5. ********************************************************/
            6. #define uint unsigned int
            7. #define uchar unsigned char
            8. #define noACK 0
            9. #define ACK 1
            10. #define STATUS_REG_W 0x06
            11. #define STATUS_REG_R 0x07
            12. #define MEASURE_TEMP 0x03
            13. #define MEASURE_HUMI 0x05
            14. #define RESET 0x1e
            15. enum {TEMP,HUMI};
            16. typedef union //定義共用同類型
            17. {
            18. unsigned int i;
            19. float f;
            20. } value;
            21. /********************************************************
            22. 位定義
            23. ********************************************************/
            24. sbit lcdrs=P2^0;
            25. sbit lcdrw=P2^1;
            26. sbit lcden=P2^2;
            27. sbit SCK = P1^0;
            28. sbit DATA = P1^1;
            29. /********************************************************
            30. 變量定義
            31. ********************************************************/
            32. uchar table2[]="SHT11 溫濕度檢測";
            33. uchar table3[]="溫度為: ℃";
            34. uchar table4[]="濕度為:";
            35. uchar table5[]=".";
            36. uchar wendu[6];
            37. uchar shidu[6];
            38. /********************************************************
            39. 1ms延時函數(shù)
            40. ********************************************************/
            41. void delay(int z)
            42. {
            43. int x,y;
            44. for(x=z;x>0;x--)
            45. for(y=125;y>0;y--);
            46. }
            47. /********************************************************
            48. 50us延時函數(shù)
            49. ********************************************************/
            50. void delay_50us(uint t)
            51. {
            52. uint j;
            53. for(;t>0;t--)
            54. for(j=19;j>0;j--);
            55. }
            56. /********************************************************
            57. 50ms延時函數(shù)
            58. ********************************************************/
            59. void delay_50ms(uint t)
            60. {
            61. uint j;
            62. for(;t>0;t--)
            63. for(j=6245;j>0;j--);
            64. }
            65. /********************************************************
            66. 12864液晶寫指令
            67. ********************************************************/
            68. void write_12864com(uchar com)
            69. {
            70. lcdrs=0;
            71. lcdrw=0;
            72. delay_50us(1);
            73. P0=com;
            74. lcden=1;
            75. delay_50us(10);
            76. lcden=0;
            77. delay_50us(2);
            78. }
            79. /********************************************************
            80. 12864液晶寫數(shù)據(jù)
            81. ********************************************************/
            82. void write_dat(uchar dat)
            83. {
            84. lcdrs=1;
            85. lcdrw=0;
            86. delay_50us(1);
            87. P0=dat;
            88. lcden=1;
            89. delay_50us(10);
            90. lcden=0;
            91. delay_50us(2);
            92. }
            93. /********************************************************
            94. 12864液晶初始化
            95. ********************************************************/
            96. void init12864lcd(void)
            97. {
            98. delay_50ms(2);
            99. write_12864com(0x30);
            100. delay_50us(4);
            101. write_12864com(0x30);
            102. delay_50us(4);
            103. write_12864com(0x0f);
            104. delay_50us(4);
            105. write_12864com(0x01);
            106. delay_50us(240);
            107. write_12864com(0x06);
            108. delay_50us(10);
            109. write_12864com(0x0c);
            110. delay_50us(10);
            111. }
            112. /********************************************************
            113. 12864液晶顯示函數(shù)
            114. ********************************************************/
            115. void display1(void)
            116. {
            117. uchar i;
            118. write_12864com(0x80);
            119. for(i=0;i<18;i++)
            120. {
            121. write_dat(table2[i]);
            122. delay_50us(1);
            123. }
            124. }
            125. /********************************************************
            126. 12864液晶顯示函數(shù)
            127. ********************************************************/
            128. void display2(void)
            129. {
            130. uchar i;
            131. write_12864com(0x90);
            132. for(i=0;i<18;i++)
            133. {
            134. write_dat(table3[i]);
            135. delay_50us(1);
            136. }
            137. }
            138. /********************************************************
            139. 12864液晶顯示函數(shù)
            140. ********************************************************/
            141. void display3(void)
            142. {
            143. uchar i;
            144. write_12864com(0x88);
            145. for(i=0;i<8;i++)
            146. {
            147. write_dat(table4[i]);
            148. delay_50us(1);
            149. }
            150. }
            151. /********************************************************
            152. 12864液晶顯示函數(shù)
            153. ********************************************************/
            154. void displaywendu(void)
            155. {
            156. uchar i;
            157. write_12864com(0x94);
            158. for(i=0;i<3;i++)
            159. {
            160. write_dat(wendu[i]);
            161. delay_50us(1);
            162. }
            163. for(i=0;i<1;i++)
            164. {
            165. write_dat(table5[i]);
            166. delay_50us(1);
            167. }
            168. for(i=4;i<5;i++)
            169. {
            170. write_dat(wendu[i]);
            171. delay_50us(1);
            172. }
            173. }
            174. /********************************************************
            175. 12864液晶顯示函數(shù)
            176. ********************************************************/
            177. void displayshidu(void)
            178. {
            179. uchar i;
            180. write_12864com(0x8C);
            181. for(i=0;i<3;i++)
            182. {
            183. write_dat(shidu[i]);
            184. delay_50us(1);
            185. }
            186. for(i=0;i<1;i++)
            187. {
            188. write_dat(table5[i]);
            189. delay_50us(1);
            190. }
            191. for(i=4;i<5;i++)
            192. {
            193. write_dat(shidu[i]);
            194. delay_50us(1);
            195. }
            196. }
            197. /********************************************************
            198. SHT11寫字節(jié)程序
            199. ********************************************************/
            200. char s_write_byte(unsigned char value)
            201. {
            202. unsigned char i,error=0;
            203. for (i=0x80;i>0;i>>=1) //高位為1,循環(huán)右移
            204. {
            205. if (i&value) DATA=1; //和要發(fā)送的數(shù)相與,結(jié)果為發(fā)送的位
            206. else DATA=0;
            207. SCK=1;
            208. _nop_();_nop_();_nop_(); //延時3us
            209. SCK=0;
            210. }
            211. DATA=1; //釋放數(shù)據(jù)線
            212. SCK=1;
            213. error=DATA; //檢查應(yīng)答信號,確認(rèn)通訊正常
            214. _nop_();_nop_();_nop_();
            215. SCK=0;
            216. DATA=1;
            217. return error; //error=1 通訊錯誤
            218. }
            219. /********************************************************
            220. SHT11讀字節(jié)程序
            221. ********************************************************/
            222. char s_read_byte(unsigned char ack)
            223. {
            224. unsigned char i,val=0;
            225. DATA=1; //釋放數(shù)據(jù)線
            226. for(i=0x80;i>0;i>>=1) //高位為1,循環(huán)右移
            227. {
            228. SCK=1;
            229. if(DATA) val=(val|i); //讀一位數(shù)據(jù)線的值
            230. SCK=0;
            231. }
            232. DATA=!ack; //如果是校驗(yàn),讀取完后結(jié)束通訊;
            233. SCK=1;
            234. _nop_();_nop_();_nop_(); //延時3us
            235. SCK=0;
            236. _nop_();_nop_();_nop_();
            237. DATA=1; //釋放數(shù)據(jù)線
            238. return val;
            239. }
            240. /********************************************************
            241. SHT11啟動傳輸
            242. ********************************************************/
            243. void s_transstart(void)
            244. {
            245. DATA=1; SCK=0; //準(zhǔn)備
            246. _nop_();
            247. SCK=1;
            248. _nop_();
            249. DATA=0;
            250. _nop_();
            251. SCK=0;
            252. _nop_();_nop_();_nop_();
            253. SCK=1;
            254. _nop_();
            255. DATA=1;
            256. _nop_();
            257. SCK=0;
            258. }
            259. /********************************************************
            260. SHT11連接復(fù)位
            261. ********************************************************/
            262. void s_connectionreset(void)
            263. {
            264. unsigned char i;
            265. DATA=1; SCK=0; //準(zhǔn)備
            266. for(i=0;i<9;i++) //DATA保持高,SCK時鐘觸發(fā)9次,發(fā)送啟動傳輸,通迅即復(fù)位
            267. {
            268. SCK=1;
            269. SCK=0;
            270. }
            271. s_transstart(); //啟動傳輸
            272. }
            273. /********************************************************
            274. SHT11溫濕度檢測
            275. ********************************************************/
            276. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
            277. {
            278. unsigned error=0;
            279. unsigned int i;
            280. s_transstart(); //啟動傳輸
            281. switch(mode) //選擇發(fā)送命令
            282. {
            283. case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //測量溫度
            284. case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //測量濕度
            285. default : break;
            286. }
            287. for (i=0;i<65535;i++) if(DATA==0) break; //等待測量結(jié)束
            288. if(DATA) error+=1; // 如果長時間數(shù)據(jù)線沒有拉低,說明測量錯誤
            289. *(p_value) =s_read_byte(ACK); //讀第一個字節(jié),高字節(jié) (MSB)
            290. *(p_value+1)=s_read_byte(ACK); //讀第二個字節(jié),低字節(jié) (LSB)
            291. *p_checksum =s_read_byte(noACK); //read CRC校驗(yàn)碼
            292. return error; // error=1 通訊錯誤
            293. }
            294. /********************************************************
            295. SHT11溫濕度值標(biāo)度變換及溫度補(bǔ)償
            296. ********************************************************/
            297. void calc_sth10(float *p_humidity ,float *p_temperature)
            298. {
            299. const float C1=-4.0; // 12位濕度精度 修正公式
            300. const float C2=+0.0405; // 12位濕度精度 修正公式
            301. const float C3=-0.0000028; // 12位濕度精度 修正公式
            302. const float T1=+0.01; // 14位溫度精度 5V條件 修正公式
            303. const float T2=+0.00008; // 14位溫度精度 5V條件 修正公式
            304. float rh=*p_humidity; // rh: 12位 濕度
            305. float t=*p_temperature; // t: 14位 溫度
            306. float rh_lin; // rh_lin: 濕度 linear值
            307. float rh_true; // rh_true: 濕度 ture值
            308. float t_C; // t_C : 溫度 ℃
            309. t_C=t*0.01 - 40; //補(bǔ)償溫度
            310. rh_lin=C3*rh*rh + C2*rh + C1; //相對濕度非線性補(bǔ)償
            311. rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相對濕度對于溫度依賴性補(bǔ)償
            312. if(rh_true>100)rh_true=100; //濕度最大修正
            313. if(rh_true<0.1)rh_true=0.1; //濕度最小修正
            314. *p_temperature=t_C; //返回溫度結(jié)果
            315. *p_humidity=rh_true; //返回濕度結(jié)果
            316. }
            317. /********************************************************
            318. 主函數(shù)
            319. ********************************************************/
            320. void main(void)
            321. {
            322. unsigned int temp,humi;
            323. value humi_val,temp_val; //定義兩個共同體,一個用于濕度,一個用于溫度
            324. unsigned char error; //用于檢驗(yàn)是否出現(xiàn)錯誤
            325. unsigned char checksum; //CRC
            326. init12864lcd();
            327. display1();
            328. display2();
            329. display3();
            330. s_connectionreset(); //啟動連接復(fù)位
            331. while(1)
            332. {
            333. error=0; //初始化error=0,即沒有錯誤
            334. error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量
            335. error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量
            336. if(error!=0) s_connectionreset(); ////如果發(fā)生錯誤,系統(tǒng)復(fù)位
            337. else
            338. {
            339. humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù)
            340. temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù)
            341. calc_sth10(&humi_val.f,&temp_val.f); //修正相對濕度及溫度
            342. temp=temp_val.f*10;
            343. humi=humi_val.f*10;
            344. wendu[0]=temp/1000+0; //溫度百位
            345. wendu[1]=temp%1000/100+0; //溫度十位
            346. wendu[2]=temp%100/10+0; //溫度個位
            347. wendu[3]=0x2E; //小數(shù)點(diǎn)
            348. wendu[4]=temp%10+0; //溫度小數(shù)點(diǎn)后第一位
            349. displaywendu();
            350. shidu[0]=humi/1000+0; //濕度百位
            351. shidu[1]=humi%1000/100+0; //濕度十位
            352. shidu[2]=humi%100/10+0; //濕度個位
            353. shidu[3]=0x2E; //小數(shù)點(diǎn)
            354. shidu[4]=humi%10+0; //濕度小數(shù)點(diǎn)后第一位
            355. displayshidu();
            356. }
            357. delay(800); //等待足夠長的時間,以現(xiàn)行下一次轉(zhuǎn)換
            358. }
            359. }


            評論


            技術(shù)專區(qū)

            關(guān)閉