设计要求:
该抢答器上电或按键复位后能自动显示系统提示符“P.”, 进入准备工作状态。主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,显示器显示违规台号。蜂鸣器发出音响;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮
功能实现代码:
#include "Race_Device.h"
void main()
{
//定时器0初始化
init_Timer0();
//显示'P.'
display(~weizhi[0] , shuzhi[11]);
while(1)
{
//按键初始化
keynumber=0;
//选手人摁键扫描,判断是否有人提前摁下
number=keyscan();
switch(number)
{
case ON:
while(1)
{
//打开计数器
TR0=1;
//让数码管在不同情况下动态显示
dongtaixianshi();
number=keyscan();
//只有当主持人摁下键才可以离开显示抢答者信息
if(number==OFF)
{
//显示'P.'
display(~weizhi[0] , shuzhi[11]);
//关闭定时器0
TR0=0;
//计时清零
s=0;
cnt0=0;
Flag_Timer=0;
//违规指示灯关闭
led=1;
//关闭蜂鸣器
beep=1;
break;
}
}
break;
case OFF:
//显示'P.'
display(~weizhi[0] , shuzhi[11]);
break;
default:
while((number>=1)&&(number<=7))
{
if(!Flag_number)
{
Flag_number=1;
Value=number;
}
//在显示违规者信息的时候违规灯一同打开了
display(~weizhi_LED[0] , shuzhi[Value]);
delayms(10);
display(~weizhi_LED[1] , shuzhi[12]);
delayms(10);
display(~weizhi_LED[2] , shuzhi[13]);
number=keyscan();
//只有当主持人摁下键才可以离开显示违规者信息
if(number==OFF)
{
//为下一次做准备
Flag_number=0;
Value=0;
//违规指示灯关闭
led=1;
//显示'P.',同时关闭违规灯
display(~weizhi[0] , shuzhi[11]);
break;
}
if(number==ON)
{
number=Value;
keynumber=Value;
}
}
break;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt0++;
//10秒内
if((cnt0<=200)&&(!Flag_Timer))
{
number=keyscan();
//判断是否有选手在10秒内摁下
if((number>=1)&&(number<=7))
{
//记录第一次按下抢答选手信息
if(!Flag_HuiDa)
{
Value_Player=number;
//让抢答选手准备第二次回答,重新开始计时
cnt0=0;
keynumber=0;
number=0;
Flag_HuiDa=1;
}
if(Flag_HuiDa&&Value_Player==number)
{
TR0=0;
shuchuxinxi();
}
}
//当时间到了10秒让蜂鸣器响2秒
if(cnt0==200)
{
beep=0;
Flag_Timer=1;
Flag_Beep=1;
}
}
//判断30秒内是否有被摁下
if((cnt0<=600)&&(Flag_Timer))
{
//让蜂鸣器响1秒后关闭
if(cnt0==240)
{
Flag_Beep=0;
beep=1;
}
keynumber=0;
number=keyscan();
//30秒内被摁下
if((number>=1)&&(number<=7))
{
//记录第一次按下抢答选手信息
if(!Flag_HuiDa)
{
Value_Player=number;
//让抢答选手准备第二次回答,重新开始计时
cnt0=0;
keynumber=0;
number=0;
Flag_HuiDa=1;
}
if(Flag_HuiDa&&Value_Player==number)
{
TR0=0;
shuchuxinxi();
}
}
}
//当30秒内无人摁下抢答器
if(s==31)
{
if(!Flag_HuiDa)
chaoshichuli();
else
chaoshichuli_HuiDa();
}
if(!Flag_HuiDa)
{
//为了让在10s内无人抢答蜂鸣器响2秒
if(Flag_Beep)
{
//每隔1秒让s++
if(cnt0%20==0)
{
s=cnt0/20;
//关闭选手信息
display(~weizhi_Beep[0] , shuzhi[10]);
display(~weizhi_Beep[1] , shuzhi[10]);
//显示倒计时
display(~weizhi_Beep[2] , shuzhi[jishi[s]/10]);
display(~weizhi_Beep[3] , shuzhi[jishi[s]%10]);
}
}
else
{
//每隔1秒让s++
if(cnt0%20==0)
{
s=cnt0/20;
//关闭选手信息
display(~weizhi[0] , shuzhi[10]);
display(~weizhi[1] , shuzhi[10]);
//显示倒计时
display(~weizhi[2] , shuzhi[jishi[s]/10]);
display(~weizhi[3] , shuzhi[jishi[s]%10]);
}
}
}
else
{
//为了让在10s内无人抢答蜂鸣器响2秒
if(Flag_Beep)
{
//每隔1秒让s++
if(cnt0%20==0)
{
s=cnt0/20;
//显示第一次按下抢答器选手信息
display(~weizhi_Beep[0] , shuzhi[Value_Player]);
display(~weizhi_Beep[1] , shuzhi[12]);
//显示倒计时
display(~weizhi_Beep[2] , shuzhi[jishi[s]/10]);
display(~weizhi_Beep[3] , shuzhi[jishi[s]%10]);
}
}
else
{
//每隔1秒让s++
if(cnt0%20==0)
{
s=cnt0/20;
//显示第一次按下抢答器选手信息
display(~weizhi[0] , shuzhi[Value_Player]);
display(~weizhi[1] , shuzhi[12]);
//显示倒计时
display(~weizhi[2] , shuzhi[jishi[s]/10]);
display(~weizhi[3] , shuzhi[jishi[s]%10]);
}
}
}
}
实现效果:
上电效果图
提前抢答效果图
一个小白写的代码,欢迎各位大佬指点