找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3062|回复: 1
打印 上一主题 下一主题
收起左侧

DHT11温湿度检测+时钟 51单片机源码

[复制链接]
跳转到指定楼层
楼主
帮别人做了个毕设,顺便把资料分享一下把,可以实现DHT11温湿度检测以及电子时钟在LCD1602上的显示,时钟可以调整分,时,日,月四项,有需要的可以自己加入年的调整

  1. #include<reg52.h>  
  2. #include<intrins.h>  //包含_nop_()函数定义的头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;
  7. typedef bit BOOL;
  8. uchar data_byte;
  9. uchar RH,RL,TH,TL;
  10. uchar deda=0;
  11. uchar hour=0,min=0,sec=0,date=1,month=3,year=17;
  12. //uchar string[]="WeiHongmouzhizuo";
  13. uchar string2[]="0123456789";//要显示的字符串

  14. sbit DHT11=P1^0;  //DHT11数据位
  15. sbit RS=P2^5;    //寄存器选择位
  16. sbit RW=P2^6;    //读写选择位
  17. sbit E=P2^7;     //使能信号位
  18. sbit BF=P0^7;    //忙碌标志位
  19. sbit k4=P2^4;         //调整时间
  20. sbit k3=P2^3;
  21. sbit k2=P2^2;
  22. sbit k1=P2^1;
  23. //const uchar string1[ ]={"    mazirong     "};
  24. //const uchar string2[ ]={"TEL:13297961386  "};
  25. /*****************************************************
  26. 函数功能:判断液晶模块的忙碌状态
  27. 返回值:result。result=1,忙碌;result=0,不忙
  28. ***************************************************/

  29. //*********************延时1ms
  30. void delay(uchar z)                  
  31. {
  32. unsigned int x,y;
  33. for(x=z;x>0;x--)
  34. for(y=123;y>0;y--);
  35. }
  36. //*********************延时10us
  37. void delay1()         
  38. {
  39. uchar i;
  40. i--;
  41. i--;
  42. i--;
  43. i--;
  44. i--;
  45. i--;
  46. }
  47. //******************走时函数
  48. void init_timer()
  49. {
  50.   TMOD=0x01;
  51.   TH0=-(4800/256);
  52.   TL0=-(4800%256);
  53.   IE=0x82;
  54.   TR0=1;
  55. }
  56. ////用延时函数代替检测STA7状态的函数
  57. void check()
  58. {
  59. uint a;
  60. for(a=0;a<1200;a++);
  61. }
  62. //**************各月份天数
  63. /*void inter_month()
  64. {
  65.      switch(month)
  66.          {
  67.           case1:
  68.           case3:
  69.           case5:
  70.           case7:
  71.           case8:
  72.           case10:
  73.           case12:if(date==32)
  74.                     {
  75.                       date=1;
  76.                       month++;
  77.                       if(month==13)
  78.                           {
  79.                             month=1;
  80.                             year++;
  81.                           }
  82.                     };
  83.           break;//若是大月,则有31天
  84.           case4:
  85.           case6:
  86.           case9:
  87.           case11:if(date==31)
  88.                     {
  89.                       date=1;
  90.                       month++;
  91.                       if(month==13)
  92.                           {
  93.                             month=1;
  94.                             year++;
  95.                           }
  96.                     };
  97.           break;//若是小月,则有30天
  98.           case2:if(year%4==0)
  99.                     {
  100.                       if(date==30)
  101.                          {
  102.                           date=1;
  103.                           month++;
  104.                           if(month==13)
  105.                             {
  106.                               month=1;
  107.                               year++;
  108.                             }
  109.                          }
  110.                     }//闰年二月有29天
  111.            else
  112.            if(date==29)
  113.                  {
  114.                     date=1;
  115.                     month++;
  116.                     if(month==13)
  117.                          {
  118.                            month=1;
  119.                            year++;
  120.                          }
  121.                  };//平年二月28天
  122.                  break;
  123.                  default:break;
  124.           }
  125. }
  126. */
  127. //*******************时间、日期走时单元
  128. void conv()
  129. {
  130. if(sec==60)
  131. {
  132. min++;
  133. sec=0;
  134. if(min==60)
  135. {
  136. min=0;
  137. hour++;
  138. if(hour==24)
  139. {
  140. hour=0;
  141. date++;
  142. //inter_month();
  143. if(month==13)
  144. {
  145. year++;
  146. month=1;
  147. if(year==100)year=0;
  148. }
  149. }
  150. }
  151. }
  152. }

  153. //*********************50ms定时中断
  154. void T0_srv(void)interrupt 1
  155. {
  156. TH0=-(50000/256);
  157. TL0=-(50000%256);
  158. deda++;
  159. if(deda==20)
  160. {
  161. sec++;
  162. deda=0;
  163. conv();
  164. }
  165. }
  166. //****************时间调整函数
  167. void set_time()
  168. {
  169. if(!k4)//min
  170. {
  171. delay(20);
  172. if(!k4)
  173. {
  174. min++;
  175. if(min==61)
  176. {
  177. min=0;
  178. }
  179. }
  180. }
  181. if(!k3)//hour
  182. {
  183. delay(20);
  184. if(!k3)
  185. {
  186. hour++;
  187. if(hour==25)
  188. {
  189. hour=0;
  190. }
  191. }
  192. }
  193. if(!k2)//date
  194. {
  195. delay(20);
  196. if(!k2)
  197. {
  198. date++;
  199. if(date==32)
  200. {
  201. date=1;
  202. }
  203. }
  204. }
  205. if(!k1)//month
  206. {
  207. delay(20);
  208. if(!k1)
  209. {
  210. month++;
  211. if(month==13)
  212. {
  213. month=1;
  214. }
  215. }
  216. }
  217. }


  218. //测试忙碌状态
  219. uchar lcd_bz()
  220. {
  221.     bit result;
  222.     RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
  223.     RW=1;
  224.     E=1;        //E=1,才允许读写
  225.     _nop_();   //空操作
  226.     _nop_();
  227.     _nop_();
  228.     _nop_();   //空操作四个机器周期,给硬件反应时间
  229.     result=BF;  //将忙碌标志电平赋给result
  230.     E=0;
  231.     return result;
  232. }
  233. //********************写指令
  234. void write_cmd(uchar cmd)
  235. {  
  236. check();
  237. //while(lcd_bz()==1);
  238. RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
  239. RW=0;  
  240. E=0;                   //E置低电平(写指令时,E为高脉冲)
  241. _nop_();
  242. _nop_();                            // 就是让E从0到1发生正跳变,所以应先置"0"
  243. P0=cmd;            //将数据送入P0口,即写入指令或地址
  244. _nop_();
  245. _nop_();
  246. _nop_();
  247. _nop_();
  248.   E=1;                   //E置高电平
  249.   _nop_();
  250.   _nop_();
  251.   _nop_();
  252.   _nop_();               //空操作四个机器周期,给硬件反应时间
  253.    E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
  254. }
  255. //*********************写地址
  256. void write_addr(uchar addr)
  257. {
  258. write_cmd(addr|0x80);
  259. }
  260. //*********************写数据
  261. void write_byte(uchar dat)
  262. {
  263.   check();
  264. //while(lcd_bz()==1);   
  265. RS=1;   //RS为高电平,RW为低电平时,可以写入数据
  266. RW=0;
  267. E=0;            //(写指令时,E为高脉冲)
  268.                     // 就是让E从0到1发生正跳变,所以应先置"0"
  269. _nop_();
  270. _nop_();
  271. P0=dat;         //将数据送入P0口,即将数据写入液晶模块
  272. _nop_();
  273. _nop_();
  274. _nop_();
  275. _nop_();
  276.   E=1;          //E置高电平
  277.   _nop_();
  278.   _nop_();



  279. …………余下代码请下载附件…………
复制代码

下载:
温度显示.rar (2.75 KB, 下载次数: 61)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:188601 发表于 2017-5-13 16:07 | 只看该作者
下载显示都是00怎么回事啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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