资源简介
基于stc89c52单片机的8位抢答器设计的源程序, 以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。
设置一个系统清除和抢答控制开关S,开关由主持人控制。
抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。
抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。
当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。
参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
代码片段和文件信息
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K0=P3^0;//开始抢答按键
sbit beep=P3^7;//蜂鸣器
sbit D0=P3^1;//指示灯
sbit K1=P1^0;//1号选手抢答按键
sbit K2=P1^1;//2号选手抢答按键
sbit K3=P1^2;//3号选手抢答按键
sbit K4=P1^3;//4号选手抢答按键
sbit K5=P1^4;//5号选手抢答按键
sbit K6=P1^5;//6号选手抢答按键
sbit K7=P1^6;//7号选手抢答按键
sbit K8=P1^7;//8号选手抢答按键
sbit S1=P3^2;//答题计时键
sbit S2=P3^3;//开始抢答时间调整键
sbit S3=P3^4;//答题计时时间调整键
char s;
uchar num=0;
char time1;//抢答时间
char time2;//答题限时时间
uint mn;//T0T1定时器定一秒时
bit flag1flag2flag3flag4; //标志位
bit aabb;//时间调整标志位
//延时子函数
void delay(uint z)
{
uint xy;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
uchar code table1[]={
//共阴数码管段码值
0x3f0x060x5b0x4f
0x660x6d0x7d0x07
0x7f0x6f0x770x7c
0x390x5e0x790x71
};
uchar code table2[]={
//共阴数码管位码值
0xfe0xfd
0xfb0xf7
};
//初始化子函数
void init()
{
TMOD=0x11;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
ET0=1;
ET1=1;
EA=1;
P0=0x00;
time1=10;
time2=10;
flag2=1;
}
//开始键扫描子函数
void key1()
{
uchar i=100;
if(K0==0)
{
delay(10);
if(K0==0)
{
while(K0==0&&i)
{
i--;
delay(10);
}
TR0=1;
s=time1;
m=0;
flag1=1;
flag2=1;
flag3=1;
num=0;
beep=1;
D0=1;
flag4=0; //清除违规标志位
aa=0;
bb=0;
}
}
}
//选手抢答按键扫描子函数
void key()
{
uchar i=100;
if(K1==0)
{
delay(10);
if(K1==0)
{
while(K1==0&&i)
{
i--;
delay(10);
}
num=1; //数码管显示1号“1“
TR0=0; //关闭定时器0时间停止
TR1=1; //打开定时器1使扬声器响一声
flag2=0; //关闭开始键标志位使再按其他七个键不会响应
}
}
if(K2==0) //下面七个键的处理同上
{
delay(10);
if(K2==0)
{
while(K2==0&&i)
{
i--;
delay(10);
}
num=2;
TR0=0;
TR1=1;
flag2=0; //重要
}
}
if(K3==0)
{
delay(10);
if(K3==0)
{
while(K3==0&&i)
{
i--;
delay(10);
}
num=3;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K4==0)
{
delay(10);
if(K4==0)
{
while(K4==0&&i)
{
i--;
delay(10);
}
num=4;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K5==0)
{
delay(10);
if(K5==0)
{
while(K5==0&&i)
{
i--;
delay(10);
}
num=5;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K6==0)
{
delay(10);
if(K6==0)
{
while(K6==0&&i)
{
i--;
delay(10);
}
num=6;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K7==0)
{
delay(10);
if(K7==0)
{
while(K7==0&&i)
{
i--;
delay(10);
}
num=7;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K8==0)
{
delay(10);
if(K8==0)
{
while(K8==0&&i)
{
i--;
delay(10);
}
num=8;
TR0=0;
TR1=1;
flag2=0;
}
}
}
//数码管显示子函数
void display()
{
if(flag1==1) //开始键按下开始计时抢答
{
if(num!=0) //如果有人抢答则显示相应的几号
{
P0=table1[num]; //显示几号抢到了
P2=t
- 上一篇:基于51单片机指纹解锁设计程序
- 下一篇:爬取一个用户的所有微博
评论
共有 条评论