久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4443|回復: 1
打印 上一主題 下一主題
收起左側

基于單片機室內溫度檢測程序源碼

[復制鏈接]
跳轉到指定樓層
樓主

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define noACK 0  
  6. #define ACK   1            
  7. #define STATUS_REG_W 0x06   
  8. #define STATUS_REG_R 0x07   
  9. #define MEASURE_TEMP 0x03   
  10. #define MEASURE_HUMI 0x05   
  11. #define RESET        0x1e   
  12. enum {TEMP,HUMI};  
  13. typedef union     //定義共用同類型
  14. {   
  15. unsigned int i;
  16. float f;
  17. } value;  
  18. sbit lcdrs=P2^0;
  19. sbit rw=P2^1;
  20. sbit lcden=P2^2;
  21. sbit SCK = P1^0;
  22. sbit DATA = P1^1;  
  23. sbit t_low = P3^0;
  24. sbit t_high = P3^1;
  25. sbit r_low = P3^2;
  26. sbit r_high = P3^3;
  27. sbit zeng = P3^4;
  28. sbit jian = P3^5;  
  29. sbit beep = P3^7;  
  30. uchar table3[]="T:      ";
  31. uchar table4[]="R:";
  32. uchar table5[]=".";
  33. uchar wendu[5];      
  34. uchar shidu[5];   
  35. uchar t_fanwei[]="1050";
  36. uchar r_fanwei[]="1090";     
  37. char t_a=10,t_b=50,r_a=10,r_b=90;  
  38. uchar flag_tlow=0,
  39. flag_thigh=0,
  40. flag_rlow=0,
  41. flag_rhigh=0;
  42. void delay(uint z)
  43. {
  44. uint x,y;
  45. for(x=110;x>0;x--)   
  46. for(y=z;y>0;y--);
  47. }
  48. void delay_50us(uint t)
  49. {
  50. uint j;
  51. for(;t>0;t--)  
  52.   for(j=19;j>0;j--);
  53. }
  54. void delay_50ms(uint t)
  55. {
  56. uint j;
  57. for(;t>0;t--)   
  58. for(j=6245;j>0;j--);
  59. }   
  60. void write_data(uchar dataa)
  61. {
  62. rw=0;
  63. lcdrs=1;  
  64. P0=dataa;  
  65. delay(5);  
  66. lcden=1;  
  67. delay(20);
  68. lcden=0;
  69. }
  70. void write_con(uchar con)
  71. {
  72. rw=0;  
  73. lcdrs=0;
  74. P0=con;  
  75. delay(5);  
  76. lcden=1;  
  77. delay(20);  
  78. lcden=0;
  79. }
  80. void init()
  81. {
  82.     rw=0;  
  83. write_con(0x38);      
  84. write_con(0x06);      
  85. write_con(0x0c);      
  86. write_con(0x01);   
  87. }
  88. void display2(void)
  89. {
  90. uchar i;
  91. write_con(0x80);   
  92. for(i=0;i<8;i++)  
  93. {   
  94. write_data(table3[i]);   
  95. delay_50us(1);   
  96. }     
  97. write_con(0x86);     
  98. write_data(0xdf);            
  99. write_data('C');      
  100. }
  101. void display3(void)
  102. {
  103. uchar i;
  104. write_con(0x80+0x40);   
  105. for(i=0;i<2;i++)  
  106. {   
  107. write_data(table4[i]);   
  108. delay_50us(1);   
  109. }     
  110. write_con(0x80+0x46);   
  111. write_data('%');  
  112. }
  113. void displaywendu(void)
  114. {
  115. uchar i;
  116. write_con(0x82);   
  117. for(i=0;i<2;i++)  
  118. {   
  119. write_data(wendu[i]);   
  120. delay_50us(1);   
  121. }
  122. for(i=0;i<1;i++)
  123. {   
  124. write_data(table5[i]);   
  125. delay_50us(1);   
  126. }
  127. for(i=3;i<4;i++)  
  128. {   
  129. write_data(wendu[i]);   
  130. delay_50us(1);   
  131. }
  132. }
  133. void displayshidu(void)
  134. {
  135. uchar i;
  136. write_con(0x80+0x42);   
  137. for(i=0;i<2;i++)  
  138. {   
  139. write_data(shidu[i]);   
  140. delay_50us(1);   
  141. }
  142. for(i=0;i<1;i++)  
  143. {   
  144. write_data(table5[i]);      //.   
  145. delay_50us(1);   
  146. }
  147. for(i=3;i<4;i++)  
  148. {   
  149. write_data(shidu[i]);   
  150. delay_50us(1);   
  151. }
  152. }
  153. char s_write_byte(unsigned char value)   
  154. {  
  155. unsigned char i,error=0;  
  156. for (i=0x80;i>0;i>>=1)             //高位為1,循環右移  
  157. {    if (i&value) DATA=1;          //和要發送的數相與,結果為發送的位      
  158. else DATA=0;                              
  159. SCK=1;                           
  160.        _nop_();_nop_();_nop_();        //延時3us      
  161. SCK=0;  
  162. }
  163. DATA=1;                           //釋放數據線  
  164. SCK=1;                             
  165. error=DATA;                       //檢查應答信號,確認通訊正常  _nop_();_nop_();_nop_();  SCK=0;         
  166. DATA=1;
  167. return error;                     //error=1 通訊錯誤
  168. }
  169. char s_read_byte(unsigned char ack)
  170. {  
  171. unsigned char i,val=0;
  172. DATA=1;                           //釋放數據線
  173. for(i=0x80;i>0;i>>=1)             //高位為1,循環右移  
  174. {   
  175. SCK=1;                          
  176.    if(DATA) val=(val|i);             //讀一位數據線的值      
  177. SCK=0;         
  178. }
  179. DATA=!ack;                        //如果是校驗,讀取完后結束通訊;  
  180. SCK=1;                             
  181. _nop_();_nop_();_nop_();          //延時3us  
  182. SCK=0;   
  183. _nop_();_nop_();_nop_();        
  184. DATA=1;                           //釋放數據線  
  185. return val;
  186. }  
  187. void s_transstart(void)
  188. {      
  189. DATA=1;
  190. SCK=0;                   //準備     
  191. _nop_();   
  192. SCK=1;     
  193. _nop_();     
  194. DATA=0;     
  195. _nop_();   
  196. SCK=0;      
  197. _nop_();_nop_();_nop_();     
  198. SCK=1;     
  199. _nop_();   
  200. DATA=1;         
  201. _nop_();     
  202. SCK=0;      
  203. }
  204. void s_connectionreset(void)
  205. {  
  206. unsigned char i;  
  207. DATA=1; SCK=0;                    //準備
  208. for(i=0;i<9;i++)                  //DATA保持高,SCK時鐘觸發9次,發送啟動傳輸,通迅即復位
  209. {   
  210. SCK=1;      
  211. SCK=0;  
  212. }
  213.   s_transstart();                   //啟動傳輸
  214. }
  215. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  216. {  
  217. unsigned error=0;  
  218. unsigned int i;
  219. s_transstart();                   //啟動傳輸  
  220. switch(mode)                     //選擇發送命令         
  221. {   
  222. case TEMP : error+=s_write_byte(MEASURE_TEMP);
  223. break;     //測量溫度               
  224. case HUMI : error+=s_write_byte(MEASURE_HUMI); break;     //測量濕度
  225.       default     : break;   
  226. }
  227. for (i=0;i<65535;i++) if(DATA==0) break;        //等待測量結束
  228. if(DATA) error+=1;                              // 如果長時間數據線沒有拉低,說明測量錯誤  
  229. *(p_value) =s_read_byte(ACK);      //讀第一個字節,高字節 (MSB)  *(p_value+1)=s_read_byte(ACK);      //讀第二個字節,低字節 (LSB)  
  230. *p_checksum =s_read_byte(noACK);  //read CRC校驗碼  
  231. return error;     // error=1 通訊錯誤
  232. }
  233. void calc_sth10(float *p_humidity ,float *p_temperature)
  234. {  
  235. const float C1=-4.0;              // 12位濕度精度 修正公式  
  236. const float C2=+0.0405;           // 12位濕度精度 修正公式  
  237. const float C3=-0.0000028;        // 12位濕度精度 修正公式
  238. const float T1=+0.01;             // 14位溫度精度 5V條件  修正公式  
  239. const float T2=+0.00008;          // 14位溫度精度 5V條件  修正公式  
  240. float rh=*p_humidity;             // rh:      12位 濕度   
  241. float t=*p_temperature;           // t:       14位 溫度  
  242. float rh_lin;                     // rh_lin: 濕度 linear值  
  243. float rh_true;                    // rh_true: 濕度 ture值  
  244. float t_C;                        // t_C   : 溫度 ℃  
  245. t_C=t*0.01 - 40;                  //補償溫度
  246. rh_lin=C3*rh*rh + C2*rh + C1;     //相對濕度非線性補償
  247. rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相對濕度對于溫度依賴性補償  if(rh_true>100)rh_true=100;       //濕度最大修正  
  248. if(rh_true<0.1)rh_true=0.1;       //濕度最小修正  
  249. *p_temperature=t_C;               //返回溫度結果  
  250. *p_humidity=rh_true;              //返回濕度結果
  251. }
  252. void main(void)
  253. {  
  254. unsigned int temp,humi,i,j;  
  255. value humi_val,temp_val;  //定義兩個共同體,一個用于濕度,一個用于溫度
  256. unsigned char error;      //用于檢驗是否出現錯誤  
  257. unsigned char checksum;   //  CRC     
  258. init();   
  259. //display1();  
  260. display2();  
  261. display3();   
  262. beep=1;        
  263. s_connectionreset();      //啟動連接復位  
  264. while(1)  
  265. {   
  266. error=0;        //初始化error=0,即沒有錯誤   
  267. error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量  
  268. error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量     
  269. if(error!=0) s_connectionreset();                 ////如果發生錯誤,系統復位      
  270. else      
  271. {     
  272. humi_val.f=(float)humi_val.i;                   //轉換為浮點數      
  273. temp_val.f=(float)temp_val.i;                   //轉換為浮點數        
  274. calc_sth10(&humi_val.f,&temp_val.f);            //修正相對濕度及溫度     
  275.    temp=temp_val.f*10;        
  276. humi=humi_val.f*10; //
  277. wendu[0]=temp/1000+'0';       //溫度百位         
  278. wendu[0]=temp%1000/100+'0';      //溫度十位        
  279. wendu[1]=temp%100/10+'0';   //溫度個位         
  280. wendu[2]=0x2E;      //小數點      
  281. wendu[3]=temp%10+'0';    //溫度小數點后第一位   
  282. displaywendu();          //
  283. shidu[0]=humi/1000+'0';       //濕度百位         
  284. shidu[0]=humi%1000/100+'0';      //濕度十位        
  285. shidu[1]=humi%100/10+'0';   //濕度個位         
  286. shidu[2]=0x2E;      //小數點      
  287. shidu[3]=humi%10+'0';    //濕度小數點后第一位   
  288. displayshidu();        
  289. }   
  290. delay(800);                             //等待足夠長的時間,以現行下一次轉換              
  291. if(t_low==0)     
  292. {     
  293. delay(10);     
  294. if(t_low==0)     
  295. {      
  296. flag_tlow=1;      
  297. flag_thigh=0;      
  298. flag_rlow=0;      
  299. flag_rhigh=0;     
  300. }
  301. }
  302. if(t_high==0)     
  303. {     
  304. delay(10);     
  305. if(t_high==0)     
  306. {      
  307. flag_tlow=0;      
  308. flag_thigh=1;      
  309. flag_rlow=0;      
  310. flag_rhigh=0;     
  311. }   
  312. }      
  313. if(r_low==0)     
  314. {     
  315. delay(10);     
  316. if(r_low==0)     
  317. {      
  318. flag_tlow=0;      
  319. flag_thigh=0;      
  320. flag_rlow=1;      
  321. flag_rhigh=0;     
  322. }
  323. }      
  324. if(r_high==0)     
  325. {     
  326. delay(10);     
  327. if(r_high==0)     
  328. {      
  329. flag_tlow=0;      
  330. flag_thigh=0;      
  331. flag_rlow=0;      
  332. flag_rhigh=1;     
  333. }
  334. }
  335. if( flag_tlow==1)    //1
  336. {   
  337. if(zeng==0)   
  338. {     
  339. delay(10);     
  340. if(zeng==0)     
  341. {      
  342. t_a++;     
  343. if(t_a==99)      
  344. t_a=0;      
  345. if(t_a>=t_b)   
  346. t_a=t_b;
  347. }
  348. }      
  349. if(jian==0)   
  350. {     
  351. delay(10);     
  352. if(jian==0)      
  353. {      
  354. t_a--;      
  355. if(t_a<=0)        
  356. t_a=0;     
  357. }
  358. }
  359. }
  360. if( flag_thigh==1)   
  361. {   
  362. if(zeng==0)   
  363. {     
  364. delay(10);     
  365. if(zeng==0)     
  366. {      
  367. t_b++;      
  368. if(t_b==99)      
  369. t_b=t_a;     
  370. }     
  371. }      
  372. if(jian==0)   
  373. {     
  374. delay(10);     
  375. if(jian==0)     
  376. {      
  377. t_b--;      
  378. if(t_b<=t_a)      
  379. t_b=t_a;     
  380. }
  381. }
  382. }
  383. if( flag_rlow==1)   //3
  384. {   
  385. if(zeng==0)   
  386. {     
  387. delay(10);   
  388. if(zeng==0)
  389. {      
  390. r_a++;
  391. if(r_a==99)      
  392. r_a=0;      
  393. if(r_a>=r_b)      
  394. r_a=r_b;
  395. }
  396. }      
  397. if(jian==0)   
  398. {     
  399. delay(10);     
  400. if(jian==0)     
  401. {      
  402. r_a--;      
  403. if(r_a<=0)      
  404. r_a=0;     
  405. }
  406. }
  407. }
  408. if(flag_rhigh==1)   
  409. {   
  410. if(zeng==0)   
  411. {     
  412. delay(10);     
  413. if(zeng==0)     
  414. {      
  415. r_b++;      
  416. if(r_b==99)      
  417. r_b=r_a;     
  418. }     
  419. }      
  420. if(jian==0)   
  421. {     
  422. delay(10);     
  423. if(jian==0)     
  424. {      
  425. r_b--;      
  426. if(r_b<=r_a)      
  427. r_b=r_a;     
  428. }
  429. }
  430. }
  431. t_fanwei[0]=t_a/10;   
  432. t_fanwei[1]=t_a%10;   
  433. t_fanwei[2]=t_b/10;   
  434. t_fanwei[3]=t_b%10;   
  435. r_fanwei[0]=r_a/10;   
  436. r_fanwei[1]=r_a%10;   
  437. r_fanwei[2]=r_b/10;   
  438. r_fanwei[3]=r_b%10;  
  439. write_con(0x80+9);   
  440. for(i=0;i<2;i++)   
  441. {     
  442. write_data(t_fanwei[i]+0x30);       //  
  443. write_data('1');      
  444. delay_50us(1);      
  445. }   
  446. write_data('-');
  447. write_con(0x80+12);      
  448. for(i=2;i<4;i++)   
  449. {     
  450. write_data(t_fanwei[i]+0x30);       //  
  451. write_data('1');      
  452. delay_50us(1);      
  453. }      
  454. write_data(0xdf);           
  455. write_data('C');     
  456. write_con(0x80+9+0x40);   
  457. for(j=0;j<2;j++)   
  458. {     
  459. write_data(r_fanwei[j]+0x30);     
  460. delay_50us(1);     
  461. }   
  462. write_data('-');   //
  463. write_con(0x80+12+0x40);   
  464. for(j=2;j<4;j++)   
  465. {     
  466. write_data(r_fanwei[j]+0x30);     
  467. delay_50us(1);     
  468. }
  469. write_data('%');
  470. if(temp_val.f<t_a||temp_val.f>t_b||humi_val.f<r_a||humi_val.f>r_b)   
  471. beep = 0;   
  472. else beep = 1;     
  473. }
  474. }  
