c语言写51单片机八路抢答器,基于51单片机的8路抢答器

相比大家对51架构都是比较了解的。在这里呢,我就只陈述整个流程和思路以及主函数架构讲解。对于51单片机的配置问题就不再赘述了。

先让大家看看原理图吧

89b87779b06ebb7770e6e15711234602.gif。手边没有开发板,简单的使用了一下protues来搭建我的实验电路。至于仿真器的问题呢,的确有很多。如果你们手边有开发板呢,那就用实物验证一下吧。

jishu_421901_1_1.html

这就是整个系统的原理图了,很简单的是吧!但是它的功能可不是看上去这么简单哦~

bf0ea43f05d28e33b347d6ff4e3daa8f.gif

系统的流程:

主持人可以通过设置抢答的时限和回答的时限来控制整个流程。当主持人按下抢答键以后,选手才可以正式抢答,否则,选手抢答键无效。选手如果抢答成功,则可以加分,并显示分数。如果抢答失败,则需要减分,并显示分数。同时在本系统中还加入了一个倒计时闪烁功能。即当抢答时间和回答时间倒计时低于10s的时候,倒计时数码管会闪烁显示,提示选手时间不多。

整个程序的思路则是采用单进程处理方式,通过系统中断实现多线程处理多任务。虽然从程序上看上去是单线程,其实它的处理速度还是很理想的。几乎能够及时响应用户操作,且能够达到很理想的精准。

废话了这么多,现在就是压轴戏了。开始讲解主函数架构。

//主函数

void main(void)

{

unsigned char AscTable[]={0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};

unsigned char DisBuff[4]={0x40,0x40,0x40,0x40};

unsigned char score[8]={5,5,5,5,5,5,5,5};//初始分数

unsigned char Qdtemp,Hdtemp,Btval,K;

Boolean Confirmval;

STAR = 0x00 ;//初始化

Qdtime = 12 ;

Hdtime = 12 ;

K = 0;

Confirmval=false;

InitDevices();//51硬件初始化

ClearSegBuff(DisBuff);//初始化显存缓冲区

while(1)

{

SetParaTime(DisBuff,AscTable);//设置时间参数,即抢答时限和回答时限的设定

if(ConfirmVal())//主持人按下抢答键

{

Qdtemp = Qdtime;Hdtemp = Hdtime;//将设定好的时限值赋予临时变量

TR0 = 1;//计时器开始工作

while(Qdtemp&&Hdtemp&&!Confirmval)//判断结束条件,抢答倒计时为0或回答倒计时为0或主持人按下回答完成按键

{

if(STAR&0x20)//选手抢答按键按下

{

Confirmval = ConfirmVal();

if((STAR&0x1F)==20){Hdtemp --; STAR&=~0x1F;}//回答倒计时计数

DisBuff[0] = AscTable[Btval];//写显存缓冲区

DisBuff[2] = AscTable[Hdtemp/10];//写显存缓冲区

DisBuff[3] = AscTable[Hdtemp%10];//写显存缓冲区

}

else//没有选手抢答键按下

{

Btval = BottonVal();

if((STAR&0x1F)==20){Qdtemp --; STAR&=~0x1F;}//抢答倒计时计数

if(Btval>=1&&Btval<=8)/检测到选手抢答按键按下

{

TR0 = 0 ;//停止计时器

LED=~LED;//提示LED灯

STAR&=~0x1F;//清零计数状态位

TH0 = (65536-50000)/256;//设定计时器初值

TL0 = (65536-50000)%256;

STAR|=0x20;//抢答按键按下标志位置位

TR0 = 1;//重新运行计时器

}

DisBuff[2] = AscTable[Qdtemp/10];//写显存缓冲区

DisBuff[3] = AscTable[Qdtemp%10];//写显存缓冲区

}

//时间显示

if(STAR&0x20)//回答倒计时显存缓冲区显示

{

if(Hdtemp >= 10) DisStatueSel(DisBuff,1,K);//如果倒计时时间大于10s则正常显示

else DisStatueSel(DisBuff,0,(STAR&0x1F));//如果倒计时时间小于10s则闪烁显示,提醒选手时间不多

}

else//抢答倒计时显存缓冲区显示

{

if(Qdtemp >= 10) DisStatueSel(DisBuff,1,K);//如果倒计时时间大于10s则正常显示

else DisStatueSel(DisBuff,0,(STAR&0x1F));//如果倒计时时间小于10s则闪烁显示,提醒选手时间不多

}

}

TR0 = 0 ;//一道抢答题周期结束,关闭计时器

if(STAR&0x20)//选手抢答过本题,则进入分数计算和显示

{

while(!PlayersScore(Btval,score))//设置选手分数

{

DisBuff[0] = AscTable[Btval];

DisBuff[1] = AscTable[score[Btval-1]/10];

DisBuff[2] = AscTable[score[Btval-1]%10];

DisBuff[3] = AscTable[0];

Seg7Dispaly(DisBuff,4);

}

}

//任务执行完成,清除所有相关设置

STAR=0;//清除标志位

TH0 = (65536-50000)/256;//重置计时器

TL0 = (65536-50000)%256;

ClearSegBuff(DisBuff);//初始化显存缓冲区

}

}

}

系统工作截图:

jishu_421901_1_1.html

抢答倒计时显示

jishu_421901_1_1.html

5号选手抢答成功

jishu_421901_1_1.html

回答完成,设置3号选手分数

原理图.jpg

(117.84 KB, 下载次数: 13)

993d5be4b93fad92a5cc6b25a09e80d9.gif

1.jpg

(121.11 KB, 下载次数: 4)

993d5be4b93fad92a5cc6b25a09e80d9.gif

2.jpg

(115.73 KB, 下载次数: 4)

993d5be4b93fad92a5cc6b25a09e80d9.gif

3.jpg

(119.79 KB, 下载次数: 20)

993d5be4b93fad92a5cc6b25a09e80d9.gif

6888e2ac438d6dfc2c408143acf8d677.gif

下载积分:

积分 -1 分

81.62 KB

, 下载次数: 73

, 下载积分:

积分 -1 分

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值