抢答器实训报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
抢答器实训报告
——嵌入式应用实训报告班级:电信0810 学号:1502081049 姓名:张天旺
一、实训目的与要求
目的:设计一个8路抢答器;4个主持人按键控制开始、复位、和倒计时的加减。
主持人按下开始键后,抢答开始,数码管上显示为“—”,在主持人
按键按下前,有选手按下,为违规。
违规时,数码管上显示的是选手编号,
并且闪烁。
抢答开始,进入倒计时,在倒计时内,若有选手按下按键,则
说明有人抢答,数码管上显示为选手编号,不闪烁。
若倒计时内没有人按
键,则说明没人抢答;主持人按“复位”键,开始下一轮抢答。
在此基础
上,还可以有其他功能,比如违规时,蜂鸣器警报、抢答成功时播放音乐
表示祝贺等。
此次实训主要培养学生的动手和思考能力,为以后的毕业设计做准备,此次实训相当于一个小的毕业设计。
要求:
1)使用单片机完成
2)能同时满足8路以上抢答
3)能判别违规现象
4)有较好的人机界面
二、方案设计
本设计采用AT89S52单片机作为控制核心,P0.0~P0.7为8路抢答信号输入端,四位共阳数码管为处理后信号输出端。
当有抢答键按下时,对应输入端为低电平"0"反之为高电平"1"。
芯片的P3.0口为抢答启动键接口。
当按下抢答启动键k1(即主持人“开始”按键)后,向单片机申请一次INT0中断单片机在中断服务程序中对抢答信号进行采样和识别处理。
采用四位LED共阳数码管以动态扫描方式对抢答键号,违规抢答键号,倒计时时间等信息进行显示;在未开始抢答时数码管显示“—”;倒计时时间由选择开关k3、k4进行设定(最高不超过99s),k3键为加,k4键为减;当主持人按下k1前,有人按键为违规抢答,选手编号就在数码管上显示并且闪烁。
1)违规抢答信号的记录
抢答开始,主持人按k1键,单片机开始先采样P0口并将采样值送入工作寄存器R0,显然R0中寄存了抢答开始前最后一瞬间各路抢答输入信号。
若无违规抢答,R0值为FFH;若有违规抢答,R0值不为FFH.R0中为0的位对应的抢答键属违规。
若出现违规现象,则需返回主程序重新抢答。
所谓"有效抢答信号"是指从数码管显示倒计时开始之后的抢答信号,在抢答提示之前的抢答信号属于"违规信号",最先到达的有效抢答信号称为"第一有效信号"。
2)第一有效抢答信号的处理:
当数码管显示抢答倒计时之后,单片机再采样P1口,用于检测抢答信号,若采样值为FFH表示还没有抢答,继续采样P0口,若不为FFH表示有人按下抢答键。
此时送入R1中含有第一有效抢答信号。
三、硬件设计
电源部分:
图1
将输入的12V交流电压通过电桥整流和7805稳压,流出5V的直流电压。
烧写芯片电路:
图2
图中所用的芯片为MAX232,通过上图电路将程序烧写进芯片89S52,
MAX232芯片的11脚和12脚分别接89S52的串行数据信号线P3.0和P3.1。
89S52:
图3
P0.0~P0.7为P0口8位双向端口线;P1.0~P1.7为P1口8位双向端口线;
P2.0~P2.7为P2口8位双向端口线;P3.0~P3.7为P3口8位双向端口线;ALE(30脚)用来锁存控制信号;29脚用来外部程序存储器读选通信号;31脚用于访问程序存储控制信号,31脚一定要连接高电平或低电平,我们所用的芯片是接高电平;RST(9脚)是复位引脚,用于复位;18、19脚是外接晶体引线端,此次实训我们所用的晶振为12MHZ的;20脚为接地端,40脚接+5V 电源;10脚、11脚(即P3.0和P3.1口)用于串行数据接受和发送;12、13脚(P3.2、P3.3口)分别是外部中断0申请和外部中断1申请;14、15脚(T0、T1)是定时\计数器0的外部输入和定时\计数器1的外部输入;16、17脚(P3.6、P3.7口)用于外部RAM或外部I/O写选通和外部RAM或外部I/O读选通。
时钟震荡电路:
时钟电路输入端引脚为XTAL1,输出端为引脚XTAL2,所用的电容为30pF 的,晶振为12MHZ,构成一个稳定的自激振荡器。
图4
复位电路:我们采用的是按键复位电路,通过RESET健实现复位,电阻R10起到保护电路的作用。
图5
显示部分:我们采用的是四位共阳数码管,P0.0~P0.7分别连接与数码管的11、7、4、2、110、5、3管脚,用于控制a、b、c、d、e、f、g、dp各段的亮灭,P2.0、P2.1、P2.2与数码管的12、8、6脚项链,用于控制1、3、4位数码管的亮灭。
9脚是用来控制第二位的,此次实训小红没有用到,就没有接。
图6
对照原理图排好版,把各个部分依次焊接在电路板上。
图6
上图是此次实训的系统图
四、软件设计
通过编写的程序来实现抢答和报违规警报,并且选手的编号能够显示在数码管上,在没有抢答前,刷关上显示为“—”,如果有人在主持人的开始键没有按下之前抢答,则数码管上显示此人的编号,并且闪烁,蜂鸣器发出声音,说明有人违规抢答;主持人按下开始键,开始抢答,在倒计时内第一个抢到的人的编号会显示在数码管上,并且不闪烁。
下面为此次实训的程序:
#include<at89x52.h>
unsigned char led[9]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,}; unsigned char aa[5]={0XF9,0XA4,0XB0,0X99,0X92,};
unsigned char k,w,j;
void delay1s()
{ unsigned char i;
for(i=0;i<60;i++){
TH1=0X3C;
TL1=0XB0;
TR1=1;
while(!TF1);
TF1=0;
}
}
void soft_reset(void)
{
((void(code*)(void)) 0x0000)();
}
///////////主函数//////////
void main()
{
while(1)
{ P0=0xbf;
if(P3_2==1)
{
if(P1_0==0){for(k=0;k<4;k++)
{ P0=led[1];delay1s();P0=0xff;delay1s();}P0=led[1];} //显示 1
if(P1_1==0){for(k=0;k<4;k++)
{ P0=led[2];delay1s();P0=0xff;delay1s();}P0=led[2];} //显示2
if(P1_2==0){for(k=0;k<4;k++)
{ P0=led[3];delay1s();P0=0xff;delay1s();}P0=led[3];} //显示3
if(P1_3==0){for(k=0;k<4;k++)
{ P0=led[4];delay1s();P0=0xff;delay1s();}P0=led[4];} //显示4
if(P1_4==0){for(k=0;k<4;k++)
{ P0=led[5];delay1s();P0=0xff;delay1s();}P0=led[5];} //显示5
if(P1_5==0){for(k=0;k<4;k++)
{ P0=led[6];delay1s();P0=0xff;delay1s();}P0=led[6];} //显示 6
if(P1_6==0){for(k=0;k<4;k++)
{ P0=led[7];delay1s();P0=0xff;delay1s();}P0=led[7];} //显示7
if(P1_7==0){for(k=0;k<4;k++)
{ P0=led[8];delay1s();P0=0xff;delay1s();}P0=led[8];} //显示8
} ///判断抢答
else {
while(1)
{
if(P1_0==0){for(k=0;k<200;k++)
{P0=led[1] ;delay1s();P0=led[1] ;if(P3_3==0) soft_reset();}break ;} //显示1
if(P1_1==0){for(k=0;k<200;k++)
{P0=led[2] ;delay1s();P0=led[2] ;if(P3_3==0) soft_reset();}break ;} //显示2
if(P1_2==0){for(k=0;k<200;k++)
{P0=led[3] ;delay1s();P0=led[3] ;if(P3_3==0) soft_reset();}break ;} //显示3
if(P1_3==0){for(k=0;k<200;k++)
{P0=led[4] ;delay1s();P0=led[4] ;if(P3_3==0) soft_reset();}break ;} //显示4
if(P1_4==0){for(k=0;k<200;k++)
{P0=led[5] ;delay1s();P0=led[5] ;if(P3_3==0) soft_reset();}break ;} //显示5
if(P1_5==0){for(k=0;k<200;k++)
{P0=led[6] ;delay1s();P0=led[6] ;if(P3_3==0) soft_reset();}break ;} //显示6
if(P1_6==0){for(k=0;k<200;k++)
{P0=led[7] ;delay1s();P0=led[7] ;if(P3_3==0) soft_reset();}break ;} //显示7
if(P1_7==0){for(k=0;k<200;k++)
{P0=led[8] ;delay1s();P0=led[1] ;if(P3_3==0) soft_reset();}break ;} //显示8
}
break; }
}
}
五.作品调试
电路板焊好后,我们编写了一段简单的程序来测试一下数码管能否发光,烧写好芯片后,通上电,发现数码管能显示,但是很暗,起初以为是程序的问题,修改了程序的延时后,烧写好芯片,通电,发现数码管显示的还是很暗。
我们在老师的指导下,测试了下电路的电流,发现电流很小,所以我们想可能是因为电路中的上拉电阻太大,我们决定改下电阻,看下数码管能否变得亮一点。
修改了一个电阻,阻值变为510欧,接上电源,发现还是很暗,我们在检查了电路之后,发现我换的电阻是接在dp脚上的,dp脚没有编入程序,所以没有变化。
修改了程序之后,烧写进去,通上电,发现dp脚对应的点比之前的都亮,我们以为换了电阻之后就会亮了,可是换了全部电阻之后,数码管显示得还是很暗。
后来我们考虑可能是没接驱动的缘故,在接上驱动后,我们继续检测,发现数码管变亮了,可是还不是很亮。
所以我们认为可能是程序还有问题,后来修改了好久,又做了些参考,终于使数码管能正常显示。
接下去是把程序编好,能满足抢答,且主持人按键能实现开始和复位,并且能够提示是否违规。
起初我们是先实现抢答,下面为起初编写的用来实现抢答的程序:
#include "at89x51.h"
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void pd(void)
{ while(1)
{
if(P1_0==0) { P0=led[1] ;break ;}
if(P1_1==0) { P0=led[2] ;break ;}
if(P1_2==0) { P0=led[3] ;break ;}
if(P1_3==0) { P0=led[4] ;break ;}
if(P1_4==0) { P0=led[5] ;break ;}
if(P1_5==0) { P0=led[6] ;break ;}
if(P1_6==0) { P0=led[7] ;break ;}
if(P1_7==0) { P0=led[8] ;break ;}
}
}
void main()
{
EA=1;
while(1)
{ if(P3_2==0) {P0=led[0];pd();break;}
}
}
通过调试我们一部分一部分来完成程序,完成抢答之后,然后编写主持人按键部分,通过调试完成了所要求的程序。
能够实现抢答、犯规提示和支持人开始和复位。
六、总结与反思
为期3个星期的实训结束了。
在这3个星期里我学到了好多。
这次的实训跟以前的有所不同。
就比如说,以前实训元器件都是现成的,不用自己去买,这次买元器件自己去买,自己去挑选合适的元器件。
在实训开始的第一个星期,我们组花了差不多4天的时间来理解我们组做的抢答器的原理图,理解各个部分的工作原理,查找关于抢答器的资料,整理好元器件清单。
接下来的一天就去买元器件了。
第二个星期,我们开始焊接电路板,焊接电路板时不要出现虚焊,漏焊,这样就不会出现接触不好或者电路不能正常工作等现象。
电路焊接好后,编写程序,花了差不多一个星期时间来编写程序,在编写程序过程中,我发现了自己的不足。
程序编好了,烧写进芯片,检验结果,只能实现抢答和主持人的开始、复位。
遗憾的是主持人的另外2个按钮倒计时的加减没有用上,还有蜂鸣器也没有用上。
通过这次实训,我认识到了自己有很多不足的地方,在编程方面我还不是很懂,以前学过的都不知道怎么应用,所以还需要去多多练习编程。
多看书,去熟悉各个语句的作用,然后运用到程序中,通过练习,让自己能够很好地应用学到的知识。
附录:原理图、PCB图、作品照片
图6 作品照片
图7 原理图
下面为元器件清单:
电容30pF 2个电桥1个晶振12MHZ 1个4位共阳数码管1个电容104 4个按钮13个电容2.2uF 4个S9012 4个电阻400欧1个7805 1个电阻470欧8个数据口1个芯片Max232 1个电容470uF 1个电容100uf 1个电容103 2个
STC89S52 1个蜂鸣器1个。