找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2141|回复: 3
收起左侧

关于使用51单片机驱动DHT11仿真成功而实物不成的问题

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
ID:894722 发表于 2021-5-17 21:18 | 显示全部楼层 |阅读模式
5.png
这是仿真图,是可以使用的。

但是在程序中,它好像卡在了读取DHT11的数据当中, Void ReadDhtData();中 ,想让大神们看看这个函数有没有问题,以及如何改错


// 读取DHT11的一帧数据,湿高、湿低(0)、温高、温低(0)、校验码
  1. void ReadDhtData()
  2. {            
  3.         uchar HumiHig;                // 湿度高检测值
  4.         uchar HumiLow;                // 湿度低检测值
  5.         uchar TemHig;                        // 温度高检测值
  6.         uchar TemLow;                        // 温度低检测值
  7.         uchar check;                        // 校验字节
  8.         
  9.         
  10.         DHT11_P=1;        //拉高等待     
  11.         DelayMs(20);
  12.         
  13.         
  14.         
  15.         
  16.         
  17.         DHT11_P=0;                                // 主机拉低
  18.         DelayMs(20);                        // 保持20毫秒
  19.         
  20.         DHT11_P=1;                                // DATA总线由上拉电阻拉高  准备输出

  21.         Delay10us();                         // 延时等待30us
  22.         Delay10us();
  23.         Delay10us();

  24.         while(!DHT11_P);        // 等待DHT的低电平结束
  25.         while(DHT11_P);                // 等待DHT的高电平结束

  26.         //进入数据接收状态
  27.         HumiHig = DhtReadByte();         // 湿度高8位
  28.         HumiLow = DhtReadByte();         // 湿度低8为,总为0
  29.         TemHig  = DhtReadByte();         // 温度高8位
  30.         TemLow  = DhtReadByte();         // 温度低8为,总为0
  31.         check   = DhtReadByte();        // 8位校验码,其值等于读出的四个字节相加之和的低8位

  32.         DHT11_P=1;                                // 拉高总线

  33.         if(check==HumiHig + HumiLow + TemHig + TemLow)                 // 如果收到的数据无误
  34.         {
  35.                 temp=TemHig;                         // 将温度的检测结果赋值给全局变量temp
  36.                 humi=HumiHig;                        // 将湿度的检测结果赋值给全局变量humi
  37.         }
  38. }




  39. 下面是程序源码
  40. #include <reg52.h>                                   // 头文件包含
  41. #include <intrins.h>

  42. #define uchar unsigned char
  43. #define uint  unsigned int              

  44. sfr ISP_DATA  = 0xe2;                        // 数据寄存器
  45. sfr ISP_ADDRH = 0xe3;                        // 地址寄存器高八位
  46. sfr ISP_ADDRL = 0xe4;                        // 地址寄存器低八位
  47. sfr ISP_CMD   = 0xe5;                        // 命令寄存器
  48. sfr ISP_TRIG  = 0xe6;                        // 命令触发寄存器
  49. sfr ISP_CONTR = 0xe7;                        // 命令寄存器

  50. sbit Buzzer_P  = P1^4;    // 蜂鸣器
  51. sbit DHT11_P   = P1^5;                 // 温湿度传感器DHT11数据接入
  52. sbit LcdRs_P   = P1^0;    // 1602液晶的RS管脚      
  53. sbit LcdRw_P   = P1^1;    // 1602液晶的RW管脚
  54. sbit LcdEn_P   = P1^2;    // 1602液晶的EN管脚
  55. sbit KeySet_P  = P3^5;                // “设置”按键的管脚
  56. sbit KeyDown_P = P3^6;                // “减”按键的管脚
  57. sbit KeyUp_P   = P3^7;                // “加”按键的管脚
  58. sbit LedTL_P   = P2^0;                // 温度过低报警指示灯
  59. sbit LedTH_P   = P2^1;                // 温度过高报警指示灯
  60. sbit LedHL_P   = P2^2;                // 湿度过低报警指示灯
  61. sbit LedHH_P   = P2^3;                // 湿度过高报警指示灯

  62. uchar temp;                                        // 保存温度
  63. uchar humi;                                        // 保存湿度

  64. uchar AlarmTL;                        // 温度下限报警值
  65. uchar AlarmTH;                        // 温度上限报警值
  66. uchar AlarmHL;                        // 湿度下限报警值
  67. uchar AlarmHH;                        // 湿度上限报警值



  68. /*********************************************************/
  69. // 单片机内部EEPROM不使能
  70. /*********************************************************/
  71. void ISP_Disable()
  72. {
  73.         ISP_CONTR = 0;
  74.         ISP_ADDRH = 0;
  75.         ISP_ADDRL = 0;
  76. }


  77. /*********************************************************/
  78. // 从单片机内部EEPROM读一个字节,从0x2000地址开始
  79. /*********************************************************/
  80. unsigned char EEPROM_Read(unsigned int add)
  81. {
  82.         ISP_DATA  = 0x00;
  83.         ISP_CONTR = 0x83;
  84.         ISP_CMD   = 0x01;
  85.         ISP_ADDRH = (unsigned char)(add>>8);
  86.         ISP_ADDRL = (unsigned char)(add&0xff);
  87.         // 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效
  88.         ISP_TRIG  = 0x46;           
  89.         ISP_TRIG  = 0xB9;
  90.         _nop_();
  91.         ISP_Disable();
  92.         return (ISP_DATA);
  93. }


  94. /*********************************************************/
  95. // 往单片机内部EEPROM写一个字节,从0x2000地址开始
  96. /*********************************************************/
  97. void EEPROM_Write(unsigned int add,unsigned char ch)
  98. {
  99.         ISP_CONTR = 0x83;
  100.         ISP_CMD   = 0x02;
  101.         ISP_ADDRH = (unsigned char)(add>>8);
  102.         ISP_ADDRL = (unsigned char)(add&0xff);
  103.         ISP_DATA  = ch;
  104.         ISP_TRIG  = 0x46;
  105.         ISP_TRIG  = 0xB9;
  106.         _nop_();
  107.         ISP_Disable();
  108. }


  109. /*********************************************************/
  110. // 擦除单片机内部EEPROM的一个扇区
  111. // 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除
  112. /*********************************************************/
  113. void Sector_Erase(unsigned int add)         
  114. {
  115.         ISP_CONTR = 0x83;
  116.         ISP_CMD   = 0x03;
  117.         ISP_ADDRH = (unsigned char)(add>>8);
  118.         ISP_ADDRL = (unsigned char)(add&0xff);
  119.         ISP_TRIG  = 0x46;
  120.         ISP_TRIG  = 0xB9;
  121.         _nop_();
  122.         ISP_Disable();
  123. }


  124. /*********************************************************/
  125. // 毫秒级的延时函数,time是要延时的毫秒数
  126. /*********************************************************/
  127. void DelayMs(uint time)
  128. {
  129.         uint i,j;
  130.         for(i=0;i<time;i++)
  131.                 for(j=0;j<112;j++);
  132. }


  133. /*********************************************************/
  134. // 1602液晶写命令函数,cmd就是要写入的命令
  135. /*********************************************************/
  136. void LcdWriteCmd(uchar cmd)
  137. {
  138.         LcdRs_P = 0;
  139.         LcdRw_P = 0;
  140.         LcdEn_P = 0;
  141.         P0=cmd;
  142.         DelayMs(2);
  143.         LcdEn_P = 1;   
  144.         DelayMs(2);
  145.         LcdEn_P = 0;        
  146. }


  147. /*********************************************************/
  148. // 1602液晶写数据函数,dat就是要写入的数据
  149. /*********************************************************/
  150. void LcdWriteData(uchar dat)
  151. {
  152.         LcdRs_P = 1;
  153.         LcdRw_P = 0;
  154.         LcdEn_P = 0;
  155.         P0=dat;
  156.         DelayMs(2);
  157.         LcdEn_P = 1;   
  158.         DelayMs(2);
  159.         LcdEn_P = 0;
  160. }


  161. /*********************************************************/
  162. // 1602液晶初始化函数
  163. /*********************************************************/
  164. void LcdInit()
  165. {
  166.         LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
  167.         LcdWriteCmd(0x0C);        // 开显示,不显示光标
  168.         LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
  169.         LcdWriteCmd(0x01);        // 清屏
  170. }


  171. /*********************************************************/
  172. // 液晶光标定位函数
  173. /*********************************************************/
  174. void LcdGotoXY(uchar line,uchar column)
  175. {
  176.         // 第一行
  177.         if(line==0)        
  178.                 LcdWriteCmd(0x80+column);
  179.         // 第二行
  180.         if(line==1)        
  181.                 LcdWriteCmd(0x80+0x40+column);
  182. }


  183. /*********************************************************/
  184. // 液晶输出字符串函数
  185. /*********************************************************/
  186. void LcdPrintStr(uchar *str)
  187. {
  188.         while(*str!='\0')                         // 判断是否到字符串的尽头了
  189.                 LcdWriteData(*str++);
  190. }


  191. /*********************************************************/
  192. // 液晶输出数字
  193. /*********************************************************/
  194. void LcdPrintNum(uchar num)
  195. {
  196.         LcdWriteData(num/10+48);        // 十位
  197.         LcdWriteData(num%10+48);         // 个位
  198. }


  199. /*********************************************************/
  200. // 液晶显示内容的初始化
  201. /*********************************************************/
  202. void LcdShowInit()
  203. {
  204.         LcdGotoXY(0,0);                                                                // 第0行的显示内容
  205.         LcdPrintStr("  DHT11 System  ");
  206.         LcdGotoXY(1,0);                                                           // 第1行的显示内容
  207.         LcdPrintStr("T:   C   H:   %");
  208.         LcdGotoXY(1,4);                                                                // 温度单位摄氏度上面的圆圈符号
  209.         LcdWriteData(0xdf);        
  210. }




  211. void Delay10us()
  212. {
  213.         _nop_();             // 执行一条指令,延时1微秒
  214.         _nop_();
  215.         _nop_();
  216.         _nop_();
  217.         _nop_();
  218.         _nop_();
  219.         _nop_();
  220.         _nop_();
  221.         _nop_();
  222.         _nop_();
  223. }



  224. // 读取DHT11单总线上的一个字节

  225. uchar DhtReadByte(void)
  226. {
  227.         bit bit_i;
  228.         uchar j;
  229.         uchar dat=0;

  230.         for(j=0;j<8;j++)   
  231.         {
  232.                 while(!DHT11_P);        // 等待低电平结束        
  233.                 Delay10us();                        // 延时
  234.                 Delay10us();
  235.                 Delay10us();
  236.                 if(DHT11_P==1)                // 判断数据线是高电平还是低电平
  237.                 {
  238.                         bit_i=1;
  239.                         while(DHT11_P);
  240.                 }
  241.                 else
  242.                 {
  243.                         bit_i=0;
  244.                 }
  245.                 dat<<=1;                                   // 将该位移位保存到dat变量中
  246.                 dat|=bit_i;   
  247.         }
  248.         return(dat);  
  249. }



  250. // 读取DHT11的一帧数据,湿高、湿低(0)、温高、温低(0)、校验码
  251. void ReadDhtData()
  252. {            
  253.         uchar HumiHig;                // 湿度高检测值
  254.         uchar HumiLow;                // 湿度低检测值
  255.         uchar TemHig;                        // 温度高检测值
  256.         uchar TemLow;                        // 温度低检测值
  257.         uchar check;                        // 校验字节
  258.         
  259.         
  260.         DHT11_P=1;        //拉高等待     
  261.         DelayMs(20);
  262.         
  263.         
  264.         
  265.         
  266.         
  267.         DHT11_P=0;                                // 主机拉低
  268.         DelayMs(20);                        // 保持20毫秒
  269.         
  270.         DHT11_P=1;                                // DATA总线由上拉电阻拉高  准备输出

  271.         Delay10us();                         // 延时等待30us
  272.         Delay10us();
  273.         Delay10us();

  274.         while(!DHT11_P);        // 等待DHT的低电平结束
  275.         while(DHT11_P);                // 等待DHT的高电平结束

  276.         //进入数据接收状态
  277.         HumiHig = DhtReadByte();         // 湿度高8位
  278.         HumiLow = DhtReadByte();         // 湿度低8为,总为0
  279.         TemHig  = DhtReadByte();         // 温度高8位
  280.         TemLow  = DhtReadByte();         // 温度低8为,总为0
  281.         check   = DhtReadByte();        // 8位校验码,其值等于读出的四个字节相加之和的低8位

  282.         DHT11_P=1;                                // 拉高总线

  283.         if(check==HumiHig + HumiLow + TemHig + TemLow)                 // 如果收到的数据无误
  284.         {
  285.                 temp=TemHig;                         // 将温度的检测结果赋值给全局变量temp
  286.                 humi=HumiHig;                        // 将湿度的检测结果赋值给全局变量humi
  287.         }
  288. }


  289. /*********************************************************/
  290. // 是否需要报警判断
  291. /*********************************************************/
  292. void AlarmJudge(void)
  293. {
  294.         uchar i;

  295.         if(temp>AlarmTH)                                // 温度是否过高
  296.         {
  297.                 LedTH_P=0;
  298.                 LedTL_P=1;
  299.         }
  300.         else if(temp<AlarmTL)                // 温度是否过低
  301.         {
  302.                 LedTL_P=0;
  303.                 LedTH_P=1;
  304.         }
  305.         else                                                                                // 温度正常
  306.         {
  307.                 LedTH_P=1;
  308.                 LedTL_P=1;
  309.         }

  310.         if(humi>AlarmHH)                           // 湿度是否过高
  311.         {
  312.                 LedHH_P=0;
  313.           LedHL_P=1;
  314.         }
  315.         else if(humi<AlarmHL)                // 湿度是否过低
  316.         {
  317.                 LedHL_P=0;
  318.                 LedHH_P=1;
  319.         }
  320.         else                                                                           // 湿度正常
  321.         {
  322.                 LedHH_P=1;
  323.                 LedHL_P=1;
  324.         }

  325.         if((LedHH_P==0)||(LedHL_P==0)||(LedTH_P==0)||(LedTL_P==0))         // 蜂鸣器判断,只要至少1个报警灯亮,蜂鸣器就报警
  326.         {
  327.                 for(i=0;i<3;i++)
  328.                 {
  329.                         Buzzer_P=0;
  330.                         DelayMs(100);
  331.                         Buzzer_P=1;
  332.                         DelayMs(100);
  333.                 }
  334.         }
  335. }


  336. /*********************************************************/
  337. // 按键扫描,用于设置温湿度报警范围
  338. /*********************************************************/
  339. void KeyScanf()
  340. {
  341.         if(KeySet_P==0)                // 判断设置按键是否被按下
  342.         {
  343.                 /*将液晶显示改为设置页面的*******************************************************/

  344.                 LcdWriteCmd(0x01);                                // 设置界面的显示框架
  345.                 LcdGotoXY(0,0);
  346.                 LcdPrintStr("Temp: 20-40");
  347.                 LcdGotoXY(1,0);
  348.                 LcdPrintStr("Humi: 10-30");
  349.                
  350.                 LcdGotoXY(0,6);                                                 // 在液晶上填充温度的下限值        
  351.                 LcdPrintNum(AlarmTL);        
  352.                 LcdGotoXY(0,9);                                                 // 在液晶上填充温度的上限值
  353.                 LcdPrintNum(AlarmTH);

  354.                 LcdGotoXY(1,6);                                                 // 在液晶上填充湿度的下限值
  355.                 LcdPrintNum(AlarmHL);        
  356.                 LcdGotoXY(1,9);                                                  // 在液晶上填充湿度的上限值
  357.                 LcdPrintNum(AlarmHH);

  358.                 LcdGotoXY(0,7);                                                 // 光标定位到第0行第7列
  359.                 LcdWriteCmd(0x0F);                                // 光标闪烁
  360.                
  361.                 DelayMs(10);                                                  // 去除按键按下的抖动
  362.                 while(!KeySet_P);                                         // 等待按键释放
  363.                 DelayMs(10);                                                  // 去除按键松开的抖动

  364.                 /*设置温度的下限值****************************************************************/

  365.                 while(KeySet_P)                                                // “设置键”没有被按下,则一直处于温度下限的设置
  366.                 {
  367.                         if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下               
  368.                         {
  369.                                 if(AlarmTL>0)                                        // 只有当温度下限值大于0时,才能减1
  370.                                         AlarmTL--;
  371.                                 LcdGotoXY(0,6);                                 // 重新刷新显示更改后的温度下限值        
  372.                                 LcdPrintNum(AlarmTL);                  
  373.                                 LcdGotoXY(0,7);                                // 重新定位闪烁的光标位置
  374.                                 DelayMs(350);                                        // 延时
  375.                         }
  376.                         if(KeyUp_P==0)                                  // 判断 “加按键“ 是否被按下
  377.                         {
  378.                                 if(AlarmTL<99)                          // 只有当温度下限值小于99时,才能加1
  379.                                         AlarmTL++;
  380.                                 LcdGotoXY(0,6);                                  // 重新刷新显示更改后的温度下限值
  381.                                 LcdPrintNum(AlarmTL);
  382.                                 LcdGotoXY(0,7);                                // 重新定位闪烁的光标位置
  383.                                 DelayMs(350);                                        // 延时
  384.                         }        
  385.                 }

  386.                 LcdGotoXY(0,10);
  387.                 DelayMs(10);                                                  // 去除按键按下的抖动
  388.                 while(!KeySet_P);                                         // 等待按键释放
  389.                 DelayMs(10);                                                  // 去除按键松开的抖动

  390.                 /*设置温度的上限值****************************************************************/
  391.                                 
  392.                 while(KeySet_P)                                          // “设置键”没有被按下,则一直处于温度上限的设置
  393.                 {
  394.                         if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下
  395.                         {
  396.                                 if(AlarmTH>0)                                  // 只有当温度上限值大于0时,才能减1                        
  397.                                         AlarmTH--;
  398.                                 LcdGotoXY(0,9);                           // 重新刷新显示更改后的温度上限值
  399.                                 LcdPrintNum(AlarmTH);
  400.                                 LcdGotoXY(0,10);                        // 重新定位闪烁的光标位置
  401.                                 DelayMs(350);                                        // 延时
  402.                         }
  403.                         if(KeyUp_P==0)                                   // 判断 “加按键“ 是否被按下
  404.                         {
  405.                                 if(AlarmTH<99)                                 // 只有当温度上限值小于99时,才能加1
  406.                                         AlarmTH++;
  407.                                 LcdGotoXY(0,9);                                // 重新刷新显示更改后的温度上限值         
  408.                                 LcdPrintNum(AlarmTH);
  409.                                 LcdGotoXY(0,10);                        // 重新定位闪烁的光标位置
  410.                                 DelayMs(350);                                        // 延时
  411.                         }                                                                 
  412.                 }

  413.                 LcdGotoXY(1,7);
  414.                 DelayMs(10);                                                  // 去除按键按下的抖动
  415.                 while(!KeySet_P);                                         // 等待按键释放
  416.                 DelayMs(10);                                                  // 去除按键松开的抖动
  417.                
  418.                 /*设置湿度的下限值****************************************************************/

  419.                 while(KeySet_P)                                                 // “设置键”没有被按下,则一直处于湿度下限的设置
  420.                 {
  421.                         if(KeyDown_P==0)                                // 判断 “减按键“ 是否被按下
  422.                         {
  423.                                 if(AlarmHL>0)                                         // 只有当湿度下限值大于0时,才能减1
  424.                                         AlarmHL--;
  425.                                 LcdGotoXY(1,6);                                // 重新刷新显示更改后的湿度下限值         
  426.                                 LcdPrintNum(AlarmHL);
  427.                                 LcdGotoXY(1,7);                                // 重新定位闪烁的光标位置
  428.                                 DelayMs(350);
  429.                         }
  430.                         if(KeyUp_P==0)                                         // 判断 “加按键“ 是否被按下
  431.                         {
  432.                                 if(AlarmHL<99)                          // 只有当湿度下限值小于99时,才能加1
  433.                                         AlarmHL++;
  434.                                 LcdGotoXY(1,6);                                  // 重新刷新显示更改后的湿度下限值
  435.                                 LcdPrintNum(AlarmHL);
  436.                                 LcdGotoXY(1,7);                          // 重新定位闪烁的光标位置
  437.                                 DelayMs(350);                                        // 延时
  438.                         }        
  439.                 }

  440.                 LcdGotoXY(1,10);
  441.                 DelayMs(10);                                                  // 去除按键按下的抖动
  442.                 while(!KeySet_P);                                         // 等待按键释放
  443.                 DelayMs(10);                                                  // 去除按键松开的抖动
  444.                
  445.                 /*设置湿度的上限值****************************************************************/

  446.                 while(KeySet_P)                                                 // “设置键”没有被按下,则一直处于湿度上限的设置
  447.                 {
  448.                         if(KeyDown_P==0)                                 // 判断 “减按键“ 是否被按下
  449.                         {
  450.                                 if(AlarmHH>0)                                  // 只有当湿度上限值大于0时,才能减1
  451.                                         AlarmHH--;
  452.                                 LcdGotoXY(1,9);                                  // 重新刷新显示更改后的湿度上限值
  453.                                 LcdPrintNum(AlarmHH);
  454.                                 LcdGotoXY(1,10);                        // 重新定位闪烁的光标位置
  455.                                 DelayMs(350);
  456.                         }
  457.                         if(KeyUp_P==0)                                         // 判断 “加按键“ 是否被按下
  458.                         {
  459.                                 if(AlarmHH<99)                                // 只有当湿度上限值小于99时,才能加1
  460.                                         AlarmHH++;
  461.                                 LcdGotoXY(1,9);                                 // 重新刷新显示更改后的湿度上限值        
  462.                                 LcdPrintNum(AlarmHH);
  463.                                 LcdGotoXY(1,10);                         // 重新定位闪烁的光标位置
  464.                                 DelayMs(350);                                        // 延时
  465.                         }        
  466.                 }

  467.                 LcdWriteCmd(0x0C);                          // 取消光标闪烁
  468.                 LcdShowInit();                                                // 液晶显示为检测界面的

  469.                 DelayMs(10);                                                  // 去除按键按下的抖动
  470.                 while(!KeySet_P);                                         // 等待按键释放
  471.                 DelayMs(10);                                                  // 去除按键松开的抖动

  472.                 Sector_Erase(0x2000);                                                 // 存储之前必须先擦除
  473.                 EEPROM_Write(0x2000,AlarmTL);                // 把温度下限存入到EEPROM的0x2000这个地址
  474.                 EEPROM_Write(0x2001,AlarmTH);                // 把温度上限存入到EEPROM的0x2001这个地址
  475.                 EEPROM_Write(0x2002,AlarmHL);                // 把湿度下限存入到EEPROM的0x2002这个地址
  476.                 EEPROM_Write(0x2003,AlarmHH);                // 把湿度上限存入到EEPROM的0x2003这个地址
  477.         }        
  478. }



  479. // 主函数
  480. void main()
  481. {
  482.         uchar i;

  483.         LcdInit();                                                        // 液晶功能的初始化                        
  484.         LcdShowInit();                                         // 液晶显示的初始化

  485.         AlarmTL=EEPROM_Read(0x2000);        // 从EEPROM的0x2000这个地址读取温度的报警下限
  486.         AlarmTH=EEPROM_Read(0x2001);        // 从EEPROM的0x2001这个地址读取温度的报警上限
  487.         AlarmHL=EEPROM_Read(0x2002);        // 从EEPROM的0x2002这个地址读取湿度的报警下限        
  488.         AlarmHH=EEPROM_Read(0x2003);        // 从EEPROM的0x2003这个地址读取湿度的报警上限

  489.         if((AlarmTL==0)||(AlarmTL>100))        // 如果温度下限报警值读出来异常(等于0或大于100),则重新赋值
  490.                 AlarmTL=20;
  491.         if((AlarmTH==0)||(AlarmTH>100))        // 如果温度上限报警值读出来异常(等于0或大于100),则重新赋值
  492.                 AlarmTH=35;
  493.         if((AlarmHL==0)||(AlarmHL>100))        // 如果温度下限报警值读出来异常(等于0或大于100),则重新赋值
  494.                 AlarmHL=40;
  495.         if((AlarmHH==0)||(AlarmHH>100))        // 如果温度上限报警值读出来异常(等于0或大于100),则重新赋值
  496.                 AlarmHH=85;
  497.                
  498.         
  499.         while(1)
  500.         {
  501.                 ReadDhtData();                                 // 检测温湿度数据

  502.                 LcdGotoXY(1,2);                                 // 定位到要显示温度的地方
  503.                 LcdPrintNum(temp);                // 显示温度值
  504.                 LcdGotoXY(1,11);                        // 定位到要显示湿度的地方
  505.                 LcdPrintNum(humi);                // 显示湿度值
  506.                
  507.                 AlarmJudge();                                        // 判断并根据需要报警

  508.                 for(i=0;i<25;i++)
  509.                 {
  510.                         KeyScanf();                                        // 按键扫描
  511.                         DelayMs(20);                                // 延时        
  512.                 }
  513.         }
  514. }
复制代码



回复

使用道具 举报

ID:894722 发表于 2021-5-17 21:21 | 显示全部楼层
当我把主函数的    ReadDhtData();           注释掉时,能够完成按键等操作。
一旦把它放在主函数里,仿佛卡在这个readdhtdate()函数中了。
回复

使用道具 举报

ID:894722 发表于 2021-5-17 22:40 | 显示全部楼层
问题很简单 就是想把ReadDhtDate()函数中的错误找出来并且尝试改正它 ,其它部分都没有问题 。希望大佬指点   顶一下   
回复

使用道具 举报

ID:748788 发表于 2021-6-6 16:10 | 显示全部楼层
dht11对时序要求比较严格,也就是各种延时要尽量准确,而网上常见的延时函数在不同单片机下的延时时间并不一致。我曾经测试过10个nop组成的delay10us函数,结果延迟时间只有4us。你最好测试一下用到的延时函数的真实数值。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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