您的位置 首页 软件

用51单片机制造4路抢答器

此抢答器具有限时抢答,超时无效的特点,并可以对主持人未喊开始而提前抢答的犯规情况作出判断。由于用了单片机,所以电路很简单。懒得写译…

此抢答器具有限时抢答,超时无效的特色,并能够对主持人未喊开端而提早抢答的犯规状况作出判别。

因为用了单片机,所以电路很简单。懒得写译码程序,也不想做驱动电路。爽性直接用了一片74LS48译码驱动器来驱动数码管。

呵呵,面包板上插一下,因为之前在Proteus中仿真过,所以直接就正常运行了~上一张实物图

左面的是STC89C52的最小体系版,P1口上接了8个LED,其时做流水灯的。直接拿来用了。P2口是显现输出,P3口承受按键。那个小的芯片便是74LS48啦~下方的是编程器+电源,STC的芯片便是编程便利,支撑在线烧写,这么细巧的编程器~

当然最重要的是程序,附上代码清单。写的比较烂,居然上了100行,期望不要被大虾们骂得太惨>_<

#include
#defineuintunsignedchar

//计时变量
uints= 0,ms= 0;

//枚举类型:记载抢答器作业状况
enumStat
{
Idle= 0,//闲暇状况,比方正在读题
Ready= 1,//安排妥当状况,能够抢答
Respond= 2,//呼应状况,有人抢到了
}stat;

//时钟中止服务程序
voidTimer()interrupt1using1
{
TH0=0x3C;
TL0=0xBD;
ms++;
s+=ms/20;
ms%= 20;
s%= 60;
}

//重置时钟
voidResetTimer()
{
EA= 1;//答应CPU中止
ET0= 1;//定时器中止翻开
TMOD= 1;//设定时器为方法
TR0= 0;//关定时器
ms= 0;
s= 0;
}

//优先编码(反向输入)
uintEncode(uintc)
{
uinti,mask= 1;
if(c== 0)return0;
for(i= 0;i< 8;i++)
{
if((c& (mask< }
}

voidmain()
{
uintled= 0xff;//对应P1口,指示灯
uintdisp= 15;//对应P2口,数码管
uintbutton;//对应P3口,按键
uintisFoul= 0;//是否犯规(或超时)
constuinttimeout= 5;//超时时刻
ResetTimer();
while(1)
{
//设置状况指示灯,用于调试,实践使用中能够去掉
if(stat==Idle)P0= (~1);
elseif(stat==Ready)P0= (~2);
elseif(stat==Respond)P0= (~4);
elsestat= 0;

//超时判别
if(timeout-s== 0)
{
isFoul= 1;
disp= 15;
stat=Idle;
ResetTimer();
}

//读按键
button=P3;

//P3.5复位键按下
if((button& 32) == 0)
{
disp= 15;
led= 0xff;
stat=Idle;
isFoul= 0;
ResetTimer();
}

//P3.4开端键按下
if((button& 16) == 0)
{
stat=Ready;
P1= 0;//一切选手的灯闪耀,提示能够开端抢答
TR0= 1;//开端计时
}

//P3.0-P3.3抢答键按下
if((button& 15) != 15)
{
if(stat==Idle)isFoul= 1;//提早抢,犯规
if(stat!=Respond)//正常抢答
{
led= (button& 15) + 240;
disp=Encode(button& 15);
stat=Respond;
}
ResetTimer();
}

//显现
if(isFoul)led&= 127;//犯规矩点亮
if(stat==Ready)disp=timeout-s;
P1=led;
P2=disp;
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/267100.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部