【微控制器彙編實戰】基於51微控制器的搶答器設計

Owen1u發表於2020-12-25


作業系統:Win10
設計軟體:Keil5 + proteus
微控制器選型:AT89C51
製作日期:2020.6.15
釋出日期:2020.12.25

一、專案要求

(1)構建proteus模擬平臺:包含搶答輸入+串列埠+數碼管

(2)通過串列埠設定計時器的開始,並把搶答結果通過串列埠輸出

(3)數碼管輸出搶答結果+組號

(4)比賽結束,能發出報警聲

二、設計難點

1、合理分配89C51的中斷系統。計劃將兩個定時器中斷分別運用於搶答倒數計時和蜂鳴器發出警報的時長,將兩個外部中斷分別運用於自定義倒數計時時長。

2、機器週期與現實時間的匹配、及定時器的初值設定問題。

3、系統的啟動、搶答功能則利用程式結構,不斷迴圈檢測。

4、在中斷用盡的情況下考慮如何設計搶答器的搶答模式和待機模式(可自定義時長)的設計。

5、在搶答器的搶答模式和待機模式中,分別考慮數碼管顯示和搶答的公平性,故決定迴圈如下:顯示數碼管十位->檢測玩家一是否搶答->檢測玩家二是否搶答->顯示數碼管個位->檢測玩家三是否搶答->檢測玩家四是否搶答。

6、數碼管顯示所須的BCD碼與二進位制的運算問題。

7、微控制器的重啟復位保護功能。

8、便於使用者增設搶答人數的擴充功能。

三、設計思路

在這裡插入圖片描述
系統分為兩個模式,等待模式和搶答模式。

預設狀態下為等待模式,該狀態下可調節倒數計時時間和啟動倒數計時開始搶答。

搶答模式中,則開始倒數計時,任意玩家按下搶答鍵,倒數計時即刻停止,且蜂鳴器發出警報,電晶體顯示搶答成功玩家的標號;若倒數計時結束無玩家搶答,數碼管顯示0,且蜂鳴器發出警報。無論以何種方式結束,系統都將再次進入等待模式,倒數計時時間將恢復。在搶答模式中,使用者不能對倒數計時時間進行操作。

為了打破搶答使用者數量的限制且保證相對公平性,各搶答器將不使用外部中斷功能觸發(51微控制器僅2個外部中斷),而採用迴圈檢索的方式,通常情況下微控制器的指令週期為微妙級,在現實應用中可忽略其誤差影響。

而倒數計時時間設定模組對觸發時效性要求不高,也可使用迴圈檢索,但為了程式碼編寫便利,我們將兩個外部中斷功能用於此處,恰好滿足兩位數的時間設定需求。

而微控制器的兩個定時器中斷源將分別用於搶答倒數計時(可調)和蜂鳴器及顯示搶答成功使用者(3s)。

四、proteus設計圖

在這裡插入圖片描述
(1)核心元件在電路中的功能:
AT89C51作為控制晶片,完成運算控制、訊號識別以及實現顯示功能。

四位數碼管前兩位顯示倒數計時,第三位置空,最後一位顯示搶答組號。

晶體振盪器產生穩定的時鐘脈衝來控制振盪電路的輸入和輸出。

蜂鳴器在比賽結束時能發出報警聲。

(2)主要功能在電路中是如何完成的:

搶答器電路

四個搶答器按鈕分別接於P1.1到P1.4,用於識別搶答按鍵的先後,鎖存第一位搶答者編號,使後按者無效,之後通過譯碼顯示搶答者編號。

其中切換模式開關接於P1.0,用於啟動搶答模式。

復位重啟電路

復位電路接於RST口,用於搶答前和搶答後的復位與重啟功能。

時鐘振盪電路

時鐘振盪電路接於XTAL1和XTAL2,用一個晶體振盪器產生穩定的時鐘脈衝來控制振盪電路的輸入和輸出,用於提供精確的定時。為了模擬實驗便於計算,設定晶振為12MHz。

電晶體顯示電路

接於P0.0到P0.6和P2.0到P2.3,用來顯示各提示資訊。前兩位顯示倒數計時時間,最後一位顯示搶答使用者的序號,若無人搶答,顯示0。開機後倒數計時預設10s。

報警電路

接於P1.6,當比賽結束時發出報警聲。為了方便觀測,串接小燈表示狀態。

串列埠輸入輸出電路

接於P3.0和P3.1,當串列埠輸入s啟動,串列埠搶答結果輸出為SUC:+編號 無人搶答輸出NONE。

設定時間電路

兩個按鍵分別獨立控制個位和十位,分別從0-9迴圈。

五、實驗結果與效能指標

1、定時器置數設定(定時器0和定時器1相同):

MOV TMOD,#01H;設定定時器0模式
MOV TL0,#0B0H;
MOV TH0,#3CH;設定定時器0的初值

MOV 11H,#60;蜂鳴器持續3s,每1s為20個loop

模擬設定晶振為12MHz,使用16位計數器,每一秒設定20個迴圈,即賦值應為216-1/20·106=15536=3CB0 H

2、搶答模式中,對各個使用者檢測的公平性:

//迴圈順序:顯示數碼管十位->檢測玩家1->檢測玩家2->顯示數碼管個位->檢測玩家3->檢測玩家4,交錯執行使數碼管視覺效果均勻,對玩家的識別也相對公平

將順序平均分配,保證檢測的相對公平。以12MHz振盪頻率為例,一個機器週期為1us。根據程式碼,相鄰使用者檢測間相差5us;顯示一位數碼管也為5us。即使用者之間最多相差5us,對實際使用幾乎不造成影響。

3、倒數計時模式下的時間設定功能:
倒數計時模式下,軟體禁止外部中斷功能,但計數器依然執行,因此按下後外部標誌位會置1,但不執行中斷。直到搶答模式結束,進入等待模式後,開啟外部中斷允許,倒數計時時間設定改變。因此搶答過程中,時間設定不會對功能造成影響,搶答結束後數碼管時間才會立即變化(一位)。

4、設定時間00s後啟動搶答:
蜂鳴器會立即被觸發,數碼管顯示結果0(無人搶答),再次進入等待,不會觸發bug。

5、數碼管、蜂鳴器、串列埠的計數器分配問題:
由於串列埠必須使用計數器T1,因此分配蜂鳴器為T2。數碼管在倒數計時時,串列埠不工作,使用T1的中斷;數碼管顯示結果時,串列埠也須輸出結果,蜂鳴器發出警報,因此數碼管使用T0的中斷。

6、時鐘、復位的模擬問題:
在proteus軟體中無法除錯復位功能,但根據電路圖,我們可以推斷該復位短路基本正確,在現實中可以實現復位功能。

同時我們發現,改變晶振大小並不會使機器週期變化,預設為12MHz。對模擬過程沒有大礙。

六、原始碼(含.asm彙編程式碼和.DSN電路檔案)

點選此處下載
(資源在稽核中)
未經允許不得轉載,不得作為商業用途。

相關文章