找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1987|回复: 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 单片机教程网

快速回复 返回顶部 返回列表