標題:
51單片機八路搶答器代碼與Proteus仿真
[打印本頁]
作者:
845464672
時間:
2022-10-15 21:31
標題:
51單片機八路搶答器代碼與Proteus仿真
8路搶答器設計難度分:9基本要求:8個選手搶答按鍵,1個主持人按鍵,4只LED數(shù)碼管顯示。系統(tǒng)復位狀態(tài)LED顯示“00 00”;主持人按下按鍵則搶答開始,系統(tǒng)顯示3秒搶答時間倒計時,計時到無人搶答則系統(tǒng)發(fā)出報警后自動復位;8個選手最先按下者搶答成功,顯示選手編號和答題時間10秒,支持人發(fā)出開始作答指令同時按下主持人鍵,答題時間開始倒計時并顯示,若選手回答結束之后主持人按下主持人鍵復位系統(tǒng),若倒計時結束選手未回答問題系統(tǒng)發(fā)出報警后自動復位。擴展要求:增加1個“√”鍵和1個“×”鍵,只在10秒回答時間內(nèi)有效,若選手回答正確,主持人按下“√”鍵彩燈閃爍,若選手回答錯誤,主持人按下“×”鍵發(fā)出低沉報警音;系統(tǒng)復位后搶答開始前,選手不得提前搶答,否則發(fā)出違例報警,顯示違例選手編號,由主持人復位系統(tǒng);可修改答題時間。
仿真原理圖如下(proteus8.10版本的仿真工程文件可到本帖附件中下載)
1.png
(235.51 KB, 下載次數(shù): 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; //定義選手按鍵的鍵值參數(shù)
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; //定時器計數(shù)參數(shù)
uint Count_B = 0; //定時器計數(shù)參數(shù)
void delay(uint ms) //延時函數(shù)
{
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; //設置模式調(diào)整
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) //死循環(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; //為第一個選手按下時,選手號=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; //出現(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) //每秒鐘減一,倒計時
{ 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, 下載次數(shù): 80)
2022-10-15 21:30 上傳
點擊文件名下載附件
搶答器
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1