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

上传人:b****1 文档编号:2361846 上传时间:2023-05-03 格式:DOCX 页数:19 大小:63.35KB
下载 相关 举报
完美抢答器仿真图及程序.docx_第1页
第1页 / 共19页
完美抢答器仿真图及程序.docx_第2页
第2页 / 共19页
完美抢答器仿真图及程序.docx_第3页
第3页 / 共19页
完美抢答器仿真图及程序.docx_第4页
第4页 / 共19页
完美抢答器仿真图及程序.docx_第5页
第5页 / 共19页
完美抢答器仿真图及程序.docx_第6页
第6页 / 共19页
完美抢答器仿真图及程序.docx_第7页
第7页 / 共19页
完美抢答器仿真图及程序.docx_第8页
第8页 / 共19页
完美抢答器仿真图及程序.docx_第9页
第9页 / 共19页
完美抢答器仿真图及程序.docx_第10页
第10页 / 共19页
完美抢答器仿真图及程序.docx_第11页
第11页 / 共19页
完美抢答器仿真图及程序.docx_第12页
第12页 / 共19页
完美抢答器仿真图及程序.docx_第13页
第13页 / 共19页
完美抢答器仿真图及程序.docx_第14页
第14页 / 共19页
完美抢答器仿真图及程序.docx_第15页
第15页 / 共19页
完美抢答器仿真图及程序.docx_第16页
第16页 / 共19页
完美抢答器仿真图及程序.docx_第17页
第17页 / 共19页
完美抢答器仿真图及程序.docx_第18页
第18页 / 共19页
完美抢答器仿真图及程序.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

完美抢答器仿真图及程序

课程设计题目:

 基于单片机的智能八路抢答器设计

一、设计项目简介

1.设计意义及目的

抢答器在现实生活中应用广泛,比如在各类娱乐节目中,像中央电视台的幸运52,开心辞典,因此做一个抢答器是具有现实意义的。

抢答器具有人数限制,我们选择做八路抢答器。

当某人抢答时,能够显示他的号码,限定他的答题时间,别人不能抢答,主持人要有启动和清空的权利。

八路抢答器在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。

如果在抢答中,靠视觉是很难判断出哪组先答题。

利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。

抢答组数可以在八组以内任意使用,本系统采用AT89S52单片机作为核心,控制系统的四个模块分别为:

单片机最小系统、显示模块、显示驱动模块、抢答开关模块。

2.系统功能描述

设计一个具有特定功能的抢答器。

该抢答器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。

主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号。

蜂鸣器发出音响;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。

3.设计达到目标

我们在要求的基础上拓展了一些功能,比如增加倒数剩下5S的时候每秒响一声,最后一声比较悠长,以提示选手抢答或者回答时间将尽,还将抢答按键和答完按键做在了同一个按键上,抢答之后选手答完题目再次按下该抢答按键即是答完,使剩余时间与台号定格。

总体上我们达到了:

按该抢答器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。

主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;最后5S倒计时蜂鸣器每秒响一声提示,最后一声比较悠长,提示抢答时间到;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号,和抢答期间一样,回答期间最后5S倒计时蜂鸣器每秒响一声提示,最后一声比较悠长,提示回答时间到;答完按钮设置在抢答按键上,再次按下抢答按键即是答完,此时蜂鸣器响一声,时间定格在答完题目之后剩下的时间;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。

二、系统硬件设计

1.系统设计方案

(1)利用译码芯片

先根据74LS148的优先功能,确定了先抢答到的选手的编码号,再根据74LS279的锁存功能,将其信号保持下来,并实现了锁定功能,将选手的编码锁定。

再者,根据74LS48的译码功能,将74LS279锁定的数字编译成二进制,将信号送到显示器中。

这样就实现了抢答功能。

原理框图如图1所示。

(2)利用单片机

可以利用单片机的定时/计数器进行计时,设定抢答时间和答题时间;可以利用单片机的I/O口线接按键,通过按键按下后,所接口线电平的变化来判断那位选手按下键。

我选择利用单片机做抢答器。

 

1、仿真图

 

2、程序

/**************************************************************************************

*操作非常简单

*主持人先按键,然后有30s的时间,等待选手按键

*选手在30s内按键,就显示选手的号数,及30s的回答倒计时

*此时,其他选手按键无效,

*只有抢答选手按键,才停止,并显示锁定

*最后,按复位,进行新一轮抢答

**************************************************************************************/

