找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机新人想请教一下为什么读取不出DHT11的数据 很急呀

查看数: 7008 | 评论数: 5 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-4-23 10:04

正文摘要:

程序是网上看的 LCD1602显示那里是自己做了点变动 串口发送数据也没有 #include  <reg51.h> #include <intrins.h> #define LCD1602_DB P0 //LCD1602数据总线 sbit LCD1602_RS = P3^5; //RS ...

回复

ID:110606 发表于 2019-4-23 15:15
所以我有这样的建议,你可以试一下
1.使用原程序,显示肯定不对,不用管,看串口,如果串口发的数据也不对,那么要么就是你DHT11插的引脚不对,要么就是原程序不对
2.找一个串口好用的程序,把DHT11部分的程序复制过去,这样DHT读取是好用的,然后再研究1602
不要期望在网上找的东西都好用,学电子就是不断的解决问题,加油!

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

ID:110606 发表于 2019-4-23 15:10
我帮你分析一下,
如果你只改动显示程序,其他的都没有改动,那么串口输出应该不会有问题
ID:512941 发表于 2019-4-23 14:54
yzwzfyz 发表于 2019-4-23 11:58
再研读过DHT11的数据手册,与你的程序作个对比。

就是按照DHT11的时序图来的 看了好几天了。
ID:123289 发表于 2019-4-23 11:58
再研读过DHT11的数据手册,与你的程序作个对比。
ID:512941 发表于 2019-4-23 10:14
  1. #include  <reg51.h>
  2. #include <intrins.h>
  3. #define LCD1602_DB P0 //LCD1602数据总线
  4. sbit LCD1602_RS = P3^5; //RS端
  5. sbit LCD1602_RW = P3^6; //RW端
  6. sbit LCD1602_EN = P3^4; //EN端
  7. sbit DU = P2^6;//
  8. sbit WE = P2^7;//数码管位选段选用于关闭数码管显示

  9. typedef unsigned char  U8;      
  10. typedef signed   char  S8;      
  11. typedef unsigned int   U16;      
  12. typedef signed   int   S16;      
  13. typedef unsigned long  U32;      
  14. typedef signed   long  S32;      
  15. typedef float          F32;      
  16. typedef double         F64;      
  17. //
  18. #define uchar unsigned char
  19. #define uint unsigned int
  20. #define   Data_0_time    4
  21. //----------------------------------------------//
  22. //----------------IO口定义区--------------------//
  23. //----------------------------------------------//
  24. sbit  P2_0  = P2^0 ;
  25. //----------------------------------------------//
  26. //----------------定义区--------------------//
  27. //----------------------------------------------//
  28. U8  U8FLAG,k;
  29. U8  U8count,U8temp;
  30. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  31. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  32. U8  U8comdata;
  33. U8  outdata[5];  //定义发送的字节数   
  34. U8  indata[5];
  35. U8  a1[5];
  36. //U8  b[10];
  37. U8  count, count_r=0;
  38. U8  str[5];
  39. U16 U16temp1,U16temp2;
  40. void SendData(U8 *a)
  41. {
  42.         outdata[0] = a[0];
  43.         outdata[1] = a[1];
  44.         outdata[2] = a[2];
  45.         outdata[3] = a[3];
  46.         outdata[4] = a[4];
  47.         count = 1;
  48.         SBUF=outdata[0];
  49. }
  50. void Delay(U16 j)
  51. {      
  52.          U8 i;
  53.    for(;j>0;j--)
  54. {
  55.        
  56.         for(i=0;i<27;i++);

  57. }
  58. }
  59. void  Delay_10us(void)
  60.       {
  61.         U8 i;
  62.         i--;
  63.         i--;
  64.         i--;
  65.         i--;
  66.         i--;
  67.         i--;
  68.        }
  69. void  COM(void)
  70.       {
  71.      
  72.        U8 i;
  73.          
  74.        for(i=0;i<8;i++)   
  75.    {
  76.      U8FLAG=2;
  77.   while((!P2_0)&&U8FLAG++);
  78.                 Delay_10us();
  79.     Delay_10us();
  80.                 Delay_10us();
  81.   U8temp=0;
  82.     if(P2_0)U8temp=1;
  83.    U8FLAG=2;
  84. while((P2_0)&&U8FLAG++);
  85.   //超时则跳出for循环  
  86.   if(U8FLAG==1)break;
  87.   //判断数据位是0还是1  
  88.    
  89. // 如果高电平高过预定0高电平值则数据位为 1
  90.    
  91.   U8comdata<<=1;
  92.     U8comdata|=U8temp;        //0
  93.     }//rof
  94.   
  95. }

  96. //--------------------------------
  97. //-----湿度读取子程序 ------------
  98. //--------------------------------
  99. //----以下变量均为全局变量--------
  100. //----温度高8位== U8T_data_H------
  101. //----温度低8位== U8T_data_L------
  102. //----湿度高8位== U8RH_data_H-----
  103. //----湿度低8位== U8RH_data_L-----
  104. //----校验 8位 == U8checkdata-----
  105. //----调用相关子程序如下----------
  106. //---- Delay();, Delay_10us();,COM();
  107. //--------------------------------

  108. void RH(void)
  109. {
  110. //主机拉低18ms
  111.   P2_0=0;
  112.   Delay(180);
  113.   P2_0=1;
  114. //总线由上拉电阻拉高 主机延时20us
  115.   Delay_10us();
  116.   Delay_10us();
  117.   Delay_10us();
  118.   Delay_10us();
  119. //主机设为输入 判断从机响应信号
  120.   P2_0=1;
  121. //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行  
  122.   if(!P2_0) //T !  
  123.   {
  124.   U8FLAG=2;
  125. //判断从机是否发出 80us 的低电平响应信号是否结束  
  126.   while((!P2_0)&&U8FLAG++);
  127.   U8FLAG=2;
  128. //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  129.   while((P2_0)&&U8FLAG++);
  130. //数据接收状态  
  131.   COM();
  132.   U8RH_data_H_temp=U8comdata;
  133.   COM();
  134.   U8RH_data_L_temp=U8comdata;
  135.   COM();
  136.   U8T_data_H_temp=U8comdata;
  137.   COM();
  138.   U8T_data_L_temp=U8comdata;
  139.   COM();
  140.   U8checkdata_temp=U8comdata;
  141.   P2_0=1;
  142. //数据校验

  143.   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  144.   if(U8temp==U8checkdata_temp)
  145. {
  146.         U8RH_data_H=U8RH_data_H_temp;
  147.         U8RH_data_L=U8RH_data_L_temp;
  148.         U8T_data_H=U8T_data_H_temp;
  149.         U8T_data_L=U8T_data_L_temp;
  150.         U8checkdata=U8checkdata_temp;
  151. }//fi
  152. }//fi

  153. }
  154. /*void Read_Busy()  //判忙函数 通过率极低 直接改延迟
  155. {
  156.         U8 busy;
  157.         LCD1602_DB = 0xff;//复位数据总线
  158.         LCD1602_RS = 0;  //拉低RS
  159.         LCD1602_RW = 1;  //拉高RW读
  160. do
  161. {
  162.         LCD1602_EN = 1;//使能EN
  163.         busy = LCD1602_DB;//读回数据
  164.         LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
  165. }
  166.         while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待
  167. }*/
  168. void LCD1602_Write_Cmd(U8 cmd)
  169. {
  170.    Delay(3);
  171.    LCD1602_RS = 0;
  172.    LCD1602_RW = 0;
  173.    LCD1602_DB = cmd;//写入命令
  174.          Delay(3);
  175.    LCD1602_EN = 1; //拉高使能端 数据被传输到LCD1602内
  176.          Delay(3);
  177.    LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
  178. }
  179. void LCD1602_Write_Dat(U8 dat)
  180. {

  181.         Delay(3);
  182.   LCD1602_RS = 1;
  183.   LCD1602_RW = 0;
  184.   LCD1602_DB = dat;
  185.   Delay(3);
  186.   LCD1602_EN = 1;
  187.   Delay(3);
  188.   LCD1602_EN = 0;
  189. }
  190. void LCD1602_Dis_Str(U8 x, U8 y, U8 *str)
  191. {
  192.        
  193.   if(y) x |= 0x40;
  194.   x |= 0x80;
  195.   LCD1602_Write_Cmd(x);
  196.   while(*str != '\0')
  197. {
  198. LCD1602_Write_Dat(*str++);
  199. }
  200. }
  201. void Init_LCD1602()
  202. {
  203.   LCD1602_Write_Cmd(0x38); // 设置16*2显示,5*7点阵,8位数据接口
  204.   LCD1602_Write_Cmd(0x0c); //开显示
  205.   LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1
  206.   LCD1602_Write_Cmd(0x01); //清除显示
  207. }
  208. void lcddisplay()
  209. {
  210.   U8 temperature[] = {"temp:           "};
  211.   U8 humidity [] = {"humi:         RH"};
  212.   DU = 0;
  213.   WE = 0;//关闭数码管显示
  214.   Init_LCD1602();//1602初始化
  215.   LCD1602_Dis_Str(0, 0, &temperature[0]); //显示字符串
  216.   LCD1602_Dis_Str(0, 1, & humidity [0]); //显示字符串
  217.   a1[0]=U8RH_data_H;
  218.   a1[1]=U8RH_data_L;
  219.   a1[2]=U8T_data_H;
  220.   a1[3]=U8T_data_L;
  221.   a1[4]=U8checkdata;
  222. temperature [5] =(0x30+a1[2]/10);
  223.         temperature [6] =(0x30+a1[2]%10);
  224.         /*temperature [7] ='.';
  225.         temperature [8] =(0x30+a1[3]/100);
  226.         temperature [9] =(0x30+(a1[3])/10);*/
  227.         temperature [14] =(0xdf);
  228.         temperature [15] =(0x43);
  229.         humidity [5] =(0x30+a1[0]/10);
  230.         humidity [6] =(0x30+a1[0]%10);
  231.         /*humidity [7] ='.';
  232.         humidity [8] =(0x30+a1[1]/100);
  233.         humidity [9] =(0x30+(a1[1])/10);*/
  234.         LCD1602_Dis_Str(5, 0, & temperature [5]);
  235.         LCD1602_Dis_Str(6, 0, & temperature [6]);
  236.         //LCD1602_Dis_Str(7, 0, & temperature [7]);
  237.         //LCD1602_Dis_Str(8, 0, & temperature [8]);
  238.         //LCD1602_Dis_Str(9, 0, & temperature [9]);
  239.         LCD1602_Dis_Str(14, 0, & temperature [14]);
  240.         LCD1602_Dis_Str(15, 0, & temperature [15]);
  241.         LCD1602_Dis_Str(5, 1, & humidity [5]);
  242.         LCD1602_Dis_Str(6, 1, & humidity [6]);
  243.         //LCD1602_Dis_Str(7, 1, & humidity [7]);
  244.         //LCD1602_Dis_Str(8, 1, & humidity [8]);
  245.         //LCD1602_Dis_Str(9, 1, & humidity [9]);

  246. }
  247. //----------------------------------------------
  248. //main()功能描述:  AT89C51  11.0592MHz 串口发
  249. //送温湿度数据,波特率 9600
  250. //----------------------------------------------
  251. void main()
  252. {

  253.   //uchar str[5]={"12345"};
  254.         /* 系统初始化 */
  255.         TMOD = 0x20;  //定时器T1使用工作方式2
  256.         TH1 = 253;        // 设置初值
  257.         TL1 = 253;
  258.         TR1 = 1;          // 开始计时
  259.         SCON = 0x50;  //工作方式1,波特率9600bps,允许接收   
  260.         ES = 1;
  261.         EA = 1;           // 打开所以中断   
  262.         TI = 0;
  263.         RI = 0;
  264.         SendData(str) ;   //发送到串口
  265.         Delay(1);         //延时100US(12M晶振)
  266.         while(1)
  267. {  

  268.   //------------------------
  269.   //调用温湿度读取子程序
  270.   RH();
  271.   //串口显示程序
  272.   //--------------------------

  273.   str[0]=U8RH_data_H;
  274.   str[1]=U8RH_data_L;
  275.   str[2]=U8T_data_H;
  276.   str[3]=U8T_data_L;
  277.   str[4]=U8checkdata;
  278.   SendData(str) ;  //发送到串口  
  279.   //读取模块数据周期不易小于 2S
  280.         lcddisplay();
  281.                 Delay(20000);
  282. }//elihw
  283. }// main

  284.         void RSINTR() interrupt 4 using 2
  285. {
  286.         U8 InPut3;
  287.         if(TI==1) //发送中断  
  288.         {
  289.         TI=0;
  290.         if(count!=5) //发送完5位数据  
  291. {
  292.         SBUF= outdata[count];
  293.         count++;
  294. }
  295. }

  296.         if(RI==1) //接收中断  
  297. {
  298.         InPut3=SBUF;
  299.         indata[count_r]=InPut3;
  300.         count_r++;
  301.         RI=0;  
  302.         if (count_r==5)//接收完4位数据
  303. {
  304.         //数据接收完毕处理。
  305.         count_r=0;
  306.         str[0]=indata[0];
  307.         str[1]=indata[1];
  308.         str[2]=indata[2];
  309.         str[3]=indata[3];
  310.         str[4]=indata[4];
  311.         P0=0;
  312. }
  313. }
  314. }
复制代码

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

Powered by 单片机教程网

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