完美抢答器仿真图及程序.docx
- 文档编号:8829811
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:61.69KB
完美抢答器仿真图及程序.docx
《完美抢答器仿真图及程序.docx》由会员分享,可在线阅读,更多相关《完美抢答器仿真图及程序.docx(16页珍藏版)》请在冰豆网上搜索。
完美抢答器仿真图及程序
课程设计题目:
基于单片机的智能八路抢答器设计
一、设计项目简介
1.设计意义及目的
抢答器在现实生活中应用广泛,比如在各类娱乐节目中,像中央电视台的幸运52,开心辞典,因此做一个抢答器是具有现实意义的。
抢答器具有人数限制,我们选择做八路抢答器。
当某人抢答时,能够显示他的号码,限定他的答题时间,别人不能抢答,主持人要有启动和清空的权利。
八路抢答器在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。
如果在抢答中,靠视觉是很难判断出哪组先答题。
利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。
抢答组数可以在八组以内任意使用,本系统采用AT89S52单片机作为核心,控制系统的四个模块分别为:
单片机最小系统、显示模块、显示驱动模块、抢答开关模块。
2.系统功能描述
设计一个具有特定功能的抢答器。
该抢答器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号。
蜂鸣器发出音响;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。
3.设计达到目标
我们在要求的基础上拓展了一些功能,比如增加倒数剩下5S的时候每秒响一声,最后一声比较悠长,以提示选手抢答或者回答时间将尽,还将抢答按键和答完按键做在了同一个按键上,抢答之后选手答完题目再次按下该抢答按键即是答完,使剩余时间与台号定格。
总体上我们达到了:
按该抢答器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;最后5S倒计时蜂鸣器每秒响一声提示,最后一声比较悠长,提示抢答时间到;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号,和抢答期间一样,回答期间最后5S倒计时蜂鸣器每秒响一声提示,最后一声比较悠长,提示回答时间到;答完按钮设置在抢答按键上,再次按下抢答按键即是答完,此时蜂鸣器响一声,时间定格在答完题目之后剩下的时间;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。
二、系统硬件设计
1.系统设计方案
(1)利用译码芯片
先根据74LS148的优先功能,确定了先抢答到的选手的编码号,再根据74LS279的锁存功能,将其信号保持下来,并实现了锁定功能,将选手的编码锁定。
再者,根据74LS48的译码功能,将74LS279锁定的数字编译成二进制,将信号送到显示器中。
这样就实现了抢答功能。
原理框图如图1所示。
图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();
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完美 抢答 仿真 程序