8路搶答器設計難度分:9基本要求:8個選手搶答按鍵,1個主持人按鍵,4只LED數碼管顯示。系統復位狀態LED顯示“00 00”;主持人按下按鍵則搶答開始,系統顯示3秒搶答時間倒計時,計時到無人搶答則系統發出報警后自動復位;8個選手最先按下者搶答成功,顯示選手編號和答題時間10秒,支持人發出開始作答指令同時按下主持人鍵,答題時間開始倒計時并顯示,若選手回答結束之后主持人按下主持人鍵復位系統,若倒計時結束選手未回答問題系統發出報警后自動復位。擴展要求:增加1個“√”鍵和1個“×”鍵,只在10秒回答時間內有效,若選手回答正確,主持人按下“√”鍵彩燈閃爍,若選手回答錯誤,主持人按下“×”鍵發出低沉報警音;系統復位后搶答開始前,選手不得提前搶答,否則發出違例報警,顯示違例選手編號,由主持人復位系統;可修改答題時間。
仿真原理圖如下(proteus8.10版本的仿真工程文件可到本帖附件中下載)
1.png (235.51 KB, 下載次數: 49)
下載附件
2022-10-16 00:16 上傳
單片機源程序如下:
- //頭文件聲明
- #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; //啟動按鍵
- sbit buzzer = P3^5; //報警
- sbit add_key = P3^6; //加
- sbit dec_key = P3^7; //減
- uchar player; //定義選手按鍵的鍵值參數
- uint player_num = 0; //選手號
- uchar now_time = 0; //默認復位時間0S
- uchar next_time=10; //默認答題時間10s
- bit run_flag = 0; //主持人按下開始標志位
- bit time_off = 0; //倒計時時間到,或者開始有人搶答成功標志位
- uint Count_A = 0; //定時器計數參數
- uint Count_B = 0; //定時器計數參數
- void delay(uint ms) //延時函數
- {
- uint i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void dispaly(uint a,uint b) //a為選手號碼,b為時間
- {
- P2=seven_bit[0];
- P0=seven_seg[a]; //顯示選手號
- delay(5);
- P2=seven_bit[1];
- P0=0x40; //顯示橫杠
- delay(5);
- P2=seven_bit[2];
- P0=seven_seg[b/10]; //顯示倒計時時間
- delay(5);
- P2=seven_bit[3];
- P0=seven_seg[b%10];
- delay(5);
- P2=0xff;
- }
- void keyScan() //按鍵子程序
- {
- if(run_key==0) //如果啟動按鍵按下
- {
- delay(5); //消抖
- if(run_key==0)
- {
- if(now_time!=next_time)
- {
- if(player_num!=0)
- {
- now_time=0; //答題結束按鍵按鍵復位
- player_num=0;
- time_off=0;//復位選手按下標志
- }
- else
- {
- player_num=0;
- run_flag=1; //設置模式調整
- buzzer=0;//0.5S聲音
- now_time=3;
- TR0=1; //開啟定時器
- TR1=1;
- }
- }
- else
- {
- buzzer=0;//0.5S聲音
- TR0=1; //開啟定時器
- TR1=1;
-
- }
- }
- while(run_key==0); //等待按鍵放開
- }
- if(run_flag==0&&time_off==0) //只有沒開始搶答的時候可以加減
- {
- if(add_key==0)
- {
- delay(5);
- if(add_key==0)
- {
- next_time++; //時間加上去
-
- }
- while(add_key==0) dispaly(player_num,next_time); //顯示
- }
- if(dec_key==0)
- {
- delay(5);
- if(dec_key==0)
- {
- next_time--; //時間減下來
-
- }
- while(dec_key==0) dispaly(player_num,next_time); //顯示
- }
- }
- }
- void EX_Init()
- {
- /*********初始化定時器/外部中斷**********/
- TMOD = 0x11; //10ms
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- TH1 = 0x0D8;
- TL1 = 0x0F0;
- IE = 0x8b; //IE = 0x85;
- IT0 = 1;
- IT1 = 1;
- PX0 = 1;
- TR0 = 0; //關閉定時器
- TR1 = 0;
- }
- void main(void)
- {
- EX_Init(); //初始化
- buzzer=1;
- P2=0xff;
- P1=0xff;
- P0=0xff;
- while(1) //死循環
- {
- 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; //為第一個選手按下時,選手號=1,定時器停止,時間十秒
- 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; //出現其它情況,顯示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) //每秒鐘減一,倒計時
- { Count_A=0;
- now_time--; //當前倒計時時間 --
- if(now_time<=0) //倒計時結束(到0),那么開始報警,其它復位
- { now_time=0;run_flag=0;TR0=0;TR1=0;time_off=1;buzzer=0; delay(1200);buzzer=1;}
- }
- }
復制代碼
Keil代碼與Proteus8.10仿真下載:
搶答器.rar
(94.5 KB, 下載次數: 80)
2022-10-15 21:30 上傳
點擊文件名下載附件
搶答器 下載積分: 黑幣 -5
|