基于单片机的智能抢答器设计Word文档下载推荐.docx
《基于单片机的智能抢答器设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能抢答器设计Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
2系统总体结构设计
2.1原理图
2.2原理图简要说明
基于这个设计的上述要求,根据功能要求,须设计有抢答电路、显示电路、主持人控制电路、定时电路、报警电路,各个电路都有其自己的功能。
通过复位键,电路进入就绪状态,等待抢答。
首先由主持人发布抢答命令,按下S3进入倒计时状态和抢答状态。
在电路中“S7—S14”为八路抢答器的8个按键,如果有人按下按键,程序就会判断是谁先按下的,然后从P0口输出抢答者号码的七段码值,送到码管显示,并封锁键盘,保持刚才按键按下时刻的时间,禁止其他人按键的输入,从而实现了抢答的功能。
如果在设定的时间中没有一个人按下按键,一到时间则产生报警信号已超时,不可以抢答。
当主持人,按S4键,答题开始,答题时间开始倒计时。
如没有按复位键,时间倒计直到0,并报警。
当要进行下一次抢答时,由主持人先按一下复位按键S2,电路复位,进入下一次抢答的就绪状态。
主持人可以在抢答开始前按“S5”,”S6”可以分别设置抢答时间,和答题时间。
3各模块电路设计与实现
3.1抢答器电路
如图2.3所示电路,该电路完成两个功能:
一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时数码管显示编号;
二是禁止其他选手按键,即使其他选手操作无效。
抢答器具有锁存、定时、显示和报警功能。
即当抢答开始后,选手抢答按动按钮,锁存器锁存相应的选手编码,同时用LED数码管把选手的编码显示出来,并且开始抢答时间的倒计时,同时用LED数码管把选手的所剩抢答时间显示出来。
而在选手按键抢答以及抢答时间倒计时到时的时候都有报警以提醒主持人和选手。
3.2时序控制电路
时序控制电路是抢答器设计的关键,它要完成以下功能:
A.主持人按“开始”键时,抢答电路和定时电路进入正常抢答状态。
B.当参赛选手按动抢答键时,蜂鸣器声响,抢答电路和定时电路停止工作。
C.主持人按“答题开始”键时,定时电路进入正常答题状态。
3.3复位电路的设计
复位是计算机的一个重要工作状态。
在单片机工作时,接电之前要复位,断电后也要复位,发生故障也要复位,在抢答器中复位则是为定时做铺垫的,在抢答之前要复位,抢答完要复位,按了复位键之后,LED的显示的是0。
单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。
整个复位电路包括芯片内外二部分。
外部电路产生的复位信号通过复位引脚RST进入片内的斯密特触发器(抑制噪声作用)再与片内复位电路相连。
复位电路每个机器周期对斯密特触发器的输出采样一次。
当RST引脚端保持两个机器周期(24个时钟周期)以上的高电平时,AT89C51进入复位状态.
图2-5复位电路
3.4定时电路的设计
(1)设置一个系统清除和抢答控制开关S即复位键,该开关由主持人控制。
(2)
抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。
当主持人启动总控制启动"
复位"
键后,定时器进行减计时,并在显示器上显示。
(3)
抢答器要具有数据锁存和显示的功能,参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,并在LED数码管上显示,同时扬声器发出报警声响提示。
显示器上显示选手的编号,同时其他人在按就无效,并一直保持到主持人将系统清除为止。
(4)
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示0,并发出一段时间的报警声。
(5)
3.5
报警电路设计
10K的电阻,一个三级管和一个蜂鸣器就组成了一个报警的电路,当选手开始抢答是蜂鸣器便提醒主持人是哪一个台号,当在设定的时间内没有人抢答,倒计时完毕后蜂鸣器也会发出短时间的叫声。
图
(2)中,接在三极管基极的10K电阻为限流电阻,在此利用晶体管的高电流增益,以达到电路快速饱和的目的。
图2-6报警电路
3.6LED数码显示器及驱动电路
LED是发光二极管的缩写,LED显示器由若干个发光二极管构成的,当发光二极管导通时,显示对应的字符。
LED显示器由7个发光二极管组成,也称为7段显示器,排列形状。
LED显示器还有一个圆点型的发光二极管,用于显示小数点,有时也称为8段LED显示器。
LED显示器的发光二极管有共阴极和共阳极两种接法。
共阴极接法,各发光二极管的阴极连在一起并接地,当某一发光二极管的阳极输入高电平时,则该段发光;
共阳极接法,各发光二极管的阳极连在一起并接+5V,当阴极输入低电平时,该段发光二极管发光。
3.7电源电路
图2-8电源电路
电源通过USB数据线,接电脑USB口供+5V电,这样方便简单。
4软件设计——程序流程图
4.1系统主要程序设计
4.1.1系统主程序设计
为了能达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前设定抢答的时间。
当时间设好了之后,主持人发布抢答命令。
按下S3按键后,程序开始打开,定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。
当扫描到有人按下了键,马上关闭T0,调用显示程序,并封锁键盘。
按下S4键后,定时中断开始倒计时,并扫描复位键是否按下。
4.1.2抢答器的源程序
P1.0-P1.7为八路抢答器的输入端口,数码管断选P0口,位选
P2口,蜂鸣器输出为P3.7。
程序框架图:
N
N
Y
NN
Y
YN
主程序框图:
5调试
5.1硬件调试过程
接完毕后,在接通电源前。
先检查一下焊接电路板有没有虚焊,和电源正负有没有短路的现象,再接通电源。
如通电源后,发现数码管不亮,要立刻切断电源,再做仔细的检查,改正后再进行测试,直到正常为止。
电源检查通电后,再进行功能调试。
首先看下数码管各断码显示是否正常,如发现显示乱码,就依次检查各断码对应的线路,直到正常显示。
再检查各个按键,是否达到了功能要求,及蜂鸣器是否正常响。
5.2软件调试
软件调试是通过对用户程序的编译、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
程序运行后编辑,查看是否有逻辑的错误。
常见的软件错误有:
程序失控、中断错误、输入/输出错误和结果不正确等,对不同的错误和现象采取相应的方法找出错误并加以修改程序,达到预期的功能。
6总结
此次设计要求我们在老师的指导下独立进行查阅资料,设计方案与组织实验等工作,并写出报告。
这次实验对于提高我们的素质和科学实验能力非常有益,为以后从事电子电路方面的设计,研制电子产品打下基础。
通过这两个多月的学习,发现了自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
这次的设计也让我看到了团队的力量,我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。
刚开始的时候,大家就分配好了各自的任务,大家有的绘制原理图,进行仿真实验,有的积极查询相关资料,并且经常聚在一起讨论各个方案的可行性。
在设计中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。
团结协作是我们成功的一项非常重要的保证。
虽然这只是一次的极简单的制作(八路抢答器),可是平心而论,也耗费了我们不少的心血,这就让我不得不佩服专门搞单片机开发的技术前辈,才意识到老一辈对我们社会的付出,为了人们的生活更美好,他们为我们社会所付出多少心血啊!
通过这次设计,为完成这次设计我们确实很辛苦,但苦中仍有乐,和团队人员这十几天的一起工作的日子,让我们有说有笑,相互帮助,配合默契,多少人间欢乐在这里洒下,大学里两年的相处还赶不上这两个月的实习,我感觉我和同学们之间的距离更加近了。
这个工程确实很累,但当我们仿真实验成功的时候,当我们连好线,按下按钮,LED亮了起来,喇叭响起的是我一生以来最好听的声音,我们的心中就不免兴奋,不免激动。
对我而言,知识上的收获重要,精神上的丰收更加可喜。
在此要特别感谢我的指导老师对我们的指导,在此向老师说一声,老师您辛苦了!
当然我也要感谢我们同组的人的积极合作。
在老师的启发和我们共同的努力下,我们才能顺利的完成设计。
在以后的工作中,我一定会更加努力的学习,充分的发挥自己的特长。
参考文献
[1]朱运利.单片机技术应用.北京:
机械工业出版社,2005年1月第一版.
[2]张大彪.电子技能与实训.北京:
电子工业出版社,2004年7月.
[3]李华.MCS-51单片机接口技术及应用.北京:
北京航天航空大学出版社.
附录A程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
chars;
ucharnum=0;
chartime=20;
chardatitime=30;
uinttt,t1;
bitflag,s_flag=1,b_flag,fall_flag;
bitK_startcountflag,K_timecountflag;
sbitK0=P3^0;
sbitbeep=P3^7;
sbitrled=P3^1;
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitK5=P1^4;
sbitK6=P1^5;
sbitK7=P1^6;
sbitK8=P1^7;
sbitK_Time=P3^2;
sbitK_startcount=P3^3;
sbitK_timecount=P3^4;
voiddelay(ucharms)
{
uchary;
for(;
ms>
0;
ms--)
for(y=120;
y>
y--);
}
ucharcodetabledu[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
ucharcodetablewe[]={0XFE,0XFD,0XFB,0XF7};
voidT0_Init(void)
TMOD=0X01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
ET0=1;
ET1=1;
EA=1;
P0=0;
voidKey_Scan(void)
if(K0==0)
{
delay(10);
if(K0==0)
{
while(!
K0);
TR0=1;
s=time;
tt=0;
flag=1;
s_flag=1;
b_flag=1;
num=0;
beep=1;
rled=1;
fall_flag=0;
K_startcountflag=0;
K_timecountflag=0;
}
}
voidScan(void)
if(K1==0)
if(K1==0)
K1);
num=1;
TR0=0;
TR1=1;
s_flag=0;
if(K2==0)
if(K2==0)
K2);
num=2;
if(K3==0)
if(K3==0)
K3);
num=3;
if(K4==0)
if(K4==0)
K4);
num=4;
if(K5==0)
if(K5==0)
K5);
num=5;
if(K6==0)
if(K6==0)
K6);
num=6;
if(K7==0)
if(K7==0)
K7);
num=7;
if(K8==0)
if(K8==0)
K8);
num=8;
voiddisplay(void)
if(flag==1)
if(num!
=0)
P0=tabledu[num];
P2=tablewe[0];
delay
(2);
P0=0;
P2=0XFF;
else
P0=tabledu[s/10];
P2=tablewe[2];
delay
(2);
P0=0;
P2=0XFF;
P0=tabledu[s%10];
P2=tablewe[3];
else{
if(fall_flag==1)
if(num!
{
P0=tabledu[num];
P2=tablewe[0];
delay
(2);
P0=0;
P2=0XFF;
P0=tabledu[15];
P2=tablewe[2];
P2=tablewe[3];
}
else
else
if(K_startcountflag==1)
P0=0X40;
P2=tablewe[1];
P0=tabledu[time/10];
P0=tabledu[time%10];
elseif(K_timecountflag==1)
P0=0X07;
P0=0x31;
P0=tabledu[datitime/10];
P0=tabledu[datitime%10];
/
}
}
voidTime_Scan(void)
if(K_startcount==0)
if(K_startcount==0)
K_startcount);
time++;
if(time>
50)
time=20;
K_startcountflag=1;
if(K_timecount==0)
if(K_timecount==0)
K_timecount);
datitime++;
if(datitime>
60)
datitime=30;
K_timecountflag=1;
voidmain(void)
T0_Init();
while
(1)
Key_Scan();
if((flag==0)&
(s_flag==1))
Time_Scan();
if((flag==1)&
(s_flag==0))
if(K_Time==0)
delay(10);
if(K_Time==0)
{
while(!
K_Time);
s=datitime;
TR0=1;
tt=0;
TR1=1;
}
(s_flag==1))/
Scan();
=0)/
fall_flag=1;
rled=0;
(s_flag==1)){
display();
}
voidtimer0(void)interrupt1
//2ms
if(b_flag)
beep=~beep;
else
beep=1;
if(s<
5)
if(s%2==0)
rled=0;
b_flag=0;
tt++;
if(tt==500)