久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2397|回復: 3
打印 上一主題 下一主題
收起左側

關于使用51單片機驅動DHT11仿真成功而實物不成的問題

[復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主

這是仿真圖,是可以使用的。

但是在程序中,它好像卡在了讀取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. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久久久久久 | 蜜桃av鲁一鲁一鲁一鲁 | 一区二区三区免费观看 | 精品国产乱码久久久久久闺蜜 | 九九热这里 | 国产激情视频在线免费观看 | 天堂av影院| 日韩欧美一级片 | 亚洲精选久久 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 亚洲精品一区二区三区蜜桃久 | 成人亚洲一区 | 精品国产欧美一区二区三区成人 | 久久国产欧美日韩精品 | 日韩国产精品一区二区三区 | 国产精品一区二区三区在线 | 中文一区 | 亚洲一区二区三区在线观看免费 | 成人精品免费 | 美国黄色毛片 | 最新av在线播放 | 视频一区欧美 | 国产高清在线观看 | 成人国产精品免费观看 | 久久中文视频 | 国产一区二区三区精品久久久 | 中文一区二区 | 懂色tv | 国产一区精品 | 欧美不卡 | 日日日日日日bbbbb视频 | 国产 日韩 欧美 中文 在线播放 | 91精品国产91久久久久久 | 91精品国产色综合久久不卡98口 | 国产情侣在线看 | 精品欧美一区二区三区久久久 | 亚洲电影中文字幕 | 久久精品97| 亚洲综合无码一区二区 | 日本不卡免费新一二三区 | 精品视频免费 |