日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机4位抢答器_倒计时可调仿真设计

發布時間:2024/8/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机4位抢答器_倒计时可调仿真设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

51單片機4位搶答器_倒計時可調仿真設計

目錄標題

  • 51單片機4位搶答器_倒計時可調仿真設計
    • 基本功能
      • 課程設計目的
      • 任務和要求
      • 系統結構圖
    • 理論分析與計算
    • 硬件設計
      • AT89C51最小系統
      • 鍵盤模塊
      • 蜂鳴器模塊
    • 軟件設計
      • 主程序
    • 仿真圖
    • 設計報告
    • 資料清單

(程序+proteus仿真+報告)

Proteus仿真版本:proteus 7.8

程序編譯器:keil 4/keil 5

編程語言:C語言

設計編號:Q001

基本功能

以單片機為核心,設計一個4位競賽搶答器:同時供4名選手或4個代表隊比賽,分別用4個按鈕S0~S4表示。

1.設置一個系統清除和搶答控制開關S,開關由主持人控制。

2.搶答器具有鎖存與顯示功能。即選手按按鈕,鎖存相應的編號,并在優先搶答選手的編號一直保持到主持人將系統清除為止。

3.搶答器具有定時搶答功能,且一次搶答的時間由主持人設定(如20秒)。

4.當主持人啟動“開始”鍵后,定時器進行減計時,同時揚聲器發出短暫的聲響,聲響持續的時間為0.5s左右。

參賽選手在設定的時間內進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答的時間,并保持到主持人將系統清除為止。

5.如果在主持人啟動"開始"鍵前搶答 ,搶答無效。且顯示器上會顯示搶答選手編號。

6.如果定時時間已到,無人搶答,本次搶答無效,系統報警并禁止搶答,定時顯示器上顯示00。

課程設計目的

(1) 綜合所學的單片機原理及接口技術等課程的理論知識完成本課程設計;

(2) 學習并掌握基本電路設計與使用方法,單片機的編程與應用方法;

(3) 提高綜合分析、解決實際問題的能力。

任務和要求

本設計是以搶答為出發點。考慮到依需設定限時回答的功能,利用AT89C51單片機及外圍接口實現的搶答系統,利用單片機的定時器/計數器定時和記數的原理,將軟、硬件有機地結合起來,使得系統能夠正確地進行計時,同時使數碼管能夠正確地顯示時間。用開關做鍵盤輸出,發光二極管和蜂鳴器發出提示。同時系統能夠實現:在搶答中,只有開始后搶答才有效,如果在開始搶答前搶答為無效;在軟件中還應用了外部中斷,通過中斷解除搶答的鎖存,似的設計更加靈活,實用性更強。

本設計主要設計指標:

(1) 按鍵輸入模塊,包括主持人時間加,時間減,開始搶答,新一輪4個按鍵和選手1號到4號共搶4答按鍵;

(2) 顯示模塊,可以搶答實現倒計時和顯示搶答選手編號。

(3) 蜂鳴器模塊,用于倒計時提醒,倒計時開始后發出短暫的聲響,聲響持續的時間為0.5s左右。

系統結構圖

? 主持人控制搶答器時間加減和開始,設置好時間或者使用默認時間后,按下開始按鍵即開始倒計時,每倒計時一秒蜂鳴器短暫鳴0.5提醒選手。選手在開始搶答后按下各自的按鍵搶答,一旦按下會顯示選手編號。一輪搶答結束后,主持人按下新一輪即可進入下一輪的搶答。

理論分析與計算

? 倒計時主要應用了51單片機的定時器,本設計應用定時器產生50ms定時。以12Mhz的晶振來說,機器周期是1us,計滿TH0、TL0就需要216-1個數,再來一個數就“溢出”產生中斷,一次溢出也就是65536us,約等于65.5ms,假若定時50ms需要一個預裝值(初值),總值-需要值=預裝值。預裝后,定時器從預裝值開始加值,定時器溢出中斷后,會重新從預裝值開始加值加到50ms就再產生中斷,從而達到了定時的目的。如果要定時1s就可以讓定時器中斷1000ms/50ms=20次。

硬件設計

根據系統結構圖,系統由:AT89C51最小系統、顯示模塊、按鍵模塊和蜂鳴器模塊組成。

AT89C51最小系統

