一、功能简介
本项目使用Proteus8仿真STM32单片机控制器,使用数码管显示模块、键盘模块、蜂鸣器、按键模块等。
主要功能:
系统运行后,数码管显示抢答时间,主持人可通过K1或K2键进行时间加减设置,时间设定好后按下K3键开始抢答,此时数码管显示抢答时间倒计时,8位选手可通过S1-S8键进行抢答,若选手抢答时间超时,则结束本次抢答且蜂鸣器长报警提示。若在有效抢答时间内,选手按下抢答键,数码管显示抢答成功的选手号、得分、抢答时间。此时主持人可按下K1或K2键对选手加减分,此时主持人可按下K4键查阅每位选手得分和抢答时间。当主持人按下K3键时,退出抢答环节,如果需要清空选手得分和抢答时间等数据,可按下K4键清空。如不需要清空可不按该键。如需要下一轮抢答,主持人可再次按下K3键开始抢答。
二、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
/*******************************************************************************
* 函 数 名 : TIM2_IRQHandler
* 函数功能 : TIM2中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
sys_ctrl.time--;//10ms减1次
if(sys_ctrl.time==0)
{
sys_ctrl.time_out=1;//计时时间到达
TIM_Cmd(TIM2,DISABLE);//关闭定时器
BEEP=0;delay_ms(1000);BEEP=1;
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
//清除选手数据
void clear_player_data(void)
{
u8 i=0;
sys_ctrl.player_id=0;
sys_ctrl.time_out=0;
for(i=0;i<PLAYER_NUM;i++)
{
sys_ctrl.player_score[i]=0;
sys_ctrl.player_time[i]=0;
}
}
//主持人预先设定好抢答时间,并按下开始抢答键
void host_rush_time_set(void)
{
u8 key=0;
u8 time_buf[4];
while(1)
{
key=KEY_Scan(0);
if(sys_ctrl.start==0)
{
if(key==KEY1_PRESS)//抢答时间加
{
if(sys_ctrl.time<9900)
sys_ctrl.time+=100;
}
else if(key==KEY2_PRESS)//抢答时间减
{
if(sys_ctrl.time>0)
sys_ctrl.time-=100;
}
sys_ctrl.time_init=sys_ctrl.time;//方便计算选手抢答时间
}
if(key==KEY3_PRESS)//开始抢答,蜂鸣器短响一下
{
sys_ctrl.start=1;
BEEP=0;delay_ms(20);BEEP=1;
sys_ctrl.time_init=sys_ctrl.time;
TIM_Cmd(TIM2,ENABLE);//打开定时器
break;//退出while循环,进入选手抢答环节
}
else if(key==KEY4_PRESS)//复位,清除选手数据
{
sys_ctrl.start=0;
TIM_Cmd(TIM2,DISABLE);//关闭定时器
BEEP=0;delay_ms(20);BEEP=1;
clear_player_data();
sys_ctrl.time=sys_ctrl.time_init;
}
//计时显示
time_buf[0]=gsmg_code[sys_ctrl.time/1000];
time_buf[1]=gsmg_code[sys_ctrl.time%1000/100]|0x80;
time_buf[2]=gsmg_code[sys_ctrl.time%1000%100/10];
time_buf[3]=gsmg_code[sys_ctrl.time%1000%100%10];
smg_display(time_buf,5);
}
}
//选手开始抢答
void player_rush_start(void)
{
u8 time_buf[8];
u8 key=0;
while(1)
{
key=KEY_Scan(0);
if(key==KEY1_PRESS)//回答正确加1分
{
if(sys_ctrl.player_score[sys_ctrl.player_id]<99)
sys_ctrl.player_score[sys_ctrl.player_id]+=1;
}
else if(key==KEY2_PRESS)//回答错误扣1分
{
if(sys_ctrl.player_score[sys_ctrl.player_id]>0)
sys_ctrl.player_score[sys_ctrl.player_id]-=1;
}
else if(key==KEY3_PRESS)//主持人按下,退出选手抢答环节,回到主持人环节
{
sys_ctrl.time=sys_ctrl.time_init;//初始时间
sys_ctrl.player_id=0;
sys_ctrl.start=0;
break;
}
else if(key==KEY4_PRESS)//查阅选手成绩
{
sys_ctrl.player_id++;
if(sys_ctrl.player_id==9)sys_ctrl.player_id=1;
}
if(sys_ctrl.time_out==0)//计时结束前,抢答有效
{
if(sys_ctrl.player_id==0)//记录最先抢答选择,然后锁死,防止其他人员按下
{
key=key_matrix_flip_scan();
//几路抢答就多少按键有效,屏蔽其余无效按键
if(key<PLAYER_NUM&&key>0)
{
sys_ctrl.player_id=key;//记录哪个选手按下
TIM_Cmd(TIM2,DISABLE);//关闭定时器
//换算选手抢答时间
sys_ctrl.player_time[sys_ctrl.player_id]=sys_ctrl.time_init-sys_ctrl.time;
}
}
}
if(sys_ctrl.player_id)//当有选手按下抢答键,显示选手号、分数、时间
{
time_buf[0]=gsmg_code[sys_ctrl.player_id%10]|0x80;//选手号
time_buf[1]=gsmg_code[sys_ctrl.player_score[sys_ctrl.player_id]/10];//得分数十位
time_buf[2]=gsmg_code[sys_ctrl.player_score[sys_ctrl.player_id]%10];//得分数个位
time_buf[3]=0x40;//-
time_buf[4]=gsmg_code[sys_ctrl.player_time[sys_ctrl.player_id]/1000];
time_buf[5]=gsmg_code[sys_ctrl.player_time[sys_ctrl.player_id]%1000/100]|0x80;
time_buf[6]=gsmg_code[sys_ctrl.player_time[sys_ctrl.player_id]%1000%100/10];
time_buf[7]=gsmg_code[sys_ctrl.player_time[sys_ctrl.player_id]%1000%100%10];
smg_display(time_buf,1);
}
if(sys_ctrl.player_id==0)//没有选手按下抢答键,显示
{
//计时显示
time_buf[0]=gsmg_code[sys_ctrl.time/1000];
time_buf[1]=gsmg_code[sys_ctrl.time%1000/100]|0x80;
time_buf[2]=gsmg_code[sys_ctrl.time%1000%100/10];
time_buf[3]=gsmg_code[sys_ctrl.time%1000%100%10];
smg_display(time_buf,5);
}
}
}
//应用控制系统
void appdemo_show(void)
{
u8 time_buf[8];
KEY_Init();
key_matrix_init();
smg_init();
SMG_DATAPORT(0x00);
BEEP_Init();
TIM2_Init(500-1,71);//定时10ms
sys_ctrl.time=3000;//初始抢答时间为30S,定时器基数是10ms一次,即3000*10ms=30S
while(1)
{
host_rush_time_set();//主持人设置抢答时间和开启抢答
player_rush_start();//选手开始抢答
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。