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

您所在的位置:网站首页 proteus仿真软件的功能 【Proteus仿真】【STM32单片机】竞赛抢答器设计

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

2023-08-07 12:16| 来源: 网络整理| 查看: 265

文章目录 一、功能简介二、软件设计三、实验现象联系作者

一、功能简介

本项目使用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 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 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] 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(key0) { 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设计,视频分享,技术交流。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3