以單片機為核心,設(shè)計一個8位競賽搶答器:同時供8名選手或8個代表隊比賽,分別用8個按鈕S0-S7表示。
設(shè)置一個系統(tǒng)清除和搶答控制按鈕,由主持人控制。
搶答器具有鎖存與顯示功能。即選手按按鈕,鎖存相應(yīng)編號,并在優(yōu)先搶答選手的編號一直保持到主持人將系統(tǒng)清零。
搶答器具有定時搶答功能,且一次搶答的時間由主持人設(shè)定。
當主持人啟動“開始”鍵后,定時器進行減計時,同時揚聲器發(fā)出短暫的聲響,聲響持續(xù)的時間為0.5s左右。
參賽選手在設(shè)定時間內(nèi)進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答時間,并保持到主持人將系統(tǒng)清除為止。
如果定時時間已到,無人搶答,本次搶答無效,系統(tǒng)報警并禁止搶答,定時顯示器上顯示00.
通過按鍵改變搶答時間。
流程圖.jpg (46.6 KB, 下載次數(shù): 0)
下載附件
2025-6-28 17:51 上傳
51hei截圖20210615194928.png (24.93 KB, 下載次數(shù): 0)
下載附件
2025-6-28 17:41 上傳
51hei截圖20210615194940.png (25.86 KB, 下載次數(shù): 0)
下載附件
2025-6-28 17:41 上傳
51hei截圖20210615194950.png (25.8 KB, 下載次數(shù): 0)
下載附件
2025-6-28 17:41 上傳
51hei截圖20210615194956.png (26.21 KB, 下載次數(shù): 0)
下載附件
2025-6-28 17:41 上傳
51hei截圖20210615195006.png (26.38 KB, 下載次數(shù): 0)
下載附件
2025-6-28 17:41 上傳
單片機源程序如下:- #include "reg51.h"
- #include "max7219.h"
- sbit beep=P3^7;//蜂鳴器
- sbit k1=P2^0;//清零/設(shè)置
- sbit k2=P2^1;//開始
- uint beep_time=0;//蜂鳴器延時
- uchar mode=0;//模式,0復(fù)位,1開始,2設(shè)置,3停止,4超時錯誤
- uchar sec=0,miao=10,miao_set=10;//倒計時
- uchar num=0;
- void main()
- {
- TMOD|=0X01;
- TH0=0X3C;
- TL0=0XB0;
- TH1=0XFC;
- TL1=0X18;
- ET1=1;
- ET0=1;//打開定時器0中斷允許
- EA=1;//打開總中斷
- TR0=1;//打開定時器
- TR1=1;
- max_init(4);
- max_send_byte(1,miao/10);//初始化顯示
- max_send_byte(2,miao%10);
- max_send_byte(3,num/10);
- max_send_byte(4,num%10);
- while(1)
- {
- if(mode>2)//開始模式
- {
- if(!k1)//復(fù)位
- {
- mode=0;//復(fù)位模式
- miao=miao_set;//復(fù)位倒計時
- num=0;
- max_send_byte(1,miao/10);//顯示
- max_send_byte(2,miao%10);
- max_send_byte(3,num/10);
- max_send_byte(4,num%10);
- while(!k1);
- }
- }
- if(mode==0)//復(fù)位狀態(tài)
- {
- if(!k2)//開始
- {
- mode=1;//開始模式
- miao=miao_set;
- beep_time=500;//啟動蜂鳴器
- while(!k2);
- }
- if(!k1)//設(shè)置時間
- {
- if(miao_set<30)
- miao_set++;
- else
- miao_set=0;
- max_send_byte(1,miao_set/10);//顯示
- max_send_byte(2,miao_set%10);
- while(!k1);
- }
- }
- if(mode==1)//搶答模式
- {
- switch(P1)
- {
- case 0xfe:mode=3;num=1;//選手1
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- beep_time=3000;//啟動蜂鳴器
- break;
- case 0xfd:mode=3;num=2;//選手2
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- beep_time=3000;//啟動蜂鳴器
- break;
- case 0xfb:mode=3;num=3;//選手3
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- beep_time=3000;//啟動蜂鳴器
- break;
- case 0xf7:mode=3;num=4;//選手4
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- beep_time=3000;//啟動蜂鳴器
- break;
- case 0xef:mode=3;num=5;//選手5
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- beep_time=3000;//啟動蜂鳴器
- break;
- case 0xdf:mode=3;num=6;//選手6
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- beep_time=3000;//啟動蜂鳴器
- break;
- case 0xbf:mode=3;num=7;//選手7
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- beep_time=3000;//啟動蜂鳴器
- break;
- case 0x7f:mode=3;num=8;//選手8
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- beep_time=3000;//啟動蜂鳴器
- }
- }
- }
- }
- void Timer0() interrupt 1//定時器中斷
- {
- TH0=0X3C;//重裝50ms
- TL0=0XB0;
- if(mode==1)//開始模式
- {
- if(sec<20) //計時1s
- sec++;
- else
- {
- sec=0;
- if(miao>0)//倒計時
- {
- miao--;
- max_send_byte(1,miao/10);//顯示
- max_send_byte(2,miao%10);
- }
- else
- {
- mode=4;//超時
- num=0;
- beep_time=3000;
- max_send_byte(1,miao/10);//顯示
- max_send_byte(2,miao%10);
- max_send_byte(3,num/10);//顯示
- max_send_byte(4,num%10);
- }
- }
- }
- }
- void Timer1() interrupt 3//定時器1中斷
- {
- TH1=0XFC; //重裝定時器
- TL1=0X18;
- if(beep_time>0)//蜂鳴器響
- {
- beep_time--;//蜂鳴器計時減一
- beep=!beep; //蜂鳴器取反,產(chǎn)生500HZ頻率
- }
- else
- beep=1; //關(guān)閉蜂鳴器
- }
復(fù)制代碼- #include "max7219.h"
- #include "intrins.h"
- //數(shù)碼管地址從1到8
- void max_send_byte(uchar addr,uchar i) //發(fā)送i到addr
- {
- uchar k=0;
- uchar a;
- a=addr;
- max_load=0;
- for(k=0;k<8;k++)
- {
- if((a & 0x80)>0)
- max_din=1;
- else
- max_din=0;
- a<<=1;
- max_clk=0;
- _nop_();
- max_clk=1;
- }
- a=i;
- for(k=0;k<8;k++)
- {
- if((a & 0x80)>0)
- max_din=1;
- else
- max_din=0;
- a<<=1;
- max_clk=0;
- _nop_();
- max_clk=1;
- }
- max_load=1;
- }
- //初始化
- //i設(shè)置數(shù)碼管個數(shù)
- void max_init(uchar i)
- {
- max_send_byte(0x0b,i);//設(shè)置個數(shù)
- max_send_byte(0x09,0xff);//譯碼方式
- max_send_byte(0x0a,0x0f);//最亮
- max_send_byte(0x0c,0x01);//開啟顯示
- max_send_byte(0x00,0x00);//關(guān)閉測試功能
- }
復(fù)制代碼
仿真程序:
資料.7z
(2.96 MB, 下載次數(shù): 0)
2025-6-28 17:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|