本帖最后由 Mr叶 于 2024-3-12 09:41 编辑
设计要求
1)抢答器同时供8名选手或2个代表队比赛,分别用8个按钮S0-S7表示;
2)设置一个系统清除和抢答控制开关S,该开关由主持人控制;
3)抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止;
4)抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30s等)。当主持人启动“开始”按键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续时间为0.5s左右;
5)参赛选手在设定时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手编号和抢答时间,并保持到主持人将系统清除为止;
部分C代码- /********************************************************
- 函数名称:void scan(void)
- 函数作用:按键检测函数
- 参数说明:
- ********************************************************/
- void scan(void)
- {
- uchar qiangda_num=0;
- //主持人键
- if(key_zhu==0) //按键按下
- {
- delayms(7); //显示消抖
- if(key_zhu==0&&zhu_f!=2&&qiang_f==0&&wan_f==0)//判断是否有人犯规或者抢答是否开始或者抢答是否完成
- {
- zhu_f++; //比赛阶段标记+1
- if(zhu_f==2) //比赛正式开始
- {
- TR0=1; //比赛开始,开启定时
- wan_f=0; //清除比赛完成标志
- bajing(); //提示比赛开始
- }
- }
- else
- if(key_zhu==0&&qiang_f==1) //判断是否有人犯规
- {
- buzz=1; //清除报警
- qiang_f=0; //清除抢答标志
- number=0; //清除选手编号
- time=EEPROM_read(0x2000);//重新读取存储的抢答总时长
- led_kongzhi(0,0,0);
- }
- else
- if(key_zhu==0&&wan_f==1) //判断是否有人完成
- {
- buzz=1; //清除报警
- wan_f=0; //清除完成标志
- number=0; //清除选手编号
- time=EEPROM_read(0x2000);//重新读取存储的抢答总时长
- led_kongzhi(0,0,0);
- }
- else
- if(key_zhu==0&&zhu_f==2) //暂停比赛
- {
- TR0=0; //关闭定时
- zhu_f=1; //重新回到设置比赛时间阶段
- bajing(); //提示暂停比赛
- }
- while(!key_zhu);//检测按键松开
- }
- //加值键,支持连按
- if(key_jia==0&&zhu_f==1&&qiang_f==0) //判断是否在设置倒计时时间
- {
- delayms(7); //延时消抖
- if(key_jia==0) //再次判断按键按下
- {
- if(time<99) //比赛时间最大值99S
- time++; //比赛时间+1S
- EEPROM_delete(0x2000); //擦除EEPROM煽区
- EEPROM_write(0x2000,time); //写入【比赛时间】数据保存
- display(time/10,time%10,10,0); //显示设置比赛时间
- }
- }
- //减值键,支持连按
- if(key_jian==0&&zhu_f==1&&qiang_f==0) //判断是否在设置倒计时时间
- {
- delayms(7); //延时消抖
- if(key_jian==0) //再次判断按键按下
- {
- if(time!=0) //比赛时间最小值0S
- time--; //比赛时间-1S
- EEPROM_delete(0x2000); //擦除EEPROM煽区
- EEPROM_write(0x2000,time); //写入【比赛时间】数据保存
- display(time/10,time%10,10,0); //显示设置比赛时间
- }
- }
- //选手按键
- qiangda_num=qianda();
- if(qiangda_num!=0) //判断是否有选手按下按键
- {
- if(zhu_f!=2&&qiang_f==0&&wan_f==0)//如果还没有开始抢答时按下
- {
- zhu_f=1;
- buzz=0; //蜂鸣器报警
- qiang_f=1; //抢答犯规标记
- number=qiangda_num;
- led_kongzhi(number,1,0);
- }
- else
- if(zhu_f==2&&wan_f==0) //在开始抢答时按下
- {
- wan_f=1; //标记抢答完成
- zhu_f=0; //主持人标记复位
- TR0=0; //关闭倒计时定时器
- number=qiangda_num;
- led_kongzhi(number,1,0);
- bajing(); //提示有人抢答完成
- }
- }
- }
- /*********************************************************
- 函数名称:void main()
- 函数作用:主函数函数
- 参数说明:
- *********************************************************/
- void main()
- {
- uchar i=0;
- T0_init(); //定时器初始化
- if(key_jian==0)
- {
- delayms(100);
- if(key_jian==0)
- {
- EEPROM_delete(0x2000); //擦除EEPROM煽区
- EEPROM_write(0x2000,30); //写入【比赛时间】数据保存
- }
- }
- time=EEPROM_read(0x2000); //读取存储的【比赛时间】数据
- for(i=0;i<9;i++)
- {
- led_kongzhi(i,1,1);
- delayms(10);
- }
- for(i=9;i>0;i--)
- {
- led_kongzhi(i-1,0,1);
- delayms(10);
- }
- led_kongzhi(0,0,0);
- while(1) //死循环
- {
- scan(); //按键检测处理
- if(zhu_f==0&&wan_f==0) //判断是否还没进入比赛阶段