A. 單片機鍵盤去抖動c語言程序!!!
使用這個到板子裡面:
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;
unsigned char code LedChar[] = { //數碼管顯示字元轉換表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
void delay();
void main(){
bit keybuf = 1; //按鍵值暫存,臨時保存按鍵的掃描值
bit backup = 1; //按鍵值備份,保存前一次的掃描值
unsigned char cnt = 0; //按鍵計數,記錄按鍵按下的次數
ENLED = 0; //選擇數碼管 DS1 進行顯示
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
P2 = 0xF7; //P2.3 置 0,即 KeyOut1 輸出低電平
P0 = LedChar[cnt]; //顯示按鍵次數初值
while (1){
keybuf = KEY4; //把當前掃描值暫存
if (keybuf != backup){ //當前值與前次值不相等說明此時按鍵有動作
delay(); //延時大約 10ms
if (keybuf == KEY4){ //判斷掃描值有沒有發生改變,即按鍵抖動
if (backup == 0){ //如果前次值為 0,則說明當前是彈起動作
cnt++; //按鍵次數+1
//只用 1 個數碼管顯示,所以加到 10 就清零重新開始
if (cnt >= 10){
cnt = 0;
}
P0 = LedChar[cnt]; //計數值顯示到數碼管上
}
backup = keybuf; //更新備份為當前值,以備進行下次比較
}
}
}
}
/* 軟體延時函數,延時約 10ms */
void delay(){
unsigned int i = 1000;
while (i--);
}
B. 單片機按鍵去抖動有哪些方法
在按鍵上增加電容去除干擾,在按鍵上串一個電阻也可以解決靜電或者是其他干擾對按鍵造成的干擾。
軟體去抖動也是一種非常常見的去抖動的方法,就是對按鍵進行多次的檢測,每次檢測都被按下,才認為按鍵被按下。軟體去抖動要採用多次採集的方法,中間的間隔可以使用延時或者使用分時的思想來進行去抖動,一般的軟體去抖中都是用分時思想去抖動。
(2)單片機按鍵抖動擴展閱讀:
注意事項:
按鍵穩定閉合時間長短是由操作人員決定的,通常都會在100ms以上,刻意快速按的話能達到40-50ms左右,很難再低了。抖動時間是由按鍵的機械特性決定的,一般都會在10ms以內。
為了確保程序對按鍵的一次閉合或者一次斷開只響應一次,必須進行按鍵的消抖處理。當檢測到按鍵狀態變化時,不是立即去響應動作,而是先等待閉合或斷開穩定後再進行處理。
利用電容的充放電特性來對抖動過程中產生的電壓毛刺進行平滑處理,從而實現消抖。但實際應用中,這種方式的效果往往不是很好,而且還增加了成本和電路復雜度,所以實際中使用的並不多。
C. 單片機獨立按鍵去抖動問題
按鍵按下的時候加了延時,你已經知道原因了。是為了消除抖動,你的疑問是為什麼松開的時候沒有再加上延時函數,原因很簡單,看圖片。
因為進行了兩次if判斷,松開按鍵的時候無非會出現電平的跳變,理論上松開按鍵之後就一直為高電平1111111111,如果出現1110101111,中間的第一個10就發生了跳變,因為cpu的運算速度非常快,當程序又到了第一個if時,此時key1為0,那麼滿足條件,執行延時函數,後面第二個10就直接忽略了,後面的電平已經為1,所以這一個延時函數就同時起到消除按下和松開的電平抖動的作用。(如果松開按鍵之後的電平為低電平,那麼把我上面的所有的程序和電平取反就行了,再來閱讀)。
D. 單片機編程怎麼消除按鍵抖動
分兩步:按下檢測,鬆手檢測
按下檢測::先判斷某按鍵是否按下,如果按下調用5—10毫秒延時函數
然後再次檢測該鍵是否被按下,如果按下就調用相關子程序。
鬆手檢測,與上面類似
E. 單片機 按鍵去抖啥意思
單片機 按鍵去抖, 就是單片機的 按鍵 在正常操作中 在按壓過程時 不能一下 完全接通,
就是按壓抖動,單片機在接收這種 信息時 會判斷錯誤,所有要去掉這種抖動因素,
去抖 有 硬體 去抖 就是在 按鍵與單片機連接的 IO 口 加 消抖電容 。
還有 用 軟體 去抖 就是 在單片機 接收按鍵 信息時 多次 判斷 相同 才確認 是 與 否。
F. 單片機按鍵如何消抖
if (key==0)如果按鍵按下
for(i=0;i<100;i++):利用延時消除抖動
if (key==0)再次判斷按鍵,如果還是按下狀態
(要執行的語句)則執行相關語句
這是常用的軟體消抖方法
G. AT89C51單片機:簡述在使用普通按鍵的時候,為什麼要進行去抖動處理,怎麼處理
從機械按鍵的結構來看,在機械按鍵接觸的瞬間,會出現接觸或者是沒有接觸的情況。在機械按鍵老化的時候,或者在其他干擾的情況下都會出現按鍵被誤觸發的情況。
去除機械按鍵這種抖動的措施有硬體方法,還有軟體方法,硬體方法就是在按鍵上增加電容去除干擾。在按鍵上串一個電阻也可以解決靜電或者是其他干擾對按鍵造成的干擾。軟體去抖動也是一種非常常見的去抖動的方法,就是對按鍵進行多次的檢測,每次檢測都被按下才認為按鍵被按下。
(7)單片機按鍵抖動擴展閱讀:
單片機使用注意事項:
室外使用的單片機系統或電源線,信號線從室外架空引入室內的要考慮系統的防雷擊問題,氣體放電管TVS,這類元器件要和抗共模和抗差模干擾的電感配合使用以提高抗干擾效果。
典型的信號隔離是光電隔離。屏蔽則是用來隔離空間輻射的,對雜訊特別大的部件,如開關電源,用金屬盒罩起來。對特別怕干擾的模擬電路,如高靈敏度的弱信號放大電路可屏蔽起來。而重要的是金屬屏蔽本身必須接真正的地。
H. 單片機按鍵消抖硬體加什麼
加個104的電容就好了
I. 單片機的按鍵開關抖動的產生原因,抖動的特點和如何消除抖動
開關按鈕在按下時,表面上只按了一下,但信號的傳導並不是單純的由1直接跳到0。這是由於機械觸點斷開/閉合時會有抖動,信號如圖示會在HIGH和LOW之間抖動。這種抖動對人來說是感覺不到的,但對單片機來說,則是完全可以感應到的。
當按鈕被按下時,你所期待的效果應該是:111111111000000000…,
而事與願違,單片機讀到的信號可能會是:111110110110000000…,
這中間連續的1和0過渡處,短暫的幾個隨機交錯出現的01就是我們不期望產生的抖動,雖然我們只按了一下按鈕,可能會被電路誤讀成按了好幾下按鈕,而給人的感覺就是有時候按鈕會不靈。消抖的目的就是為了要除去信號在高低電位之間彈跳所造成的不正確輸入,就是交錯出現的01那段,一般抖動持續的時間是3-10毫秒。所以簡單的去抖動操作,只要在這段抖動出現的時間跨度兩端進行兩次按鈕狀態檢測即可:
假設放開按鈕信號為1,按下為0,
那麼當首次檢測到按鈕為0,過10ms再次檢測,若依然為0,按鈕按下有效;若為1,說明為抖動,去除。
更可靠,更靈敏的消抖做法為:
首次檢測到按鈕為0後,以後的3-5ms持續檢測,若檢測到信號一直為0,則按鈕有效,若中間有一次不為0,時間清0,重新計時,直到連續3-5ms按鈕信號一直為0,方為有效。(補充一下,持續檢測的意思,並不是讓你把全部的CPU時間全部花在這上面,否則這幾ms時間內單片機相當於死機了,影響其它進程,而是間隔性地采樣一下,比如5ms之內檢測10次,10次全為0有效,其它時間CPU當然去處理別的事務)
至於按鈕的連按和單按、雙按,多按鈕同時生效等更復雜的功能,可藉助其它的標志位實現。
J. 單片機的程序中,為什麼按鍵要去抖動
因為你單片機反應很快的,在你按下的這段時間里,會認為是按了很多下,所以要消除抖動