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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

AT89C51单片机的8位竞赛抢答器的protues仿真设计_倒计时可调

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

資料下載

資料下載鏈接

任務要求

本設計是以搶答為出發點。考慮到依需設定限時回答的功能,利用AT89C51單片機及外圍接口實現的搶答系統,利用單片機的定時器/計數器定時和記數的原理,將軟、硬件有機地結合起來,使得系統能夠正確地進行計時,同時使數碼管能夠正確地顯示時間。用開關做鍵盤輸出,發光二極管和蜂鳴器發出提示。同時系統能夠實現:在搶答中,只有開始后搶答才有效,如果在開始搶答前搶答為無效;在軟件中還應用了外部中斷,通過中斷解除搶答的鎖存,似的設計更加靈活,實用性更強。
本設計主要設計指標:
(1) 按鍵輸入模塊,包括主持人時間加,時間減,開始搶答,新一輪4個按鍵和選手1號到4號共搶4答按鍵;
(2) 顯示模塊,可以搶答實現倒計時和顯示搶答選手編號。
(3) 蜂鳴器模塊,用于倒計時提醒,倒計時開始后發出短暫的聲響,聲響持續的時間為0.5s左右。

仿真



程序

4.1 主程序

主程序完成外部中斷初始化、定時器初始化、蜂鳴器模塊初始化。主程序掃描主持人不斷掃描按鍵,進行對應的操作。
進入主程序后,顯示顯示預設的倒計時數字20,程序掃描主持人按鍵倒計時加減鍵和開始按鍵。按下開始按鍵后,倒計時開始工作,實時刷新倒計時數字,每倒計時1秒蜂鳴器beep引腳拉低0.5秒,蜂鳴器短鳴0.5秒。在掃描到選手按下按鍵后,倒計時定時器停止工作,顯示選手編號和按下搶答鍵的時間。

主要(關鍵)代碼:

EA=1;EX0=1;//外部中斷0IT0=1;//設置下降沿觸發中斷0TMOD=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; time=20; //定時時間num=0; //選手編號flag=0; //搶答模式標志位beep=0;//蜂鳴器為0 不響

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

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);}}

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

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

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

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

4.2 按鍵掃描子函數

關鍵代碼介紹

if(key1==0) {DelayMs(10); if(key1==0){ num=1;while(!key1);} }

程序一直判斷按鍵引腳電壓,按下按鍵電壓為0。按鍵會產生抖動,需要進行消抖處理,演示10毫秒后,如果按鍵電壓還是0,令按鍵數目num為1。表示按下的按鍵是按鍵1。供主函數處理按鍵消息。

4.3顯示子程序
關鍵代碼介紹

void Display(unsigned char FirstBit,unsigned char Num) {unsigned char i;for(i=0;i<Num;i++){ DataPort=0; //清空數據,防止有交替重影DUAN=1; //段鎖存DUAN=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位碼 WEI=1; //位鎖存WEI=0;DataPort=TempData[i]; //取顯示數據,段碼DUAN=1; //段鎖存DUAN=0;DelayMs(2); // 掃描間隙延時,時間太長會閃爍,太短會造成重影} }

該函數用于動態掃描數碼管。輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示,如輸入0表示從第一個顯示。 Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2。顯示主要控制74HC573鎖存數據。先清除數據,清段鎖存。然后選擇位碼。開位鎖存將數據存在位鎖存器,選擇到了需要顯示的數碼管。位鎖存完成后將數據寫進段鎖存數據,將需要顯示的數據寫到數碼管中。

4.4蜂鳴器提示子函數
蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負極接到三極管的發射極E,三極管的基極B經過限流電阻R3后由單片機的beep引腳控制,當beep輸出低電平時,三級管QS截止,沒有電流流過線圈,蜂鳴器不發聲;當beep輸出高電平時,三級管導通,這樣蜂鳴器的電流形成回路,發出聲音。因此,我們可以通過程序控制beep腳的電平來使蜂鳴器發出聲音和關閉。

if(t==20)//設置為20,就是0.5s為高0.5s為低 {beep=1;t=0;time--;TempData[2]=dofly_DuanMa[time/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8 TempData[3]=dofly_DuanMa[time%10];if(time<=0){time=0; } }

在50ms一次的定時器0中斷中,每10次中斷令蜂鳴器置零。第20次中斷令蜂鳴器置一。以此產生0.5s短暫提醒。

測試

1.初始化。

2.未按下開始搶答鍵,選手搶答無效。

3.按下開始搶答鍵,進入搶答倒計時。


3.有選手按下搶答鍵,顯示選手號碼及剩余時間。

總結

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

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