? AT89C51是美國ATMEL公司生產的低電壓,高性能CMOS4位單片機,片內含4k bytes的可反復擦寫的只讀程序存儲器和128 bytes的隨機存取數據存儲器,期間采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用4位中央處理器和Flash存儲單元,功能強大的AT89C51單片機可靈活應用于各種控制領域。

AT89C51提供以下標準功能:4k字節Flash閃速存儲器,128字節內部RAM,32個I/O口線,兩個16位定時/計數器,一個5向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,AT89C51可降至0Hz的靜態邏輯操作,并支持兩種軟件可選的節電工作模式。空閑方式停止CPU的工作,但允許RAM,定時/計數器,串行通信口及中斷系統繼續工作。掉電方式保存RAM中的內容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。

本系統中央控制器采用的單片機AT89C51,復位電路采用上電復位電路。外接的晶振為12MHz晶振。

圖2 AT89C51最小系統

*3**.2* *顯示模塊*

本次設計采用八段數碼管顯示,是四位一體共陰極數碼管,由四個八段數碼管集成,高電平點亮。在顯示上我們通常采用兩種方法:一種是靜態顯示,一種是動態顯示。

靜態顯示是指每個數碼管的每一個段碼都由一個單片機的I/O端口進行驅動,或者使用如BCD碼二-十進制譯碼器譯碼進行驅動。靜態顯示的優點是編程簡單,顯示亮度高,缺點是占用I/O端口多,實際應用時必須增加譯碼驅動器進行驅動,增加了硬件電路的復雜性。

LED數碼管動態顯示接口是單片機中應用最為廣泛的一種顯示方式之一,動態顯示是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示,這就是動態顯示。

在輪流顯示過程中,每位數碼管的點亮時間為1~2ms,由于人的視覺暫留現象及發光二極管的余輝效應,盡管實際上各位數碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,但能夠節省大量的I/O端口,而且功耗更低。故本次設計采用動態顯示方法。其原理圖如圖3所示。

圖3 顯示模塊

本設計使用74HC573來驅動四位一體數碼管。74HC573的八個鎖存器都是透明的D型鎖存器,當使能(LE)為高時,Q輸出將隨數據(D)輸入而變。當使能(LE)為低時,輸出將鎖存在已建立的數據電平上。輸出控制不影響鎖存器的內部工作,即老數據可以保持,甚至當輸出被關閉時,新的數據也可以置入。這種電路可以驅動大電容或低阻抗負載,可以直接與系統總線接口并驅動總線,而不需要外接口。特別適用于緩沖寄存器,I/O通道,雙向總線驅動器和工作寄存器.573工作電壓在5V(VCC)左右最大7V最小2V,最大輸出電流為20MA,可用來驅動發光二極管。

圖4 顯示電路驅動電路

鍵盤模塊

鍵盤是人機交互的接口,本設計中,我們采用獨立鍵盤。按鈕需要12個,分別為4位搶答按鍵、開始搶答鍵、新一輪按鍵、搶答時間加鍵和搶答時間減鍵。當按鍵按下,與主控芯片連接的端口被降為低電平,按鍵松開則也升為高電平。按鍵采用的是Tack Switch按鈕開關,它具有自動恢復的功能。當我們按下按鈕時,其中的接點接通,放開按鈕后,接點恢復為切斷。雖然Tack Switch有4個引腳,但實際上,其內部只有一對a接點,即其中兩個引腳是內部相連通的,而另外兩個引腳內部也是相連通的。

本設計中12個按鍵實現了搶答,時間調節等功能,獨立按鍵的引入使得體現了本設計的人性化,智能化,功能的強大。其電路分為主持人部分和選手部分。分別實現了控制、調節功能和搶答功能。其電路圖如圖4所示。

圖4 按鍵電路

蜂鳴器模塊

蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。 蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。

本設計采用電磁式蜂鳴器進行。電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。因此需要一定的電流才能驅動它,單片機I/O引腳輸出的電流較小,單片機輸出的TTL電平基本上驅動不了蜂鳴器,因此需要增加一個電流放大的電路。如蜂鳴器電路圖5所示,蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負極接到三極管的發射極E,三極管的基極B經過限流電阻R3后由單片機的beep引腳控制,當beep輸出低電平時,三級管QS截止,沒有電流流過線圈,蜂鳴器不發聲;當beep輸出高電平時,三級管導通,這樣蜂鳴器的電流形成回路,發出聲音。因此,我們可以通過程序控制beep腳的電平來使蜂鳴器發出聲音和關閉。其電路圖如圖5所示。

