八路抢答器设计.docx
《八路抢答器设计.docx》由会员分享,可在线阅读,更多相关《八路抢答器设计.docx(21页珍藏版)》请在冰豆网上搜索。
八路抢答器设计
物理与电子信息工程学院
实验报告
实验课程名称:
电子综合设计实验
实验项目名称:
八路智力抢答器
班级:
0912241
姓名:
学号:
成绩:
______________
实验时间:
2011.10.25
1.实验目的
(1)掌握八路抢答器的工作原理。
(2)掌握单片机的使用方法。
(3)掌握程序的编写、调试和下载方法。
(4)学会分析、观察及调式电路。
2.仪器设备
AT89C51单片机1个
11.0592M晶振1个
四位共阴极数码管1个
按键10个
Led各1个
22pF瓷片电容2个
10uF电解电容1个
排阻1k*82个
10k电阻若干
基于单片机的
八路抢答器设计方案
本题利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间和选手号码。
用开关做键盘输出,扬声器发生提示。
系统达到要求:
在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可是在1-99s设定;可以显示是哪位选手有效抢答和无效抢答,正确按键后有音乐提示;抢答时间和回答问题时间倒记时显示,时间完后系统自动复位;按键锁定,在有效状态下,按键无效非法。
抢答器的系统概述
系统的主要功能:
本系统是借用单片机采用模块化设计的八路抢答器,包括8路抢答按纽、计时显示、提示功能等(根据需要可另设或多设相关功能)、开始与结束控制按钮、时限设定、各种相关显示调控功能等(根据需要也可另设或多设相关功能)。
参赛者系统,除享有抢答按纽的权利功能外,还有人性化的提示功能和时间提示功能,也可设定由主控控制在参赛者终端表现的趣味性功能等;主控系统的控制按钮做开始与结束控制,根据活动参赛者的层次,对提前抡答者的行为设定为非法或阻隔,若设有非法抢答控制功能时,在主控处带有公示性显示的非法抡答者的台位号,对抢答限时及回答问题限时设为倒计时,并有显示提示。
系统的主要功能模块方框图如图1所示:
图1系统主要功能模块
本系统采用模块化设计的八路抢答器,在抢答比赛中广泛应用,各组分别有一个抢答按钮。
一共有8个按键输入,分别对应8路选手的抢答按键。
主持人有开始和结束键。
在后台主持人可以修改,抢答时间和选手回答问题的时间设置,原始状态下抢答时间为20s,回答问题时间为30s。
通过加键和减键修改上述时间,改完后结束键确定。
新时间开始有效,主持人按键开始后,选手开始抢答为有效,数码显示屏显示抢答时间倒计时和选手号,在最后五秒扬声器发生提示。
如果主持人没有按下开始键而选手就抢答视为犯规,数码显示屏显示犯规者的代号,扬声器持续发生。
主持人可按键结束,新一轮抢答开始。
单片机是整个抢答器的核心,内部电路设计用汇编语言编写。
它完成了时间参数的设定,抢按号码的译码,保存;显示;输出,抢按及答题倒计时功能等。
本设计中,有一个共阴的数码管组,四个数码管。
其中两个显示时间,一个空位,一个显示抢答号码。
主持人依次按下复位键(RESET),开始键后开始抢答。
可以抢按:
超时数码管显示“FFF”,当抢按超过规定时间或答题超过规定时间后数码管显示“FFF”。
若有选手在规定时间内抢按成功,则可以答题,数码管显示抢答时间的同时也显示选手号码。
若在按开始键前抢答表示违规,数码管显示“FF”并显示选手号码。
系统需求分析
1在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效。
2抢答限定时间和回答问题的时间可以在1~99s设定。
3可以显示是哪位选手有效抢答和无效抢答,正确按键后有音乐提示。
4抢答时间和回答问题时间倒记时显示,时间完后系统自动复位。
5抢答限定时间内使用锦囊回答时间将加到60s。
6按键锁定,在有效状态下,按键无效非法。
抢答器的工作流程
抢答器的基本工作原理[4]:
在抢答竞赛或呼叫时,有多个信号同时或不同时送入主电路中,抢答器内部的寄存器工作,并识别、记录第一个号码,同时内部的定时器开始工作,记录有关时间并产生超时信号。
在整个抢答器工作过程中,显示电路、声音电路等还要根据现场的实际情况向外电路输出相应信号。
抢答器的工作流程分为:
系统复位、正常流程、违例流程等几部分,如图2所示,下面分别予以介绍。
图2抢答器工作流程
抢答器的工作过程
1、主持人按"抢答开始"键,会有红灯亮,并立刻进入抢答倒计时(预设20s抢答时间),如有选手抢答,会有提示音和一个绿灯亮,并会显示0,不进行抢答查询,所以只有第一个按抢答的选手有效。
2、如倒计时期间,主持人想停止倒计时可以随时按“停止”按键,系统会自动进入准备状态,等待主持人按“抢答开始”进入下次抢答计时。
3、如果主持人未按“抢答开始”键,而有人按了抢答按键,犯规抢答,LED上不断闪烁FF和犯规号数并响个不停,直到按下“停止”键为止。
总而言之,本课题利用AT89C51单片机及外围接口实现的抢答系统设计了抢答器,该抢答器增加了新功能、提高了系统的可靠性、简化了电路结构、节约了成本,是一个实用的工程设计。
总体原理图
图4系统原理图
图中U1为单片机AT89C51,U2为芯片74HC30,U3为芯片74LS04。
K1~K8分别为8路抢答按键,分别接到单片机的P1.0~P1.7中。
开始按键与结束按键分别接到单片机的10、11脚,由于单片机的10、11脚既有串行接口RXD、TXD功能,又有P3.0、P3.1的IO端口功能,此处按键用到单片机10、11脚的IO端口功能。
抢答时间调整按键和回答时间调整按键分别接到单片机的13、14管脚,加一按键和减一按键分别接到单片机的15、16管脚。
4位七段数码管段选P0口。
4位七段数码管的位选接P2口低3位,蜂鸣器输出为P3.7口。
软件设计
1.主程序系统结构图
图13软件系统结构图
2.程序流程图-----主流程图如14所示:
图14程序设计流程图
3.复位图
图15复位显示三个FFF
该图显示当单片机复位后,在4位七段数码管上显示的初始状态“FFF”字符。
4.设置计时时间
图16计时时间为17秒
该图显示通过加一按键操作后在4位数码管上显示的计时时间为17秒。
5.非法抢答并显示座号
图17三号选手非法抢答
该图显示的是若三号选手非法抢答时候,第一位字符显示单片机判定的非法选手“3”号选手,在4位数码管上的后两位显示非法抢答字符“FF”。
6.抢答成功并显示倒计时
图18六号选手抢答
图中显示的是若6号选手抢答成功的时候,4位数码管的第一显示是“6”号选手抢答成功,最后两位显示选手答题倒计时时间还有25秒。
程序
#include
/*-----------------------------------------------------------
宏定义
------------------------------------------------------------*/
#defineuintunsignedint
#defineucharunsignedchar
/*-----------------------------------------------------------
共阴极
数码管
编
码
表
0-f
显示
------------------------------------------------------------*/
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbitstart_stop=P3^6;
sbitreset=P3^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
sbitkey8=P1^7;
sbitstate=P3^4;
sbitbao=P3^3;
sbitxiang=P3^2;
bitstart_stop_flag=0;
bitkey1_flag=0;
bitkey2_flag=0;
bitkey3_flag=0;
bitkey4_flag=0;
bitkey5_flag=0;
bitkey6_flag=0;
bitkey7_flag=0;
bitkey8_flag=0;
bitreset_flag=0;
bitaction=0;
ucharsecond=20;
uchartimer0_count=0;
ucharnumber=0;
ucharnumber_display=0;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplay(ucharnumber,ucharsecond)
{
ucharsecond_first,second_second;
second_first=second/10;
second_second=second%10;
P2=0xfe;
P0=table[number];
delay
(2);
P2=0xfd;
P0=0x40;
delay
(2);
P2=0xfb;
P0=table[second_first];
delay
(2);
P2=0xf7;
P0=table[second_second];
delay
(2);
}
voidstart_stop_keyscan()
{
if(start_stop!
=0)
{if(P1!
=0xff)
{
bao=0;
xiang=0;
delay(3000);
xiang=1;
}}
if(start_stop==0)
{
delay(8);
if((start_stop==0)&&(!
start_stop_flag))
{
start_stop_flag=1;
action=1;
TR0=1;
state=0;
//xiang=1;
}
}
else
{
start_stop_flag=0;
}
}
ucharkey_scan8()
{
if(key1==0)
{
delay(8);
if((key1==0)&&(!
key1_flag))
{
key1_flag=1;
number=1;
number_display=number;
}
}
else
{
key1_flag=0;
number=0;
}
if(key2==0)
{
delay(8);
if((key2==0)&&(!
key2_flag))
{
key2_flag=1;
number=2;
number_display=number;
}
}
else
{
key2_flag=0;
number=0;
}
if(key3==0)
{
delay(8);
if((key3==0)&&(!
key3_flag))
{
key3_flag=1;
number=3;
number_display=number;
}
}
else
{
key3_flag=0;
number=0;
}
if(key4==0)
{
delay(8);
if((key4==0)&&(!
key4_flag))
{
key4_flag=1;
number=4;
number_display=number;
}
}
else
{
key4_flag=0;
number=0;
}
if(key5==0)
{
delay(8);
if((key5==0)&&(!
key5_flag))
{
key5_flag=1;
number=5;
number_display=number;
}
}
else
{
key5_flag=0;
number=0;
}
if(key6==0)
{
delay(8);
if((key6==0)&&(!
key6_flag))
{
key6_flag=1;
number=6;
number_display=number;
}
}
else
{
key6_flag=0;
number=0;
}
if(key7==0)
{
delay(8);
if((key7==0)&&(!
key7_flag))
{
key7_flag=1;
number=7;
number_display=number;
}
}
else
{
key7_flag=0;
number=0;
}
if(key8==0)
{
delay(8);
if((key8==0)&&(!
key8_flag))
{
key8_flag=1;
number=8;
number_display=number;
}
}
else
{
key8_flag=0;
number=0;
}
if(number_display!
=0)
{
return1;
}
else
{
return0;
}
}
voidreset_keyscan()
{
if(reset==0)
{
delay(8);
if((reset==0)&&(!
reset_flag))
{
reset_flag=1;
number_display=0;
state=1;
bao=1;
}
}
else
{
reset_flag=0;
}
}
voidmain()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
while
(1)
{
start_stop_keyscan();
reset_keyscan();
while(action)
{
while(!
key_scan8())
{
display(number_display,second);
if(second==0)
{
second=20;
break;
}
}
TR0=0;
second=20;
display(number_display,second);
action=0;
break;
}
display(number_display,second);
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timer0_count++;
if(timer0_count==20)
{
timer0_count=0;
second--;
if(second==0)
{
TR0=0;
number_display=0;
state=1;
action=0;
}
}
}