|
单片机源程序如下:
#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()//数码管显示
{time=30;
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;
flag=1;
TR0=~TR0;
TR1=0;//开定时器0,关定时器1
beep=1;
delay(500);
beep=0;//蜂鸣器响
while(!k1);//等待按键释放
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
num=2;
led2=1;
flag=1;
TR0=~TR0;
TR1=0;
beep=1;
delay(500);
beep=0;
while(!k2);
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
num=3;
led3=1;
flag=1;
TR0=~TR0;
TR1=0;
beep=1;
delay(500);
beep=0;
while(!k3);
}
}
display();//显示编号和时间
if(time==0)
{
TR0=0;
TR1=0;
flag=1;//关计时器0和1
}
}
void init()
{
TMOD=0x11;//选择定时器模式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//总中断
ET0=1;//定时器中断允许
ET1=1;
TR0=1;//打开定时器
beep=0;
}
void main()//主程序
{
init();//初始化
while(1)
{
display();
if(q2==0)
{
delay(10);
if(q2==0)
{
P3=0x00;
flag1=q2;
time=00;
wei1=0;
num=0;
P0=table[num];
while(!flag1)
{
if(q1==0);
{
delay(10);
if(q1==0)
{
flag1=1;
flag=q1;
TR0=1;
beep=1;
delay(500);
beep=0;
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--;
}
}
void T1_time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
j++;
if(j==10)
{
j=0;
beep=~beep;
}
}
|
|