单片机八位抢答器课程设计报告

更新时间:2024-05-16 12:55:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目录

第1章 设计题目分析、方案 ........................................................... - 2 -

1.1 设计任务与要求 ....................................................................................... - 2 - 1.2 单片机的控制原理 ................................................................................... - 2 - 1.3 方案设计 ................................................................................................... - 4 - 1.4 AT89C51引脚分配 .................................................................................. - 5 -

第2章 系统电路设计 ........................................................................ - 6 -

2.1 时钟模块以及复位电路模块 ................................................................... - 6 - 2.2 显示电路模块 ........................................................................................... - 7 - 2.3 抢答输入模块 ........................................................................................... - 8 - 2.4 控制模块 ................................................................................................... - 8 - 2.5 提示模块 ................................................................................................... - 9 - 2.6 总电路图 .................................................................................................. - 11 -

第3章 系统软件设计 ...................................................................... - 12 -

3.1 系统主程序设计 ..................................................................................... - 12 - 3.2 程序流程图 ............................................................................................. - 13 - 3.3 源程序 ..................................................................................................... - 14 -

第4章 连接调试 .............................................................................. - 26 -

4.1 源程序的编译 ......................................................................................... - 26 - 4.2 peotues的仿真 ....................................................................................... - 27 -

第5章 总结 ...................................................................................... - 29 -

- 1 -

第1章 设计题目分析、方案

1.1 设计任务与要求

以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。

设置一个系统清除和抢答控制开关S,开关由主持人控制。

抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。 当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。

参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。 如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

1.2 单片机的控制原理

单片机(SCM)是单片微型计算机(Single Chip Microcomputer)的简称。它是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。它的最大优点是体积小,可放在仪表内部。但存储量小,输入输出适配器简单,功能较低。目前,单片机在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。

简单的说,用单片机系统来设计抢答器,实现两组的抢答时间即使是相差几微秒,也可分辨出哪组优先答题。

- 2 -

P0端口(P0.0-P0.7):P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,

P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1端口(P1.0-P1.7):P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高电平,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2端口(P2.0-P2.7): P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3端口(P3.0-P3.7):P3口管脚是一个带有内部上拉电阻的8位的双向I/O端口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入端时,由于外部下拉为低电平,P3口将输出电流(I LL)。

通过键盘改变抢答的时间,原理与闹钟时间的设定相同,将定时时间的变量置为全局变量后,通过键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。同时单片机不断进行按键扫描,当参赛选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间分别显示在LED上。

- 3 -

1.3 方案设计

在设计时将抢答器分为如下几个模块:时钟模块,复位电路模块,显示电路模块,抢答输入模块,控制模块和提示模块,由以上模块和AT89C51构成抢答系统。

该八位抢答器以MCS-51系列单片机AT89C51作为控制核心。其片内带有4K的ROM,128字节的RAM。其可以完成运算控制、信号识别以及显示功能的实现。利用单片机程序判断选手按键是否有效,但是选手违规抢答,利用简答程序显示,启动扬声器报警,告诉主持人有人违规操作,抢答无效。给出相应的延时,选手按正常的操作抢答,软件倒计时,利用AT89C51移位寄存八段数码管,实现倒计时显示时间,到5秒相应时间提醒选手时间快到了,要及时作答,并启动扬声器和灯光。

数字抢答器系统设计是借用单片机采用模块化设计的八路抢答器,包括8路抢答按纽、计时显示、提示功能、开始与结束控制按钮、时限设定、各种相关显示调控功能等。

参赛者系统,除享有抢答按纽的权利功能外,还有人性化的提示功能和时间提示功能,也可设定由主控控制在参赛者终端表现的趣味性功能等;主控系统的控制按钮做开始与结束控制,根据活动参赛者的层次,对提前抡答者的行为设定为非法或阻隔,若设有非法抢答控制功能时,在主控处带有公示性显示的非法抡答者的台位号,对抢答限时及回答问题限时设为倒计,并有显示提示。

