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

標題: 基于51單片機的濕度計 按下“結束鍵后無任何顯示” [打印本頁]

作者: 懶爺駕到    時間: 2024-5-14 17:22
標題: 基于51單片機的濕度計 按下“結束鍵后無任何顯示”
  1. /******************************
  2. 基于51單片機的濕度計

  3. ********************************/
  4. #include <reg52.h>
  5. #include <intrins.h>
  6. #include <absacc.h>
  7. #include <math.h>
  8. #include "DHT11.h"
  9. #include "LCD.h"
  10. #include "delay.h"
  11.         
  12. sbit Key_Begin = P2^0;
  13. sbit Key_Over = P2^1;

  14. unsigned char humiH,humiL;

  15. void main()
  16. {
  17.         while(1)
  18.         {
  19.                 LCD1602_Init();//LCD1602初始化
  20.                 LCD1602_Write_Cmd(0x82);//確定顯示位置
  21.                 LCD1602_Write_Data('P');//確定顯示"P"
  22.         
  23.                 if(Key_Begin == 0)
  24.                 {
  25.                         while(1)
  26.                         {
  27.                                 LCD1602_Init();//LCD1602初始化
  28.                                 LCD1602_Write_Cmd(0x83);//確定顯示位置
  29.                                 LCD1602_Write_Data('H');//確定顯示內容,H
  30.                                 LCD1602_Write_Cmd(0x84);//地址
  31.                                 LCD1602_Write_Data('u');//內容,u
  32.                                 LCD1602_Write_Cmd(0x85);//地址
  33.                                 LCD1602_Write_Data('m');//內容,m
  34.                                 LCD1602_Write_Cmd(0x86);//地址
  35.                                 LCD1602_Write_Data(0x3A);//內容,:
  36.                                 LCD1602_Write_Cmd(0x89);//地址
  37.                                 LCD1602_Write_Data(0x25);//內容,%

  38.                                 DHT11_Read_Date(&humiH,&humiL);//DHT11讀取數據
  39.                                 Delay1000ms();
  40.                                 
  41.                                 LCD1602_Write_Cmd(0x87);//確定顯示地址
  42.                                 LCD1602_Write_Data(humiH);//確定顯示內容 humiH
  43.                                 LCD1602_Write_Cmd(0x88);//地址
  44.                                 LCD1602_Write_Data(humiL);//內容 humiL
  45.                                 if(Key_Over == 0)
  46.                                 {
  47.                                         break;
  48.                                 }
  49.                         }
  50.                         LCD1602_Init();//LCD1602初始化
  51.                         LCD1602_Write_Cmd(0x82);//確定顯示位置:第一行第一個
  52.                         LCD1602_Write_Data('P');//確定顯示"P"
  53.                 }
  54.         }
  55. }

  56. #include "LCD.h"
  57. #define Lcd_DataPort P0
  58. /************************************
  59. //函數名稱:LCD1602_Write_Cmd
  60. //輸入參數:cmd-指令
  61. //輸出參數:無
  62. //函數功能:LCD1602寫指令
  63. *********************************/
  64. void LCD1602_Write_Cmd(char cmd)
  65. {
  66.         RS = 0;
  67.         RW = 0;
  68.         EN = 0;
  69.         //配置DB0-DB7的電平
  70.         Lcd_DataPort = cmd;
  71.         _nop_();
  72.         //延時tsp+tsp2的時間
  73.         EN = 1;
  74.         //EN變為高電平,讓Lcd1602開始讀取DB0-DB7的引腳電平
  75.         _nop_();
  76.         //延時tpm一段時間
  77.         EN = 0;
  78.         _nop_();
  79.         //延時tc-tpw時間
  80. }

  81. /************************************
  82. //函數名稱:LCD1602_Write_Data
  83. //輸入參數:cmd-數據
  84. //輸出參數:無
  85. //函數功能:LCD1602寫數據
  86. *********************************/
  87. void LCD1602_Write_Data(char cmd)
  88. {
  89.         RS = 1;
  90.         RW = 0;
  91.         EN = 0;
  92.         //配置DB0-DB7的電平
  93.         Lcd_DataPort = cmd;
  94.         _nop_();
  95.         //延時tsp+tsp2的時間
  96.         EN = 1;
  97.         //EN變為高電平,讓Lcd1602開始讀取DB0-DB7的引腳電平
  98.         _nop_();
  99.         //延時tpm一段時間
  100.         EN = 0;
  101.         _nop_();
  102.         //延時tc-tpw時間
  103. }

  104. /************************************
  105. //函數名稱:LCD1602_Init
  106. //輸入參數:無
  107. //輸出參數:無
  108. //函數功能:LCD1602初始化
  109. *********************************/
  110. void LCD1602_Init(void)
  111. {
  112.         Delay15ms();
  113.         LCD1602_Write_Cmd(0x38);//寫指令38H
  114.         Delay5ms();
  115.         LCD1602_Write_Cmd(0x38);//顯示模式設置
  116.         Delay5ms();
  117.         LCD1602_Write_Cmd(0x38);//顯示模式設置
  118.         LCD1602_Busy_Check();
  119.         LCD1602_Write_Cmd(0x38);
  120.         LCD1602_Busy_Check();
  121.         LCD1602_Write_Cmd(0x08);//顯示關閉
  122.         LCD1602_Busy_Check();
  123.         LCD1602_Write_Cmd(0x01);//顯示清屏
  124.         LCD1602_Busy_Check();
  125.         LCD1602_Write_Cmd(0x06);//顯示光標移動設置
  126.         LCD1602_Busy_Check();
  127.         LCD1602_Write_Cmd(0x0c);//顯示開及光標設置
  128. }

  129. /************************************
  130. //函數名稱:LCD1602_Busy_Check
  131. //輸入參數:無
  132. //輸出參數:無
  133. //函數功能:LCD1602忙信號檢測
  134. *********************************/
  135. void LCD1602_Busy_Check(void)
  136. {
  137.         char tmp;//用來保存Lcd_date的電平狀態
  138.         Lcd_DataPort = 0xff;//一開始的時候,Lcd_date設置成輸入狀態
  139.         do{
  140.                 RS = 0;
  141.                 RW = 1;
  142.                 EN = 1;
  143.                 _nop_();
  144.                 //延時CP
  145.                 tmp = Lcd_DataPort;
  146.                 _nop_();
  147.                 //延時PQ
  148.                  EN = 0;
  149.                 }while(tmp&0x80);//判斷最高位是否為1
  150. }

  151. #include "DHT11.h"
  152. /************************************
  153. //函數名稱:DHT11_Rst
  154. //輸入參數:無
  155. //輸出參數:無
  156. //函數功能:DHT11復位
  157. *********************************/
  158. void DHT11_Rst(void)
  159. {
  160.         DHT11_IO = 0;//主機拉低總線,至少18ms以上
  161.         Delay20ms();
  162.         DHT11_IO = 1;//主機拉高總線,20-40us
  163.         Delay30us();
  164. }

  165. /************************************
  166. //函數名稱:DHT11_Check
  167. //輸入參數:無
  168. //輸出參數:無
  169. //函數功能:DHT11信號檢測
  170. *********************************/
  171. char DHT11_Check(void)
  172. {
  173.         unsigned int t = 0;
  174.         while(DHT11_IO)//等待低電平出現
  175.         {
  176.                 t++;
  177.                 _nop_();
  178.                 if(t > 1000)
  179.                         return -1;
  180.         }
  181.         t = 0;
  182.         while(!DHT11_IO)//判斷低電平的合法性,低電平時間80us
  183.         {
  184.                 t++;
  185.                 _nop_();
  186.                 if(t > 100)
  187.                         return -2;
  188.         }
  189.         t = 0;
  190.         while(DHT11_IO)//判斷高電平的合法性,高電平時間80us
  191.         {
  192.                 t++;
  193.                 _nop_();
  194.                 if(t > 100)
  195.                         return -3;
  196.         }
  197.         return 0;//如果DHT11 正常,返回0,異常返回小于0
  198. }

  199. /************************************
  200. //函數名稱:DHT11_Read_Byte
  201. //輸入參數:無
  202. //輸出參數:dat
  203. //函數功能:DHT11讀取數據
  204. *********************************/
  205. unsigned char DHT11_Read_Byte(void)
  206. {
  207.         unsigned char i;
  208.         unsigned int t = 0;
  209.         unsigned char dat = 0;
  210.         for(i = 0;i<8;i++)//高位先出,地位后出
  211.         {
  212.                 while(!DHT11_IO)//等待50us低電平過去,超時
  213.                 {
  214.                         t++;
  215.                         _nop_();
  216.                         if(t > 100)
  217.                         return 0;
  218.                 }
  219.                 Delay40ms();
  220.                 dat <<= 1;
  221.                 if(DHT11_IO == 1)
  222.                 {
  223.                         dat |= 1;
  224.                         t = 0;
  225.                         while(!DHT11_IO)
  226.                         {
  227.                                 t++;
  228.                                 _nop_();
  229.                                 if(t > 100)
  230.                                 return 0;
  231.                         }
  232.                 }
  233.         }
  234.         return dat;
  235. }

  236. /************************************
  237. //函數名稱:DHT11_Read_Date
  238. //輸入參數:無
  239. //輸出參數:無
  240. //函數功能:DHT11接收并數據檢驗
  241. *********************************/
  242. char DHT11_Read_Date(unsigned char *humiH,unsigned char *humiL)
  243. {
  244.         unsigned char buf[5];
  245.         DHT11_Rst();
  246.         if(DHT11_Check() == 0)
  247.         {               
  248.                 buf[0] = DHT11_Read_Byte();//接收濕度高8位
  249.                 buf[1] = DHT11_Read_Byte();//接收濕度低8位
  250.                 buf[2] = DHT11_Read_Byte();//接收溫度高8位
  251.                 buf[3] = DHT11_Read_Byte();//接收溫度低8位
  252.                 buf[4] = DHT11_Read_Byte();//接收校驗        
  253.                 Delay40ms();
  254.                 if(buf[0]+buf[1]+buf[2]+buf[3] == buf[4])
  255.                 {
  256.                         *humiH = buf[0];
  257.                         *humiL = buf[1];
  258.                 }
  259.                 else
  260.                         return -1;
  261.                 }
  262.         else
  263.                 return -2;
  264.         return 0;
  265. }
