找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2445|回复: 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 单片机教程网

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