AT89C51课程设计单片机抢答器.docx

上传人:b****8 文档编号:10478617 上传时间:2023-02-13 格式:DOCX 页数:19 大小:395.75KB
下载 相关 举报
AT89C51课程设计单片机抢答器.docx_第1页
第1页 / 共19页
AT89C51课程设计单片机抢答器.docx_第2页
第2页 / 共19页
AT89C51课程设计单片机抢答器.docx_第3页
第3页 / 共19页
AT89C51课程设计单片机抢答器.docx_第4页
第4页 / 共19页
AT89C51课程设计单片机抢答器.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

AT89C51课程设计单片机抢答器.docx

《AT89C51课程设计单片机抢答器.docx》由会员分享,可在线阅读,更多相关《AT89C51课程设计单片机抢答器.docx(19页珍藏版)》请在冰豆网上搜索。

AT89C51课程设计单片机抢答器.docx

AT89C51课程设计单片机抢答器

抢答器设计

内容提要:

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

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

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

本设计使用AT89C51单片机来设计智能抢答器,组数可以在八组以内任意使用。

并且具有倒计时和时间设置及报警功能。

利用AT89C51单片机对信号进行锁存、显示等功能。

分别从硬件和软件两方面阐述了该控制系统的设计方法,并经过调试和运行使该系统达到预期目标,具有反应快、功能齐全、实用性强的特点。

一、系统总体方案设计

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

为了完成这个任务设计时系统能显示抢答组号、各组计分并能计分显示以及比赛结束时能发出报警声三个要求;电子智能抢答计分器主要是由硬件部分和软件部分构成,硬件和软件分开设计;系统综框图如下:

 

图1-1系统框架图

 

抢答器的工作原理

抢答器的工作原理是利用单片机的定时器T0、T1中断完成,其余状态循环调用显示子程序,用4个共阴极LED数码管来显示,用P0口作为数码管的八个段选,用P2口中的P2.0、P2.1、P2.2、作为4个数码管其中3个位选,P1口接4个按键,提供选手抢答,P3.0-P3.5四个接四个按键,提供开始、结束、答题时间调整、抢答时间调整,加1、减1调整之用。

抢答功能:

通过四路按键配合程序来实现抢答功能。

当主持人按下抢答键开始抢答后,此时任一路按下按钮均闭锁其它各路,由程序对键盘译码并显示最先按下抢答键的路数及其当前时间。

抢答限时:

主持人按下抢答键后,设置5秒为抢答时间(此时间可在1-99秒之间修改)。

若5秒内无人抢答,倒计时为0时发出报警,说明该抢答题目作废。

此时闭锁所有抢答按键,只有当主持人再次按下抢答键开始下一次抢答方可抢答。

答题限时:

当选手按下按钮时,启动倒计时(此倒计时时间可在1~99秒之间修改),倒计时为0时发出报警,说明答题时间到。

二、系统硬件设计

1、控制系统及所需元件

芯片的选择

抢答器电路的核心是89C51单片机,其内部带有4KB的FLASHROM,无需外扩程序存储器;抢答器没有大量的运算和暂存数据现有的128B篇内RAM已经能满足容量需求,故不需外扩片外RAM,系统配有8位8段数码显示管,管采用共阴数码管,作为时钟的显示输出。

控制系统主要由单片机应用电路、存储器、接口电路、显示接口电路组成;其中单片机采用的是AT89C51单片机使系统工作的核心,它主要负责控制各个部分协调工作。

所需元件:

该系统的核心器件是AT89C51,其外部接上复位电路、上拉电阻、数码管、按钮及扬声器。

元件为:

晶体振荡管X1,电容C1、C2、C3,电阻RP1,P3.0和P3.1有裁判控制分别是抢答停止和开始键;P1.0-P1.7是8组抢答的输入口;P2.0-P2.3口为数码管的段选口;位选口用的是P0.0-P0.6口输出,外部中断0、1和P3.3,P3/4为抢答记时调整口,实现的对个队进行计时,并且加减调整,外部中断0,1实现了答题时间调整。

P3.4、P3.5分别实现了时间的加一和减一;P3.6为蜂鸣器控制口。

智能抢答器用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,采用单片机AT89C51,它是低功耗、高性能的CMOS型8位单片机。

片内带有4KB的Flash存储器,并允许在系统内改写或用编程器编程。

该智力竞赛抢答器的准确度很高,其误差主要由晶振自身的误差所造成。

AT89C51单片机由微处理器,存储器,I/O口以及特殊功能寄存器SFR等部分构成。

