找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1667|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

我這個(gè)程序燒到單片機(jī)里,LCD顯示一翻頁第一頁的濕度就自己跳為零

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1071895 發(fā)表于 2023-5-22 22:38 來自觸屏版 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我這個(gè)程序燒到單片機(jī)里,LCD顯示一翻頁第一頁的濕度就自己跳為零,然后就報(bào)警,第二頁的內(nèi)容可以正常顯示。
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是否按下,按下進(jìn)入設(shè)置閾值狀態(tài)
                        {
                                LED2=0;
                                while(1)   //溫度上限設(shè)置
                                {
                                                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)   //溫度下限設(shè)置
                                {
                                                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)   //濕度上限設(shè)置
                                {
                                                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)   //濕度下限設(shè)置
                                {
                                                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);               
        }
}
藍(lán)牙程序:
void time0() interrupt 1 //定時(shí)器0中斷函數(shù)
{
        TH0=0XDC;        //給定時(shí)器賦初值,定時(shí)10ms
        TL0=0X00;
        gmsec++;//10ms加1次
                        if(BUT==0)
                {
                        delay_ms(500);
                        lcd1602_clear();
                 keydata=!keydata;
                }
        if(gmsec%500==0)//定時(shí)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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1071895 發(fā)表于 2023-5-23 00:15 來自觸屏版 | 只看該作者
求助,謝謝各位!
回復(fù)

使用道具 舉報(bào)

板凳
ID:1079239 發(fā)表于 2023-5-23 08:30 | 只看該作者
根據(jù)你提供的程序,可能是由于在主函數(shù)中的循環(huán)中,每次都會(huì)重新讀取DHT11的溫濕度數(shù)據(jù),而在發(fā)送藍(lán)牙數(shù)據(jù)的定時(shí)器中斷中,只發(fā)送了之前讀取的溫濕度數(shù)據(jù),因此第一頁顯示的溫濕度數(shù)據(jù)和第二頁顯示的溫濕度數(shù)據(jù)不一致,導(dǎo)致第一頁的濕度在顯示完一次之后就變成了零。  解決方法是在發(fā)送藍(lán)牙數(shù)據(jù)的定時(shí)器中斷中,每次發(fā)送之前重新讀取溫濕度數(shù)據(jù),例如可以將DHT11讀取數(shù)據(jù)的代碼移到定時(shí)器中斷函數(shù)中,在定時(shí)器中斷函數(shù)中更新溫濕度數(shù)據(jù)并發(fā)送藍(lán)牙數(shù)據(jù)。  另外,建議在發(fā)送藍(lán)牙數(shù)據(jù)時(shí)先將數(shù)據(jù)存儲(chǔ)到一個(gè)緩沖區(qū)中,然后再統(tǒng)一發(fā)送,以避免發(fā)送過程中出現(xiàn)數(shù)據(jù)混亂的情況。
回復(fù)

使用道具 舉報(bào)

地板
ID:526543 發(fā)表于 2023-5-23 11:05 | 只看該作者
代碼邏輯錯(cuò)誤:在你的代碼中,第一頁顯示的是溫度和濕度數(shù)據(jù),第二頁顯示的是GZ和YW數(shù)據(jù)。如果切換到第二頁后,濕度顯示為零,有可能是在切換頁面的過程中,溫濕度傳感器讀取出了錯(cuò)誤的值,導(dǎo)致顯示錯(cuò)誤。你可以檢查DHT11傳感器的連接和代碼邏輯,確保正確讀取溫濕度值。

數(shù)據(jù)傳輸問題:如果通過藍(lán)牙傳輸數(shù)據(jù)給其他設(shè)備,可能存在數(shù)據(jù)傳輸錯(cuò)誤導(dǎo)致顯示異常。你可以檢查藍(lán)牙模塊的連接和數(shù)據(jù)傳輸代碼,確保數(shù)據(jù)正確傳輸。
回復(fù)

使用道具 舉報(bào)

5#
ID:744809 發(fā)表于 2023-5-23 13:45 | 只看該作者
1、定時(shí)器中斷中不要放那么多代碼,特別是不要調(diào)用串口發(fā)送函數(shù)。
2、代碼中不要用那么多while循環(huán);可以用狀態(tài)機(jī)替代
3、代碼中最好不要用那么多delay延時(shí),同樣可用狀態(tài)標(biāo)志位替代
4、讀取溫濕度的函數(shù)不用寫那么多個(gè)地方,定時(shí)去讀一遍就好了,讀完就放全局變量/main中的局部變量,直接用就好了。
5、發(fā)送函數(shù)那樣用有點(diǎn)繁瑣,可以重定向printf函數(shù),用printf("temp:%d℃ humi:%d%%\r\n", temp, humi);
暫時(shí)就寫這么點(diǎn)建議吧
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表