找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机驱动DHT21通过串口发送温湿度数据

  [复制链接]
跳转到指定楼层
楼主
ID:51773 发表于 2013-7-19 02:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机 : AT89S52 或 STC89C52RC,功能 :串口发送温湿度数据 晶振 11.0592M 波特率 9600 ,硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑 。
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. //----------------IO口定义区--------------------//
  6. sbit  P2_0  = P1^0 ;


  7. //----------------定义区--------------------//

  8. uchar  U8FLAG,k;
  9. uchar  U8count,U8temp;
  10. uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  11. uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  12. uchar  U8comdata;
  13. uchar  outdata[5];  //定义发送的字节数     
  14. uchar  indata[5];
  15. uchar  count, count_r=0;
  16. uchar  str[5]={"RS232"};
  17. uint U16temp1,U16temp2;
  18. SendData(uchar *a)
  19. {
  20.     outdata[0] = a[0];
  21.     outdata[1] = a[1];
  22.     outdata[2] = a[2];
  23.     outdata[3] = a[3];
  24.     outdata[4] = a[4];
  25.     count = 1;
  26.     SBUF=outdata[0];
  27.     while(!TI);
  28.     TI = 0;

  29.     SBUF=outdata[1];
  30.     while(!TI);
  31.     TI = 0;

  32.     SBUF=outdata[2];
  33.     while(!TI);
  34.     TI = 0;

  35.     SBUF=outdata[3];
  36.     while(!TI);
  37.     TI = 0;

  38.     SBUF=outdata[4];
  39.     while(!TI);
  40.     TI = 0;
  41. }

  42. void Delay(uint j)
  43. {   uchar i;
  44.     for(;j>0;j--)
  45.   {     
  46.     for(i=0;i<27;i++);

  47.   }
  48. }

  49. void  Delay_10us(void)
  50. {
  51.     unsigned char a,b;
  52.     for(b=1;b>0;b--)
  53.         for(a=2;a>0;a--);
  54. }
  55.      
  56. void COM(void)
  57. {   
  58.     uchar i;   
  59.     for(i=0;i<8;i++)   
  60.     {
  61.      
  62.         U8FLAG=2;   
  63.     while((!P2_0)&&U8FLAG++);
  64.         Delay_10us();
  65.         Delay_10us();
  66.         Delay_10us();
  67.         U8temp=0;
  68.      if(P2_0)U8temp=1;
  69.         U8FLAG=2;
  70.      while((P2_0)&&U8FLAG++);
  71.     //超时则跳出for循环         
  72.      if(U8FLAG==1)break;
  73.     //判断数据位是0还是1     
  74.         
  75.     // 如果高电平高过预定0高电平值则数据位为 1     
  76.        U8comdata<<=1;
  77.        U8comdata|=U8temp;        //0
  78.      }//rof

  79. }
  80. void RH(void)
  81. {
  82.     //主机拉低18ms
  83.     P2_0=0;
  84.     Delay(180);
  85.     P2_0=1;
  86.     //总线由上拉电阻拉高 主机延时20us
  87.     Delay_10us();
  88.     Delay_10us();
  89.     Delay_10us();
  90.     Delay_10us();
  91.     //主机设为输入 判断从机响应信号
  92.     P2_0=1;
  93.     //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行      
  94.     if(!P2_0)        //T !   
  95.     {
  96.     U8FLAG=2;
  97.     //判断从机是否发出 80us 的低电平响应信号是否结束     
  98.     while((!P2_0)&&U8FLAG++);
  99.     U8FLAG=2;
  100.     //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  101.     while((P2_0)&&U8FLAG++);
  102.     //数据接收状态         
  103.     COM();
  104.     U8RH_data_H_temp=U8comdata;
  105.     COM();
  106.     U8RH_data_L_temp=U8comdata;
  107.     COM();
  108.     U8T_data_H_temp=U8comdata;
  109.     COM();
  110.     U8T_data_L_temp=U8comdata;
  111.     COM();
  112.     U8checkdata_temp=U8comdata;
  113.     P2_0=1;
  114.     //数据校验
  115.     U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  116.         if(U8temp==U8checkdata_temp)
  117.         {
  118.           U8RH_data_H=U8RH_data_H_temp;
  119.           U8RH_data_L=U8RH_data_L_temp;
  120.           U8T_data_H=U8T_data_H_temp;
  121.           U8T_data_L=U8T_data_L_temp;
  122.           U8checkdata=U8checkdata_temp;
  123.         }//fi
  124.     }//fi

  125. }


  126.      
  127. //----------------------------------------------
  128. //main()功能描述:  AT89C51  11.0592MHz  串口发
  129. //送温湿度数据,波特率 9600
  130. //----------------------------------------------
  131. void main()
  132. {
  133.     /* 系统初始化 */
  134.     TMOD = 0x20;      //定时器T1使用工作方式2
  135.     TH1 = 253;        // 设置初值
  136.     TL1 = 253;
  137.     TR1 = 1;          // 开始计时
  138.     SCON = 0x50;      //工作方式1,波特率9600bps,允许接收   
  139.     ES = 1;
  140.     EA = 1;           // 打开所以中断   
  141.     TI = 0;
  142.     RI = 0;
  143.     SendData(str) ;   //发送到串口
  144.     Delay(1);         //延时100US(12M晶振)
  145.     while(1)
  146.     {  
  147.        //------------------------
  148.        //调用温湿度读取子程序
  149.        RH();
  150.        //串口显示程序
  151.        //--------------------------
  152.        str[0]=U8RH_data_H;
  153.        str[1]=U8RH_data_L;
  154.        str[2]=U8T_data_H;
  155.        str[3]=U8T_data_L;
  156.        str[4]=U8checkdata;
  157.        SendData(str) ;  //发送到串口  
  158.        //读取模块数据周期不易小于 2S
  159.        Delay(20000);
  160.     }//elihw   
  161. }// main


  162. void RSINTR() interrupt 4 using 2
  163. {
  164.     //if(TI==1) //发送中断   
  165.     //{
  166.     //  TI = 0;
  167.     //}

  168.     if(RI==1)    //接收中断      
  169.     {   
  170.         RI = 0;
  171.     }
  172. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:62967 发表于 2014-6-15 16:46 | 只看该作者
真好啊                     
回复

使用道具 举报

板凳
ID:108333 发表于 2016-3-11 09:56 | 只看该作者
很好!!
回复

使用道具 举报

地板
ID:115905 发表于 2016-4-22 13:10 | 只看该作者
开始测温湿度前会显示         uchar  str[5]={"RS232"};  这句吗?
回复

使用道具 举报

5#
ID:115905 发表于 2016-4-22 13:12 | 只看该作者
在测温湿度前会显示uchar  str[5]={"RS232"};这句吗?
回复

使用道具 举报

6#
ID:79544 发表于 2016-10-21 22:08 | 只看该作者
这个程序怎么不好用,显示00
回复

使用道具 举报

7#
ID:249763 发表于 2017-11-19 12:39 | 只看该作者
感谢楼主
回复

使用道具 举报

8#
ID:11792 发表于 2019-8-31 10:30 | 只看该作者
谢谢大神
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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