时钟 AT89C51复位电路 开始、结束 按键输入 调抢答时间和 调答题时间输入 七段数码管显示 单片机声音灯光提示电路 8路抢答 按键输入 抢答系统方框图

- 4 -

1.4 AT89C51引脚分配

8路抢答按键输入模块:8路抢答按键输入由8个开关与AT89C51的P1口相连,每一路开关与AT89C51 的P1口的每一个引脚一一对应相连。

提示电路模块:灯光提示模块由AT89C51的P3.6引脚输出,声音提示模块由AT89C51的P3.7引脚输出

显示电路模块:显示模块由三个八段数码管显示抢答选手编号和抢答时间以及答题时间的显示,由AT89C51得P0口输出控制八段数码管的显示,由P2.0、P2.1和P2.2作为三个八段数码管的位选控制

控制模块:控制模块包括复位电路、开始、结束按键输入以及调节抢答时间和调节答题时间输入,其中复位电路由AT89C51的rst引脚控制;开始、结束按键输入控制,开始由AT89C51的P3.0控制,结束由AT89C51的P3.1控制;调节抢答时间和调节答题时间输入控制,调节抢答时间由AT89C51的P3.2控制,调节答题时间由AT89C51的P3.3控制,P3.4控制加时间,P3.5控制减时间。

- 5 -

第2章 系统电路设计

2.1 时钟模块以及复位电路模块

单片机必须在时钟的驱动下才能工作。在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。

一般选用石英晶体振荡器。此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。电路中两个电容 C1、C2的作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调。C1、C2的典型值为30uF。

单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数,常用fosc表示。图中时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12μs。

单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,

由按键S8以及电解电容C3构成按键及上电复位电路。由于单片机是高电平复位,所以当按键S8按下时候,单片机的9脚RESET管脚处于高电平,此时单片机处于复位状态。当上电后,由于电容的缓慢充电,单片机的9脚电压逐步由高向低转化,经过一段时间后,单片机的9脚处于稳定的低电平状态,此时单片机上电复位完毕,系统程序从0000H开始执行。

时钟模块以及复位电路模块的电路图如下所示:

- 6 -

时钟模块以及复位模块电路图

2.2 显示电路模块

此模块显示采用数码管,违规者编号、抢答30秒倒计时、正常抢答者编号和回答问题时间60秒倒计时,数码管采用动态显示。查询显示程序利用P0口做段选码口输出P2低3位做位选码输出,当为低电平则能驱动数码管使其显示数字。在+5V电压下接10k的电阻,保证正常压降。其电路图如下:

显示模块电路图

- 7 -

2.3 抢答输入模块

AT89C51的P1口做一个为选手抢答的输入按键引脚,P1.0至P1.7轮流输出低电位,给每一个选手编号1至8,当选手按下按钮时,P1口个端口的电平变化从P1口输入,经单片机处理后从P0输出由数码管显示抢答者编号。

抢答输入模块

2.4 控制模块

控制模块要完成以下功能:

1)、要主持人按下开始按钮重可以开始抢答。

2)、答题结束后,主持人按下停止按钮既可停止为进行下一轮的抢答做准备。

3)、能进行对选手抢答时间的调整和选手答题时间的调整。

- 8 -

控制模块电路图

2.5 提示模块

提示模块要完成以下功能:

1)、主持人将控制开关拨到\开始\位置时,扬声器发声和LED灯闪烁一下。 2)、选手正常抢答后扬声器发声和LED灯闪烁一下。

3)、选手未按下开始按钮前抢答,扬声器不断发一定频率的声音和LED灯不断闪烁。

4)、在抢答和答题倒计时最后5秒时,扬声器每一秒发一声,LED灯每一秒闪烁一次。

- 9 -

提示模块电路图

- 10 -

2.6 总电路图

- 11 -

第3章 系统软件设计

3.1 系统主程序设计

为了能够达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前必须先设定抢答的时间,因而在编开始抢答前的程序得先编写设定时间的程序,当时间设好了之后,主持人发布抢答命令按下P3.0按键,程序开始打开定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。当在扫描到有人按下了答题键,马上关闭T0、调用显示程序、封锁键盘。主程序系统结构图如下所示:

