要求:
一、 任務(wù)描述
設(shè)計一種4人搶答器。控制要求如下:
(1)設(shè)主持人1名,選手4名。
(2)1、2、3、4號搶答臺上均有藍(lán)色指示燈、搶答按鈕。
(3)主持人臺上有綠色開始指示燈、紅色犯規(guī)指示燈、黃色報警燈,開始按鈕和復(fù)位按鈕。開始前,所有燈全滅。 (4)主持人按開始按鈕后,開始指示燈亮,并開始9S倒計時,以數(shù)碼管顯示,選手9S內(nèi)可以按搶答按鈕搶答,最先按搶答按鈕的選手指示燈亮, 后按搶答按鈕的選手指示燈不亮,9S內(nèi)如果無人搶答,黃色報警燈點(diǎn)亮。
(5)若主持人還未按開始按鈕,就有選手按了搶答按鈕,主持人臺上的犯規(guī)指示燈點(diǎn)亮(閃爍),同時所有犯規(guī)選手指示燈點(diǎn)亮(閃爍),(閃爍頻率均為1HZ)。
(6)任何情況下,主持人按復(fù)位按鈕都可以熄滅所有指示燈。 程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar code q[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//倒計時數(shù)組
uchar flag;
uchar count=0; //中斷進(jìn)入次數(shù)
uchar num=9; //倒計時
sbit kai=P3^2;//主持人開始 set
sbit fu=P3^3; //reset
sbit b1=P1^6; //主持人開始燈
sbit b2=P1^5; //犯規(guī)燈
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) //判斷是否進(jìn)入搶答狀態(tài)
{
if(P2==0x01) //別人搶答狀態(tài)
{
a1=1;
a2=0;
a3=0;
a4=0;
}
}
}
if(b==0) //搶答
{
delay10(); //去抖
if(b==0) //判斷是否進(jìn)入搶答狀態(tài)
{
if(P2==0x02) //別人搶答狀態(tài)
{
a2=1;
a1=0;
a3=0;
a4=0;
}
}
}
if(c==0) //搶答
{
delay10(); //去抖
if(c==0) //判斷是否進(jìn)入搶答狀態(tài)
{
if(P2==0x03) //別人搶答狀態(tài)
{
a3=1;
a2=0;
a1=0;
a4=0;
}
}
}
if(d==0) //搶答
{
delay10(); //去抖
if(d==0) //判斷是否進(jìn)入搶答狀態(tài)
{
if(P2==0x04) //別人搶答狀態(tài)
{
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()//復(fù)位按鈕
{
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);
|