#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;
} |