在做一項(xiàng)關(guān)于定時器的設(shè)計,要求:門口有人(紅外探測輸出高電平),LCD點(diǎn)亮顯示歡迎詞;若門口人站那超過2分鐘,LCD顯示請離開,并蜂鳴器報警。人離開后,LCD待機(jī),待檢測到有人,如此循環(huán)。大家有什么好方法可以說一說。
在做一項(xiàng)關(guān)于定時器的設(shè)計,要求:門口有人(紅外探測輸出高電平),LCD點(diǎn)亮顯示歡迎詞;若門口人站那超過2分鐘,LCD顯示請離開,并蜂鳴器報警。人離開后,LCD待機(jī),待檢測到有人,如此循環(huán)。大家有什么好方法可以說一說。
下面是本人寫的程序,但功能不能實(shí)現(xiàn)。
sw1為紅外傳感器,高電平說明有人;
lcd()為歡迎詞程序;
lcd1()為警告詞程序;
lcd_init()為LCD初始化程序;
問題:
1.sw1==1時(有人),顯示歡迎詞,同時定時器開啟;此時我把sw1==0(沒人),這時定時器應(yīng)該停止,LCD待機(jī)。但我寫的這個程序,一直亮歡迎詞,按 下sw1==0后不會立即初始化,直到定時器2分鐘定完過后才初始化。正確的應(yīng)該是定時中若sw1==0,LCD立即就能初始化的效果。
2.2分鐘結(jié)束后,警告詞只亮一次,然后又就跳到歡迎詞。正確的應(yīng)該是警告詞一直顯示,直到人走后(sw1==0),才待機(jī),檢測到人,顯示歡迎詞再如 此循環(huán)。
以下為自己寫的程序(一些程序省篇幅就不貼出來了)
void Time0_init()
{
TMOD = 0x01;//定時器T0工作在方式1,定時時間60ms=0.06s
TH0 = 0x15;//高8位初值
TL0 = 0xA0;//低8位初值
EA = 1;//開總中斷
ET0 = 1;//開定時器T0中斷
TR0=1;//啟動定時器
}
void main()
{
while(1)
{
a=0;//變量a清零
if(sw1==1)
{
Time0_init();
lcd();
if(sw1==0)
{
lcd_init();
}
}
while(2000-a !=0);//等待延時2000x0.06=120s=2min
TR0=0;//關(guān)閉定時器
while(sw1==1)
{
lcd1();
}
}
}
void Time0() interrupt 1//中斷服務(wù)程序
{
TH0 = 0x15;//重裝定時器高8位初值
TL0 = 0xA0;//重裝定時器低8位初值
a++;//變量a加1
}
你這沒有響應(yīng)的地方啊
你直接放到定時器中斷服務(wù)函數(shù)里面。那個 a變量,不做其他用的話,可以在服務(wù)函數(shù)里定義,并修飾成static類型的。用if判斷a的值是不是到2000了。
if(2000 == a)
{
a = 0;
//到這里就表示已經(jīng)2min了??梢远x個全局變量標(biāo)識比如g_2min_flag,在這更改它的值?;蛘咧苯佑眠@個a變量,定時到了就把最高位置1. a |= 0x8000; 然后main程序判斷a的最高位是不是1就行了。
}
不能把等待的循環(huán)放在main里吶
你看看是不是這里的問題
關(guān)于sw==1變化到sw==0時,為啥不會立即初始化,問題在下面這段程序上
if(sw1==1)
{
Time0_init();
lcd();
if(sw1==0)
{
lcd_init();
}
}
while(2000-a !=0);//等待延時2000x0.06=120s=2min
當(dāng)if(sw==1)成立的時候,僅僅經(jīng)過了兩個函數(shù)運(yùn)行的時間(我們暫且把這段時間叫做 s 吧,它可能只需要幾十微秒),就來判斷sw是否為0。這顯然不合理,因?yàn)槿藦恼镜介T口,到離開門口,怎么可能只要幾十微秒呢,也就是說,當(dāng)人還沒有來得及離開時,你就要求sw==0了
邏輯上的問題。
第一、當(dāng)開啟系統(tǒng)時,要初始化一下,包括LCD,初始化完成之后,要?dú)w于待機(jī)狀態(tài),等待開啟。(這個狀態(tài)你肯定沒設(shè)置,所以一開機(jī)和人走后,兩個狀態(tài)下就一直顯示的不是你要的內(nèi)容。)
在第一個的待機(jī)狀態(tài)正常后,進(jìn)入下一個。
第二、當(dāng)有人來的時候,出現(xiàn)高電平,這時候:1、定時計數(shù)器啟動;2、LCD打出歡迎詞;3、持續(xù)檢測人的位置狀態(tài)。PS:從你程序看來,人員狀態(tài)你只是問一下就不理了。按設(shè)計要求,應(yīng)該把對時間的檢測和對人的檢測同步進(jìn)行的。按照你程序里面的內(nèi)容對應(yīng)的,可以是這樣:
while(2000-a)
{
if(sw1==0)
{
a=2000;
lcd_int('空白');
}
if(a==1999)
{
lcd1('喂,門前那誰誰誰,趕緊滾蛋!');
}
}
while(sw1);
lcd_int('空白');