#include"reg52.h"

#include"intrins.h"

#include"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);

delay(2000);

}

voidring()//蜂鸣器程序

{

P36=0;

delay(10000);

P36=1;

}

voidledk()//P.显示程序

{

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)&&(j=0xff))

{

ring();

}

if((time==0)&&(j=0xff))

{ring();

delay(1000);

ring();

}

led_buf_auto_flush();//LED显示缓冲区时间值更新

}

}

voidtimer1(void)interrupt3//选用定时器1工作方式为1

{

ucharj;

staticucharclick=0;//定时器0定时中断次数

TH1=v_th0;TL1=v_tl0;//设置初始值50ms为循环20次为1ms,12MHz

++click;

if(click==20)

{

--time2;

click=0;

if((time2<=5)&&(time2!

=0)&&(j!

=0xff))

{

ring();

}

if((time2==0)&&(j!

=0xff))

{

ring();

delay(1000);

ring();

TR1=0;

P32=0;

}

}

time=time2;

led_buf_auto_flush();//LED显示缓冲区时间值更新

}

 

voidput_on_leds(void)//显示输出函数

{

uchardmask=0x01;//位控码初始化

ucharpos;

for(pos=0;pos<4;pos++)

{

P2=dmask;//位控码输出到位控口

P0=dispcode[led_buf[pos]];//取显示段码并输出到段控口

delay(100);//延时

delay(100);

dmask=_crol_(dmask,1);//修改未控码

}

}

voidinit_sys(void)//进行初始化并接受用户的初始化时间设置

{

TMOD=v_tmod;

TH0=v_th0;

TL0=v_tl0;

TH1=v_th0;

TL1=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();

put_on_leds();

keyzhi=keychuli();

}

keyzhi=keyzhii;//按键释放后恢复按键键值

}

}

return(keyzhi);//返回按键键值

}

voidmain()//主函数调用init_sys()函数对系统初始化,调用put_on_leds()函数

{

ucharj;

ucharc=1;//C1,2,31:

无人违规合法抢答,2:

有人违规,3:

允许答完

ucharkeyzhiii;

while

(1)

{

keyzhiii=key();//调键盘扫描函数得到按键键码

ledk();//调P.程序

if(P30==0)//主持人是否按下启动键

delay(100);

if(P30==0)

{

c=1;

break;

}

if(keyzhiii!

=0xff)

{

c=2;

led();

break;

}

}

init_sys();//调用init_sys()函数对系统初始化

time=30;

time2=30;

TR0=1;//开定时器0

while

(1)

{

put_on_leds();//调显示函数

delay(100);//调延时函数

if(c==1)//判断有没有违规

{

keyzhiii=key();//调键盘扫描函数得到按键键码

j=keyzhiii;

}

if(c==3)

{

keyzhiii=key();//调键盘扫描函数得到按键键码

}

if(time==0)

{

while

(1)

{

TR0=0;

put_on_leds();

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();

put_on_leds();

break;

}

case0xfd:

//2号选手抢答

{

m=2;

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();

put_on_leds();

break;

}

case0xfb:

//3号选手抢答

{

m=3;

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();

put_on_leds();

break;

}

case0xf7:

//4号选手抢答

{

m=4;

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();

put_on_leds();

break;

}

case0xef:

//5号选手抢答

{

m=5;

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();

put_on_leds();

break;

}

case0xdf:

//6号选手抢答

{

m=6;

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();

put_on_leds();

break;

}

case0xbf:

//7号选手抢答

{

m=7;

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();

put_on_leds();

break;

}

case0x7f:

//8号选手抢答

{

m=8;

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();

put_on_leds();

break;

}

}

if(c==3)//无人违规,等待答完

{

TR1=1;

TR0=0;

if(j==keyzhiii)

{

ring();//有人答完,蜂鸣器发出声音

TR1=0;

TR0=0;

while

(1)

{

led_buf_auto_flush();

put_on_leds();

}

}

}

led_buf_auto_flush();

put_on_leds();

}

}

 

欢迎您的下载,

资料仅供参考!

 

致力为企业和个人提供合同协议,策划案计划书,学习资料等等

打造全网一站式需求

 

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2