復制代碼
要求:上電或案件復位后自動顯示"P",進入測量準備階段;按測量開始鍵開始測量,當前環境的濕度在顯示器上穩定顯示;按測量結束鍵停止測量并返回"P"狀態。問題:上電后無法顯示“P”;按下“開始建”后只顯示部分數據;按下“結束鍵后無任何顯示”。
求各位大佬指點,在此謝過了

51hei圖片仿真.png (89.97 KB, 下載次數: 21)

51hei圖片仿真.png

濕度計.zip

72.04 KB, 下載次數: 3

程序+仿真


作者: chenbingjy    時間: 2024-5-15 18:45
你的版本太新了,我打不開。我還是用舊版試試吧,稍等
作者: chenbingjy    時間: 2024-5-15 19:08
我用你的程序,改了一下接口,根本液晶不顯示。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美一级特黄aaa大片在线观看 | 午夜欧美| 一级在线观看 | 91久久国产综合久久 | 人人看人人射 | 久久99视频 | 日韩一区二区三区在线 | 欧美精品导航 | 九九伦理片 | 黑人粗黑大躁护士 | 久久久影院 | 伊人手机在线视频 | 老司机精品福利视频 | 午夜91| 国产91久久精品一区二区 | 一区二区三区视频在线观看 | 国产午夜亚洲精品不卡 | 中文字幕视频在线观看 | 视频一二区| 国内精品视频在线观看 | 99pao成人国产永久免费视频 | 欧美激情欧美激情在线五月 | 操操操av | 精品欧美一区二区在线观看 | 中文字幕在线一 | 久久久久久高潮国产精品视 | 亚洲视频一区在线观看 | 久久久免费毛片 | 日韩精品成人一区二区三区视频 | 天堂国产 | av一区在线观看 | 国产在线a视频 | gogo肉体亚洲高清在线视 | 中文字幕成人av | 黄色av观看 | 亚洲天天干 | 久久精品99久久 | 在线观看av网站永久 | 日本久久久久久久久 | 欧美午夜视频 | 欧美天堂在线 |