久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
IAP15F2K60S2單片機定時器延時問題
[打印本頁]
作者:
程鵬
時間:
2020-3-27 12:14
標題:
IAP15F2K60S2單片機定時器延時問題
本帖最后由 程鵬 于 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--;
}
}
復制代碼
1.國信長天單片機競賽平臺V20原理圖 - 副本.pdf
2020-3-27 12:12 上傳
點擊文件名下載附件
175.19 KB, 下載次數: 5
作者:
程鵬
時間:
2020-3-29 22:41
問題解決了,只需要更改中斷服務函數就可以。
if (count==(200*lt))
count=0;
復制代碼
將以上部分由“count==(200*lt)”改為“count>=(200*lt)”就可以了。
為什么要這么修改?我個人推測如下:
在按鍵函數中,消抖延時時間為5毫秒;而在定時器0中,產生一次中斷的時間為10毫秒。當我把條件設置為“==”時,兩者之間相差較小,容錯率較低,會出現按鍵失靈的情況。反之,當條件為“>=”時,大大提高了容錯率,就不會出現上述情況了。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产黄色免费网站
|
三级视频网站
|
成人国产在线
|
日韩国产精品视频
|
国产精品久久久久久久久久久久久
|
羞羞的视频网站
|
欧美午夜精品一区二区三区
|
综合久久久
|
午夜黄色影院
|
96看片
|
亚洲特级毛片
|
我要看一级黄色片
|
国产日产精品一区二区三区的介绍
|
欧美一级做性受免费大片免费
|
十八岁毛片
|
伊人免费视频
|
国产视频a
|
黄色一级在线观看
|
激情高潮到大叫狂喷水
|
亚洲一区二区免费
|
精品免费在线
|
欧美日韩一二三区
|
99视频免费在线观看
|
亚洲天堂国产
|
婷婷狠狠
|
在线观看黄色av
|
伊人网在线
|
日韩精品在线一区
|
黄色大片在线免费观看
|
国产在线第一页
|
成人毛片在线观看
|
一区
|
91亚洲视频
|
九九九免费视频
|
亚洲欧美在线观看视频
|
国产在线第一页
|
蜜乳av懂色av粉嫩av
|
欧美日韩高清在线
|
国产精品福利在线
|
日韩三级精品
|
瑟瑟视频在线观看
|