找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3488|回复: 2
收起左侧

DHT11温湿度1602显示的单片机程序

[复制链接]
ID:230034 发表于 2017-8-30 13:01 | 显示全部楼层 |阅读模式
利用89c52,用DHT11,将温湿显示到LCD1602屏幕上

单片机源程序如下:
  1. //****************************************************************//

  2. #include <reg52.h>
  3. #include <intrins.h>
  4. //
  5. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量  */
  6. typedef signed   char  S8;       /* defined for signed 8-bits integer variable                  有符号8位整型变量  */
  7. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           无符号16位整型变量 */
  8. typedef signed   int   S16;      /* defined for signed 16-bits integer variable           有符号16位整型变量 */
  9. typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable           无符号32位整型变量 */
  10. typedef signed   long  S32;      /* defined for signed 32-bits integer variable           有符号32位整型变量 */
  11. typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
  12. typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
  13. //
  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. #define   Data_0_time    4
  17. U8 str1[]={" "};
  18. U8 str2[]={" "};


  19. //----------------------------------------------//
  20. //----------------IO口定义区--------------------//
  21. //----------------------------------------------//
  22. sbit  P2_0  = P2^0 ;

  23. sbit RS = P2^6;   //定义端口
  24. sbit RW = P2^5;
  25. sbit EN = P2^7;


  26. #define RS_CLR RS=0
  27. #define RS_SET RS=1

  28. #define RW_CLR RW=0
  29. #define RW_SET RW=1

  30. #define EN_CLR EN=0
  31. #define EN_SET EN=1

  32. #define DataPort P0
  33. //----------------------------------------------//
  34. //----------------定义区--------------------//
  35. //----------------------------------------------//
  36. U8  TH_data,TL_data,RH_data,RL_data,CK_data;
  37. U8  U8FLAG,k;
  38. U8  U8count,U8temp;
  39. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  40. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  41. U8  U8comdata;







  42. void delayms(U16 xms)
  43.    {
  44.    U16 i,j;
  45.   for(i=xms;i>0;i--)
  46.    {
  47.    for(j=110;j>0;j--);
  48.    }

  49.    }

  50. void Delay(U16 j)
  51.     {      U8 i;
  52.             for(;j>0;j--)
  53.           {         
  54.                 for(i=0;i<27;i++);

  55.           }
  56.     }

  57. void  Delay_10us(void)
  58.       {
  59.         U8 i;
  60.         i--;
  61.         i--;
  62.         i--;
  63.         i--;
  64.         i--;
  65.         i--;
  66.        }



  67. /*------------------------------------------------
  68. mS延时函数,含有输入参数 unsigned char t,无返回值
  69. unsigned char 是定义无符号字符变量,其值的范围是
  70. 0~255 这里使用晶振12M,精确延时请使用汇编
  71. ------------------------------------------------*/

  72. /*------------------------------------------------
  73.               判忙函数
  74. ------------------------------------------------*/
  75. bit LCD_Check_Busy(void)
  76. {
  77. DataPort= 0xFF;
  78. RS_CLR;
  79. RW_SET;
  80. EN_CLR;
  81. _nop_();
  82. EN_SET;
  83. return (bit)(DataPort & 0x80);
  84. }
  85. /*------------------------------------------------
  86.               写入命令函数
  87. ------------------------------------------------*/
  88. void LCD_Write_Com(unsigned char com)
  89. {  
  90. while(LCD_Check_Busy()); //忙则等待
  91. RS_CLR;
  92. RW_CLR;
  93. EN_SET;
  94. DataPort= com;
  95. _nop_();
  96. EN_CLR;
  97. }
  98. /*------------------------------------------------
  99.               写入数据函数
  100. ------------------------------------------------*/
  101. void LCD_Write_Data(unsigned char Data)
  102. {
  103. while(LCD_Check_Busy()); //忙则等待
  104. RS_SET;
  105. RW_CLR;
  106. EN_SET;
  107. DataPort= Data;
  108. _nop_();
  109. EN_CLR;
  110. }

  111. /*------------------------------------------------
  112.                 清屏函数
  113. ------------------------------------------------*/
  114. void LCD_Clear(void)
  115. {
  116. LCD_Write_Com(0x01);
  117. delayms(1);
  118. }
  119. /*------------------------------------------------
  120.               写入字符串函数
  121. ------------------------------------------------*/
  122. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  123. {     
  124. if (y == 0)
  125.         {     
  126.          LCD_Write_Com(0x80 + x);     //表示第一行
  127.         }
  128. else
  129.         {      
  130.         LCD_Write_Com(0xC0 + x);      //表示第二行
  131.         }        
  132. while (*s)
  133.         {     
  134. LCD_Write_Data( *s);     
  135. s ++;     
  136.         }
  137. }
  138. /*------------------------------------------------
  139.               写入字符函数
  140. ------------------------------------------------*/
  141. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  142. {     
  143. if (y == 0)
  144.         {     
  145.         LCD_Write_Com(0x80 + x);     
  146.         }   
  147. else
  148.         {     
  149.         LCD_Write_Com(0xC0 + x);     
  150.         }        
  151. LCD_Write_Data( Data);  
  152. }
  153. /*------------------------------------------------
  154.               初始化函数
  155. ------------------------------------------------*/
  156. void LCD_Init(void)
  157. {
  158.    LCD_Write_Com(0x38);    /*显示模式设置*/
  159.    delayms(5);
  160.    LCD_Write_Com(0x38);
  161.    delayms(5);  
  162.    LCD_Write_Com(0x38);
  163.    delayms(5);  
  164.    LCD_Write_Com(0x38);  
  165.    LCD_Write_Com(0x08);    /*显示关闭*/
  166.    LCD_Write_Com(0x01);    /*显示清屏*/
  167.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  168.    delayms(5);  
  169.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  170.    }
  171.         
  172.      void  COM(void)
  173.       {

  174.                 U8 i;

  175.        for(i=0;i<8;i++)           
  176.             {
  177.                
  178.                        U8FLAG=2;        
  179.                    while((!P2_0)&&U8FLAG++);
  180.                         Delay_10us();
  181.                     Delay_10us();
  182.                         Delay_10us();
  183.                           U8temp=0;
  184.              if(P2_0)U8temp=1;
  185.                     U8FLAG=2;
  186.                  while((P2_0)&&U8FLAG++);
  187.                    //超时则跳出for循环                  
  188.                     if(U8FLAG==1)break;
  189.                    //判断数据位是0还是1         
  190.                      
  191.                 // 如果高电平高过预定0高电平值则数据位为 1
  192.                     
  193.                    U8comdata<<=1;
  194.                       U8comdata|=U8temp;        //0
  195.              }//rof
  196.            
  197.         }

  198.         //--------------------------------
  199.         //-----湿度读取子程序 ------------
  200.         //--------------------------------
  201.         //----以下变量均为全局变量--------
  202.         //----温度高8位== U8T_data_H------
  203.         //----温度低8位== U8T_data_L------
  204.         //----湿度高8位== U8RH_data_H-----
  205.         //----湿度低8位== U8RH_data_L-----
  206.         //----校验 8位 == U8checkdata-----
  207.         //----调用相关子程序如下----------
  208.         //---- Delay();, Delay_10us();,COM();
  209.         //--------------------------------

  210.         void RH(void)
  211.         {
  212.           //主机拉低18ms
  213.        P2_0=0;
  214.            Delay(180);
  215.            P2_0=1;
  216.          //总线由上拉电阻拉高 主机延时20us
  217.            Delay_10us();
  218.            Delay_10us();
  219.            Delay_10us();
  220.            Delay_10us();
  221.          //主机设为输入 判断从机响应信号
  222.            P2_0=1;
  223.          //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
  224.            if(!P2_0)                 //T !         
  225.            {
  226.            U8FLAG=2;
  227.          //判断从机是否发出 80us 的低电平响应信号是否结束         
  228.            while((!P2_0)&&U8FLAG++);
  229.            U8FLAG=2;
  230.          //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  231.            while((P2_0)&&U8FLAG++);
  232.          //数据接收状态                 
  233.            COM();
  234.            U8RH_data_H_temp=U8comdata;
  235.            COM();
  236.            U8RH_data_L_temp=U8comdata;
  237.            COM();
  238.            U8T_data_H_temp=U8comdata;
  239.            COM();
  240.            U8T_data_L_temp=U8comdata;
  241.            COM();
  242.            U8checkdata_temp=U8comdata;
  243.            P2_0=1;
  244.          //数据校验
  245.          
  246.            U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  247.            if(U8temp==U8checkdata_temp)
  248.            {
  249.                      U8RH_data_H=U8RH_data_H_temp;
  250.                      U8RH_data_L=U8RH_data_L_temp;
  251.                   U8T_data_H=U8T_data_H_temp;
  252.                      U8T_data_L=U8T_data_L_temp;
  253.                      U8checkdata=U8checkdata_temp;
  254.            }//fi
  255.            }//fi

  256.         }
  257.         
  258. void main()
  259. {
  260.         
  261.          LCD_Init();
  262.          LCD_Clear();//清屏
  263.          LCD_Write_String(0,0,"shidu:");
  264.          LCD_Write_String(0,1,"wendu:");
  265.                  LCD_Write_Char(9,0,'%');
  266.                  LCD_Write_String(10,1,"C");
  267.                  LCD_Write_String(10,0,"RH");
  268.         Delay(1);         //延时100US(12M晶振)
  269.         while(1)
  270.         {  

  271.            //------------------------
  272. ……………………

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

所有资料51hei提供下载:
1602DHT11工程文件.zip (35.13 KB, 下载次数: 68)


回复

使用道具 举报

ID:271725 发表于 2018-1-11 17:01 | 显示全部楼层
显示不出来
回复

使用道具 举报

ID:67787 发表于 2024-1-28 22:25 | 显示全部楼层
buxing
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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