系 统 初 始 化 模 块 按 键 模 块 非法抢答模块正确抢答模块调整抢答时间调整回答时间 数据显示模块 主程序系统结构图

- 12 -

3.2 程序流程图

主程序 设置抢答时间和回答问题时间 定时器及并行口初始化 将时间计数器及启动标志值1 开中断 Y 采并行口数据为0吗? N(抢答犯规) 启动标志=1吗? Y(正确抢答) 判断抢答组号 判断哪一组为抢答组 显示抢答组LED灯闪烁,蜂鸣器不停的响 将抢答组号送显示 N 抢答时间到了吗? Y 输出响铃信号提示超时 Y 继续抢答比赛吗? N 系统返回

- 13 -

3.3 源程序

OK EQU 20H;抢答开始标志位 RING EQU 22H;响铃标志位 ORG 0000H AJMP MAIN ORG 0003H AJMP INT0SUB ORG 000BH AJMP T0INT ORG 0013H AJMP INT1SUB ORG 001BH AJMP T1INT ORG 0040H MAIN:

MOV R1,#30;初设抢答时间为30s MOV R2,#60;初设答题时间为60s

MOV TMOD,#11H;设置未定时器/模式1 MOV TH0,#0F0H

MOV TL0,#0FFH;越高发声频率越高,越尖 MOV TH1,#3CH

MOV TL1,#0B0H;50ms为一次溢出中断 SETB EA SETB ET0 SETB ET1 SETB EX0

SETB EX1;允许四个中断,T0/T1/INT0/INT1 CLR OK CLR RING SETB TR1

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

;=====查询程序===== START:

MOV R5,#0BH

- 14 -

MOV R4,#0BH MOV R3,#0BH

ACALL DISPLAY;未开始抢答时候显示FFF JB P3.0,NEXT ACALL DELAY

JB P3.0,NEXT;去抖动,如果\开始键\按下向下执行,否跳到非法抢答查询 ACALL BARK;按键发声 MOV A,R1

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

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

MOV R7,#01H ;读抢答键数据信号标志,这里表示只读一次有用信号 MOV R3,#0AH;抢答只显示计时,灭号数

AJMP COUNT;进入倒计时程序,\查询有效抢答的程序\在COUNT里面 NEXT:

JNB P1.0,FALSE1 JNB P1.1,FALSE2 JNB P1.2,FALSE3 JNB P1.3,FALSE4 JNB P1.4,FALSE5 JNB P1.5,FALSE6 JNB P1.6,FALSE7 JNB P1.7,FALSE8 AJMP START

;=====非法抢答处理程序===== FALSE1:

MOV R3,#01H AJMP ERROR FALSE2:

MOV R3,#02H AJMP ERROR FALSE3:

MOV R3,#03H AJMP ERROR FALSE4:

MOV R3,#04H AJMP ERROR

- 15 -

FALSE5:

MOV R3,#05H

AJMP ERROR FALSE6:

MOV R3,#06H AJMP ERROR FALSE7:

MOV R3,#07H AJMP ERROR FALSE8:

MOV R3,#08H AJMP ERROR

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

MOV A,R1 MOV B,#0AH DIV AB MOV R5,A MOV R4,B MOV R3,#0AH

ACALL DISPLAY;先在两个时间LED上显示R1 JNB P3.4,INC0;P3.4为+1s键,如按下跳到INCO JNB P3.5,DEC0;P3.5为-1s键,如按下跳到DECO

JNB P3.1,BACK0;P3.1为确定键,如按下跳到BACKO AJMP INT0SUB INC0:

MOV A,R1

CJNE A,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0 MOV R1,#00H IN0:

ACALL DISPLAY JNB P3.4,IN0 AJMP INT0SUB ADD0:

INC R1

- 16 -

AD0:

ACALL DISPLAY JNB P3.4,AD0

AJMP INT0SUB DEC0:

MOV A,R1

JZ SETR1;如果R1为0, R1就置99, DEC R1 DC0:

