要求:
一、 任务描述
设计一种4人抢答器。控制要求如下:
(1)设主持人1名,选手4名。
(2)1、2、3、4号抢答台上均有蓝色指示灯、抢答按钮。
(3)主持人台上有绿色开始指示灯、红色犯规指示灯、黄色报警灯,开始按钮和复位按钮。开始前,所有灯全灭。 (4)主持人按开始按钮后,开始指示灯亮,并开始9S倒计时,以数码管显示,选手9S内可以按抢答按钮抢答,最先按抢答按钮的选手指示灯亮, 后按抢答按钮的选手指示灯不亮,9S内如果无人抢答,黄色报警灯点亮。
(5)若主持人还未按开始按钮,就有选手按了抢答按钮,主持人台上的犯规指示灯点亮(闪烁),同时所有犯规选手指示灯点亮(闪烁),(闪烁频率均为1HZ)。
(6)任何情况下,主持人按复位按钮都可以熄灭所有指示灯。 程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar code q[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//倒计时数组
uchar flag;
uchar count=0; //中断进入次数
uchar num=9; //倒计时
sbit kai=P3^2;//主持人开始 set
sbit fu=P3^3; //reset
sbit b1=P1^6; //主持人开始灯
sbit b2=P1^5; //犯规灯
sbit b3=P1^4; //报警灯
sbit a=P2^0;//选手按键 KEY_1
sbit b=P2^1;
sbit c=P2^2;
sbit d=P2^3;
sbit a1=P1^0;//选手灯 LED_1
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;
void delay10()//10ms
{
uchar i,k;
for(i=20; i>0; i--)
for(k=250; k>0; k--);
}
void delay1s() //1s
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 46;
j = 153;
k = 245;
do
{
do
{
while (--k);
}
while (--j);
}
while (--i);
}
void init() //初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1; //定时器T0中断启动
EA=1; //总中断启动
EX0=1; //外部中断启动
IT0=1; //下降沿启动
}
void daojishi()//主持人开始后倒计时
{
while(kai==0)
{
TR0=1;
P0=q[num];
delay10();
P0=0x01; //0xff
}
}
void qiangda()//选手抢答
{
if(a==0) //抢答
{
delay10(); //去抖
if(a==0) //判断是否进入抢答状态
{
if(P2==0x01) //别人抢答状态
{
a1=1;
a2=0;
a3=0;
a4=0;
}
}
}
if(b==0) //抢答
{
delay10(); //去抖
if(b==0) //判断是否进入抢答状态
{
if(P2==0x02) //别人抢答状态
{
a2=1;
a1=0;
a3=0;
a4=0;
}
}
}
if(c==0) //抢答
{
delay10(); //去抖
if(c==0) //判断是否进入抢答状态
{
if(P2==0x03) //别人抢答状态
{
a3=1;
a2=0;
a1=0;
a4=0;
}
}
}
if(d==0) //抢答
{
delay10(); //去抖
if(d==0) //判断是否进入抢答状态
{
if(P2==0x04) //别人抢答状态
{
a4=1;
a2=0;
a3=0;
a1=0;
}
}
}
}
void hong()//红灯亮
{
qiangda();
if(TR0==1)
{
b2=1;
delay1s();
b2=0;
while(TR0==1);
}
}
void huang()//黄灯亮
{
while(P0==0xff)
{
b3=1;
}
}
void fuwei()//复位按钮
{
if(fu==0)
{
/*
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
EX0=1;
IT0=1;
*/
TR0=0;
num=9;
P1=0X00;
P0=0;
P2=0xff;
}
}
void main()
{
P1=0X00;
init();
while(1)
{
daojishi();
qiangda();
hong();
huang();
fuwei();
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256; //10ms
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
num--;
}
if(num==0)
{
P0=0x00;
}
}
void anjian() interrupt 0//按键去抖
{
delay10();
if(fu==0)
{
TR0=1;
}
while (fu==0);
|