單片機入門學習記錄(二)
在機械按鍵的觸點閉合和斷開時,都會產(chǎn)生抖動,為了保證系統(tǒng)能正確識別按鍵的開關,就必須對按鍵的抖動進行處理。按鍵的抖動對于人類來說是感覺不到的,但對單片機來說,則是完全可以感應到的,而且還是一個很“漫長”的過程,因為單片機處理的速度在“微秒”級,而按鍵抖動的時間至少在“毫秒”級。單片機如果在觸點抖動期間檢測按鍵的通斷狀態(tài),則可能導致判斷出錯,即按鍵一次按下或釋放被錯誤地認為是多次操作,從而引起誤處理。因此,為了確保單片機對一次按鍵動作只作一次響應,就必須考慮如何消除按鍵抖動的影響。———————————————————————————(來自百度百科)
為了實現(xiàn)按鍵消抖通常有軟件消抖和硬件消抖的方法。
軟件消抖有采用delay()的延遲消抖,雖然代碼簡單,但是在函數(shù)執(zhí)行時CPU無法執(zhí)行其他指令,直到函數(shù)執(zhí)行完畢,影響程序運行。
定時器消抖則是采用定時器中斷的方法,把按鍵掃描程序放置在定時器中斷中,可以使得掃描程序減少對于cpu的占用,但是會占用一個定時器,雖然不及硬件消抖但是對于軟件消抖來說已是很高效的方法。因此采用的此方法。
通過定時器中斷以5ms的速度掃描一次當前的按鍵值,中斷程序時間設置如下,
void int_time0() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
i++;
if(i>3)
i=0;
key();
}
key_flag 為按鍵是否按下的標志位,其初始化為0。當key按下為0,high開始加一,只有按鍵值被定時器掃描到2次即持續(xù)為10ms以上時,判定key0按鍵確實按下了,key_flag置為1。開始松手檢測,檢測key0為1的時間達到10ms以上時,判定key0按鍵是完全松開,到此為一次完整的按鍵動作。所以P2的狀態(tài)值改變。(下面程序為單按鈕示例,多個按鈕可以通過放置多個標志位來實現(xiàn)相同效果)文章來源:http://www.zghlxwxcb.cn/news/detail-629933.html
void key()
{
if(key0==0&&key_flag==0) //按鍵按下
{
high++;
if(high>1) //按下消抖
{
high=0;
key_flag=1;
}
}
else if(key0==1&&key_flag==1) //松手檢測
{
low++;
if(low>1) //松手消抖
{
P2=~P2;? ? ? ? //狀態(tài)反轉(zhuǎn)
key_flag=0;
}
}
}
多按鈕示例如下文章來源地址http://www.zghlxwxcb.cn/news/detail-629933.html
if(key0==0&&key_flag1==0) //按鍵按下
{
high1++;
if(high1>1) //按下消抖
{
high1=0;
key_flag1=1;
}
}
else if(key0==1&&key_flag1==1) //松手檢測
{
low1++;
if(low1>1) //松手消抖
{
key_state1=~key_state1;
key_flag1=0;
}
}
if(key1==0&&key_flag2==0) //按鍵按下
{
high2++;
if(high2>1) //按下消抖
{
high2=0;
key_flag2=1;
}
}
else if(key1==1&&key_flag2==1) //松手檢測
{
low2++;
if(low2>1) //松手消抖
{
key_state2=~key_state2;
key_flag2=0;
}
}
到了這里,關于51單片機定時器中斷按鍵消抖(無延時)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!