|
本帖最后由 程鵬 于 2020-3-31 10:44 編輯
我原想通過按鍵來控制定時器的延時時間的,但是出現的情況是,按鍵絕大多數情況都是失靈的。無法控制定時器服務程序里的延時函數。
單片機源程序如下:
- //實驗目標效果:用按鍵控制LED燈的閃爍頻率。
- //實驗實際效果:單片機上電后,LED會以1秒/次的頻率閃爍;按下S5,頻率為5秒/次,若此時再按下S4,LED滅很久,時間未知;在按下S5后按下S6,改變頻率為30秒/次;在按下S6后按下S7,改變頻率為60秒/次,若此時再按下S5,LED滅很久,時間未知(遠大于所有設定時間)。可推測,在上電后,按鍵只能順序按一次有用(即從S4→S7),若逆序按下,則LED燈會一直熄滅很久。
- #include <stc15f2k60s2.h>
- #include <absacc.h>
- #include <intrins.h>
- void button(void);//獨立鍵盤函數。
- void led(void);//led函數。
- void Delayms(unsigned int ms);//軟件延時函數,單位為微秒。
- void Timer0Init(void);//定時器0初始化函數。
- void T0_Ser(void);//定時器0中斷服務函數。
- unsigned char time,lt;//LED亮燈間隔時間參數。
- unsigned int count=0;//定時器0中斷服務程序計數參數,延長中斷時間。
- int main(void)
- {
- XBYTE[0xA000]=0;//初始化無關元器件。
- EA=1;//開總中斷。
- Timer0Init();
- while(1)
- {
- button();
- }
- return 0;
- }
- void button(void)//獨立鍵盤函數。
- {
- unsigned char key;
- P3=0x0f;
- key=(P3&0x0f);
- if(key!=0x0f)//第一次消抖開始。
- {
- Delayms(5);
- key=(P3&0x0f);
- if(key!=0x0f)
- {
- key=(P3&0x0f);//第一次消抖結束。
- switch(key)
- {
- case 0x07:time=1;break;//s4。
- case 0x0b:time=2;break;//s5。
- case 0x0d:time=3;break;//s6。
- case 0x0e:time=4;break;//s7。
- default:XBYTE[0x8000]=0;//判斷鍵值是否正確。
- }
- while(key!=0x0f)//第二次消抖開始。
- key=(P3&0x0f);//第二次消抖結束。
- }
- }
- switch(time)//根據按鍵給lt賦不同值,即讓定時器延時不同的時間。
- {
- case 1:lt=1;break;//LED閃爍頻率為1秒(亮1秒、滅1秒)。
- case 2:lt=5;break;//LED閃爍頻率為5秒(亮5秒、滅5秒)。
- case 3:lt=30;break;//LED閃爍頻率為30秒(亮30秒、滅30秒)。
- case 4:lt=60;break;//LED閃爍頻率為5秒(亮60秒、滅60秒)。
- }
- }
- void Timer0Init(void) //10毫秒@12.000MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式,16位自動重載。
- TL0 = 0xF0; //設置定時初值
- TH0 = 0xD8; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0=1; //開定時器0中斷。
- }
- void T0_Ser(void) interrupt 1//定時器0中斷服務函數。
- {
- count++;
- if(count<(100*lt))
- XBYTE[0x8000]=0;//LED亮。
- else if(count>=(100*lt))
- XBYTE[0x8000]=0xff;//LED滅。
- if (count==(200*lt))
- count=0;
-
- }
- void Delayms(unsigned int ms) //@12.000MHz
- {
- unsigned char i, j;
- while(ms)
- {
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- ms--;
- }
- }
復制代碼
|
|