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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LCD1602上顯示不出DHT11實時數值,求單片機大神指導如何調試?

[復制鏈接]
跳轉到指定樓層
樓主
LCD就是顯示不出實時數值,不知道是什么的原因,小弟真的沒什么學識,真誠的請求各位大佬的幫忙  謝謝。。。
有幫助的話有獎勵 謝謝。。。。 希望各位幫幫忙



單片機源程序如下:
  1. #include"dht11.h"           //添加DHT11頭文件
  2. #include <reg52.h>          //調用單片機頭文件
  3. #define uchar unsigned char  //無符號字符型 宏定義 變量范圍0~255
  4. #define uint  unsigned int  //無符號整型 宏定義 變量范圍0~65535
  5. #include <intrins.h>
  6. sbit CS=P2^4;  //CS定義為P2口的第4位腳,連接ADC0832CS腳
  7. sbit SCL=P2^3;  //SCL定義為P2口的第3位腳,連接ADC0832SCL腳
  8. sbit DO=P2^2;  //DO定義為P2口的第4位腳,連接ADC0832DO腳
  9. sbit beep = P3^2;          //蜂鳴器IO口定義
  10. sbit shuijin= P1^5;        //水浸IO口定義
  11. uint temperature,s_templ,s_temph;  //溫度的變量
  12. uchar shidu,s_sdl,s_sdh;          //濕度的變量
  13. uchar dengji,s_dengji;     //煙物等級
  14. uchar shoudong;            //手動報警鍵

  15. int flag_300ms ;
  16. uchar key_can;   //按鍵值的變量
  17. uchar menu_1;        //菜單設計的變量
  18. //這三個引腳參考資料
  19. sbit rs=P2^7;  //1602數據/命令選擇引腳 H:數據       L:命令
  20. sbit rw=P2^6;  //1602讀寫引腳          H:數據寄存器   L:指令寄存器
  21. sbit e =P2^5;  //1602使能引腳          下降沿觸發
  22. uchar code table_num[]="0123456789abcdefg";
  23. /********************************************************************
  24. * 名稱 : delay_uint()
  25. * 功能 : 小延時。
  26. * 輸入 : 無
  27. * 輸出 : 無
  28. ***********************************************************************/
  29. void delay_uint(uint q)
  30. {
  31. while(q--);
  32. }
  33. /********************************************************************
  34. * 名稱 : write_com(uchar com)
  35. * 功能 : 1602命令函數
  36. * 輸入 : 輸入的命令值
  37. * 輸出 : 無
  38. ***********************************************************************/
  39. void write_com(uchar com)
  40. {
  41. e=0;
  42. rs=0;
  43. rw=0;
  44. P0=com;
  45. delay_uint(3);
  46. e=1;
  47. delay_uint(25);
  48. e=0;
  49. }
  50. /********************************************************************
  51. * 名稱 : write_data(uchar dat)
  52. * 功能 : 1602寫數據函數
  53. * 輸入 : 需要寫入1602的數據
  54. * 輸出 : 無
  55. ***********************************************************************/
  56. void write_data(uchar dat)
  57. {
  58. e=0;
  59. rs=1;
  60. rw=0;
  61. P0=dat;
  62. delay_uint(3);
  63. e=1;
  64. delay_uint(25);
  65. e=0;
  66. }
  67. /********************************************************************
  68. * 名稱 : write_sfm2(uchar hang,uchar add,uchar date)
  69. * 功能 : 顯示2位十進制數,如果要讓第一行,第五個字符開始顯示"23" ,調用該函數如下
  70.     write_sfm1(1,5,23)
  71. * 輸入 : 行,列,需要輸入1602的數據
  72. * 輸出 : 無
  73. ***********************************************************************/
  74. void write_sfm2(uchar hang,uchar add,uint date)
  75. {
  76. if(hang==1)
  77.   write_com(0x80+add);
  78. else
  79.   write_com(0x80+0x40+add);
  80. write_data(0x30+date/10%10);
  81. write_data(0x30+date%10);
  82. }
  83. /********************************************************************
  84. * 名稱 : write_sfm1(uchar hang,uchar add,uchar date)
  85. * 功能 : 顯示1位十進制數,如果要讓第一行,第五個字符開始顯示"2" ,調用該函數如下
  86.     write_sfm1(1,5,2)
  87. * 輸入 : 行,列,需要輸入1602的數據
  88. * 輸出 : 無
  89. ***********************************************************************/
  90. void write_sfm1(uchar hang,uchar add,uint date)
  91. {
  92. if(hang==1)
  93.   write_com(0x80+add);
  94. else
  95.   write_com(0x80+0x40+add);
  96. write_data(0x30+date);
  97. }
  98. /********************************************************************
  99. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  100. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  101.     write_string(1,5,"ab cd ef;")
  102. * 輸入 : 行,列,需要輸入1602的數據
  103. * 輸出 : 無
  104. ***********************************************************************/
  105. void write_string(uchar hang,uchar add,uchar *p)
  106. {
  107. if(hang==1)
  108.   write_com(0x80+add);
  109. else
  110.   write_com(0x80+0x40+add);
  111.   while(1)
  112.   {
  113.    if(*p == '\0')  break;
  114.    write_data(*p);
  115.    p++;
  116.   }
  117. }

  118. /***********************lcd1602上顯示特定的字符************************/
  119. void write_zifu(uchar hang,uchar add,uchar date)
  120. {
  121. if(hang==1)
  122.   write_com(0x80+add);
  123. else
  124.   write_com(0x80+0x40+add);
  125. write_data(date);
  126. }

  127. /********************************************************************
  128. * 名稱 : init_1602()
  129. * 功能 : 初始化1602液晶
  130. * 輸入 : 無
  131. * 輸出 : 無
  132. ***********************************************************************/
  133. void init_1602()
  134. {
  135. write_com(0x38);
  136. write_com(0x0c);
  137. write_com(0x06);
  138. write_string(1,0,"Y:0/0S:00(00/00)");
  139. write_string(2,0,"W:00(00/00)SJ:0");
  140. write_sfm1(1,2,dengji);     //顯示煙物等級
  141. write_sfm1(1,4,s_dengji);
  142. write_sfm2(2,2,temperature);   //顯示溫度
  143.     write_sfm2(2,5,s_templ);
  144.     write_sfm2(2,8,s_temph);
  145. write_sfm2(1,7,shidu);         //顯示濕度
  146.     write_sfm2(1,10,s_sdl);
  147.     write_sfm2(1,13,s_sdh);
  148. write_sfm1(2,14,shuijin); //顯示是否水浸
  149. }
  150. /***********************1ms延時函數*****************************/
  151. void delay_1ms(uint q)
  152. {
  153. uint i,j;
  154. for(i=0;i<q;i++)
  155.   for(j=0;j<120;j++);
  156. }
  157. /*************讀取溫度的值 ***************/
  158. uint read_temp()
  159. {
  160. uchar T1_data=0;  //溫度變量
  161. while(1)
  162.     {
  163.         T1_data=Read_TRH(0,0);//溫度
  164.     }
  165. return T1_data;     //返回讀出的溫度
  166. }
  167. /*************讀取濕度的值 ***************/
  168. uint read_sd()
  169. {
  170. uchar R1_data=0;//濕度變量
  171. while(1)
  172.     {
  173.   R1_data=Read_TRH(1,0);//濕度
  174.     }
  175. return R1_data;     //返回讀出的濕度
  176. }
  177. /***********讀數模轉換數據********************************************************/
  178. //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的
  179.       //  1  0  0 通道
  180.       //  1  1  1 通道
  181. unsigned char ad0832read(bit SGL,bit ODD)
  182. {
  183. unsigned char i=0,value=0,value1=0;
  184. SCL=0;
  185. DO=1;
  186. CS=0;  //開始
  187. SCL=1;  //第一個上升沿
  188. SCL=0;
  189. DO=ODD;
  190. SCL=1;   //第二個上升沿
  191. SCL=0;
  192. DO=SGL;
  193. for(i=0;i<8;i++)
  194. {
  195.   SCL=0; //開始從第四個下降沿接收數據
  196.   value<<=1;
  197.   SCL=1;
  198.   if(DO)
  199.    value++;
  200. }
  201. return value;
  202. }
  203. /********************獨立按鍵程序*****************/
  204. uchar key_can;  //按鍵值
  205. void key()  //獨立按鍵程序
  206. {
  207. static uchar key_new;
  208. key_can = 20;                   //按鍵值還原
  209. P1 |= 0x0f;
  210. if((P1 & 0x0f) != 0x0f)  //按鍵按下
  211. {
  212.   delay_1ms(1);       //按鍵消抖動
  213.   if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
  214.   {      //確認是按鍵按下
  215.    key_new = 0;
  216.    switch(P1 & 0x0f)
  217.    {
  218.     case 0x0e: key_can = 4; break;    //得到k1鍵值
  219.     case 0x0d: key_can = 3; break;    //得到k2鍵值
  220.     case 0x0b: key_can = 2; break;    //得到k3鍵值
  221.     case 0x07: key_can = 1; break;    //得到k4鍵值
  222.    }
  223.   }
  224. }
  225. else
  226.   key_new = 1;
  227. }
  228. /****************按鍵處理數碼管顯示函數***************/
  229. void key_with()
  230. {
  231. if(key_can == 4)   //緊急報警鍵  手動報警
  232. {
  233.   if(menu_1 == 0)
  234.    shoudong = 1;
  235. }
  236. if(key_can == 1)  //設置鍵
  237. {
  238.   menu_1 ++;
  239.   if(menu_1 >= 4)
  240.   {
  241.    menu_1 = 0;
  242.   }
  243.   if(menu_1 == 0)
  244.    init_1602() ;  //初始化顯示
  245. }
  246. if(menu_1 == 0)
  247. {
  248.   if((key_can == 2) || (key_can == 3))
  249.    shoudong = 0;          //取消手動報警
  250. }
  251. if(menu_1 == 1)   //設置煙霧報警
  252. {
  253.   if(key_can == 2)
  254.   {
  255.    s_dengji ++ ;   //煙物報警值加1
  256.    if(s_dengji >= 99)
  257.     s_dengji = 99;
  258.   }
  259.   if(key_can == 3)
  260.   {
  261.    s_dengji --;   //煙物報警值減1
  262.    if(s_dengji <= 1)
  263.     s_dengji = 1;
  264.   }
  265. }
  266.     if(menu_1 == 2)   //設置低濕度報警
  267. {
  268.   if(key_can == 2)
  269.   {
  270.    s_sdl ++ ;  //低濕度報警值加1
  271.    if(s_sdl > 50)
  272.     s_sdl = 50;
  273.   }
  274.   if(key_can == 3)
  275.   {
  276.    s_sdl -- ;  //低濕度報警值減1
  277.    if(s_sdl <= 00)
  278.     s_sdl = 00 ;
  279.   }
  280. }
  281. if(menu_1 == 4)   //設置低溫報警
  282. {
  283.   if(key_can == 2)
  284.   {
  285.    s_templ ++ ;  //低溫報警值加1
  286.    if(s_templ > 50)
  287.     s_templ = 50;
  288.   }
  289.   if(key_can == 3)
  290.   {
  291.    s_templ -- ;  //低溫報警值減1
  292.    if(s_templ <= 00)
  293.     s_templ = 00 ;
  294.   }
  295. }
  296.     write_sfm2(1,10,s_sdl);
  297.     write_sfm2(2,5,s_templ);   //顯示溫度
  298.     write_sfm1(1,4,s_dengji);     //顯示煙物等級

  299.     if(menu_1 == 3)   //設置高濕度報警
  300. {
  301.   if(key_can == 2)
  302.   {
  303.    s_sdh ++ ;  //高濕度報警值加1
  304.    if(s_sdh > 99)
  305.     s_sdh = 99;
  306.   }
  307.   if(key_can == 3)
  308.   {
  309.    s_sdh -- ;  //高濕度報警值減1
  310.    if(s_sdh <= 10)
  311.     s_sdh = 10 ;
  312.   }
  313. }
  314.     if(menu_1 == 5)   //設置高溫報警
  315. {
  316.   if(key_can == 2)
  317.   {
  318.    s_temph ++ ;  //高溫報警值加1
  319.    if(s_temph > 99)
  320.     s_temph = 99;
  321.   }

  322.   if(key_can == 3)
  323.   {
  324.    s_temph -- ;  //高溫報警值減1
  325.    if(s_temph <= 10)
  326.     s_temph = 10 ;
  327.   }
  328. }
  329.     write_sfm2(1,13,s_sdh);    //顯示濕度
  330.     write_sfm2(2,8,s_temph);   //顯示溫度
  331.     write_com(0x80+0x40+15);           //將光標移動到第2行第到3位
  332.     write_com(0x0f);                  //顯示光標并且閃爍
  333. }
  334. /****************報警函數***************/
  335. void clock_h_l()
  336. {
  337. if((dengji >= s_dengji) || (temperature >= s_temph) || (temperature <= s_templ) || (shoudong == 1)||(shidu>=s_sdh)||(shidu<=s_sdl)||(shuijin==0))  //報警
  338. {
  339.   beep = ~beep;   //蜂鳴器報警
  340. }else
  341. {
  342.   beep = 1;
  343. }
  344. }
  345. /***************主函數*****************/
  346. void main()
  347. {
  348. beep = 0;        //開機蜂鳴器叫一聲
  349. delay_1ms(200);
  350. P0 = P1 = P2 = P3 = 0xff;   //初始化IO口
  351. init_1602();      //1602液晶初始化
  352. while(1)
  353. {
  354.   key();     //獨立按鍵程序
  355.   if(key_can < 10)
  356.   {
  357.    key_with();   //按鍵按下要執行的程序
  358.   }
  359.   flag_300ms ++;
  360.   if(flag_300ms >= 300)
  361.   {
  362.    flag_300ms = 0;
  363.    temperature = read_temp();  //讀取溫度值
  364.    shidu = read_sd(); //讀取濕度值
  365.    clock_h_l();
  366.    dengji = ad0832read(1,0);
  367.    dengji = dengji * 500 / 255;
  368.       dengji = dengji - 100;
  369.    write_sfm2(2,2,temperature);   //顯示溫度
  370.    write_sfm1(1,2,dengji);     //顯示煙物等級
  371.    write_sfm1(1,14,shuijin);//水浸
  372.    write_sfm2(2,7,shidu);//濕度
  373.   }
  374.   delay_1ms(1);
  375. }
  376. }

  377. DHT11.h的文件
  378. #ifndef __DHT11_H__
  379. #define __DHT11_H__
  380. #include"delay.h"
  381. sbit DHT11_DQ2 = P2^0;
  382. sbit DHT11_DQ1 = P2^0;
  383. uchar U8count,U8temp,U8FLAG,U8comdata;
  384. void Delay_10us(void)
  385. {
  386. uchar i;
  387. i--;
  388. i--;
  389. i--;
  390. i--;
  391. i--;
  392. i--;
  393. }
  394. void COM(uchar n)
  395. {
  396.   uchar i;
  397.     for(i=0;i<8;i++)
  398.     {
  399.      U8FLAG=2;
  400.      if(n){while((!DHT11_DQ1)&&U8FLAG++);}
  401.   else {while((!DHT11_DQ2)&&U8FLAG++);}
  402.      Delay_10us();
  403.      Delay_10us();
  404.        U8temp=0;
  405.        if(n){if(DHT11_DQ1)U8temp=1;}
  406.   else {if(DHT11_DQ2)U8temp=1;}
  407.        U8FLAG=2;
  408.      if(n){while((DHT11_DQ1)&&U8FLAG++);}
  409.   else {while((DHT11_DQ2)&&U8FLAG++);}
  410.      if(U8FLAG==1)break;
  411.       U8comdata<<=1;
  412.         U8comdata|=U8temp;
  413. }
  414. }
  415. uchar Read_TRH(uchar ch,uchar n)
  416. {
  417. uchar TRH_data=0;
  418. static uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  419. static uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  420.     if(n)DHT11_DQ1=0;
  421. else DHT11_DQ2=0;
  422.     Delay(24);
  423.     if(n)DHT11_DQ1=1;
  424. else DHT11_DQ2=1;
  425.     Delay_10us();
  426.     Delay_10us();
  427.     Delay_10us();
  428.     Delay_10us();
  429.     if(n)DHT11_DQ1=1;
  430. else DHT11_DQ2=1;
  431.     if(!DHT11_DQ1 || !DHT11_DQ2)
  432.     {
  433.      U8FLAG=2;
  434.      if(n){while((!DHT11_DQ1)&&U8FLAG++);}
  435.   else {while((!DHT11_DQ2)&&U8FLAG++);}
  436.      U8FLAG=2;
  437.      if(n){while((DHT11_DQ1)&&U8FLAG++);}
  438.   else {while((DHT11_DQ2)&&U8FLAG++);}
  439.      COM(n);U8RH_data_H_temp=U8comdata;
  440.      COM(n);U8RH_data_L_temp=U8comdata;
  441.      COM(n);U8T_data_H_temp=U8comdata;
  442.      COM(n);U8T_data_L_temp=U8comdata;
  443.      COM(n);U8checkdata_temp=U8comdata;
  444.      if(n)DHT11_DQ1=1;
  445.   else DHT11_DQ2=1;
  446.      U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  447.      if(U8temp==U8checkdata_temp)
  448.      {
  449.          U8RH_data_H=U8RH_data_H_temp;
  450.          U8RH_data_L=U8RH_data_L_temp;
  451.       U8T_data_H=U8T_data_H_temp;
  452.          U8T_data_L=U8T_data_L_temp;
  453.          U8checkdata=U8checkdata_temp;
  454.      }
  455.     }
  456. if(ch)TRH_data=U8RH_data_H;
  457. else TRH_data=U8T_data_H;
  458. return TRH_data;
  459. }
  460. #endif
