|
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define max 30
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
sbit d1=P2^4;//段選
sbit d2=P2^5;
sbit x1=P2^6;
sbit x2=P2^7;
sbit k1=P1^0;//八位選手開關(guān)
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit zk1=P2^0;//主持人開關(guān)zk1,zk2
sbit zk2=P2^1;
sbit buz=P2^2;//蜂鳴器
uchar num,aa;
uchar f,flag;
void jianpan();
void init(void)
{
TMOD=0X01;//T0,模式1,定時(shí)
TL0=0XB0; //定時(shí)50ms
TH0=0X3C;
ET0=1; //開中斷
EA=1;
num=max;//置倒計(jì)時(shí)計(jì)數(shù)初值
}
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--) ;//延時(shí)1s
}
void display()
{
d1=0; //控制開始置數(shù)
P0=tab[num/10];//倒計(jì)時(shí)控制取最高位
delay(5);
d1=1; //停止置數(shù)操作
d2=0;
P0=tab[num%10];//倒計(jì)時(shí)取最低位
delay(5);
d2=1;
x1=0; //控制開始置數(shù)
P0=tab[flag/10];//選手號(hào)控制
delay(5);
x1=1; //停止置數(shù)操作
x2=0;
P0=tab[flag%10];
delay(5);
x2=1;
}
void main()
{
init();
while(1)
{
jianpan();
display();
}
}
void timer0(void) interrupt 1
{
TL0=0XB0; //重裝初值,定時(shí)50ms
TH0=0X3C;
aa++;
if(aa==30)//1秒到了
{
aa=0;//計(jì)數(shù)清零
num--;
if(num==0)//倒計(jì)時(shí)為0時(shí)迅速變?yōu)槌踔低瑫r(shí)關(guān)中斷停止倒計(jì)時(shí)
{
num=max;
TR0=0;
}
buz=0;//要求蜂鳴器響
delay(30);//蜂鳴器響,時(shí)間為一秒buz=1;
}
}
/**************************************************
按鍵控制 程序的核心部分
****************************************************/
void jianpan()
{
if(zk1==0&flag==0)
{
delay(5);//消除數(shù)碼管抖動(dòng)操作
flag=0;//數(shù)碼管顯示0
display();
TR0=1;//ZK1鍵按下,開中斷以此控制:只有當(dāng)此鍵按下時(shí)才搶答
}
if(zk2==0&&TR0==0)//注意這里要求TR0=0;
{
delay(5);//消除抖動(dòng)
if(zk2==0&&TR0==0)
if(flag==0)
{
num--;
buz=0;
delay(30);
buz=1;
}
if(num==0)
num=max;
if(flag!=0)//ZK2鍵清零操作
{
flag=0;
num=max;//倒計(jì)時(shí)顯示最大值
TR0=0;//注意此時(shí)關(guān)中斷,不再進(jìn)行倒計(jì)時(shí)
buz=0;
delay(30);
buz=1;
}
while(!zk2)//倒計(jì)時(shí)中ZK2 鍵不可影響
display();
}
if(k1==0&&TR0==1)
{
buz=0;
delay(30);
buz=1;
delay(5);
flag=1;
TR0=0;//此鍵按下關(guān)中斷,其他選手按鍵不再受影響
display();
}
/*************************************
以下原理相同
*************************************/
if(k2==0&&TR0==1)
{
buz=0;
delay(30);
buz=1;
delay(5);
flag=2;
TR0=0;
display();
}
if(k3==0&&TR0==1)
{
buz=0;
delay(30);
buz=1;
delay(5);
flag=3;
TR0=0;
display();
}
if(k4==0&&TR0==1)
{
buz=~buz;
delay(30);
buz=1;
delay(5);
flag=4;
TR0=0;
display();
}
if(k5==0&&TR0==1)
{
buz=0;
delay(30);
buz=1;
delay(5);
flag=5;
TR0=0;
display();
}
if(k6==0&&TR0==1)
{
buz=0;
delay(30);
buz=1;
delay(5);
flag=6;
TR0=0;
display();
}
if(k7==0&&TR0==1)
{
buz=0;
delay(30);
buz=1;
delay(5);
flag=7;
TR0=0;
display();
}
if(k8==0&&TR0==1)
{
buz=0;
delay(30);
buz=1;
delay(5);
flag=8;
TR0=0;
display();
}
}
為什么我的蜂鳴器就很輕微的滴一聲就沒(méi)了,很短暫!幾乎瞬間的事情
|
|