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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的溫度濕度采集系統程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:450363 發表于 2019-2-7 12:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于單片機的溫度濕度采集系統

因為做設計所以編寫了這個程序
將源碼貼上 希望其他人少走彎路
  1. /****************************************************************

  2. 聲明:本程序僅供大家參考學習,未經本人同意禁止用于商業用途。

  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;//報警的溫度和濕度
  23. #include "eeprom52.h"


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

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



  50. /******************把數據保存到單片機內部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. /******************把數據從單片機內部eeprom中讀出來*****************/
  59. void read_eeprom()
  60. {
  61. WenDu = byte_read(0x2000);
  62. ShiDu = byte_read(0x2001);
  63. a_a = byte_read(0x2060);
  64. }

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



  77. /********************報警程序部分*******************/
  78. void warn() //報警函數
  79. {

  80. if(TH>=WenDu) //檢測的溫度高于設定溫度報警值

  81. {
  82. bee=0; //報警

  83. }

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

  85. {
  86. bee=0; //報警
  87. }


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


  92. }

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

  94. BOOL lcd_bz()//測試LCD忙碌狀態
  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)//寫字節
  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)//在某一地址上顯示一字節
  142. {
  143. delay(1) ;
  144. write_addr(addr) ;
  145. write_byte(q) ;
  146. delay(1) ;

  147. }

  148. /*********************** DHT11測試模塊***************************************/

  149. void start()//開始信號
  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()//接收一個字節
  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()//接收數據
  179. {
  180. uchar T_H,T_L,R_H,R_L,check,num_check;
  181. uchar count;
  182. start();//開始信號
  183. io=1;
  184. if(!io)//讀取DHT11響應信號
  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;//拉低延時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() // 問候語函數
  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); //短暫延時
  218. delay(250);
  219. delay(250);


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

  225. */
  226. }


  227. /*************定時器0初始化程序***************/
  228. void time_init()        
  229. {
  230. EA = 1;        //開總中斷
  231. TMOD = 0X01;        //定時器0、定時器1工作方式1
  232. ET0 = 1;        //開定時器0中斷
  233. TR0 = 1;        //允許定時器0定時
  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() //對里面的數值進行修改
  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(); //保存數據        
  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(); //保存數據        
  288. }
  289. }

  290. }



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

  297. while(1)
  298. {

  299. key();
  300. //====================yemian==0時 進入工作狀態=================================
  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); //報警溫度
  325. display(0x0f,WenDu%10+0x30);

  326. display(0x4c,'H');
  327. display(0x4d,':');
  328. display(0x4e,ShiDu/10+0x30); //報警濕度
  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 溫度設置===========================
  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濕度設置==========================        
  360. if(yemian==2) //濕度設置
  361. //因篇幅原因代碼程序放到附件
復制代碼



基于單片機的溫度濕度采集系統.zip

74.17 KB, 下載次數: 17, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發
ID:354566 發表于 2019-2-8 10:40 | 只看該作者
很實用啊,但我看那個原理圖里面怎么沒有濕度傳感器
回復

使用道具 舉報

板凳
ID:412814 發表于 2019-2-8 18:16 | 只看該作者
謝謝樓主,學習了
回復

使用道具 舉報

地板
ID:475326 發表于 2019-2-8 19:16 | 只看該作者
kaitaoguo 發表于 2019-2-8 10:40
很實用啊,但我看那個原理圖里面怎么沒有濕度傳感器

可以發一份附件給我嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本精品久久久久久久 | 日本aaa视频 | 色.com| 日韩精品一区二区三区视频播放 | 成人精品一区二区 | 高清欧美性猛交xxxx黑人猛交 | 女同久久| 欧美午夜在线 | 日韩欧美1区2区 | caoporn视频| 亚洲成人精选 | 麻豆成人在线视频 | 日日躁狠狠躁aaaaxxxx | 在线中文视频 | 日韩三级一区 | 国产精品欧美一区喷水 | 亚洲精品乱码久久久久久按摩观 | 色吧综合网 | 欧美成人一区二区三区 | 欧美精品一区二区三区在线播放 | 欧美亚洲视频在线观看 | 日韩精品一区二区三区视频播放 | a级毛片国产 | 中文字幕在线精品 | 欧美精品中文字幕久久二区 | www精品| 久久乐国产精品 | 91久久精品一区二区二区 | 免费观看色 | 精品自拍视频 | 韩国av一区二区 | 欧美综合一区二区三区 | 黄在线免费观看 | 一级高清视频 | 青草福利 | 亚洲综合二区 | 亚洲精品观看 | 国产亚洲精品美女久久久久久久久久 | 四虎影音 | 久久久国产精品 | 国产三级日本三级 |