|
这是个基于单片机的四人抢答器,程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit sp=P2^3;
uchar num,temp,flag1=0,flag2=0;
int flag=10;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
void delay(uint xms) //延时函数
{
uint a,b;
for(a=xms;a>0;a--)
for(b=110;b>0;b--);
}
void beep(uint a) //蜂鸣器函数,xms设置蜂鸣器报警的时间
{
sp=0;
delay(a);
sp=1;
}
void display(uchar a) //显示选手编号函数
{
dula=1;
P0=table[a];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(10);
}
void dis10() //十秒倒计时显示函数
{
int a;
a=flag%10;
dula=1;
P0=table[a];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
}
void clear() //数码管初始化显示0函数
{
dula=1;
P0=table[0];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
}
void keyscan() //选手键盘扫描程序,检测是否有选手抢答
{
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
switch(temp)
{
case 0xed:TR0=0;display(1);flag2=0;beep(500);break;
case 0xdd:TR0=0;display(2);flag2=0;beep(500);break;
case 0xbd:TR0=0;display(3);flag2=0;beep(500);break;
case 0x7d:TR0=0;display(4);flag2=0;beep(500);break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
ET0=0;
}
}
}
void main()
{
while(1)
{
TMOD=0x01; //设置定时器0工作方式1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
P3=0xfe; //判断主持人是否按下清零键
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
if(temp==0xee)
{
flag1=1;
}
if(flag1==1)
{
flag1=0;
clear(); //按下清零则显示初始值0
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
if(temp==0xde)
{
flag2=1;
}
if(flag2==1)
{
flag2=0;
beep(100);
TR0=1;
keyscan();
}
}
}
}
}
}
}
}
void T0_10s() interrupt 1 //定时器0中断服务程序,提供十秒倒计时计数
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
flag--;
if(flag==0)
{
TR0=0;
flag=10; //送十秒显示函数作为十秒倒计时数
beep(1000);
}
}
dis10();
}
|
|