完美抢答器仿真图及程序Word下载.docx
《完美抢答器仿真图及程序Word下载.docx》由会员分享,可在线阅读,更多相关《完美抢答器仿真图及程序Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
![完美抢答器仿真图及程序Word下载.docx](https://file1.bdocx.com/fileroot1/2023-2/3/2c0a63c1-d0f3-438d-b9ca-33bfe3a76acb/2c0a63c1-d0f3-438d-b9ca-33bfe3a76acb1.gif)
正常抢答下,从按下抢答按钮开始30S,答完按钮没按下,如此作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号,和抢答期间一样,回答期间最后5S倒计时蜂鸣器每秒响一声提示,最后一声比拟悠长,提示回答时间到;
答完按钮设置在抢答按键上,再次按下抢答按键即是答完,此时蜂鸣器响一声,时间定格在答完题目之后剩下的时间;
二、系统硬件设计
1.系统设计方案
〔1〕利用译码芯片
先根据74LS148的优先功能,确定了先抢答到的选手的编码号,再根据74LS279的锁存功能,将其信号保持下来,并实现了锁定功能,将选手的编码锁定。
再者,根据74LS48的译码功能,将74LS279锁定的数字编译成二进制,将信号送到显示器中。
这样就实现了抢答功能。
原理框图如图1所示。
〔2〕利用单片机
可以利用单片机的定时/计数器进展计时,设定抢答时间和答题时间;
可以利用单片机的I/O口线接按键,通过按键按下后,所接口线电平的变化来判断那位选手按下键。
我选择利用单片机做抢答器。
1、仿真图
2、程序
/**************************************************************************************
*操作非常简单
*主持人先按键,然后有30s的时间,等待选手按键
*选手在30s按键,就显示选手的号数,与30s的回答倒计时
*此时,其他选手按键无效,
*只有抢答选手按键,才停止,并显示锁定
*最后,按复位,进展新一轮抢答
**************************************************************************************/
#include"
reg52.h"
intrins.h"
absacc.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
/*定义定时器T0和T1时间常数和方式控制字*/
#definev_th00x3c
#definev_tl00xb0
#definev_tmod0x11
sbitP30=P3^0;
sbitP36=P3^6;
sbitP32=P3^2;
sbitP31=P3^1;
ucharled_buf[8];
//显示缓冲数组
ucharcodedispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c};
//段码数组
ucharkeyzhi;
uintm,time,time2;
voiddelay(uinta)//延时程序
{
while(a--);
}
voidled()//违规指示灯亮程序
P32=0;
delay(2000);
}
voidring()//蜂鸣器程序
P36=0;
delay(10000);
P36=1;
{
uchardmask=0x01;
//位控码初始化
ucharpos;
for(pos=0;
pos<
3;
pos++)
{
P2=dmask;
//位控码输出到位控口
P0=dispcode[10];
//取显示段码并输出到段控口
delay(200);
dmask=_crol_(dmask,1);
//位控码左移一位
}
voidled_buf_auto_flush(void)reentrant//显示缓冲区更新函数
led_buf[0]=m;
//获得选手的
led_buf[1]=time/10;
//获得秒十位
led_buf[2]=time%10;
//获得秒的个位
voidtimer0(void)interrupt1//定时器t0中断服务函数,选用定时器0工作方式为1
ucharj;
staticucharclick=0;
TH0=v_th0;
TL1=v_tl0;
//设置初始值50ms为循环20次为1ms,12MHz
++click;
if(click==20)//定时器0定时中断次数
--time;
click=0;
if((time==20)&
&
(j=0xff))
{
ring();
}
if((time<
=5)&
(time!
=0)&
if((time==0)&
{ring();
delay(1000);
ring();
led_buf_auto_flush();
//LED显示缓冲区时间值更新
voidtimer1(void)interrupt3//选用定时器1工作方式为1
//定时器0定时中断次数
TH1=v_th0;
TL1=v_tl0;
//设置初始值50ms为循环20次为1ms,12MHz
if(click==20)
{
--time2;
if((time2<
(time2!
(j!
=0xff))
if((time2==0)&
{
TR1=0;
P32=0;
}
time=time2;
led_buf_auto_flush();
voidput_on_leds(void)//显示输出函数
4;
P2=dmask;
P0=dispcode[led_buf[pos]];
delay(100);
//延时
dmask=_crol_(dmask,1);
//修改未控码
voidinit_sys(void)//进展初始化并承受用户的初始化时间设置
TMOD=v_tmod;
TL0=v_tl0;
//设置时间初值
TR0=0;
EA=1;
ET0=1;
TR1=0;
ET1=1;
//开启中断,关闭定时器
ucharkeychuli()//处理与键盘相连的P1口的容,作为键值
uchark;
k=P1;
//P1口容送K
return(k);
//返回键值
ucharkey()//键盘扫描函数,函数返回值即键值
ucharkeyzhi,keyzhii;
//电子钟键盘按键键值临时存放
keyzhi=keychuli();
//调P1口处理函数
if(keyzhi!
=0xff)//有键动作延时去抖动,否如此函数返回
delay(100);
//再次调P1口处理函数
if(keyzhi!
=0xff)//真正有键按下,取键值并暂存
keyzhii=keyzhi;
while(keyzhi!
=0xff)//判按键是否释放,没有释放延时去抖动等待释放
{
put_on_leds();
keyzhi=keychuli();
}
keyzhi=keyzhii;
//按键释放后恢复按键键值
}
return(keyzhi);
//返回按键键值
voidmain()//主函数调用init_sys()函数对系统初始化,调用put_on_leds()函数
ucharc=1;
//C1,2,31:
无人违规合法抢答,2:
有人违规,3:
允许答完
ucharkeyzhiii;
while
(1)
keyzhiii=key();
//调键盘扫描函数得到按键键码
if(P30==0)//主持人是否按下启动键
if(P30==0)
c=1;
break;
if(keyzhiii!
=0xff)
c=2;
led();
init_sys();
//调用init_sys()函数对系统初始化
time=30;
time2=30;
TR0=1;
//开定时器0
put_on_leds();
//调显示函数
//调延时函数
if(c==1)//判断有没有违规
keyzhiii=key();
j=keyzhiii;
if(c==3)
if(time==0)
while
(1)
TR0=0;
delay(100);
if(c==1||c==2)
switch(keyzhiii)//按键功能控制
{
case0xfe:
//1号选手抢答,抢答时间设定为三十秒
{
m=1;
if(c==1)
{
ring();
//有人正常按下,蜂鸣器发出声音
TR1=1;
//开定时器1,关定时器0
TR0=0;
c=3;
keyzhiii=0xff;
}
if(c==2)//有人违规
TR1=0;
time=0;
}
led_buf_auto_flush();
break;
case0xfd:
//2号选手抢答
{
m=2;
case0xfb:
//3号选手抢答
m=3;
case0xf7:
//4号选手抢答
m=4;
case0xef:
//5号选手抢答
m=5;
//有人正常按下,蜂鸣器发出声音
//开定时器1,关定时器0
if(c==2)//有人违规
case0xdf:
//6号选手抢答
m=6;
case0xbf:
//7号选手抢答
m=7;
case0x7f:
//8号选手抢答
m=8;
if(c==3)//无人违规,等待答完
TR1=1;
TR0=0;
if(j==keyzhiii)
//有人答完,蜂鸣器发出声音
TR1=0;
while
(1)
led_buf_auto_flush();
put_on_leds();
}