#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2; //黄灯
sbit P23=P2^3; //红灯
sbit P26=P2^6;
sbit P27=P2^7;
sbit key1=P3^2; //倒计时开关
sbit key2=P3^3; //抢答器开关
sbit key3=P3^5; //复位开关
uchar s,n,k,flag;
void delay5ms()
{
uchar i,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--);
}
void delay10ms()
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void main()
{
P22=0;
P23=0;
P0=0xff;
P1=0xff;
TMOD=0x11; //T0用中断定时1s,T1用定时器定时1s,均为方式一
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x8d; //1000 1101
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;
TR1=1;
flag=0;
while(1)
{
if(flag==1) //倒计时60s开始,中断法定时
{
s=60;
k=20;
P20=1;
P21=0;
if(s>=10)
P0=zixingma[s/10];
delay5ms();
P0=0xff;
P20=0;
P21=1;
P0=zixingma[s%10];
delay5ms();
while(s==0) //倒计时结束,红灯亮
{
P0=0xff;
P23=1;
}
}
if(flag==2) //抢答开始,定时器T0定时30s倒计时
{
P22=1; //答题开始,黄灯亮
P0=0xff;
k=20;
n=20;
while(TF1==0);
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TF1=0;
k--;
if(k==0)
{
k=20;
P1=0xff;
P26=1;
P27=0;
if(n>=10)
{
P1=zixingma[n/10];
delay5ms();
}
P1=0xff;
P26=0;
P27=1;
P1=zixingma[n%10];
delay5ms();
while(n==0) //答题时间到,黄灯灭,红灯亮
{
P22=0;
P1=0xff;
P23=1;
}
}
}
if(flag==3) //复位
{
P2=0;
P0=0xff;
P1=0xff;
s=60;
n=30;
}
}
}
void t_0() interrupt 1 //1秒定时 (1分钟)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
k--;
if(k==0)
{
k=20;
s--;
if(s==0)
{
P23=1;
P0=0xff;
}
}
}
void int_0() interrupt 0 //倒计时开关
{
EX0=0;
delay10ms();
if(key1==0)
flag=1;
while(key1==1);
delay10ms();
EX0=1;
}
void int_1() interrupt 2 //抢答开关
{
EX1=0;
delay10ms();
if(key2==0)
flag=2;
while(key2==1);
delay10ms();
EX1=1;
}
void t_1() interrupt 3 //复位开关
{
ET1=0;
delay10ms();
if(key3==0)
flag=3;
while(key3==1);
delay10ms();
ET1=1;
} |