日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

【討論】定時器的一個程序設(shè)計問題探討

在做一項(xiàng)關(guān)于定時器的設(shè)計,要求:門口有人(紅外探測輸出高電平),LCD點(diǎn)亮顯示歡迎詞;若門口人站那超過2分鐘,LCD顯示請離開,并蜂鳴器報警。人離開后,LCD待機(jī),待檢測到有人,如此循環(huán)。大家有什么好方法可以說一說。

 

全部回復(fù)(5)
正序查看
倒序查看
001a
LV.3
2
2014-02-08 10:54

下面是本人寫的程序,但功能不能實(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

}

0
回復(fù)
一木01
LV.3
3
2014-02-08 11:03
@001a
下面是本人寫的程序,但功能不能實(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)。以下為自己寫的程序(一些程序省篇幅就不貼出來了)voidTime0_init(){TMOD=0x01;//定時器T0工作在方式1,定時時間60ms=0.06sTH0=0x15;//高8位初值TL0=0xA0;//低8位初值EA=1;//開總中斷ET0=1;//開定時器T0中斷TR0=1;//啟動定時器}voidmain(){while(1){a=0;//變量a清零if(sw1==1){Time0_init();lcd();if(sw1==0){lcd_init();}}while(2000-a!=0);//等待延時2000x0.06=120s=2minTR0=0;//關(guān)閉定時器while(sw1==1){lcd1();}}}voidTime0()interrupt1//中斷服務(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里吶

 

0
回復(fù)
2014-02-08 14:47
@001a
下面是本人寫的程序,但功能不能實(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)。以下為自己寫的程序(一些程序省篇幅就不貼出來了)voidTime0_init(){TMOD=0x01;//定時器T0工作在方式1,定時時間60ms=0.06sTH0=0x15;//高8位初值TL0=0xA0;//低8位初值EA=1;//開總中斷ET0=1;//開定時器T0中斷TR0=1;//啟動定時器}voidmain(){while(1){a=0;//變量a清零if(sw1==1){Time0_init();lcd();if(sw1==0){lcd_init();}}while(2000-a!=0);//等待延時2000x0.06=120s=2minTR0=0;//關(guān)閉定時器while(sw1==1){lcd1();}}}voidTime0()interrupt1//中斷服務(wù)程序{TH0=0x15;//重裝定時器高8位初值TL0=0xA0;//重裝定時器低8位初值a++;//變量a加1}

你看看是不是這里的問題

關(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了

0
回復(fù)
001a
LV.3
5
2014-02-10 11:05
@soap泡泡
你看看是不是這里的問題關(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ǎo)啊,偶爾挑戰(zhàn)一下自己也不錯
0
回復(fù)
cltwolf
LV.5
6
2014-02-13 18:03
@001a
謝謝各位的指導(dǎo)啊,偶爾挑戰(zhàn)一下自己也不錯

邏輯上的問題。

第一、當(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('空白'); 

0
回復(fù)
發(fā)