|
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//共陰數碼管編碼
uint i,j,time,num;
uchar ge,shi;
void delay(z);
void display();
bit flag,flag1;
sbit k1=P1^0;//1號開關
sbit k2=P1^1;//2號開關
sbit k3=P1^2;//3號開關
sbit q1=P1^3;//啟動按鈕
sbit q2=P1^4;//復位按鈕
sbit led1=P3^5;//1號燈
sbit led2=P3^6;//2號燈
sbit led3=P3^7;//3號燈
sbit beep=P1^5;//報警器
sbit wei1=P2^0;//數碼位選口
sbit wei2=P2^1;
sbit wei3=P2^2;
sbit wei4=P2^3;
void delay(z)//延時函數
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void display()//數碼管顯示
{
shi=time/10;
ge=time%10;
P0=table[num];//顯示選手編號
wei1=0;
delay(1);
wei1=1;
P0=table[shi];
wei3=0;
delay(1);
wei3=1;
P0=table[ge];
wei4=0;
delay(1);
wei4=1;
}
void keyscan()
{
if(time<=6)
TR1=1;
if(k1==0)//1號按下
{delay(10);
if(k1==0)
{
num=1;
led1=1;
time=30;
flag=1;
TR0=1;
TR1=0;//開定時器0,關定時器1
beep=1;
delay(500);
beep=0;//蜂鳴器響
while(!k1);
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
num=2;
led2=1;
time=30;
flag=1;
TR0=1;
TR1=0;
beep=1;
delay(500);
beep=0;
while(!k2);
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
num=3;
led3=1;
time=30;
flag=1;
TR0=1;
TR1=0;
beep=1;
delay(500);
beep=0;
while(!k3);
}
}
display();//顯示編號和時間
if(time==0)
{
TR0=0;
TR1=0;
flag=1;//關計時器0和1
beep=1;
delay(500);
beep=0;
time=0;
}
}
void init()//初始化
{
TMOD=0x01;//選擇定時器模式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//總中斷
ET0=1;//定時器中斷允許
ET1=1;
TR0=0;//關閉定時器
beep=0;
num=0;
time=0;
wei1=0;
wei3=0;
wei4=0;
}
void main()//主程序
{
init();//初始化
while(1)
{
display();//顯示
if(q2==0)//復位按下
{
delay(10);
display();
if(q2==0)//確認是否按下
{
P3=0x00;
flag1=q2;
time=00;
wei1=0;
wei3=0;
wei4=0;
num=0;
while(!flag1)
{
if(q1==0);//開始按下
{
delay(10);
if(q1==0)
{
flag1=1;
flag=q1;
TR0=1;
beep=1;
delay(500);
beep=0;
time=30;
while(!q1);
while(!flag)
keyscan();//掃描鍵盤
}
}
}
}
}
}
}
void T0_time() interrupt 1//定時器中斷處理函數
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20)
{
i=0;
time--;
if(time==0)
time=0;
}
}
void T1_time() interrupt 3//有人搶答響
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
j++;
if(j==10)
{
j=0;
beep=~beep;
}
}
|
|