找回密码
 立即注册

QQ登录

只需一步,快速开始

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

共享一个DHT11温湿度测试单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:286781 发表于 2018-3-1 22:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个DHT11温湿度测试程序

单片机源程序如下:
  1. /*******************************************************************************/
  2. //DHT11温湿度测试程序
  3. //P0作为LCD的数据控制口,P2.0 作为DHT11data总线 ,P2.1作为状态显示
  4. //作者:赵军伟 兰州大学信息科学与工程学院 08级通信工程一班
  5. /********************************************************************************/
  6. #include <reg52.h>
  7. #include <intrins.h>
  8. typedef unsigned char unint8;
  9. typedef unsigned char unint16;
  10. unsigned char str1[]={"        "};
  11. unsigned char str2[]={"        "};
  12. unsigned char code dis1[] = {"TRH RH: "};
  13. unsigned char code dis2[] = {"TRH  T: "};
  14. sbit TRH = P2^1;//温湿度传感器DHT11数据接入
  15. sbit ST  = P2^2;//状态显示,是为了方便调试,具体使用的时候可以不要
  16. sbit LCD_RS = P3^5;            
  17. sbit LCD_RW = P3^6;
  18. sbit LCD_EN = P3^4;
  19. unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
  20. unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
  21. unint8 com_data,untemp,temp;
  22. unint8 respond;
  23. /*********************************************************************************/
  24. void delayNOP()
  25. {
  26.          _nop_();
  27.          _nop_();
  28.          _nop_();
  29.          _nop_();
  30. }
  31. /*********************************************************************************/

  32. /*********************************************************************************/
  33. // 毫秒级延时子程序
  34. /*********************************************************************************/
  35. void delay_ms(unsigned char ms)
  36. {      
  37.           unsigned char i;
  38.           while(ms--)
  39.           {
  40.                     for(i = 0; i< 150; i++)
  41.                     {
  42.                               _nop_();
  43.                               _nop_();
  44.                               _nop_();
  45.                               _nop_();
  46.                     }
  47.           }
  48. }
  49. /*********************************************************************************/

  50. /*********************************************************************************/
  51. //5us级延时程序
  52. /*********************************************************************************/
  53. void delay_us()
  54. {
  55.            unint8 i;
  56.           i--;
  57.           i--;
  58.           i--;
  59.           i--;
  60.           i--;
  61.           i--;
  62. }
  63. /********************************************************************************/

  64.       
  65. /********************************************************************************/
  66. // 测试LCD忙碌状态
  67. //lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。
  68. /********************************************************************************/
  69. bit lcd_busy()
  70. {      
  71.          bit result;
  72.          LCD_RS = 0;
  73.          LCD_RW = 1;
  74.          LCD_EN = 1;
  75.           delayNOP();
  76.          result = (bit)(P0&0x80);
  77.          LCD_EN = 0;
  78.          return(result);
  79. }
  80. /*******************************************************************************/

  81. /*******************************************************************************/
  82. // 写入指令数据到LCD
  83. /*******************************************************************************/
  84. void lcd_wcmd(unsigned char cmd)
  85. {      
  86.          while(lcd_busy());
  87.          LCD_RS = 0;
  88.          LCD_RW = 0;
  89.          LCD_EN = 0;
  90.           _nop_();
  91.           _nop_();
  92.          P0 = cmd;
  93.           delayNOP();
  94.          LCD_EN = 1;
  95.          delayNOP();
  96.          LCD_EN = 0;
  97. }
  98. /*****************************************************************************/

  99. /*****************************************************************************/
  100. //写显示数据到LCD                                                
  101. //RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。                             
  102. /*****************************************************************************/
  103. void lcd_wdata(unsigned char dat)
  104. {                          
  105.          while(lcd_busy());
  106.           LCD_RS = 1;
  107.          LCD_RW = 0;
  108.          LCD_EN = 0;
  109.          P0 = dat;
  110.          delayNOP();
  111.          LCD_EN = 1;
  112.          delayNOP();
  113.          LCD_EN = 0;
  114. }
  115. /****************************************************************************/

  116. /****************************************************************************/
  117. //LCD初始化设定
  118. /****************************************************************************/
  119. void lcd_init()
  120. {
  121.         delay_ms(15);                  
  122.         lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
  123.         delay_ms(5);
  124.         lcd_wcmd(0x38);         
  125.         delay_ms(5);
  126.         lcd_wcmd(0x38);         
  127.         delay_ms(5);
  128.         lcd_wcmd(0x0c);      //显示开,关光标
  129.         delay_ms(5);
  130.         lcd_wcmd(0x06);      //移动光标
  131.         delay_ms(5);
  132.         //lcd_wcmd(0x01);      //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
  133.         //delay_ms(5);
  134. }
  135. /****************************************************************************/

  136. /****************************************************************************/
  137. //设定LCD显示位置
  138. /****************************************************************************/
  139. void lcd_dis_pos(unsigned char pos)
  140. {      
  141.           lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
  142. }
  143. /****************************************************************************/

  144. /****************************************************************************/
  145. //收发信号检测,数据读取
  146. /****************************************************************************/
  147. char receive()
  148. {   
  149.           unint8 i;
  150.           ST=0;
  151.           com_data=0;
  152.           for(i=0;i<=7;i++)   
  153.          {
  154.                     respond=2;
  155.                     while((!TRH)&&respond++);
  156.                     delay_us();
  157.                     delay_us();
  158.                     delay_us();
  159.                     if(TRH)
  160.                     {
  161.                               temp=1;
  162.                               respond=2;
  163.                               while((TRH)&&respond++);
  164.                     }
  165.                     else
  166.                               temp=0;
  167.                     com_data<<=1;
  168.                     com_data|=temp;   
  169.           }
  170.           return(com_data);  
  171. }
  172. /****************************************************************************/

  173. /****************************************************************************/
  174. //湿度读取子程序
  175. //温度高8位== TH_data
  176. //温度低8位== TL_data
  177. //湿度高8位== RH_data
  178. //湿度低8位== RL_data
  179. //校验 8位 == CK_data
  180. //调用的程序有 delay();, Delay_5us();,RECEIVE();
  181. /***************************************************************************/
  182. void read_TRH()
  183. {
  184.           //主机拉低18ms
  185.           TRH=0;
  186.          delay_ms(18);
  187.          TRH=1;
  188.           //DATA总线由上拉电阻拉高 主机延时20us
  189.          delay_us();
  190.          delay_us();
  191.          delay_us();
  192.          delay_us();
  193.           //delay_us();
  194.           //delay_us();delay_us();delay_us();delay_us();
  195.           //主机设为输入 判断从机响应信号
  196.              TRH=1;
  197.           //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行   
  198.          if(!TRH)   
  199.          {
  200.                   respond=2;
  201.                   //判断DHT11发出 80us 的低电平响应信号是否结束
  202.                   while((!TRH)&& respond++);
  203.                  respond=2;
  204.                  //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  205.                 while(TRH && respond++);
  206.                //数据接收状态   
  207.                 RH_temp = receive();
  208.                 RL_temp = receive();
  209.                 TH_temp = receive();
  210.                 TL_temp = receive();
  211.                 CK_temp = receive();
  212.                 TRH=1;ST=1;     
  213.                  //数据校验
  214.                  untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
  215.                  if(untemp==CK_temp)
  216.                  {
  217.                           RH_data = RH_temp;
  218.                           RL_data = RL_temp;
  219.                          TH_data = TH_temp;
  220.                           TL_data = TL_temp;
  221.                           CK_data = CK_temp;
  222.                 }
  223.         }
  224.          //湿度整数部分
  225.          str1[0] = (char)(0X30+RH_data/10);
  226.          str1[1] = (char)(0X30+RH_data%10);
  227.          str1[2] =  0x2e; //小数点
  228.           //湿度小数部分
  229.          str1[3] = (char)(0X30+RL_data/10);
  230.           str1[5] = 0X25; //"%"
  231.          str1[6] = 0X52; //"R"
  232.          str1[7] = 0X48; //"H"
  233.          //温度整数部分
  234.          str2[0] = (char)(0X30+TH_data/10);
  235.          str2[1] = (char)(0X30+TH_data%10);
  236.          str2[2] =  0x2e; //小数点
  237.          //温度小数部分
  238.           str2[3] = (char)(0X30+TL_data/10);
  239.           str2[5] = 0X27;  //"'"
  240.           str2[6] = 0X43;  //"C"
  241. }
  242. /****************************************************************************/
  243. //主函数
  244. //TH,TL,RH,RL分别代表温湿度的整数和小数部分
  245. /****************************************************************************/
  246. void main()
  247. {
  248.           unsigned char i,n=0x40,m;
  249.           lcd_init();
  250.           delay_us();
  251.           while(1)
  252.           {
  253. ……………………

  254. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
main.rar (2.26 KB, 下载次数: 25)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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