項目二 任務4-簡易搶答器設計_第1頁
項目二 任務4-簡易搶答器設計_第2頁
項目二 任務4-簡易搶答器設計_第3頁
項目二 任務4-簡易搶答器設計_第4頁
項目二 任務4-簡易搶答器設計_第5頁
已閱讀5頁,還剩27頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目二簡易搶答器設計獨立按鍵識別檢測任務一一位數碼管顯示任務二數碼管動態顯示任務三簡易搶答器設計任務四任務四簡易搶答器設計任務描述單片機P3口接8個按鍵,模擬8個選手進行知識搶答,有開始和停止鍵。知識鏈接狀態機按鍵檢測狀態機按鍵檢測

實際上按鍵識別檢測也可以用狀態機來編程實現,使用狀態機最節約系統資源,如:進行按鍵檢測,只需要定時執行按鍵狀態機程序即可。1.狀態機的基本概念無按鍵0有按鍵1等釋放20/0(消抖)1/01/0(干擾)0/1(確認)1/00/0比如說一個按鍵命令解析程序,就可以被看做狀態機:

本來在A狀態下,觸發一個按鍵后切換到了B狀態;再觸發另一個鍵后切換到C狀態,或者返回到A狀態。這就是最簡單的按鍵狀態機例子。實際的按鍵解析程序會比這更復雜些。進一步看,擊鍵動作本身也可以看做一個狀態機。一個細小的擊鍵動作包含了:釋放、抖動、閉合、抖動和重新釋放等狀態。一個鍵按下之后的波形是這樣的(假定低有效):在有鍵按下后,數據線上的信號出現一段時間的抖動,然后為低,當按鍵釋放時,信號抖動一段時間后變高。當然,在數據線為低或者為高的過程中,都有可能出現一些很窄的干擾信號。(1)空閑狀態,即數據線信號為高,這里假定為S1狀態,對應無按鍵狀態;(2)確認真的有鍵按下的狀態,這里假定為S2狀態,對應有按鍵按下狀態;(3)確認真的有鍵釋放的狀態,這里假定為S3狀態,對應按鍵松開狀態。一般情況下,采用的時間序列可以為10-20毫秒之間。在S1狀態,按鍵掃描的狀態始終處于S1,若此時按下按鍵,在下一個掃描時間間隔(這個時間間隔用于消抖)后,單片機檢測到有按鍵按下,進入狀態S2,表示是一次有效的按鍵,然后在以后的每個時間間隔里繼續檢測,如果檢測IO一直是低電平,說明按鍵沒有被松開,那么狀態將一直停留在S2,一旦檢測到IO電平恢復為高電平說明是按鍵已經松開,即狀態S3。2.狀態切換無按鍵0有按鍵1等釋放20/0(消抖)1/01/0(干擾)0/1(確認)1/00/0任務實施1.硬件電路。2.程序設計。1.硬件電路2.程序設計#include<reg52.h>#defineucharunsignedchar #defineuintunsignedint#defineKeyPortP3sbitsmg1=P2^4; sbitsmg2=P2^5; sbitsmg3=P2^6; sbitsmg4=P2^7; sbitkeyks=P1^2; sbitkeytz=P1^1; #definekeystate00 #definekeystate11 #definekeystate22 ucharucKeyStatus=0; unsignedcharkeyvalue=0;uintcount=0;uchartemp1;uchartemp[4]={0x3f,0x3f,0x3f,0x3f};bitflag=0; inttable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharweixuan[4]={0xef,0xdf,0xbf,0x7f};/**********10ms延時子程序***********/voiddelay10ms(void){uchari,k;for(i=20;i>0;i--)for(k=250;k>0;k--);}/**********ms級延時子程序***********/voiddelayms(uintx) //x=1,約1ms延時函數,數碼管用{uinty,z;for(y=x;y>0;y--)for(z=111;z>0;z--);}/**********狀態機按鍵掃描程序***********/ucharkeyscan() {switch(ucKeyStatus){casekeystate0:ucKeyStatus=keystate1;break;casekeystate1:switch(KeyPort){case0xfe:keyvalue=1;++count;break;//第一個按鍵按下

case0xfd:keyvalue=2;++count;break;//第二個按鍵按下

case0xfb:keyvalue=3;++count;break;//第三個按鍵按下

case0xf7:keyvalue=4;++count;break;//第四個按鍵按下

case0xef:keyvalue=5;++count;break;//第五個按鍵按下

case0xdf:keyvalue=6;++count;break;//第六個按鍵按下

case0xbf:keyvalue=7;++count;break;//第七個按鍵按下

case0x7f:keyvalue=8;++count;break;//第八個按鍵按下

default:keyvalue=0xff;break;//其他情況,無按鍵按下

}/**********功能鍵識別檢查**********/voidKeyScan_1(void){uchari;

if(keytz==0){ delay10ms(); if(keytz==0)

{ while(!keytz);

count=0; for(i=0;i<4;i++){ temp[i]=0x40;} } flag=0;

}}}//開始鍵是否按下if(keyks==0){ delay10ms(); if(keyks==0){ while(!keyks);

count=0;for(i=0;i<4;i++){ temp[i]=0x40;} } flag=1;

}}//數碼管顯示voidsmg(){uchari;for(i=0;i<4;i++){ P0=temp[i];

P2=weixuan[i];

delayms(1);

P2=0xff;

}

}/**********主函數**********/voidmain() {while(1){ smg(); temp1=keyscan(); if((count==1)&&(flag==1)){ temp[0]=0x40; temp[1]=table[0]; temp[2]=table[0]; temp[3]=table[temp1];} KeyScan_1();}}進階提高1.延時時間的計算單片機開發過程中,用到延時程序的地方太多了,怎么比較精確的知道當前使用的延時程序延時時間是多少?2.為搶答器添加提示音一延時時間的計算介紹一個工具軟件:Emu51Form。Emu51Form是一個軟件仿真計時器,具體使用方法為:1.打開

keil\tools.ini

文件,在它的c51欄中加入AGSI9=Emu51Form.DLL

("delay

simulation")

然后存盤。1.延時時間的計算2.把

Emu51Form.dll

文件復制

keil\c51\bin

中。3.新建一個工程,編寫一個延時程序編譯通過后,如圖。4.調時時在peripherals下有Emu51Form選項,如圖:5.選擇

Debug/Start/Stop

Debug

Session

后,彈出如圖所示的對話框。選擇對話框中的Run,即可得到延時程序的延時值。6.編譯測試下面延時程序執行的延時時間,晶振設置為11.0592MHz,該延時程序延時時間為1065us(1.065ms),如圖:#include<reg51.h>//頭文件#defineucharunsignedchar//定義uchar為無符號字符變量。

void

delayms(void)

{

uchark,ms;

ms=1

;

while(ms--)

{

for(k

=

0

;

k

<

120

;

k++)

;

}}2.為搶答器添加提示音核心代碼提示:voidbeeping(){uchari;for(i=0;i<100;i++)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論