找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我在51单片机上面用DHT11发送串口数据,但是数据接收不到

[复制链接]
跳转到指定楼层
楼主
ID:1027942 发表于 2022-5-31 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用另一个12板子,12MHZ,可以接收到数据,但是会出现乱码(这个板子的串口可能有问题)

单片机源程序如下:
  1. /********************************************************************
  2. 实现功能:DHT11温湿度采集串口显示
  3. 使用芯片:STC12C5A60S2
  4. 晶振:11.059MHZ
  5. 波特率:9600
  6. 编译环境:Keil
  7. *********************************************************************/
  8. #include <STC12C5A60S2.H>
  9. #include "intrins.h"
  10. #include "delay.h"
  11. #include "IO.h"

  12. #define u8  unsigned char
  13. #define u16 unsigned int  
  14. #define JUDGE  30                //用于判断通信的0和1,与单片机速度和晶振频率有关

  15. u8  p[15];
  16. u8  dat_r[5];                  //用于存放从DHT11读取到的数值

  17. void UartInit(void)                //9600bps@11.0592MHz
  18. {
  19.         SCON = 0x50;                //8???,?????
  20.         AUXR |= 0x40;                //?????1T??
  21.         AUXR &= 0xFE;                //??1?????1???????
  22.         TMOD &= 0x0F;                //???????
  23.         TL1 = 0xE0;                //???????
  24.         TH1 = 0xFE;                //???????
  25.         ET1 = 0;                //?????%d??
  26.         TR1 = 1;                //???1????
  27. }



  28. void SendDataByUart1(u8 *a)//发送字符串  
  29. {
  30.                 while(*a!='\0')
  31.         {
  32.       SBUF = *a++;
  33.       while(TI==0);
  34.       TI = 0;
  35.         }               
  36. }

  37. char GetData (void)
  38. {
  39.         u8 i,j;                                //for循环变量
  40.         u8 t;                                //超时判断
  41.         u8 dat8=0;                        //一次读取的8位数据,需要读5次

  42.         DATA = 0;                                //主机发起始信号
  43.         NDelay1ms(20);                        //主机拉低总线至少18ms
  44.         DATA = 1;                                //主机拉高总线20~40us
  45.         Delay30us();

  46.         t = 80;                                        //设置超时等待时间
  47.         while(DATA && t--);                //等待DHT11拉低总线
  48.         if(t == 0)                                //超时
  49.         {
  50.                 DATA = 1;
  51.                 return -1;                        //通信错误退出,返回错误信号:-1
  52.         }

  53.         //等80us响应信号
  54.         t = 250;                                //设置超时等待时间
  55.         while(!DATA && t--);        //等待DHT11拉高总线
  56.         if(t == 0)                                //超时
  57.         {
  58.                 DATA = 1;
  59.                 return -2;                        //通信错误退出,返回错误信号:-2
  60.         }

  61.         //等80us响应信号
  62.         t = 250;                                //设置超时等待时间
  63.         while(DATA && t--);                //等待DHT11拉低总线
  64.         if(t == 0)                                //超时
  65.         {
  66.                 DATA = 1;
  67.                 return -3;                        //通信错误退出,返回错误信号:-3
  68.         }

  69.         for(j=0; j<5; j++)                //5次读取
  70.         {
  71.                 for(i=0; i<8; i++)                        //1次8个位
  72.                 {
  73.                         //等待50us开始时隙
  74.                         t = 150;                                //设置超时等待时间
  75.                         while(!DATA && t--);        //等待DHT11拉高总线
  76.                         if(t == 0)                                //超时
  77.                         {
  78.                                 DATA = 1;
  79.                                 return -4;                        //通信错误退出,返回错误信号:-4
  80.                         }
  81.                         t = 0;                                        //记录时间清零
  82.                         while(DATA && ++t);                //等待并记录高电平持续时间
  83.                         dat8 <<= 1;
  84.                         if(t > JUDGE)                        //高电平持续时间较长(70us)
  85.                                 dat8 += 1;                        //传输值为1
  86.                         //else dat8 += 0;
  87.                 }
  88.                 dat_r[j] = dat8;
  89.         }

  90.         Delay30us();                //等待DHT11拉低50us
  91.         Delay30us();
  92.         DATA = 1;                        //结束,拉高总线
  93.         return 0;                        //返回成功信号
  94. }

  95. char Check(void)
  96. {
  97.         u8  i;                        //for循环变量
  98.         u16 chk=0;                        //校验和
  99.         for(i=0; i<4; i++)
  100.                 chk += dat_r[i];                //累加
  101.         if((u8)chk != dat_r[4])        //比对
  102.                 return -1;                                //返回错误信号:-1
  103.         else
  104.                 return 0;                                //返回正确信号:0
  105. }

  106. void SendOutDH11Str(void)
  107. {
  108.         char i;
  109.         u8 HD11_str[11];//发送的数据
  110.         u8 RH,RL,TH,TL,revise;
  111.     i = GetData();        //读数据
  112.     if(i != 0)            //有错误
  113.     {
  114.             //UART_T(-i);        //返回错误值
  115.             return;              //重新开始
  116.     }
  117.     i = Check();                  //数据校验
  118.     if(i != 0)                //有错误
  119.     {
  120.             //UART_T(-i);                //返回错误值
  121.             return;                 //重新开始
  122.     }
  123.        
  124.         RH = dat_r[0];//湿度整数
  125.         RL = dat_r[1];//湿度小数(根据数据手册,DHT11小数部分一直是0没用)
  126.         TH = dat_r[2];//温度整数
  127.         TL = dat_r[3];//温度小数(根据数据手册,DHT11小数部分一直是0没用)
  128.         revise = dat_r[4];//校验值
  129.        
  130.        
  131.         //数据处理
  132.         HD11_str[0]=RH/10+'0';
  133.         HD11_str[1]=(RH%10)+'0';
  134.         HD11_str[2]='%';
  135.         HD11_str[3]='R';
  136.         HD11_str[4]='H';
  137.         HD11_str[5]=' ';
  138.         HD11_str[6]=' ';
  139.         HD11_str[7]=(TH/10)+'0';
  140.         HD11_str[8]=(TH%10)+'0';
  141.         HD11_str[9]='^';
  142.         HD11_str[10]='C';
  143.         SendDataByUart1(HD11_str);
  144.         NDelay1ms(1000);                        //经测试,两次连读要至少延时80ms     
  145. }

  146. void main(void)
  147. {
  148.         Uart1_Init();       
  149.         IO_Init();
  150.         EA=1;
  151.         while(1)   
  152.         {
  153.                 SendOutDH11Str();
  154.         }
  155. }       

  156. void Uart1() interrupt 4 using 1
  157. {     
  158.                 if(TI)           
  159.         {
  160.                 TI=0;
  161.         }       
  162.                 if(RI)                   
  163.         {       
  164.                 RI=0;
  165.         }
  166. }
复制代码

DHT11_stc12.zip (79.04 KB, 下载次数: 9)


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

使用道具 举报

沙发
ID:390416 发表于 2022-6-1 08:55 | 只看该作者
回复

使用道具 举报

板凳
ID:161164 发表于 2022-6-1 10:28 | 只看该作者
你SendDataByUart1的代码显然在跟中断拼速度
从结果来看
11.0592Mhz 是中断比较快,程序在39行死循环了
参考STC-ISP的例程,加个Busy来检测比较好

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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