|
8路搶答器設(shè)計(jì)難度分:9基本要求:8個(gè)選手搶答按鍵,1個(gè)主持人按鍵,4只LED數(shù)碼管顯示。系統(tǒng)復(fù)位狀態(tài)LED顯示“00 00”;主持人按下按鍵則搶答開始,系統(tǒng)顯示3秒搶答時(shí)間倒計(jì)時(shí),計(jì)時(shí)到無人搶答則系統(tǒng)發(fā)出報(bào)警后自動(dòng)復(fù)位;8個(gè)選手最先按下者搶答成功,顯示選手編號(hào)和答題時(shí)間10秒,支持人發(fā)出開始作答指令同時(shí)按下主持人鍵,答題時(shí)間開始倒計(jì)時(shí)并顯示,若選手回答結(jié)束之后主持人按下主持人鍵復(fù)位系統(tǒng),若倒計(jì)時(shí)結(jié)束選手未回答問題系統(tǒng)發(fā)出報(bào)警后自動(dòng)復(fù)位。擴(kuò)展要求:增加1個(gè)“√”鍵和1個(gè)“×”鍵,只在10秒回答時(shí)間內(nèi)有效,若選手回答正確,主持人按下“√”鍵彩燈閃爍,若選手回答錯(cuò)誤,主持人按下“×”鍵發(fā)出低沉報(bào)警音;系統(tǒng)復(fù)位后搶答開始前,選手不得提前搶答,否則發(fā)出違例報(bào)警,顯示違例選手編號(hào),由主持人復(fù)位系統(tǒng);可修改答題時(shí)間。
仿真原理圖如下(proteus8.10版本的仿真工程文件可到本帖附件中下載)
1.png (235.51 KB, 下載次數(shù): 49)
下載附件
2022-10-16 00:16 上傳
單片機(jī)源程序如下:
- //頭文件聲明
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- //code uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- code uchar seven_seg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- code uchar seven_bit[] = {0xfe,0xfd,0xfb,0xf7};
- sbit run_key = P3^2; //啟動(dòng)按鍵
- sbit buzzer = P3^5; //報(bào)警
- sbit add_key = P3^6; //加
- sbit dec_key = P3^7; //減
- uchar player; //定義選手按鍵的鍵值參數(shù)
- uint player_num = 0; //選手號(hào)
- uchar now_time = 0; //默認(rèn)復(fù)位時(shí)間0S
- uchar next_time=10; //默認(rèn)答題時(shí)間10s
- bit run_flag = 0; //主持人按下開始標(biāo)志位
- bit time_off = 0; //倒計(jì)時(shí)時(shí)間到,或者開始有人搶答成功標(biāo)志位
- uint Count_A = 0; //定時(shí)器計(jì)數(shù)參數(shù)
- uint Count_B = 0; //定時(shí)器計(jì)數(shù)參數(shù)
- void delay(uint ms) //延時(shí)函數(shù)
- {
- uint i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void dispaly(uint a,uint b) //a為選手號(hào)碼,b為時(shí)間
- {
- P2=seven_bit[0];
- P0=seven_seg[a]; //顯示選手號(hào)
- delay(5);
- P2=seven_bit[1];
- P0=0x40; //顯示橫杠
- delay(5);
- P2=seven_bit[2];
- P0=seven_seg[b/10]; //顯示倒計(jì)時(shí)時(shí)間
- delay(5);
- P2=seven_bit[3];
- P0=seven_seg[b%10];
- delay(5);
- P2=0xff;
- }
- void keyScan() //按鍵子程序
- {
- if(run_key==0) //如果啟動(dòng)按鍵按下
- {
- delay(5); //消抖
- if(run_key==0)
- {
- if(now_time!=next_time)
- {
- if(player_num!=0)
- {
- now_time=0; //答題結(jié)束按鍵按鍵復(fù)位
- player_num=0;
- time_off=0;//復(fù)位選手按下標(biāo)志
- }
- else
- {
- player_num=0;
- run_flag=1; //設(shè)置模式調(diào)整
- buzzer=0;//0.5S聲音
- now_time=3;
- TR0=1; //開啟定時(shí)器
- TR1=1;
- }
- }
- else
- {
- buzzer=0;//0.5S聲音
- TR0=1; //開啟定時(shí)器
- TR1=1;
-
- }
- }
- while(run_key==0); //等待按鍵放開
- }
- if(run_flag==0&&time_off==0) //只有沒開始搶答的時(shí)候可以加減
- {
- if(add_key==0)
- {
- delay(5);
- if(add_key==0)
- {
- next_time++; //時(shí)間加上去
-
- }
- while(add_key==0) dispaly(player_num,next_time); //顯示
- }
- if(dec_key==0)
- {
- delay(5);
- if(dec_key==0)
- {
- next_time--; //時(shí)間減下來
-
- }
- while(dec_key==0) dispaly(player_num,next_time); //顯示
- }
- }
- }
- void EX_Init()
- {
- /*********初始化定時(shí)器/外部中斷**********/
- TMOD = 0x11; //10ms
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- TH1 = 0x0D8;
- TL1 = 0x0F0;
- IE = 0x8b; //IE = 0x85;
- IT0 = 1;
- IT1 = 1;
- PX0 = 1;
- TR0 = 0; //關(guān)閉定時(shí)器
- TR1 = 0;
- }
- void main(void)
- {
- EX_Init(); //初始化
- buzzer=1;
- P2=0xff;
- P1=0xff;
- P0=0xff;
- while(1) //死循環(huán)
- {
- keyScan(); //按鍵程序
- dispaly(player_num,now_time); //顯示
- }
- }
- void Time0() interrupt 1
- {
- TH0 = 0x0D8; //10ms
- TL0 = 0x0F0;
-
- if(run_flag==1) //如果開始搶答
- {
- player=P1; //讀取端口
-
- switch(player)
- {
- case 0xfe:player_num=1;run_flag=0;time_off=1;TR0=0;TR1=0;now_time=next_time;break; //為第一個(gè)選手按下時(shí),選手號(hào)=1,定時(shí)器停止,時(shí)間十秒
- case 0xfd:player_num=2;run_flag=0;time_off=1;TR0=0;TR1=0;now_time=next_time;break;
- case 0xfb:player_num=3;run_flag=0;time_off=1;TR0=0;TR1=0;now_time=next_time;break;
- case 0xf7:player_num=4;run_flag=0;time_off=1;TR0=0;TR1=0;now_time=next_time;break;
- case 0xef:player_num=5;run_flag=0;time_off=1;TR0=0;TR1=0;now_time=next_time;break;
- case 0xdf:player_num=6;run_flag=0;time_off=1;TR0=0;TR1=0;now_time=next_time;break;
- case 0xbf:player_num=7;run_flag=0;time_off=1;TR0=0;TR1=0;now_time=next_time;break;
- case 0x7f:player_num=8;run_flag=0;time_off=1;TR0=0;TR1=0;now_time=next_time;break;
- case 0xff:break; //全高電平-無人按下,退出
- default:player_num=9; break; //出現(xiàn)其它情況,顯示9
- }
- }
- }
- void Time1() interrupt 3
- {
- TH1 = 0x0D8;
- TL1 = 0x0F0; //10ms
- Count_A++;
- Count_B++;
- if(Count_B<50) //500ms的蜂鳴器提示
- buzzer=0;
- else buzzer=1;
-
- if(Count_A==100) //每秒鐘減一,倒計(jì)時(shí)
- { Count_A=0;
- now_time--; //當(dāng)前倒計(jì)時(shí)時(shí)間 --
- if(now_time<=0) //倒計(jì)時(shí)結(jié)束(到0),那么開始報(bào)警,其它復(fù)位
- { now_time=0;run_flag=0;TR0=0;TR1=0;time_off=1;buzzer=0; delay(1200);buzzer=1;}
- }
- }
復(fù)制代碼
Keil代碼與Proteus8.10仿真下載:
搶答器.rar
(94.5 KB, 下載次數(shù): 80)
2022-10-15 21:30 上傳
點(diǎn)擊文件名下載附件
搶答器 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|