完美抢答器仿真图及程序Word下载.docx

上传人:b****7 文档编号:22477486 上传时间:2023-02-04 格式:DOCX 页数:18 大小:62.62KB
下载 相关 举报
完美抢答器仿真图及程序Word下载.docx_第1页
第1页 / 共18页
完美抢答器仿真图及程序Word下载.docx_第2页
第2页 / 共18页
完美抢答器仿真图及程序Word下载.docx_第3页
第3页 / 共18页
完美抢答器仿真图及程序Word下载.docx_第4页
第4页 / 共18页
完美抢答器仿真图及程序Word下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

完美抢答器仿真图及程序Word下载.docx

《完美抢答器仿真图及程序Word下载.docx》由会员分享,可在线阅读,更多相关《完美抢答器仿真图及程序Word下载.docx(18页珍藏版)》请在冰豆网上搜索。

完美抢答器仿真图及程序Word下载.docx

正常抢答下,从按下抢答按钮开始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();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1