其存储器在物理上设计成程序存储器和数据存储器两个独立的空间,片内程序存储器的容量为4KB,片内数据存储器为128个字节。

89C51单片机有4个8位的并行I/O口:

P0口,P1口,P2口和P3口。

各个接口均由接口锁存器,输出驱动器和输入缓冲器组成。

P1口是唯一的但功能口,仅能用作通用的数据输入/输出口。

P3口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如P3.0是串行输入口线,P3.1口是串行输出口线。

在需要外部程序存储存储器和数据存储器扩展时,P0可作为分时复用的低8位地址/数据总线,P2口可作为高8位的地址总线。

P3口也可作为AT89C51的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号。

复位电路的设计

图2-1复位电路原理图

该复位电路采用上电自动复位和手动复位两种复位方式,图中网络标号所指9连接到单片机的复位引脚。

要实现复位只需在,51系列单片机的RESET引脚上加上5ms的高电平就可以了。

上电复位是利用电容的充电来实现的,即上电瞬间RESET端的电位与Vcc相同,随着电容上储能增加,电容电压也逐渐增大,充电电流减小,RESET端的电位。

这样就会建立一个脉冲电压,调节电容与电阻的大小可对脉冲的持续时间进行调节。

通常若采用12MHz的晶振时,复位元件参数为22μF的电解电容和10kΩ的电阻。

按钮复位电路是通过按下复位按钮时,电源对RESET端维持两个机器周期的高电平实现复位的。

3.4晶振电路的设计

MSC-51单片机的定时控制功能是用时钟电路和振荡器完成的,而根据硬件电路的不同,连接方式分为内部时钟方式和外部时钟方式。

本设计中采用内部时钟方式。

单片机内部有一个反相放大器,XTAL1、XTAL2分别为反相放大器的输入端和输出端,外接定时反馈元件组成振荡器(内部时钟方式),产生时钟送至单片机内部各元件。

时钟频率越高,单片机控制器的控制节拍就越快,运算速度也就越快。

一般来说单片机内部有一个带反馈的线性反相放大器,外界晶振(或接陶瓷振荡器)和电容就可组成振荡器,如图2-2所示。

加电以后延时一段时间(约10ms)振荡器产生时钟,不受软件控制,图中Y1为晶振,震荡产生的时钟频率主要由Y1确定。

电容C1,C2的作用有两个:

一是帮助振荡器起振,二是对振荡器的频率起微调作用,典型值为30pF。

晶振电路的设计如图2-2所示:

图2-2晶振电路原理图

 

3.5数码显示管的选择

数码显示管用来作为时间的显示输出,一般用7段数码显示管。

本次设计中采用7段共阴数码显示管应用简单、可靠性高、成本低,作为显示输出。

连接时段选信号接在P0口的P0.0~P0.6七个I/O口上,P1口是准双向I/O接口在输出驱动部分具有驱动4个TTL负载的能力,即输出电流不大于400μA,所以在接电阻时选择接510Ω限流电阻。

而在位选方面采用单片机P2口的P2.0~P2.2三个I/O口作为位选信号的输出口。

软件设计

4.1主程序的设计

此程序的及时采用定时器T0和T1中断完成,其余状态循环调用显示子程序。

系统主程序流程图如图3-1所示。

主程序开始

各控制单元赋初值

初始化

调用显示程序

调用键盘扫描程序

调用键值处理程序

         

 

图3-1系统主程序流程图

4.2显示子程序的设计

由于采用软件动态扫描实现数据显示,显示用十进制BCD码的数据对应段码存放在ROM表中。

显示时,先取出70H~75H某一地址中的数据,然后查得对应的显示段码从P0口输出。

P2口将对应的数码管选中,就能显示该地址单元的数据值。

4.3定时器T0、T1中断服务程序的设计

定时器T0用于响铃程序,定时器T1用于计时程序。

当答题剩余5秒种时P3.6口不断取反使喇叭发出一定频率的声音,提示选手。

中断服务程序流程图如图3-2所示。

定时中断服务程序开始

关中断、恢复定时初值

开中断、修改计数单位

到1秒?

置计数初值设备

修改到计时单位

到计时结束?

恢复初值

中断返回

 

N

 

Y

 

N

 

Y

 

图3-2中断服务程序流程图

4.4程序清单

定时器T1时间初值

设50ms时间初值为Z,Z的计算方法为

(216-Z)×12=12×50×103,结果Z=15536D=3CB0H

OKEQU20H;抢答开始标志位

RINGEQU22H;响铃标志位

ORG0000H

AJMPMAIN

ORG0003H

AJMPINT0SUB

ORG000BH

AJMPT0INT

