小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 共同成長888 2014-05-08

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

  •  
    • 下面是原理圖:

      \

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

      \

      下面是源代碼:

      001.#include <reg52.h>
      002.#include <intrins.h>
      003.
      004./********************************************************
      005. 宏定義
      006.********************************************************/
      007.#define uint unsigned int
      008.#define uchar unsigned char
      009.#define noACK 0
      010.#define ACK 1
      011.#define STATUS_REG_W 0x06
      012.#define STATUS_REG_R 0x07
      013.#define MEASURE_TEMP 0x03
      014.#define MEASURE_HUMI 0x05
      015.#define RESET 0x1e
      016.
      017.enum {TEMP,HUMI};
      018.
      019.typedef union //定義共用同類型
      020.{
      021. unsigned int i;
      022. float f;
      023.} value;
      024.
      025.
      026./********************************************************
      027. 位定義
      028.********************************************************/
      029.sbit lcdrs=P2^0;
      030.sbit lcdrw=P2^1;
      031.sbit lcden=P2^2;
      032.sbit SCK = P1^0;
      033.sbit DATA = P1^1;
      034.
      035./********************************************************
      036. 變量定義
      037.********************************************************/
      038.uchar table2[]="SHT11 溫濕度檢測";
      039.uchar table3[]="溫度為: ℃";
      040.uchar table4[]="濕度為:";
      041.uchar table5[]=".";
      042.uchar wendu[6];
      043.uchar shidu[6];
      044.
      045./********************************************************
      046. 1ms延時函數(shù)
      047.********************************************************/
      048.void delay(int z)
      049.{
      050. int x,y;
      051. for(x=z;x>0;x--)
      052. for(y=125;y>0;y--);
      053.}
      054.
      055./********************************************************
      056. 50us延時函數(shù)
      057.********************************************************/
      058.void delay_50us(uint t)
      059.{
      060. uint j;
      061. for(;t>0;t--)
      062. for(j=19;j>0;j--);
      063.}
      064.
      065./********************************************************
      066. 50ms延時函數(shù)
      067.********************************************************/
      068.void delay_50ms(uint t)
      069.{
      070. uint j;
      071. for(;t>0;t--)
      072. for(j=6245;j>0;j--);
      073.}
      074.
      075./********************************************************
      076. 12864液晶寫指令
      077.********************************************************/
      078.void write_12864com(uchar com)
      079.{
      080. lcdrs=0;
      081. lcdrw=0;
      082. delay_50us(1);
      083. P0=com;
      084. lcden=1;
      085. delay_50us(10);
      086. lcden=0;
      087. delay_50us(2);
      088.}
      089.
      090./********************************************************
      091. 12864液晶寫數(shù)據(jù)
      092.********************************************************/
      093.void write_dat(uchar dat)
      094.{
      095. lcdrs=1;
      096. lcdrw=0;
      097. delay_50us(1);
      098. P0=dat;
      099. lcden=1;
      100. delay_50us(10);
      101. lcden=0;
      102. delay_50us(2);
      103.}
      104.
      105./********************************************************
      106. 12864液晶初始化
      107.********************************************************/
      108.void init12864lcd(void)
      109.{
      110. delay_50ms(2);
      111. write_12864com(0x30);
      112. delay_50us(4);
      113. write_12864com(0x30);
      114. delay_50us(4);
      115. write_12864com(0x0f);
      116. delay_50us(4);
      117. write_12864com(0x01);
      118. delay_50us(240);
      119. write_12864com(0x06);
      120. delay_50us(10);
      121. write_12864com(0x0c);
      122. delay_50us(10);
      123.}
      124.
      125./********************************************************
      126. 12864液晶顯示函數(shù)
      127.********************************************************/
      128.void display1(void)
      129.{
      130. uchar i;
      131. write_12864com(0x80);
      132. for(i=0;i<18;i++)
      133. {
      134. write_dat(table2[i]);
      135. delay_50us(1);
      136. }
      137.}
      138.
      139./********************************************************
      140. 12864液晶顯示函數(shù)
      141.********************************************************/
      142.void display2(void)
      143.{
      144. uchar i;
      145. write_12864com(0x90);
      146. for(i=0;i<18;i++)
      147. {
      148. write_dat(table3[i]);
      149. delay_50us(1);
      150. }
      151.}
      152.
      153./********************************************************
      154. 12864液晶顯示函數(shù)
      155.********************************************************/
      156.void display3(void)
      157.{
      158. uchar i;
      159. write_12864com(0x88);
      160. for(i=0;i<8;i++)
      161. {
      162. write_dat(table4[i]);
      163. delay_50us(1);
      164. }
      165.}
      166.
      167./********************************************************
      168. 12864液晶顯示函數(shù)
      169.********************************************************/
      170.void displaywendu(void)
      171.{
      172. uchar i;
      173. write_12864com(0x94);
      174. for(i=0;i<3;i++)
      175. {
      176. write_dat(wendu[i]);
      177. delay_50us(1);
      178. }
      179. for(i=0;i<1;i++)
      180. {
      181. write_dat(table5[i]);
      182. delay_50us(1);
      183. }
      184. for(i=4;i<5;i++)
      185. {
      186. write_dat(wendu[i]);
      187. delay_50us(1);
      188. }
      189.}
      190.
      191.
      192./********************************************************
      193. 12864液晶顯示函數(shù)
      194.********************************************************/
      195.void displayshidu(void)
      196.{
      197. uchar i;
      198. write_12864com(0x8C);
      199. for(i=0;i<3;i++)
      200. {
      201. write_dat(shidu[i]);
      202. delay_50us(1);
      203. }
      204. for(i=0;i<1;i++)
      205. {
      206. write_dat(table5[i]);
      207. delay_50us(1);
      208. }
      209. for(i=4;i<5;i++)
      210. {
      211. write_dat(shidu[i]);
      212. delay_50us(1);
      213. }
      214.}
      215.
      216./********************************************************
      217. SHT11寫字節(jié)程序
      218.********************************************************/
      219.char s_write_byte(unsigned char value)
      220.{
      221. unsigned char i,error=0;
      222. for (i=0x80;i>0;i>>=1) //高位為1,循環(huán)右移
      223. {
      224. if (i&value) DATA=1; //和要發(fā)送的數(shù)相與,結(jié)果為發(fā)送的位
      225. else DATA=0;
      226. SCK=1;
      227. _nop_();_nop_();_nop_(); //延時3us
      228. SCK=0;
      229. }
      230. DATA=1; //釋放數(shù)據(jù)線
      231. SCK=1;
      232. error=DATA; //檢查應(yīng)答信號,確認(rèn)通訊正常
      233. _nop_();_nop_();_nop_();
      234. SCK=0;
      235. DATA=1;
      236. return error; //error=1 通訊錯誤
      237.}
      238.
      239./********************************************************
      240. SHT11讀字節(jié)程序
      241.********************************************************/
      242.char s_read_byte(unsigned char ack)
      243.{
      244. unsigned char i,val=0;
      245. DATA=1; //釋放數(shù)據(jù)線
      246. for(i=0x80;i>0;i>>=1) //高位為1,循環(huán)右移
      247. {
      248. SCK=1;
      249. if(DATA) val=(val|i); //讀一位數(shù)據(jù)線的值
      250. SCK=0;
      251. }
      252. DATA=!ack; //如果是校驗,讀取完后結(jié)束通訊 www. ;
      253. SCK=1;
      254. _nop_();_nop_();_nop_(); //延時3us
      255. SCK=0;
      256. _nop_();_nop_();_nop_();
      257. DATA=1; //釋放數(shù)據(jù)線
      258. return val;
      259.}
      260.
      261./********************************************************
      262. SHT11啟動傳輸
      263.********************************************************/
      264.void s_transstart(void)
      265.{
      266. DATA=1; SCK=0; //準(zhǔn)備
      267. _nop_();
      268. SCK=1;
      269. _nop_();
      270. DATA=0;
      271. _nop_();
      272. SCK=0;
      273. _nop_();_nop_();_nop_();
      274. SCK=1;
      275. _nop_();
      276. DATA=1;
      277. _nop_();
      278. SCK=0;
      279.}
      280.
      281.
      282./********************************************************
      283. SHT11連接復(fù)位
      284.********************************************************/
      285.void s_connectionreset(void)
      286.{
      287. unsigned char i;
      288. DATA=1; SCK=0; //準(zhǔn)備
      289. for(i=0;i<9;i++) //DATA保持高,SCK時鐘觸發(fā)9次,發(fā)送啟動傳輸,通迅即復(fù)位
      290. {
      291. SCK=1;
      292. SCK=0;
      293. }
      294. s_transstart(); //啟動傳輸
      295.}
      296.
      297./********************************************************
      298. SHT11溫濕度檢測
      299.********************************************************/
      300.char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
      301.{
      302. unsigned error=0;
      303. unsigned int i;
      304.
      305. s_transstart(); //啟動傳輸
      306. switch(mode) //選擇發(fā)送命令
      307. {
      308. case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //測量溫度
      309. case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //測量濕度
      310. default : break;
      311. }
      312. for (i=0;i<65535;i++) if(DATA==0) break; //等待測量結(jié)束
      313. if(DATA) error+=1; // 如果長時間數(shù)據(jù)線沒有拉低,說明測量錯誤
      314. *(p_value) =s_read_byte(ACK); //讀第一個字節(jié),高字節(jié) (MSB)
      315. *(p_value+1)=s_read_byte(ACK); //讀第二個字節(jié),低字節(jié) (LSB)
      316. *p_checksum =s_read_byte(noACK); //read CRC校驗碼
      317. return error; // error=1 通訊錯誤
      318.}
      319./********************************************************
      320. SHT11溫濕度值標(biāo)度變換及溫度補償
      321.********************************************************/
      322.void calc_sth10(float *p_humidity ,float *p_temperature)
      323.{
      324. const float C1=-4.0; // 12位濕度精度 修正公式
      325. const float C2=+0.0405; // 12位濕度精度 修正公式
      326. const float C3=-0.0000028; // 12位濕度精度 修正公式
      327. const float T1=+0.01; // 14位溫度精度 5V條件 修正公式
      328. const float T2=+0.00008; // 14位溫度精度 5V條件 修正公式
      329.
      330. float rh=*p_humidity; // rh: 12位 濕度
      331. float t=*p_temperature; // t: 14位 溫度
      332. float rh_lin; // rh_lin: 濕度 linear值
      333. float rh_true; // rh_true: 濕度 ture值
      334. float t_C; // t_C : 溫度 ℃
      335.
      336. t_C=t*0.01 - 40; //補償溫度
      337. rh_lin=C3*rh*rh + C2*rh + C1; //相對濕度非線性補償
      338. rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相對濕度對于溫度依賴性補償
      339. if(rh_true>100)rh_true=100; //濕度最大修正
      340. if(rh_true<0.1)rh_true=0.1; //濕度最小修正
      341.
      342. *p_temperature=t_C; //返回溫度結(jié)果
      343. *p_humidity=rh_true; //返回濕度結(jié)果
      344.}
      345./********************************************************
      346. 主函數(shù)
      347.********************************************************/
      348.void main(void)
      349.{
      350. unsigned int temp,humi;
      351. value humi_val,temp_val; //定義兩個共同體,一個用于濕度,一個用于溫度
      352. unsigned char error; //用于檢驗是否出現(xiàn)錯誤
      353. unsigned char checksum; //CRC
      354. init12864lcd();
      355. display1();
      356. display2();
      357. display3();
      358. s_connectionreset(); //啟動連接復(fù)位
      359. while(1)
      360. {
      361. error=0; //初始化error=0,即沒有錯誤
      362. error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量
      363. error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量
      364. if(error!=0) s_connectionreset(); ////如果發(fā)生錯誤,系統(tǒng)復(fù)位
      365. else
      366. {
      367. humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點數(shù)
      368. temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點數(shù)
      369. calc_sth10(&humi_val.f,&temp_val.f); //修正相對濕度及溫度
      370. temp=temp_val.f*10;
      371. humi=humi_val.f*10;
      372. wendu[0]=temp/1000+'0'; //溫度百位
      373. wendu[1]=temp%1000/100+'0'; //溫度十位
      374. wendu[2]=temp%100/10+'0'; //溫度個位
      375. wendu[3]=0x2E; //小數(shù)點
      376. wendu[4]=temp%10+'0'; //溫度小數(shù)點后第一位
      377. displaywendu();
      378. shidu[0]=humi/1000+'0'; //濕度百位
      379. shidu[1]=humi%1000/100+'0'; //濕度十位
      380. shidu[2]=humi%100/10+'0'; //濕度個位
      381. shidu[3]=0x2E; //小數(shù)點
      382. shidu[4]=humi%10+'0'; //濕度小數(shù)點后第一位
      383. displayshidu();
      384. }
      385. delay(800); //等待足夠長的時間,以現(xiàn)行下一次轉(zhuǎn)換
      386. }
      387.}


      相關(guān)手冊資料及源碼下載地址:基于51單片機SHT11溫濕度傳感器檢測程序相關(guān)資料

      本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
      轉(zhuǎn)藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多