機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
單片機(jī)課程設(shè)計(jì)--按鍵識(shí)別方法
單片機(jī)課程設(shè)計(jì)--按鍵識(shí)別方法
 更新時(shí)間:2008-7-27 13:55:09  點(diǎn)擊數(shù):4
【字體: 字體顏色

1.    實(shí)驗(yàn)任務(wù)
每按下一次開(kāi)關(guān)SP1,計(jì)數(shù)值加1,通過(guò)AT89S51單片機(jī)的P1端口的P1.0到P1.3顯示出其的二進(jìn)制計(jì)數(shù)值。
2.    電路原理圖


3.    系統(tǒng)板上硬件連線(xiàn)
(1.    把“單片機(jī)系統(tǒng)”區(qū)域中的P3.7/RD端口連接到“獨(dú)立式鍵盤(pán)”區(qū)域中的SP1端口上;
(2.    把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0-P1.4端口用8芯排線(xiàn)連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1-L8”端口上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。
4.    程序設(shè)計(jì)方法
(1.    其實(shí),作為一個(gè)按鍵從沒(méi)有按下到按下以及釋放是一個(gè)完整的過(guò)程,也就是說(shuō),當(dāng)我們按下一個(gè)按鍵時(shí),總希望某個(gè)命令只執(zhí)行一次,而在按鍵按下的過(guò)程中,不要有干擾進(jìn)來(lái),因?yàn),在按下的過(guò)程中,一旦有干擾過(guò)來(lái),可能造成誤觸發(fā)過(guò)程,這并不是我們所想要的。因此在按鍵按下的時(shí)候, 

要把我們手上的干擾信號(hào)以及按鍵的機(jī)械接觸等干擾信號(hào)給濾除掉,一般情況下,我們可以采用電容來(lái)濾除掉這些干擾信號(hào),但實(shí)際上,會(huì)增加硬件成本及硬件電路的體積,這是我們不希望,總得有個(gè)辦法解決這個(gè)問(wèn)題,因此我們可以采用軟件濾波的方法去除這些干擾信號(hào),一般情況下,一個(gè)按鍵按下的時(shí)候,總是在按下的時(shí)刻存在著一定的干擾信號(hào),按下之后就基本上進(jìn)入了穩(wěn)定的狀態(tài)。具體的一個(gè)按鍵從按下到釋放的全過(guò)程的信號(hào)圖如上圖所示:


從圖中可以看出,我們?cè)诔绦蛟O(shè)計(jì)時(shí),從按鍵被識(shí)別按下之后,延時(shí)5ms以上,從而避開(kāi)了干擾信號(hào)區(qū)域,我們?cè)賮?lái)檢測(cè)一次,看按鍵是否真得已經(jīng)按下,若真得已經(jīng)按下,這時(shí)肯定輸出為低電平,若這時(shí)檢測(cè)到的是高電平,證明剛才是由于干擾信號(hào)引起的誤觸發(fā),CPU就認(rèn)為是誤觸發(fā)信號(hào)而舍棄這次的按鍵識(shí)別過(guò)程。從而提高了系統(tǒng)的可靠性。
由于要求每按下一次,命令被執(zhí)行一次,直到下一次再按下的時(shí)候,再執(zhí)行一次命令,因此從按鍵被識(shí)別出來(lái)之后,我們就可以執(zhí)行這次的命令,所以要有一個(gè)等待按鍵釋放的過(guò)程,顯然釋放的過(guò)程,就是使其恢復(fù)成高電平狀態(tài)。

(1.  對(duì)于按鍵識(shí)別的指令,我們依然選擇如下指令JB BIT,REL指令是用來(lái)檢測(cè)BIT是否為高電平,若BIT=1,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序;蛘呤恰NB BIT,REL指令是用來(lái)檢測(cè)BIT是否為低電平,若BIT=0,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序。
(2.    但對(duì)程序設(shè)計(jì)過(guò)程中按鍵識(shí)別過(guò)程的框圖如右圖所示:

                 圖4.8.3
5.    程序框圖


 

1. 匯編源程序

                                     ORG 0

START:                         MOV R1,#00H                     ;初始化R70,表示從0開(kāi)始計(jì)數(shù)

                                     MOV A,R1                                     ;

                                     CPL A                                             ;取反指令

                                     MOV P1,A                                     ;送出P1端口由發(fā)光二極管顯示

REL:                    JNB P3.7,REL                                ;判斷SP1是否按下

                                     LCALL DELAY10MS                   ;若按下,則延時(shí)10ms左右

                                     JNB P3.7,REL                                ;再判斷SP1是否真得按下

                                     INC R7                                           ;若真得按下,則進(jìn)行按鍵處理,使

                                     MOV A,R7                                     ;計(jì)數(shù)內(nèi)容加1,并送出P1端口由

                                     CPL A                                             ;發(fā)光二極管顯示

                                     MOV P1,A                                     ;

                                     JNB P3.7,$                                     ;等待SP1釋放

                                     SJMP REL                                      ;繼續(xù)對(duì)K1按鍵掃描

DELAY10MS:    MOV R6,#20                                  ;延時(shí)10ms子程序

L1:                                MOV R7,#248

                                     DJNZ R7,$

                                     DJNZ R6,L1

                                     RET

                                     END

 

 

 

 

2. C語(yǔ)言源程序

#include <AT89X51.H>

 

unsigned char count;

 

void delay10ms(void)

{

  unsigned char i,j;

  for(i=20;i>0;i--)

  for(j=248;j>0;j--);

}

 

void main(void)

{

  while(1)

    {

      if(P3_7==0)

        {

          delay10ms();

          if(P3_7==0)

            {

              count++;

              if(count==16)

                {

                  count=0;

                }

              P1=~count;

              while(P3_7==0);

            }

        }

    }

}

 

  • 上一篇: 單片機(jī)課程設(shè)--I/O并行口直接驅(qū)動(dòng)LED顯示
  • 下一篇: 用打印機(jī)接口做的語(yǔ)音型搶答器
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話(huà):0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1