圖5 蜂鳴器電路

軟件設計

當接通電源開始工作后,單片機中的程序開始運行,將對程序進行初始化,以便和單片機芯片達成通信協議。完成初始化后,將進行鍵盤掃描,同時判斷開始按鍵、調節按鍵是否按下。最后完成倒計時和選手號碼的顯示。系統流程圖如圖6所示。

圖6 系統流程框圖

根據系統軟件設計要求將軟件劃分為:主程序、顯示子程序、按鍵子程序、蜂鳴器子程序

主程序完成外部中斷初始化、定時器初始化、蜂鳴器模塊初始化。主程序掃描主持人不斷掃描按鍵,進行對應的操作。

主程序

進入主程序后,顯示顯示預設的倒計時數字20,程序掃描主持人按鍵倒計時加減鍵和開始按鍵。按下開始按鍵后,倒計時開始工作,實時刷新倒計時數字,每倒計時1秒蜂鳴器beep引腳拉低0.5秒,蜂鳴器短鳴0.5秒。在掃描到選手按下按鍵后,倒計時定時器停止工作,顯示選手編號和按下搶答鍵的時間。

主要(關鍵)代碼:

void main (void) { EA=1;TMOD=0x11;TH0=(65536-50000)/256;//這是50ms的TL0=(65536-50000)%256;ET0=1;TR0=0; TH1=(65536-50000)/256;//這是50ms的TL1=(65536-50000)%256;ET1=1;TR1=1; beep = 0;time=20; num=0; flag=0; while (1) //主循環{TempData[2]=dofly_DuanMa[time/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[3]=dofly_DuanMa[time%10];if(num!=0)m=1;if(start==0){DelayMs(10); if(start==0){ flag=1;while(!start);}}if(add==0){DelayMs(10); if(add==0){ time++;while(!add);}}if(jian==0){DelayMs(10); if(jian==0){ time--;while(!jian);}}if(time>=99)time=99;if(flag==0){if(num!=0)m=1;keyscan(); check2();}if(flag==1){ TR0=1;if(num!=0)m=1; keyscan(); check1();}//主循環中添加其他需要一直工作的程序 } }

此段程序是完成外部中斷初始化、定時器初始化、蜂鳴器模塊初始化。完成后進入大循環。

if(num==1){TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[0];beep=0;Display(0,8); //數碼管顯示函數TR0=0; while(m);} if(num==2){TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[1];beep=0;Display(0,8); //數碼管顯示函數TR0=0; while(m);} if(num==3){TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[2];beep=0;Display(0,8); //數碼管顯示函數 TR0=0; while(m);} if(num==4){TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[3];beep=0;Display(0,8); //數碼管顯示函數 TR0=0; while(m);}

這段函數完成了倒計時的顯示和掃描是否開始倒計時。在沒有開始搶答時,選手按下按鍵會顯示選手編號和清零時間,一起防止選手搶答。開始搶答后,標志位flag變為1。開始執行按鍵掃描函數check2();

void check2() {if(num==1){TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[3]=0x40;TempData[4]=table[0];Display(0,8); //數碼管顯示函數TR0=0; while(m);} if(num==2){TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[3]=0x40;TempData[4]=table[1];Display(0,8); //數碼管顯示函數TR0=0; while(m);} if(num==3){TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[3]=0x40;TempData[4]=table[2];Display(0,8); //數碼管顯示函數 TR0=0; while(m);} if(num==4){TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[3]=0x40;TempData[4]=table[3];Display(0,8); //數碼管顯示函數 TR0=0; while(m);} }

?

假如按鍵1按下,會顯示選手編號。同時程序會卡在while(m);循環。此時除了新一輪按鍵之外的任何按鍵都系統沒有任何變化。

新一輪按鍵是系統復位,即使程序一直在執行while(m)循環,按下按鍵后,程序會執行一次硬件復位,將變量清零,函數重新執行按鍵掃描。

仿真圖

設計報告

資料清單

資料下載鏈接

總結

以上是生活随笔為你收集整理的51单片机4位抢答器_倒计时可调仿真设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。