ORG0013H

AJMPINT1SUB

ORG001BH

AJMPT1INT

ORG0040H

MAIN:

MOVR1,#30;初设抢答时间为30s

MOVR2,#60;初设答题时间为60s

MOVTMOD,#11H;设置定时器T0/T1模式1

MOVTH0,#0F0H

MOVTL0,#0FFH;越高发声频率越高,越尖

MOVTH1,#3CH

MOVTL1,#0B0H;50ms为一次溢出中断

SETBEA

SETBET0

SETBET1

SETBEX0

SETBEX1;允许四个中断,T0/T1/INT0/INT1

CLROK

CLRRING

SETBTR1

SETBTR0;一开始就运行定时器,以开始显示FFF

=====查询程序=====

START:

MOVR5,#0BH

MOVR4,#0BH

MOVR3,#0BH

ACALLDISPLAY;未开始抢答时候显示FFF

JBP3.0,NEXT;ddddddd

ACALLDELAY

JBP3.0,NEXT

ACALLBARK;按键发声

MOVA,R1

MOVR6,A;送R1->R6,因为R1中保存了抢答时间

SETBOK;抢答标志位,用于COUNT只程序中判断是否查询抢答

MOVR3,#0AH;抢答只显示计时,灭号数

AJMPCOUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面

NEXT:

JNBP1.0,FALSE1

JNBP1.1,FALSE2

JNBP1.2,FALSE3

JNBP1.3,FALSE4

AJMPSTART

TZ1:

JMPFALSE7

TZ2:

JMPFALSE8

=====非法抢答处理程序=====

FALSE1:

ACALLBARK;;按键发声

MOVR3,#01H

AJMPERROR

FALSE2:

ACALLBARK

MOVR3,#02H

AJMPERROR

FALSE3:

ACALLBARK

MOVR3,#03H

AJMPERROR

FALSE4:

ACALLBARK

MOVR3,#04H

AJMPERROR

=====INT0(抢答时间R1调整程序)=====

INT0SUB:

MOVA,R1

MOVB,#0AH

DIVAB

MOVR5,A

MOVR4,B

MOVR3,#0AH

ACALLDISPLAY;先在两个时间LED上显示R1

JNBP3.4,INC0;P3.4为+1s键,如按下跳到INCO

JNBP3.5,DEC0;P3.5为-1s键,如按下跳到DECO

JNBP3.1,BACK0;P3.1为确定键,如按下跳到BACKO

AJMPINT0SUB

INC0:

MOVA,R1

CJNEA,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。

MOVR1,#00H

ACALLDELAY1

AJMPINT0SUB

ADD0:

INCR1

ACALLDELAY1

AJMPINT0SUB

DEC0:

MOVA,R1

JZSETR1;如果R1为0,R1就置99

DECR1

ACALLDELAY1

AJMPINT0SUB

SETR1:

MOVR1,#63H

ACALLDELAY1

AJMPINT0SUB

BACK0:

RETI

=====INT1(回答时间R2调整程序)=====

INT1SUB:

MOVA,R2

MOVB,#0AH

DIVAB

MOVR5,A

MOVR4,B

MOVR3,#0AH

ACALLDISPLAY

JNBP3.4,INC1

JNBP3.5,DEC1

JNBP3.1,BACK1

AJMPINT1SUB

INC1:

MOVA,R2

CJNEA,#63H,ADD1

MOVR2,#00H

ACALLDELAY1

AJMPINT1SUB

ADD1:

INCR2

ACALLDELAY1

AJMPINT1SUB

DEC1:

MOVA,R2

JZSETR2

DECR2

ACALLDELAY1

AJMPINT1SUB

SETR2:

MOVR2,#63H

ACALLDELAY1

AJMPINT1SUB

BACK1:

RETI

===倒计时程序(抢答倒计时和回答倒计时都跳到改程序)===

COUNT:

MOVR0,#00H;重置定时器中断次数

MOVTH1,#3CH

MOVTL1,#0B0H;重置定时器

RECOUNT:

MOVA,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6

MOVB,#0AH

DIVAB;除十分出个位/十位

MOV30H,A;十位存于(30H)

MOV31H,B;个位存于(31H)

MOVR5,30H;取十位

MOVR4,31H;取个位

MOVA,R6

SUBBA,#07H

JNCLARGER;大于5s跳到LARGER,小于等于5s会提醒

MOVA,R0

CJNEA,#0AH,FULL1s中0.5s向下运行

CLRRING

AJMPCHECK

FULL:

CJNEA,#14H,CHECK下面是1s的情况,响并显示号数并清R0,重新计

