標(biāo)題:
我這個(gè)程序燒到單片機(jī)里,LCD顯示一翻頁第一頁的濕度就自己跳為零
[打印本頁]
作者:
禿頭了
時(shí)間:
2023-5-22 22:38
標(biāo)題:
我這個(gè)程序燒到單片機(jī)里,LCD顯示一翻頁第一頁的濕度就自己跳為零
我這個(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");
}
}
作者:
禿頭了
時(shí)間:
2023-5-23 00:15
求助,謝謝各位!
作者:
1065009825
時(shí)間:
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ù)混亂的情況。
作者:
123456ZXC1
時(shí)間:
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ù)正確傳輸。
作者:
123156fsadf
時(shí)間:
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)建議吧
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1