这是一个基于51单片机做的抢答器,他不仅能实现抢答的功能,还可以倒计时间,功能切换由一个无线模块控制。
程序如下:
#include
***it jies=P3^7; //抢答复位
unsigned char zuhao=10,time=30,t, k=1,count=1,w=0;
unsigned char code led1[11]={0x7F,0x6,0x5B,0x4F,
0x66,0x6D,0x7D,0x7,0x7F,0x6F,0x40,}; //共阴
unsigned char code led2[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xF8,0x80,0x90,};//共阳
unsigned char code key[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay() //one second
{
unsigned char k;
unsigned int l;
for(k=0;k<31;k++)
for(l=0;l<5000;l++);
}
void Time0_Init()
{
TMOD=0X01;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
EA=1;
ET0=1;
EX0=1;
EX1=1;
TR0=1;
IT0=1;
IT1=1;
}
void TIME_isp() interrupt 1 using 1 //数码管扫描中断
{
static unsigned char temp=0;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
if(count) //判断是抢答模式还是倒计时
{
P2=0xf4;P0=led1[zuhao];
}
else
{
if(temp){P2=0xf2;P0=led2[t/10];}
if(temp==0)
{P2=0xf1;P0=led2[t%10];}
temp=~temp;
}
}
void Int0() interrupt 0 //启用倒计时功能
{
count=0;k=0;t=time;w=0;
}
void Int1() interrupt 2 //倒时选择
{
time+=10;
if(time==100)time=10;
t=time;count=0;k=0;w=1;
}
void main() //主函数
{
unsigned char i,button,result;
P1=0Xff;
jies=0;
Time0_Init();
while(1)
{
if(count==0)
{
for(t=time;t>0;t--)
{
delay();if(w==1)break;
}
count=1;k=0;w=0;
}
else
if(jies==1){k=1;zuhao=10;}
while(k==1)
{
P1=0xff;
if(P1!=0xff) //有按键按一下
{
result=P1; //保存按下结果
for(i=0;i<8;i++ ) //查找按键
if(key[i]==result)
{
button=i;
break;
}
zuhao=button; //显示对应的组号数
k=0; //停止抢答
}
}
}
}
|