ACALL DISPLAY JNB P3.5,DC0 AJMP INT0SUB SETR1:

MOV R1,#63H ST1:

ACALL DISPLAY JNB P3.5,ST1 ACALL DELAY1 AJMP INT0SUB BACK0: RETI

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

MOV A,R2 MOV B,#0AH DIV AB MOV R5,A MOV R4,B MOV R3,#0AH ACALL DISPLAY JNB P3.4,INC1 JNB P3.5,DEC1 JNB P3.1,BACK1 AJMP INT1SUB INC1:

- 17 -

IN1:

MOV A,R2

CJNE A,#63H,ADD1 MOV R2,#00H

ACALL DISPLAY JNB P3.4,IN1 AJMP INT1SUB ADD1:

INC R2 AD1:

ACALL DISPLAY JNB P3.4,AD1 AJMP INT1SUB DEC1:

MOV A,R2 JZ SETR2 DEC R2

ACALL DELAY1 AJMP INT1SUB SETR2:

MOV R2,#63H ACALL DELAY1 AJMP INT1SUB BACK1: RETI

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

MOV A,R2 ;使用锦囊时重新计时 MOV R6,A CLR RING COUNT:

MOV R0,#00H;重置定时器中断次数 MOV TH1,#3CH

MOV TL1,#0B0H;重置定时器 RECOUNT:

- 18 -

MOV A,R6;R6保存倒计时的时间,之前先将抢答时间或回答时间给R6 MOV B,#0AH

DIV AB;除十分出个位/十位 MOV 30H,A;十位存于(30H) MOV 31H,B;个位存于(31H)

MOV R5,30H;取十位 MOV R4,31H;取个位 MOV A,R6 SUBB A,#07H

JNC L ARGER;大于5s跳到LARGER,小于等于5s会提醒 MOV A,R0

CJNE A,#0AH,FULL;1s中0.5s向下运行 CLR RING AJMP CHECK FULL:

CJNE A,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计 SETB RING MOV A,R6

JZ QUIT;计时完毕 MOV R0,#00H

DEC R6;一秒标志减1 AJMP CHECK LARGER:

MOV A,R0

CJNE A,#14H,CHECK;如果1s向下运行,否者跳到查\停/显示\ DEC R6;计时一秒R6自动减1 MOV R0,#00H CHECK:

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

JNB OK,CHECKK ;只在回答倒计时才有效 AJMP NEXTT CHECKK:

JNB P3.0,REPEAT ;判断是否使用锦囊 NEXTT:

ACALL DISPLAY

- 19 -

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

MOV A,36H

JNB ACC.0,TRUE1

JNB ACC.1,TRUE2 JNB ACC.2,TRUE3 JNB ACC.3,TRUE4 JNB ACC.4,TRUE5 JNB ACC.5,TRUE6 JNB ACC.6,TZ1 JNB ACC.7,TZ2 AJMP RECOUNT TZ1:

JMP TRUE7 TZ2:

JMP TRUE8 QUIT:

CLR OK;如果按下了\停止键\执行的程序 CLR RING AJMP START

;=====正常抢答处理程序===== TRUE1:

ACALL BARK MOV A,R2

MOV R6,A;抢答时间R2送R6 MOV R3,#01H

CLR OK;因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT TRUE2:

ACALL BARK MOV A,R2 MOV R6,A MOV R3,#02H

- 20 -

CLR OK

AJMP COUNT TRUE3:

ACALL BARK MOV A,R2 MOV R6,A MOV R3,#03H

CLR OK

AJMP COUNT TRUE4:

ACALL BARK MOV A,R2 MOV R6,A MOV R3,#04H CLR OK

AJMP COUNT TRUE5:

ACALL BARK MOV A,R2 MOV R6,A MOV R3,#05H CLR OK

AJMP COUNT TRUE6:

ACALL BARK MOV A,R2 MOV R6,A MOV R3,#06H CLR OK

AJMP COUNT TRUE7:

ACALL BARK MOV A,R2 MOV R6,A MOV R3,#07H

- 21 -

CLR OK

