找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1597|回复: 2
收起左侧

求助!请问为啥单片机+LCD1602显示的是这样子的?问题如下

[复制链接]
回帖奖励 8 黑币 回复本帖可获得 8 黑币奖励! 每人限 1 次
ID:913310 发表于 2021-5-8 10:48 | 显示全部楼层 |阅读模式
LCD显示正常应该是是温度Wd:00  H00  L00,湿度Sd:00% H00% L00% ,但是仿真图显示出来的是不对的;另外就是按键函数那块,按键不起温湿度选择加减,而且对应的LED报警也是不对的;最后就是DHT11温湿度传感也可能有问题。全部代码如下,希望有大佬可以解决一下。

单片机源程序如下:
  1. #include <reg52.h>                 
  2. #define uchar unsigned char  
  3. #define uint  unsigned int         
  4. #include<intrins.h>
  5. sbit beep = P1^0;  
  6. uchar a_a;
  7. bit flag_300ms ;
  8. uchar key_can;                 
  9. sbit wh_led = P1^4;  
  10. sbit wl_led = P1^3;
  11. sbit sh_led = P1^5;
  12. sbit sl_led = P1^6;
  13. uchar flag_en = 1;
  14. uchar menu_1;  
  15. uint t_high = 30,t_low = 10;
  16. uint s_high = 30,s_low = 10;
  17. void delay_1ms(uint q)
  18. {
  19.         uint i,j;
  20.         for(i=0;i<q;i++)
  21.                 for(j=0;j<120;j++);
  22. }
  23. sbit dht11=P1^1;
  24. uchar table_dht11[5]={1,2,3,4,5};
  25. uchar code table_num[]="0123456789abcdefg";
  26. sbit rs=P2^0;        
  27. sbit rw=P2^1;        
  28. sbit e =P2^2;         
  29. void delay_uint(uint q)
  30. {
  31.         while(q--);
  32. }
  33. void write_com(uchar com)      
  34. {
  35.         e=0;
  36.         rs=0;
  37.         rw=0;
  38.         P0=com;
  39.         delay_uint(25);
  40.         e=1;                          
  41.         delay_uint(100);
  42.         e=0;
  43. }
  44. void write_data(uchar dat)   
  45. {
  46.         e=0;
  47.         rs=1;
  48.         rw=0;
  49.         P0=dat;
  50.         delay_uint(25);
  51.         e=1;                           //éÏéyÑØÖ′DD
  52.         delay_uint(100);
  53.         e=0;        
  54. }
  55. void write_zifu(uchar hang,uchar add,uchar date)
  56. {
  57.         if(hang==1)   
  58.                 write_com(0x80+add);
  59.         else
  60.                 write_com(0x80+0x40+add);
  61.         write_data(date);        
  62. }
  63. void write_sfm2(uchar hang,uchar add,uint date)
  64. {
  65.         if(hang==1)   
  66.                 write_com(0x80+add);
  67.         else
  68.                 write_com(0x80+0x40+add);
  69.         write_data(0x30+date/10%10);
  70.         write_data(0x30+date%10);        
  71. }
  72. void write_string(uchar hang,uchar add,uchar *p)
  73. {
  74.         if(hang==1)   
  75.                 write_com(0x80+add);
  76.         else
  77.                 write_com(0x80+0x40+add);
  78.                 while(1)                                                                                                                 
  79.                 {
  80.                         if(*p == '\0')  break;
  81.                         write_data(*p);
  82.                         p++;
  83.                 }        
  84. }
  85. void init_1602()               //LCD16023õê¼»ˉoˉêy
  86. {
  87.         write_com(0x38);        
  88.         write_com(0x0c);
  89.         write_com(0x06);
  90.         delay_uint(1000);
  91.         write_string(1,0,"Wd:00  H00  L00   ");        
  92.         write_string(2,0,"Sd:00% H00% L00% ");        
  93.         write_zifu(1,5,0xdf);
  94.         write_zifu(1,10,0xdf);        
  95.         write_zifu(1,15,0xdf);        
  96.         write_sfm2(1,3,table_dht11[2]);         
  97.         write_sfm2(2,3,table_dht11[0]);   
  98.         write_sfm2(1,7,t_high);         
  99.         write_sfm2(2,7,s_high);   
  100.         write_sfm2(1,10,t_low);         
  101.         write_sfm2(2,10,s_low);   

  102. }
  103. void time_init()         
  104. {
  105.         EA   = 1;                 
  106.         TMOD = 0X01;
  107.         ET0  = 1;                  
  108.         TR0  = 1;               
  109. }
  110. uchar key_can;         //°′¼ü

  111. void key()            
  112. {
  113.         static uchar key_new;
  114.         key_can = 20;              
  115.         P3 |= 0xf0;    //¸ßËÄλ
  116.         if((P3 & 0xf0) != 0xf0)        
  117.         {
  118.                 delay_1ms(1);            
  119.                 if(((P3 & 0xf0) != 0xf0) && (key_new == 1))  
  120.                 {                                                
  121.                         key_new = 0;
  122.                         switch(P3 & 0xf0)
  123.                         {
  124.                                 case 0xd0: key_can = 1; break;        
  125.                                 case 0xb0: key_can = 2; break;           
  126.                                 case 0x70: key_can = 3; break;           
  127.                         }
  128.                 }                        
  129.         }
  130.         else
  131.                 key_new = 1;        
  132. }
  133. void key_with()
  134. {
  135.         if(key_can == 1)         
  136.         {
  137.                 menu_1 ++;
  138.                 if(menu_1 > 2)
  139.                 {
  140.                         menu_1 = 0;
  141.                         init_1602();
  142.                 }
  143.         }
  144.         if(menu_1 == 1)                        
  145.         {
  146.                 if(key_can == 2)
  147.                 {
  148.                         t_high ++ ;               
  149.                         if(t_high > 99)
  150.                                 t_high = 99;
  151.                 }
  152.                 if(key_can == 3)
  153.                 {
  154.                         t_high -- ;               
  155.                         if(t_high <= t_low)
  156.                                 t_high = t_low + 1;
  157.                 }
  158.                 write_sfm2(1,8,t_high);         
  159.                 write_com(0x80+8);            
  160.                 write_com(0x0f);                  
  161.         }        
  162.         if(menu_1 == 2)                        
  163.         {
  164.                 if(key_can == 2)
  165.                 {
  166.                         t_low ++ ;                        
  167.                         if(t_low >= t_high)
  168.                                 t_low = t_high - 1;
  169.                 }
  170.                 if(key_can == 3)                        
  171.                 {
  172.                         t_low -- ;                        
  173.                         if(t_low <= 1)
  174.                                 t_low = 1;
  175.                 }
  176.                 write_sfm2(1,13,t_low);
  177.                 write_com(0x80+13);         
  178.                 write_com(0x0f);               
  179.         }
  180.         if(menu_1 == 3)               
  181.         {
  182.                 if(key_can == 2)
  183.                 {
  184.                         s_high ++ ;               
  185.                         if(s_high > 99)
  186.                                 s_high = 99;
  187.                 }
  188.                 if(key_can == 3)
  189.                 {
  190.                         s_high -- ;               
  191.                         if(s_high <= s_low)
  192.                                 s_high = s_low + 1;
  193.                 }
  194.                 write_sfm2(2,8,s_high);         
  195.                 write_com(0x80+0x40+8);           
  196.                 write_com(0x0f);                  
  197.         }        
  198.         if(menu_1 == 4)               
  199.         {
  200.                 if(key_can == 2)
  201.                 {
  202.                         s_low ++ ;                        
  203.                         if(s_low >= s_high)
  204.                                 s_low = s_high - 1;
  205.                 }
  206.                 if(key_can == 3)                        
  207.                 {
  208.                         s_low -- ;                        
  209.                         if(s_low <= 1)
  210.                                 s_low = 1;
  211.                 }
  212.                 write_sfm2(2,13,s_low);           
  213.                 write_com(0x80+0x40+13);            
  214.                 write_com(0x0f);                    
  215.         }               
  216. }
  217. void dst11()
  218. {
  219.         uchar i,j;                        
  220.         dht11 = 0;        
  221.         delay_1ms(5);
  222.         dht11 = 1;
  223.         delay_uint(4);         
  224.         if(dht11 == 0)         
  225.         {
  226.                 while(dht11 == 0);
  227.                 while(dht11 == 1);         
  228.                 for(i=0;i<5;i++)
  229.                 {
  230.                         for(j=0;j<8;j++)
  231.                         {
  232.                                 table_dht11[i] <<= 1;
  233.                                 while(dht11 == 1);
  234.                                 delay_uint(4);         
  235.                                 if(dht11 == 1)
  236.                                 {
  237.                                         table_dht11[i] |= 0x01;
  238.                                         while(dht11 == 1);         
  239.                                 }                        
  240.                         }                        
  241.                 }                        
  242.         }
  243.         dht11 = 1;
  244. }
  245. void clock_h_l()
  246. {
  247.         static uchar value,value1,value2,value3,value4;
  248.         if((table_dht11[2] >= t_high))
  249.         {                        
  250.                 value1 ++;                  
  251.                 if(value1 > 2)
  252.                 {
  253.                         wh_led = 0;                 
  254.                 }               
  255.         }
  256.         else
  257.         {
  258.                 value1 = 0;
  259.                 wh_led = 1;                 
  260.         }
  261.         if((table_dht11[2] <= t_low))
  262.         {                        
  263.                 value2 ++;                 
  264.                 if(value2 > 2)
  265.                 {
  266.                         wl_led = 0;                  
  267.                 }               
  268.         }
  269.         else
  270.         {
  271.                 value2 = 0;
  272.                 wl_led = 1;                 
  273.         }
  274.         if((table_dht11[0] >= s_high))
  275.         {
  276.                 value3 ++;                 
  277.                 if(value3 > 2)
  278.                 {
  279.                         sh_led = 0;               
  280.                 }
  281.         }else
  282.         {
  283.                 value3 = 0;        
  284.                 sh_led = 1;                 
  285.         }
  286.         if((table_dht11[0] <= s_low))
  287.         {
  288.                 value4 ++;                 
  289.                 if(value4 > 2)
  290.                 {
  291.                         sl_led = 0;                  
  292.                 }
  293.         }else
  294.         {
  295.                 value4 = 0;        
  296.                 sl_led = 1;                 
  297.         }
  298.         if((wh_led == 0) || (wl_led == 0) || (sh_led == 0) || (sl_led == 0))
  299.         {
  300.                 value ++;
  301.                 if(value >= 2)
  302.                         if(flag_en == 1)
  303.                         beep = ~beep;           
  304.         }
  305.         else
  306.         {
  307.                 beep = 1;
  308.                 value = 0;
  309.                 flag_en = 1;
  310.         }
  311. }  
  312. void main()
  313. {               
  314.         beep = 0;                                
  315.         delay_1ms(150);
  316.         P0 = P1 = P2 = P3 = 0xff;
  317.         time_init();         
  318.         init_1602();        
  319.         dst11();           
  320.         while(1)
  321.         {
  322.                 if(flag_300ms == 1)
  323.                 {
  324.                         flag_300ms = 0;
  325.                         dst11();               
  326.                         write_sfm2(2,3,table_dht11[0]);   
  327.                         write_sfm2(1,3,table_dht11[2]);         
  328.                         clock_h_l();   
  329.                 }
  330.                 key();
  331.                 if(key_can < 10)
  332.                 {
  333.                         key_with();                           
  334.                         if(key_can == 3)
  335.                         {
  336.                                 flag_en = 0;   
  337.                         }
  338.                 }
  339.                 delay_1ms(1);
  340.         }
  341. }
  342. void time0_int() interrupt 1   
  343. {        
  344.         static uchar value;
  345.         TH0 = 0x3c;
  346.         TL0 = 0xb0;     
  347.         value ++;         
  348.         if(value % 6 == 0)
  349.         {
  350.                 flag_300ms = 1;           
  351.                 value = 0;        
  352.         }
  353. }
复制代码

回复

使用道具 举报

ID:390416 发表于 2021-5-8 12:14 | 显示全部楼层
我发了个贴子 更新了LCD1602的时间要求 你可以先去看看 照着改动
回复

使用道具 举报

ID:913310 发表于 2021-5-8 12:24 | 显示全部楼层
802ab9cb2b03e56f403919e2b8a49dc8.png
仿真图在这里
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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