復制代碼




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:668762 發表于 2019-12-19 22:09 | 只看該作者
顯示不完整是怎么回事
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品中文字幕 | 国产精品久久久久久久免费大片 | 999免费视频| 久草网址 | 久久亚洲91 | 精品一区二区电影 | 一区二区中文 | 91精品国产综合久久福利软件 | 亚洲欧美中文日韩在线v日本 | 午夜精品在线 | 久久久久国产精品 | 国产美女精品视频免费观看 | 91久久国产综合久久 | 国产区在线观看 | 国产精品久久久久久久久免费高清 | 欧美精品欧美精品系列 | 黄色片大全在线观看 | 国产一区二区三区色淫影院 | 欧美专区日韩专区 | 香蕉大人久久国产成人av | 男人天堂社区 | 国产精品福利视频 | 看亚洲a级一级毛片 | 亚洲色视频 | 成人在线播放 | 91精品国产综合久久精品 | 91精品久久久久久久久中文字幕 | 精品久| 欧美成视频在线观看 | 午夜国产羞羞视频免费网站 | 国产欧美一区二区久久性色99 | 国产精品久久久久国产a级 欧美日韩国产免费 | 精品九九| 欧产日产国产精品v | 狠狠操狠狠干 | 三级黄色片在线播放 | 91在线看视频 | 国产免费观看一区 | 久久国产精品亚洲 | 久久久久国产成人精品亚洲午夜 | 久草青青草 |