AJMP COUNT TRUE8:

ACALL BARK MOV A,R2 MOV R6,A MOV R3,#08H CLR OK

AJMP COUNT ;=====犯规抢答程序===== ERROR:

MOV R0,#00H MOV TH1,#3CH MOV TL1,#0B0H

MOV 34H,R3;犯规号数暂存与(34H) HERE:

MOV A,R0

CJNE A,#06H,FLASH;0.3s向下运行->灭并停响 CLR RING MOV R3,#0AH MOV R4,#0AH

MOV R5,#0AH;三灯全灭 AJMP CHECK1 FLASH:

CJNE A,#0CH,CHECK1 SETB RING MOV R0,#00H

MOV R3,34H;取回号数 MOV R5,#0BH

MOV R4,#0BH;显示FF和号数 AJMP CHECK1 CHECK1:

JNB P3.1,QUIT1 ACALL DISPLAY AJMP HERE

- 22 -

QUIT1:

CLR RING CLR OK

AJMP START ;=====显示程序===== DISPLAY:

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

MOV A,R3

MOVC A,@A+DPTR MOV P2,#0feH MOV P0,A

ACALL DELAY2 MOV DPTR,#DAT2 MOV A,R5

MOVC A,@A+DPTR MOV P2,#0fdH MOV P0,A

ACALL DELAY2 MOV A,R4

MOVC A,@A+DPTR MOV P2,#0fbH MOV P0,A

ACALL DELAY2 RET DAT1:

DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H ;\灭\灭\DAT2:

DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H ;第一个为零,其他与上相同,因为十位如果为零显示熄灭 ;====加减时间延时(起到不会按下就加N个数)====== DELAY1:

MOV 35H,#08H LOOP0:

- 23 -

ACALL DISPLAY DJNZ 35H,LOOP0 RET

;=====延时4236个机器周期(去抖动用到)===== DELAY:

MOV 32H,#12H LOOP:

MOV 33H,#0AFH LOOP1:

DJNZ 33H,LOOP1

DJNZ 32H,LOOP RET

;=====延时4236个机器周期(显示用到)===== DELAY2:

MOV 32H,#43H LOOP3:

MOV 33H,#1EH

MOV A,R7 ;每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转到正常抢答处理

JNZ AAAA1 ;没读到有效数据时继续转到AAAA1 LOOP2:

DJNZ 33H,LOOP2 DJNZ 32H,LOOP3 RET

;=====读抢答按键数据口程序=====

;由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口

;然而在检测按键口时动态扫描要调用三次(4ms)延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号最低.

;故采用在延时子程序中加了读数据口程序.保证了灵敏度和可靠性 AAAA1:

MOV A,P1

CJNE A,#0FFH,AA1 ;当不全为1时的数据为有效数据 AA0:

MOV 36H,A ;将有效数据送到36H暂存

- 24 -

AJMP LOOP2 AA1:

DEC R7 AJMP AA0 ;=====发声程序===== BARK:

SETB RING

ACALL DELAY1 ACALL DELAY1 CLR RING;按键发声 RET

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

MOV TH0,#0ECH MOV TL0,#0FFH JNB RING,OUT;

CPL P3.6; RING标志位为1时候P3.6口不断取反使led灯闪烁 CPL P3.7 ;RING标志位为1时候P3.7口不断取反使喇叭发出声音 OUT:

RETI

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

MOV TH1,#3CH MOV TL1,#0B0H INC R0 RETI END

- 25 -

第4章 连接调试

4.1 源程序的编译

在keil中新建一个工程,选择AT89C51芯片,对源程序编译时选择生成.hex文件,如下图所示:

选择生成hex文件

编译完成

- 26 -

4.2 peotues的仿真

在protues中双击AT89C51,将在keil中编译生成的hex文件下载到AT89C51中,如图所示

完成下载后,点击仿真,如图所示:

初始状态

- 27 -

开始抢答

抢答完成后回答

- 28 -

第5章 总结

- 29 -

- 30 -

- 31 -

本文来源:https://www.bwwdw.com/article/z1n7.html

Top