当前位置:   article > 正文

【Proteus仿真】【STM32单片机】竞赛抢答器设计_智力竞赛抢答器单片机仿真

智力竞赛抢答器单片机仿真


一、功能简介

本项目使用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();//选手开始抢答		
	}
}




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182

三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/776182
推荐阅读
相关标签
  

闽ICP备14008679号