找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 939|回复: 4
打印 上一主题 下一主题
收起左侧

我这个程序烧到单片机里,LCD显示一翻页第一页的湿度就自己跳为零

[复制链接]
跳转到指定楼层
楼主
ID:1071895 发表于 2023-5-22 22:38 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我这个程序烧到单片机里,LCD显示一翻页第一页的湿度就自己跳为零,然后就报警,第二页的内容可以正常显示。
void main()
{        
        BUT=1;
  uart_init();//初始化串口
        lcd1602_init();
        time0_init();
        while(DHT11_Init())        //检测DHT11是否存在
        {
                lcd1602_show_string(0,0,"Error");               
        }
                DHT11_Read_Data(&temp,&humi);        
//        lcd1602_show_string(0,0,"Temp:   C");
//        lcd1602_show_string(0,1,"Humi:   %RH");
//                lcd1602_show_string(0,0,"Wating......");
//          delay_ms(2500);
        while(1)
        {
                i++;
                DHT11_Read_Data(&temp,&humi);
                valuedata1=200-Adc0832(0);
                delay_ms(100);
                valuedata2=Adc0832(1);
                key=key_scan(0);

                                        if(key==KEY1_PRESS)//检测按键K1是否按下,按下进入设置阈值状态
                        {
                                LED2=0;
                                while(1)   //温度上限设置
                                {
                                                key=key_scan(0);
                                         if(key==KEY2_PRESS)
                                         {
                                                temphigh++;
                                         }
                                                if(key==KEY3_PRESS)
                                         {
                                                temphigh--;
                                         }
                                         
                                                if(key==KEY1_PRESS)
                                        {
                                                break;
                                        }
                                        tempgoal_bufhigh[0]=temphigh/10+0x30;
                                        tempgoal_bufhigh[1]=temphigh%10+0x30;
                                        lcd1602_show_string(10,0,tempgoal_bufhigh);
                                }
                                
                                                                while(1)   //温度下限设置
                                {
                                                key=key_scan(0);
                                         if(key==KEY2_PRESS)
                                         {
                                                templow++;
                                         }
                                                if(key==KEY3_PRESS)
                                         {
                                                templow--;
                                         }
                                         
                                                if(key==KEY1_PRESS)
                                        {
                                                break;
                                        }
                                        tempgoal_buflow[0]=templow/10+0x30;
                                        tempgoal_buflow[1]=templow%10+0x30;
                                        lcd1602_show_string(13,0,tempgoal_buflow);
                                }

                                                                while(1)   //湿度上限设置
                                {
                                                key=key_scan(0);
                                         if(key==KEY2_PRESS)
                                         {
                                                humihigh++;
                                         }
                                                if(key==KEY3_PRESS)
                                         {
                                                humihigh--;
                                         }
                                         
                                                if(key==KEY1_PRESS)
                                        {
                                                break;
                                        }
                                        humigoal_bufhigh[0]=humihigh/10+0x30;
                                        humigoal_bufhigh[1]=humihigh%10+0x30;
                                        lcd1602_show_string(10,1,humigoal_bufhigh);
                                }

                                                                while(1)   //湿度下限设置
                                {
                                                key=key_scan(0);
                                         if(key==KEY2_PRESS)
                                         {
                                                humilow++;
                                         }
                                                if(key==KEY3_PRESS)
                                         {
                                                humilow--;
                                         }
                                         
                                                if(key==KEY1_PRESS)
                                        {
                                                break;
                                        }
                                        humigoal_buflow[0]=humilow/10+0x30;
                                        humigoal_buflow[1]=humilow%10+0x30;
                                        lcd1602_show_string(13,1,humigoal_buflow);
                                }
                                LED2=1;
                        }

                if(keydata==0)
                {
                        lcd1602_show_string(0,0,"Temp:   C");
                        lcd1602_show_string(0,1,"Humi:   %");
                        
                                        temp_buf[0]=temp/10+0x30;        
                                        temp_buf[1]=temp%10+0x30;
                                        temp_buf[2]='\0';
                                        lcd1602_show_string(6,0,temp_buf);

                                        humi_buf[0]=humi/10+0x30;        
                                        humi_buf[1]=humi%10+0x30;
                                        humi_buf[2]='\0';
                                        lcd1602_show_string(6,1,humi_buf);
                        
                        tempgoal_bufhigh[0]=temphigh/10+0x30;
                        tempgoal_bufhigh[1]=temphigh%10+0x30;
                        tempgoal_bufhigh[2]='\0';
                        
                        tempgoal_buflow[0]=templow/10+0x30;
                        tempgoal_buflow[1]=templow%10+0x30;
                        tempgoal_buflow[2]='\0';
                        
                        humigoal_bufhigh[0]=humihigh/10+0x30;
                        humigoal_bufhigh[1]=humihigh%10+0x30;
                        humigoal_bufhigh[2]='\0';
                        
                        
                        humigoal_buflow[0]=humilow/10+0x30;
                        humigoal_buflow[1]=humilow%10+0x30;
                        humigoal_buflow[2]='\0';
                        
                        lcd1602_show_string(10,0,tempgoal_bufhigh);
                        lcd1602_show_string(13,0,tempgoal_buflow);
                        lcd1602_show_string(10,1,humigoal_bufhigh);
                        lcd1602_show_string(13,1,humigoal_buflow);

                                        delay_ms(50);        
                }
                if(keydata==1)
                {
                        DHT11_Read_Data(&temp,&humi);
                        lcd1602_show_string(0,0,"GZ:   LUX");
                        lcd1602_show_string(0,1,"YW:   MMP");
                                        CO_buf[0]=valuedata1/100+0x30;
                                        CO_buf[1]=valuedata1%100/10+0x30;
                                        CO_buf[2]=valuedata1%10+0x30;
                                        CO_buf[3]='\0';        
                                        lcd1602_show_string(3,0,CO_buf);

                                        CH_buf[0]=valuedata2/100+0x30;
                                        CH_buf[1]=valuedata2%100/10+0x30;
                                        CH_buf[2]=valuedata2%10+0x30;
                                        CH_buf[3]='\0';
                                        lcd1602_show_string(3,1,CH_buf);
                                        delay_ms(50);        
                }
                if(temp>=temphigh||temp<=templow||humi>=humilow||humi<humihigh||valuedata2>=10)
                {
                 BEEP=0;
                 LED1=0;
                }
                else
                {
                 BEEP=1;
                 LED1=1;
                }
                                        if(temp>=temphigh)
                        {
                         IN1=0;
                        }
                        else
                        {
                         IN1=1;
                        }
                        if(temp<=templow)
                        {
                         IN2=0;
                        }
                        else
                        {
                         IN2=1;
                        }
                        if(humi<=humilow)
                        {
                         IN3=0;
                        }
                        else
                        {
                         IN3=1;
                        }
                        if(humi>=humihigh)
                        {
                         IN4=0;
                        }
                        else
                        {
                         IN4=1;
                        }
                        if(valuedata2>=10)
                        {
                         IN5=0;
                        }
                        else
                        {
                         IN5=1;
                        }
                delay_ms(1);               
        }
}
蓝牙程序:
void time0() interrupt 1 //定时器0中断函数
{
        TH0=0XDC;        //给定时器赋初值,定时10ms
        TL0=0X00;
        gmsec++;//10ms加1次
                        if(BUT==0)
                {
                        delay_ms(500);
                        lcd1602_clear();
                 keydata=!keydata;
                }
        if(gmsec%500==0)//定时5秒
        {
                                SendString("Temp:");
                                SendString(temp_buf);
                                SendString("C");
                                SendString("\r\n");
                                delay_ms(20);
                                SendString("Humi:");
                                SendString(humi_buf);
                                SendString("%");
                                SendString("\r\n");
                                delay_ms(20);
                                SendString("GZ:");
                                SendString("144");
                                SendString("LUX");
                                SendString("\r\n");
                                delay_ms(20);
                                SendString("YW:");
                                SendString(CH_buf);
                                SendString("MMP");
                                SendString("\r\n");
        }                                       
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1071895 发表于 2023-5-23 00:15 来自手机 | 只看该作者
求助,谢谢各位!
回复

使用道具 举报

板凳
ID:1079239 发表于 2023-5-23 08:30 | 只看该作者
根据你提供的程序,可能是由于在主函数中的循环中,每次都会重新读取DHT11的温湿度数据,而在发送蓝牙数据的定时器中断中,只发送了之前读取的温湿度数据,因此第一页显示的温湿度数据和第二页显示的温湿度数据不一致,导致第一页的湿度在显示完一次之后就变成了零。  解决方法是在发送蓝牙数据的定时器中断中,每次发送之前重新读取温湿度数据,例如可以将DHT11读取数据的代码移到定时器中断函数中,在定时器中断函数中更新温湿度数据并发送蓝牙数据。  另外,建议在发送蓝牙数据时先将数据存储到一个缓冲区中,然后再统一发送,以避免发送过程中出现数据混乱的情况。
回复

使用道具 举报

地板
ID:526543 发表于 2023-5-23 11:05 | 只看该作者
代码逻辑错误:在你的代码中,第一页显示的是温度和湿度数据,第二页显示的是GZ和YW数据。如果切换到第二页后,湿度显示为零,有可能是在切换页面的过程中,温湿度传感器读取出了错误的值,导致显示错误。你可以检查DHT11传感器的连接和代码逻辑,确保正确读取温湿度值。

数据传输问题:如果通过蓝牙传输数据给其他设备,可能存在数据传输错误导致显示异常。你可以检查蓝牙模块的连接和数据传输代码,确保数据正确传输。
回复

使用道具 举报

5#
ID:744809 发表于 2023-5-23 13:45 | 只看该作者
1、定时器中断中不要放那么多代码,特别是不要调用串口发送函数。
2、代码中不要用那么多while循环;可以用状态机替代
3、代码中最好不要用那么多delay延时,同样可用状态标志位替代
4、读取温湿度的函数不用写那么多个地方,定时去读一遍就好了,读完就放全局变量/main中的局部变量,直接用就好了。
5、发送函数那样用有点繁琐,可以重定向printf函数,用printf("temp:%d℃ humi:%d%%\r\n", temp, humi);
暂时就写这么点建议吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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