資源描述:
《按鍵消抖及時(shí)間按鍵》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、按鍵消抖與時(shí)間按鍵這篇文章寫給正在學(xué)51單片機(jī)的或者剛?cè)腴T51單片機(jī)準(zhǔn)備進(jìn)階的的朋友,我們來(lái)著重討論一下按鍵消抖和時(shí)間按鍵這兩項(xiàng)。我們常用的按鍵大多都是機(jī)械的,機(jī)械開(kāi)關(guān)就會(huì)出現(xiàn)機(jī)械振動(dòng),這個(gè)由物理學(xué)或者實(shí)驗(yàn)可以推出來(lái),抖動(dòng)會(huì)在單片機(jī)上面出現(xiàn)重復(fù)掃描次數(shù),次數(shù)多少與單片機(jī)的時(shí)鐘晶振有關(guān),時(shí)鐘晶振越高單片機(jī)執(zhí)行速度越快,重復(fù)次數(shù)就越多整個(gè)按鍵數(shù)百ms按下瞬間,抖動(dòng)時(shí)間大概10ms彈起瞬間,抖動(dòng)大概10ms按鍵一次出現(xiàn)的電平變化(上面的時(shí)間都是老師說(shuō)的和書上現(xiàn)成的,沒(méi)有實(shí)際測(cè)試,而且不同的按鍵應(yīng)該也會(huì)有差異,作為學(xué)習(xí)研究確實(shí)不應(yīng)該,找個(gè)時(shí)間
2、鍋鍋會(huì)測(cè)出這個(gè)時(shí)間供大家參考,嘿嘿)由圖我們可以看出,按下去瞬間會(huì)出現(xiàn)抖動(dòng),彈起來(lái)也會(huì)出現(xiàn)抖動(dòng),明顯是個(gè)阻尼振動(dòng),按鍵掃描程序是按順序執(zhí)行的;首先提出三個(gè)問(wèn)題大家思考一下1.為什么要消除抖動(dòng)2.如何消抖3.是不是按鍵都要消抖,不是的話,哪些需要消抖,哪些不需要消抖4.消抖的時(shí)間是不是必須10ms5.按鍵消抖的方式是不是一定像書上的那樣,如何消抖更節(jié)省CPU,且更簡(jiǎn)單按鍵如果不消除抖動(dòng),那么單片機(jī)檢測(cè)到的低電平的次數(shù)就不止一次,那我們按鍵一次,單片機(jī)會(huì)檢測(cè)到多次,比如我們把按某個(gè)按鍵設(shè)置按一次成某個(gè)變量加1,結(jié)果按一次就加了很多次,這樣
3、我們就不能精確的通過(guò)按鍵來(lái)調(diào)整我們想要的參數(shù),所以我們消除抖動(dòng)的目的就是要實(shí)現(xiàn)按一次按鍵讓單片機(jī)讀出一次按鍵操作消抖分硬件和軟件消抖,硬件消抖有《模擬電子技術(shù)》上提到用三態(tài)門實(shí)現(xiàn),當(dāng)然還有周立功那個(gè)7920(管理數(shù)碼管和按鍵的芯片),當(dāng)然還有很多硬件電路以及一些按鍵有自帶消抖電路,但是如果要做產(chǎn)品硬件消抖肯定會(huì)增加成本,一般都會(huì)考慮軟件消抖軟件消抖我們先來(lái)看看書上消抖方法如下圖7延時(shí)10ms延時(shí)10ms書上的按鍵軟件消抖方法例程Unsignedcharkeyscan()//這里是用的P2口作為按鍵的輸入口{Unsignedcharke
4、y;//定義按鍵的鍵值變量if(P2!=0xff){delay(10);//延時(shí)10mskey=P2;while(P2!=0xff)delay(10);//延時(shí)10msswitch(key){//返回鍵值case0xfe:return1;break;case0xfd:return2;break;case0xfb:return3;break;case0xf7:return4;break;case0xef:return5;break;case0xdf:return6;break;case0xbf:return7;break;case0x7
5、f:return8;break;default:return0;break;}}}當(dāng)然延時(shí)函數(shù)delay肯定要寫才能用這個(gè)函數(shù)voiddelay(unsignedcharx)//對(duì)應(yīng)12M的晶振是1ms{7unsignedchari,j;for(i=0;i<100;i++)for(j=0;j<10*x;j++);}這個(gè)消抖里面有延時(shí)函數(shù)如果時(shí)序處理不好就要出問(wèn)題;被我們單片機(jī)老師稱為“弱智程序”,原因就是用了軟件延時(shí)(軟件延時(shí)會(huì)占用CPU資源),當(dāng)然對(duì)于剛?cè)腴T還是可以學(xué)一下,很容易理解,方便以后提升(學(xué)習(xí)嘛當(dāng)然由易到難還是值得推薦的)
6、要提高首先要把軟件延時(shí)換成定時(shí)器,或者不用這種方法下面介紹我自己改進(jìn)的兩種方法首先我們消抖的目的就是為了按鍵一次只讓單片機(jī)采集到一次按鍵操作,所以我就讓單片機(jī)采集到一次操作以后不再檢測(cè),當(dāng)然是在按鍵時(shí)間內(nèi),前面提到人按鍵一次操作數(shù)百ms,所以這兒我們可以再檢測(cè)到一次按鍵后打開(kāi)定時(shí)器,在數(shù)百ms內(nèi)不再檢測(cè)檢測(cè)到按鍵一次不檢測(cè)方法一Unsignedcharkeyscan()//這里是用的P2口作為按鍵的輸入口{StaticT=0;Unsignedcharkey;//定義按鍵的鍵值變量if(P2!=0xff){key=P2;while(P2
7、!=0xff);if(TR0=0)TR0=1;if(T>100)TR0=0;7if(TR0=1&&T<100)continue;//在定時(shí)器里面設(shè)置初值讓定時(shí)器中斷一次1ms并且T自加1,100次就100msswitch(key){//返回鍵值case0xfe:return1;break;case0xfd:return2;break;case0xfb:return3;break;case0xf7:return4;break;case0xef:return5;break;case0xdf:return6;break;case0xbf:r
8、eturn7;break;case0x7f:return8;break;default:return0;break;}}}定時(shí)器函數(shù)voidtimer0()interrupt1{TH0=(66636-1000)/256;