欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2645|回復(fù): 3
收起左側(cè)

基于單片機(jī)的溫度濕度采集系統(tǒng)程序

[復(fù)制鏈接]
ID:450363 發(fā)表于 2019-2-7 12:13 | 顯示全部樓層 |閱讀模式
基于單片機(jī)的溫度濕度采集系統(tǒng)

因?yàn)樽鲈O(shè)計(jì)所以編寫了這個(gè)程序
將源碼貼上 希望其他人少走彎路
  1. /****************************************************************

  2. 聲明:本程序僅供大家參考學(xué)習(xí),未經(jīng)本人同意禁止用于商業(yè)用途。

  3. ***************************************************************/
  4. #include <reg52.h>
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. #include <intrins.h>

  8. typedef bit BOOL ;

  9. sbit io = P1^1 ;//(口線定義)
  10. sbit bee=P1^0;
  11. sbit rs = P2^5 ;
  12. sbit rw = P2^6 ;
  13. sbit ep = P2^7 ;
  14. bit flag_300ms ;

  15. sbit K1=P1^2;
  16. sbit K2=P1^3;
  17. sbit K3=P1^4;

  18. uchar yemian=0;//(定義變量)
  19. uchar flat=1;
  20. uchar data_byte;
  21. uchar RH,RL,TH,TL;
  22. uchar WenDu,ShiDu;//報(bào)警的溫度和濕度
  23. #include "eeprom52.h"


  24. /****************************延時(shí)程序****************************/
  25. void delay(uchar ms)
  26. { // 延時(shí)子程序
  27. uchar i ;
  28. while(ms--)
  29. {
  30. for(i = 0 ; i<250;i++) ;
  31. }
  32. }

  33. void delay1()//延時(shí)10us
  34. {
  35. uchar i;
  36. i--;
  37. i--;
  38. i--;
  39. i--;
  40. i--;
  41. i--;
  42. }
  43. void longdelay(uchar s) //長(zhǎng)延時(shí)
  44. {
  45. while(s--)
  46. {
  47. delay(20) ;
  48. }
  49. }



  50. /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
  51. void write_eeprom()
  52. {
  53. SectorErase(0x2000);
  54. byte_write(0x2000, WenDu);
  55. byte_write(0x2001, ShiDu);
  56. byte_write(0x2060, a_a);        
  57. }

  58. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/
  59. void read_eeprom()
  60. {
  61. WenDu = byte_read(0x2000);
  62. ShiDu = byte_read(0x2001);
  63. a_a = byte_read(0x2060);
  64. }

  65. /**************開機(jī)自檢eeprom初始化*****************/
  66. void init_eeprom()
  67. {
  68. read_eeprom();        //先讀
  69. if(a_a != 2)        //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
  70. {
  71. WenDu = 30;
  72. ShiDu = 80;
  73. a_a = 2;
  74. write_eeprom();
  75. }        
  76. }



  77. /********************報(bào)警程序部分*******************/
  78. void warn() //報(bào)警函數(shù)
  79. {

  80. if(TH>=WenDu) //檢測(cè)的溫度高于設(shè)定溫度報(bào)警值

  81. {
  82. bee=0; //報(bào)警

  83. }

  84. if(RH>=ShiDu) //檢測(cè)的濕度高于設(shè)定的濕度值

  85. {
  86. bee=0; //報(bào)警
  87. }


  88. if( TH<WenDu && RH<ShiDu )        
  89. {
  90. bee=1; //停止報(bào)警
  91. }


  92. }

  93. /************************LCD模塊******************************************/

  94. BOOL lcd_bz()//測(cè)試LCD忙碌狀態(tài)
  95. {
  96. BOOL result ;
  97. rs = 0 ;
  98. rw = 1 ;
  99. ep = 1 ;
  100. result = (BOOL)(P0 & 0x80) ;
  101. ep = 0 ;
  102. return result ;
  103. }

  104. void write_cmd(uchar cmd)// 寫指令
  105. {
  106. while(lcd_bz()) ;
  107. rs = 0 ;
  108. rw = 0 ;
  109. ep = 0 ;
  110. P0 = cmd ;
  111. ep = 1 ;
  112. ep = 0 ;
  113. }

  114. void write_addr(uchar addr)//寫地址
  115. {
  116. write_cmd(addr|0x80) ;
  117. }

  118. void write_byte(uchar dat)//寫字節(jié)
  119. {
  120. while(lcd_bz()) ;
  121. rs = 1 ;
  122. rw = 0 ;
  123. ep = 0 ;
  124. P0 = dat ;
  125. ep = 1 ;
  126. ep = 0 ;
  127. }

  128. void lcd_init()// 初始化
  129. {
  130. write_cmd(0x38) ;
  131. delay(1);
  132. write_cmd(0x08) ;
  133. delay(1);
  134. write_cmd(0x01) ;
  135. delay(1);
  136. write_cmd(0x06) ;
  137. delay(1);
  138. write_cmd(0x0c) ;
  139. delay(1);
  140. }

  141. void display(uchar addr, uchar q)//在某一地址上顯示一字節(jié)
  142. {
  143. delay(1) ;
  144. write_addr(addr) ;
  145. write_byte(q) ;
  146. delay(1) ;

  147. }

  148. /*********************** DHT11測(cè)試模塊***************************************/

  149. void start()//開始信號(hào)
  150. {
  151. io=1;
  152. delay1();
  153. io=0;
  154. delay(20);//>18ms
  155. io=1;
  156. delay1();//20-40us
  157. delay1();
  158. delay1();
  159. delay1();
  160. delay1();
  161. }
  162. uchar receive_byte()//接收一個(gè)字節(jié)
  163. {
  164. uchar i,temp,count;
  165. for(i=0;i<8;i++)
  166. {
  167. temp=0;
  168. delay1();delay1();delay1();delay1();
  169. if(io==1)temp=1;
  170. count=2;
  171. while((io)&&count++);
  172. if(count==1)break;
  173. data_byte<<=1;        
  174. data_byte|=temp;
  175. }
  176. return data_byte;
  177. }
  178. void receive()//接收數(shù)據(jù)
  179. {
  180. uchar T_H,T_L,R_H,R_L,check,num_check;
  181. uchar count;
  182. start();//開始信號(hào)
  183. io=1;
  184. if(!io)//讀取DHT11響應(yīng)信號(hào)
  185. {

  186. while((io)&&count++);
  187. R_H=receive_byte();
  188. R_L=receive_byte();
  189. T_H=receive_byte();
  190. T_L=receive_byte();
  191. check=receive_byte();
  192. io=0;//拉低延時(shí)50us
  193. delay1();delay1();delay1();delay1();delay1();
  194. io=1;
  195. num_check=R_H+R_L+T_H+T_L;
  196. if(num_check=check)
  197. {
  198. RH=R_H;
  199. RL=R_L;
  200. TH=T_H;
  201. TL=T_L;
  202. check=num_check;
  203. }
  204. }
  205. }


  206. void showw() // 問候語函數(shù)
  207. {
  208. lcd_init(); //初始化
  209. delay(10);

  210. display(0x05,'W');
  211. display(0x06,'e');
  212. display(0x07,'l');
  213. display(0x08,'c');
  214. display(0x09,'o');
  215. display(0x0a,'m');
  216. display(0x0b,'e');
  217. delay(250); //短暫延時(shí)
  218. delay(250);
  219. delay(250);


  220. /*********************************/
  221. /*
  222. display(0x40,' ') ;
  223. display(0x41,'h');
  224. display(0x42,'e');

  225. */
  226. }


  227. /*************定時(shí)器0初始化程序***************/
  228. void time_init()        
  229. {
  230. EA = 1;        //開總中斷
  231. TMOD = 0X01;        //定時(shí)器0、定時(shí)器1工作方式1
  232. ET0 = 1;        //開定時(shí)器0中斷
  233. TR0 = 1;        //允許定時(shí)器0定時(shí)
  234. }



  235. void key() //按鍵程序 選擇菜單模式
  236. {

  237. if(!K1)
  238. {
  239. delay(20);
  240. if(!K1)
  241. {
  242. while(!K1)
  243. ;
  244. yemian++;
  245. flat++;
  246. if(yemian>=3) { yemian=0; }

  247. }
  248. }



  249. }


  250. shezhi() //對(duì)里面的數(shù)值進(jìn)行修改
  251. {
  252. if(!K2)
  253. {
  254. delay(50);
  255. if(!K2)
  256. {
  257. ;

  258. if(yemian==1)
  259. {
  260. WenDu+=1;
  261. if(WenDu>99) { WenDu=99; } //濕度上限加
  262. }

  263. if(yemian==2)
  264. {
  265. ShiDu+=1;
  266. if(ShiDu>99) { ShiDu=99; } //濕度下限加
  267. }

  268. write_eeprom(); //保存數(shù)據(jù)        
  269. }
  270. }

  271. if(!K3)
  272. {
  273. delay(50);
  274. if(!K3)
  275. {

  276. ;
  277. if(yemian==1)
  278. {
  279. WenDu-=1; //濕度下限減
  280. if(WenDu<1) {WenDu=1; }
  281. }

  282. if(yemian==2)
  283. {
  284. ShiDu-=1; //濕度下限減
  285. if(ShiDu<1) { ShiDu=1; }
  286. }
  287. write_eeprom(); //保存數(shù)據(jù)        
  288. }
  289. }

  290. }



  291. /***************************主程序*********************************/
  292. void main()
  293. {
  294. init_eeprom(); //讀eeprom數(shù)據(jù)
  295. time_init();        //初始化定時(shí)器
  296. showw(); //顯示問候語 和名字

  297. while(1)
  298. {

  299. key();
  300. //====================yemian==0時(shí) 進(jìn)入工作狀態(tài)=================================
  301. if(yemian==0)
  302. {
  303. if(flat==1)
  304. {
  305. flat=0;
  306. lcd_init(); //初始化

  307. display(0x00,'T') ; //Temp
  308. display(0x01,'e');
  309. display(0x02,'m');
  310. display(0x03,'p');
  311. display(0x04,':');

  312. display(0x08,0xdf); // 度
  313. display(0x09,'C');


  314. display(0x40,'H') ; //Humi
  315. display(0x41,'u');
  316. display(0x42,'m');
  317. display(0x43,'i');
  318. display(0x44,':');

  319. display(0x47,'%');
  320. display(0x48,'R');
  321. display(0x49,'H');

  322. display(0x0c,'T');
  323. display(0x0d,':');
  324. display(0x0e,WenDu/10+0x30); //報(bào)警溫度
  325. display(0x0f,WenDu%10+0x30);

  326. display(0x4c,'H');
  327. display(0x4d,':');
  328. display(0x4e,ShiDu/10+0x30); //報(bào)警濕度
  329. display(0x4f,ShiDu%10+0x30);

  330. }

  331. if(flag_300ms == 1)
  332. {        
  333. flag_300ms = 0;
  334. receive();

  335. display(0x05,TH/10+0x30); //溫度顯示
  336. display(0x06,TH%10+0x30);

  337. display(0x45,RH/10+0x30); //濕度顯示
  338. display(0x46,RH%10+0x30);


  339. warn();
  340. }

  341. }        

  342. //====================yemian==1 溫度設(shè)置===========================
  343. if(yemian==1) //溫度
  344. {
  345. if(flat==1)
  346. {
  347. flat=0;
  348. bee=1;
  349. lcd_init(); //初始化
  350. display(0x06,'T');
  351. display(0x07,'e');
  352. display(0x08,'m');
  353. display(0x09,'p');
  354. }

  355. shezhi();
  356. display(0x47,WenDu/10+0x30); //溫度
  357. display(0x48,WenDu%10+0x30);
  358. }

  359. //====================yemian==1濕度設(shè)置==========================        
  360. if(yemian==2) //濕度設(shè)置
  361. //因篇幅原因代碼程序放到附件
復(fù)制代碼



基于單片機(jī)的溫度濕度采集系統(tǒng).zip

74.17 KB, 下載次數(shù): 17, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:354566 發(fā)表于 2019-2-8 10:40 | 顯示全部樓層
很實(shí)用啊,但我看那個(gè)原理圖里面怎么沒有濕度傳感器
回復(fù)

使用道具 舉報(bào)

ID:412814 發(fā)表于 2019-2-8 18:16 | 顯示全部樓層
謝謝樓主,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:475326 發(fā)表于 2019-2-8 19:16 | 顯示全部樓層
kaitaoguo 發(fā)表于 2019-2-8 10:40
很實(shí)用啊,但我看那個(gè)原理圖里面怎么沒有濕度傳感器

可以發(fā)一份附件給我嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表