復制代碼


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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩欧美一区二区 | 欧美一区免费在线观看 | 久久久91 | 在线欧美亚洲 | 欧美日韩不卡在线 | 一级片网站视频 | 亚洲国产精品一区二区第一页 | 在线中文字幕国产 | 一级欧美黄色片 | 国精产品一区一区三区免费完 | 国产成人综合久久 | 国产精品欧美一区二区三区不卡 | 日本在线观看网址 | 欧美精品一区在线 | 国产精品福利久久久 | 中文字幕在线一区 | 99精品视频免费观看 | 超碰人人做 | 日韩精品一区二区三区视频播放 | 超碰男人天堂 | 免费日韩av网站 | 精品国产一区二区三区久久久蜜月 | 日韩无 | 在线国产视频 | 久久综合伊人 | 久久国产精品99久久久大便 | 国产欧美一区二区三区国产幕精品 | 人人草人人干 | 一区二区日韩 | 国产精品特级毛片一区二区三区 | 久久久久久国产精品 | 国产欧美在线观看 | 欧美一区在线视频 | 56pao在线| 亚洲综合在线一区二区 | 一级黄色片在线看 | 日日网| 成人精品久久 | 国产农村妇女毛片精品久久麻豆 | 久久国产一区二区三区 | 国产亚洲一区精品 |