SETBRING

MOVA,R6

JZQUIT;计时完毕

MOVR0,#00H

DECR6;一秒标志减1

AJMPCHECK

LARGER:

MOVA,R0

CJNEA,#14H,CHECK如果1s向下运行,否者跳到查"停/显示"

DECR6;计时一秒R6自动减1

MOVR0,#00H

CHECK:

JNBP3.1,QUIT;如按下停止键退出

ACALLDISPLAY

JBOK,ACCOUT如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)

AJMPRECOUNT

ACCOUT:

JNBP1.0,TRUE1

JNBP1.1,TRUE2

JNBP1.2,TRUE3

JNBP1.3,TRUE4

JNBP1.4,TRUE5

JNBP1.5,TRUE6

JNBP1.6,TZ3

JNBP1.7,TZ4

AJMPRECOUNT

TZ3:

JMPTRUE7

TZ4:

JMPTRUE8

QUIT:

CLROK;如果按下了"停止键"执行的程序

CLRRING

AJMPSTART

=====正常抢答处理程序=====

TRUE1:

ACALLBARK;按键发声

MOVA,R2

MOVR6,A;抢答时间R2送R6

MOVR3,#01H

CLROK因为答题的计时不再查询抢答,所以就锁了抢答

AJMPCOUNT

TRUE2:

ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#02H

CLROK

AJMPCOUNT

TRUE3:

ACALLBARK;

MOVA,R2

MOVR6,A

MOVR3,#03H

CLROK

AJMPCOUNT

TRUE4:

ACALLBARK;

MOVA,R2

MOVR6,A

MOVR3,#04H

CLROK

AJMPCOUNT

=====犯规抢答程序=====

ERROR:

MOVR0,#00H

MOVTH1,#3CH

MOVTL1,#0B0H

MOV34H,R3;犯规号数暂存与(34H)

HERE:

MOVA,R0

CJNEA,#0AH,FLASH;0.5s向下运行->灭并停响

CLRRING

MOVR3,#0AH

MOVR4,#0AH

MOVR5,#0AH;三灯全灭

AJMPCHECK1

FLASH:

CJNEA,#14H,CHECK1下面是1s的情况,响并显示号数并清R0,重新计

SETBRING

MOVR0,#00H

MOVR3,34H;取回号数

MOVR5,#0BH

MOVR4,#0BH;显示FF和号数

AJMPCHECK1

CHECK1:

JNBP3.1,QUIT1

ACALLDISPLAY

AJMPHERE

QUIT1:

CLRRING

CLROK

AJMPSTART

=====显示程序=====

DISPLAY:

MOVDPTR,#DAT1查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,

MOVA,R3

MOVCA,@A+DPTR

MOVP2,#0feH

MOVP0,A

ACALLDELAY

MOVDPTR,#DAT2

MOVA,R5

MOVCA,@A+DPTR

MOVP2,#0fdH

MOVP0,A

ACALLDELAY

MOVA,R4

MOVCA,@A+DPTR

MOVP2,#0fbH

MOVP0,A

ACALLDELAY

RET

DAT1:

DB00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

;"灭","1","2","3","4","5","6","7","8","9","灭","F"

DAT2:

DB3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

;第一个为零,其他与上相同,因为十位如果为零显示熄灭

====加减时间延时(起到不会按下就加N个数)======

DELAY1:

MOV35H,#08H

LOOP0:

ACALLDISPLAY

DJNZ35H,LOOP0

RET

=====延时(显示和去抖动用到)=====

DELAY:

MOV32H,#12H

LOOP:

MOV33H,#0AFH

LOOP1:

DJNZ33H,LOOP1

DJNZ32H,LOOP

RET

=====发声程序=====

BARK:

SETBRING

ACALLDELAY1

ACALLDELAY1

CLRRING;按键发声

RET

=====TO溢出中断(响铃程序)=====

T0INT:

MOVTH0,#0ECH

MOVTL0,#0FFH

JNBRING,OUT;

CPLP3.6;RING标志位为1时候P3.6口不断取反使喇叭发出一定频率的声音

OUT:

RETI

=====T1溢出中断(计时程序)=====

T1INT:

MOVTH1,#3CH

MOVTL1,#0B0H

INCR0

RETI

END

结束语

经过将近二周的单片机课程设计,终于完成了四路抢答器的设计,虽然没有完全达到设计要求,但还是收获良多。

通过这次课程设计,使我更进一步地熟悉了单片机芯片的工作原理和其具体的使用方法。

单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,这锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。

还有了解了课程设计的一般步骤,和设计中应注意的问题。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

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

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1