清华大学
微机原理与接口技术课程
题 目学生姓名专业班级学 号所 在 系指导教师完成时间
设计
___竞赛抢答器课程设计_____ 刘闯 10计科2班 信息工程学院 曾毅 2013 年 1 月 1 日
郑 州 科 技 学 院
微机原理与接口技术课程设计任务书
题目 竞赛抢答器课程设计 专业 计算机科学与技术 班级 _10计科2班__ 学号 201015056 姓名 刘闯
一、基本要求
设计一个具有8路抢答的抢答器,利用并行接口和开关键。逻辑开关K0---K7代表抢答按钮,当某个逻辑开关闭合时,相当于抢答按钮按下,此时在七段数码管上将其号码显示出来,并使喇叭响一声(或者以发光二极管代替)。
二、设计任务
启动计算机,计算机自动为系统各芯片进行初始化,抢答器开始工作。 比赛开始,在主持人按下开始键,绿灯亮后,选手才可开始抢答,否则违规。若选手抢答成功,LED显示器显示选手号码,扬声器鸣叫。若选手抢答违规(主持人未按开妈键),LED显示器显示违规选手号码,红灯亮,扬声器报警,并根据比赛规则进行对该选手进行扣分。若系统提示某号选手抢答违规,主持人仍未按开始键,此时该号选手又按下抢答键,LED显示器显示该选手的号码。本系统开机后,若主持人既未按复位键又未按开始键,此时有选手按下抢答键,系统提示红灯亮,并报警。 1、抢答成功,置8253通道2计数值为1000,扬声器的鸣叫声音频率为1MHz/1000=1KHz。2、抢答失败,置8253通道2计数值为2000,扬声器的鸣叫声音频率为1MHz/2000=0.5KHz。3、扬声器鸣叫或报警的时间为12s。
三、设计时间
___2012__年__12__月__31__日 至 __2013___年__1__月__4__日
指导教师:
教研室主任:
2
目录
一 课程设计的目的和要求.........................2
二 总体设计.....................................2
三 硬件电路设计.................................4
四 软件设计.....................................9
五 仿真调试.....................................20
六 源程序.......................................22
七 总结.........................................28
八 参考文献 ....................................30
3
一、课程设计的目的和要求
单片机原理及应用课程设计是学生综合运用所学知识,全面掌握单片微型计算机及其接口的工作原理、编程和使用方法的重要实践环节。通过独立或协作提出并论证设计方案,进行软、硬件调试,最后获得正确的运行结果,可以加深和巩固对理论教学和实验教学内容的掌握,进一步建立计算机应用系统整体概念,初步掌握单片机软、硬件开发方法。
根据单片机原理及应用课程的要求,主要进行两个方面的设计,即单片机最小系统和存储器扩展设计、接口技术应用设计。其中,单片机最小系统主要要求学生熟悉单片机的内部结构和引脚功能、引脚的使用、复位电路、时钟电路、4个并行接口和一个串行接口的实际应用,从而可构成最小应用系统,并编程进行简单使用。
存储器扩展设计要求学生掌握常用半导体芯片与单片机的接口,如EPROM存储器用作外部程序存储器时与单片机的连接关系,SRAM存储器用作外部数据存储器时与单片机的连接关系,E2PROM存储器用作外部程序/数据存储器时与单片机的连接关系。能合理分配和使用单片机的内部和外部存储器,编程实现正常的读写功能。在进行智力竞赛时,为了具有一种反应准确显示方便的抢答装置,下面设计了一种带有定时功能的多路抢答器。
1、八路抢答,各用一个抢答按钮;
2、设置一个控制开关,该开关由主持人控制;
3、具有数据锁存和显示功能,抢答开始后若有选手按动抢答按钮,编号立即锁存,此外,要封锁输入电路,禁止其他选手抢答。优先抢答选手的编号一直保持到系统清零为止;
4、当主持人按下“开始”按钮,抢答开始。
5、当某一路抢答成功时,在数码管上显示成功信息和该路的号数;
6、当某一路抢答违规时,能在数码管上显示违规信息和号数;
可扩展以下功能:
7、具有定时抢答的功能,选手在设定的时间内抢答有效,且一次抢答的时间设定为30秒,超时扬声器报警;
8、定时抢答的时间到,却没有选手抢答时,本次抢答无效,系统短暂报警,并封锁输入电路,禁止选手超时抢答,时间显示器上显示00。
9、开始开关未动作,在数码管上显示出选手的编号和抢答时刻,同时扬声器给出音响提示,选手抢答无效,并报警,系统复位,重新开始。
二、总体设计
该系统采用51系列单片机AT89C51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩更改。MCS-51单片机特点如下:
<1>可靠性好:单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以写在ROM里,许多信号通道都在同一芯片,因此可靠性高,易扩充。
4
<2>单片机有一般电脑所必须的器件,如三态双向总线,串并行的输入及输出引脚,
可扩充为各种规模的微电脑系统。
<3> 控制功能强:单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的
条件分支跳跃指令。其原理框图如下:
如图所示为电路框图。其工作原理为:接通电源后,主持人将开关拨到“清除”
状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;主持人将开关
置,“开始”状态,宣布“开始”抢答器工作。定时器倒计时,扬声器给出声响提示。
选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器提
示。当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。如果再次抢答必须由主持人再次操作“开始、停止”状态开关。
(一)功能介绍
1、如果想调节抢答时间或答题时间,按"抢答时间调节"键或"答题时间调节"键进
入调节状态,此时会显示现在设定的抢答时间或回答时间值,如想加一秒按一下"加1s"
键,如果想减一秒按一下"-1s"键,时间LED上会显示改变后的时间,调整范围为0s~99s,
0s时再减1s会跳到99,99s时再加1s会变到0s。
2、主持人按"抢答开始"键,会有提示音,并立刻进入抢答倒计时(预设30s抢答
时间),如有选手抢答,会有提示音,并会显示其号数并立刻进入回答倒计时(预设60s
抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。倒数时间到小于5s
会每秒响一下提示音。
3、如倒计时期间,主持人想停止倒计时可以随时按"停止"按键,系统会自动进入
准备状态,等待主持人按"抢答开始"进入下次抢答计时。
4、如果主持人未按"抢答开始"键,而有人按了抢答按键,犯规抢答,LED上不断
闪烁FF和犯规号数并响个不停,直到按下"停止" 键为止。
5、P3.0为开始抢答,P3.1为停止,p1.0-p1.7为八路抢答输入 数码管段选P0
口,位选P2口低3位,蜂鸣器输出为P3.6口。P3.2抢答时间调整结,P3.3回答时间
调整,P3.4为时间加1调整,P3.5为时间减1调整。
(二)抢答器的工作原理
抢答器的工作原理是利用单片机的定时器T0、T1中断完成,其余状态循环调用显
5
示子程序,用4个共阴极LED数码管来显示,用P0口作为数码管的八个段选,用P2口中的P2.0、P2.1、P2.2、作为4个数码管其中3个位选,P1口接8个按键,提供选手抢答,P3.0-P3.5四个接四个按键,提供开始、结束、答题时间调整、抢答时间调整,加1、减1调整之用。
抢答功能:
通过八路按键配合程序来实现抢答功能。当主持人按下抢答键开始抢答后,此时任一路按下按钮均闭锁其它各路,由程序对键盘译码并显示最先按下抢答键的路数及其当前时间。
抢答限时:
主持人按下抢答键后,设置30秒为抢答时间(此时间可在1-99秒之间修改)。若30秒内无人抢答,倒计时为5时发出报警,说明该抢答题目作废。此时闭锁所有抢答按键,只有当主持人再次按下抢答键开始下一次抢答方可抢答。
答题限时:
当选手按下按钮时,启动倒计时(此倒计时时间可在1~99秒之间修改),倒计时为5时发出报警,说明答题时间到。
三、硬件电路设计
1.原理图的确定
单片机实现抢答的原理图:
抢答电路的接口电路
2.抢答器电路
6
参考电路如上图所示。该电路完成两个功能:一是分辨出选手按键的先后,并锁存
优先抢答者的编号,同时译码显示电路显示编号;二是禁止其他选手按键操作无效。
如有再次抢答需由主持人将S开关重新置,“清除”然后再进行下一次抢答。
3.时序控制电路设计
a.主持人将控制开关拨到"开始"位置时,扬声器发声,抢答电路和定时电路进人正
常抢答工作状态。b.当参赛选手按动抢答键时,扬声器发声,抢答电路和定时电路停
止工作
4.复位电路的设计
外部中断和内部中断并存,单片机硬件复位端,只要持续4个机器周期的高电平即
可实现复位,硬件复位后的各状态可知寄存器以及存储器的值都恢复到了初始值,因
为本设计中功能中有倒计时时间的记忆功能,所以不能对单片机进行硬件复位,只能
用软件复位,软件复位实际上就是当程序执行完之后,将程序通过一条跳转指令让它
完成复位。复位电路如图3所示:
复位电路原理图
5. 晶振电路的设计
MSC-51单片机的定时控制功能是用时钟电路和振荡器完成的,
而根据硬件电路的
7
不同,连接方式分为内部时钟方式和外部时钟方式。本设计中采用内部时钟方式。
单片机内部有一个反相放大器,XTAL1、XTAL2分别为反相放大器的输入端和输出端,外接定时反馈元件组成振荡器(内部时钟方式),产生时钟送至单片机内部各元件。时钟频率越高,单片机控制器的控制节拍就越快,运算速度也就越快。
一般来说单片机内部有一个带反馈的线性反相放大器,外界晶振(或接陶瓷振荡器)和电容就可组成振荡器,如图2-2所示。加电以后延时一段时间(约10ms)振荡器产生时钟,不受软件控制,图中Y1为晶振,震荡产生的时钟频率主要由Y1确定。电容C1,C2的作用有两个:一是帮助振荡器起振,二是对振荡器的频率起微调作用,典型值为30pF。
晶振电路的设计如图2-2所示:
晶振电路原理图
6. 报警电路设计
报警电路用于报警,当遇到报警信号时,发出警报。一般喇叭是一种电感性图5报警电路图。8951驱动喇叭的信号为各种频率的脉冲。因此,最简单的喇叭驱动方式就是利用达林顿晶体管,或者以两个常用的小晶体管连接成达林顿架势。在右图中电阻R为限流电阻,在此利用晶体管的高电流增益,以达到电路快速饱和的目的。不过,如果要由P0输出到此电路,还需要连接一个10K的上拉电阻。
选手在设定的时间内抢答时,实现:优先判断、编号锁存、编号显示、扬声器提示。当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。如果再次抢答必须由主持人再次作"清除"和"开始"状态开关。
7.选手抢答键(矩阵式键盘)
AT89C51的P1口做一个为选手抢答的输入按键引脚,P1.0至P1.7轮流输出低电位,给每一个选手编号1至8,当选手按下按钮时,P1口个端口的电平变化从P1口输入,经单片机处理后从P0输出由数码管显示抢答者编号。
8
8.显示与显示驱动电路
此电路包括显示和驱动,显示采用数码管,驱动用P2口, 违规者编号、抢答30秒倒计时、正常抢答者编号和回答问题时间60秒倒计时,数码管采用动态显示。驱动电路P2口,查询显示程序利用P0口做段选码口输出P2低3位做位选码输出,当为低电平则能驱动数码管使其显示数字。在+5V电压下接10k的电阻,保证正常压降。
四、软件设计
1、系统主程序设计
为了能够达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前必须先设定抢答的时间,因而在编开始抢答前的程序得先编写设定时间的程序,当时间设好了之后,主持人发布抢答命令按下P1.7按键,程序开始打开定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。当在扫描到有人按下了答题键,马上关闭T0、调用显示程序、封锁键盘。
9
系统主程序流程图
2. 显示抢答违规流程图
10
3. 抢答成功流程图
4. 程序清单
定时器T1时间初值
设50ms时间初值为Z,Z的计算方法为
11
(216- Z)×12=12×50×103,结果Z=15536D=3CB0H
OK EQU 20H ;抢答开始标志位
RING EQU 22H ;响铃标志位
DATA0 EQU 36H ;抢答按键口数据存放地址
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 ;一开始就运行定时器,以开始显示PPP.如果想重新计数,重置TH1/TL1就可以了;查询程序
START: MOV DATA0,#0FFH ;初始化
MOV R5,#0BH
MOV R4,#0BH
MOV R3,#0BH
ACALL DISPLAY ;未开始抢答时候显示PPP
JNB P3.3 ,INT0SUB
JNB P3.4,TZ1 ;倒计时调整
JB P3.0,NEXT ;ddddddd
ACALL DELAY
JB P3.0,NEXT ;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询 SETB EX0 ;开放INT0
ACALL BARK ;按键发声
12
MOV A,R1
MOV R6,A ;送R1->R6,因为R1中保存了抢答时间
SETB OK ;抢答标志位,用于COUNT只程序中判断是否查询抢答(在使用锦囊时用作判断是抢答倒计时还是回答倒计时)
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,TZ1
JNB P1.7,TZ2
AJMP START
TZ1: JMP FALSE7
TZ2: JMP FALSE8
FALSE1: ACALL BARK
MOV R3,#01H
AJMP ERROR
FALSE2: ACALL BARK
MOV R3,#02H
AJMP ERROR
FALSE3: ACALL BARK
MOV R3,#03H
AJMP ERROR
FALSE4: ACALL BARK
MOV R3,#04H
AJMP ERROR
FALSE5: ACALL BARK
MOV R3,#05H
AJMP ERROR
FALSE6: ACALL BARK
MOV R3,#06H
AJMP ERROR
FALSE7: ACALL BARK
MOV R3,#07H
AJMP ERROR
FALSE8: ACALL BARK
MOV R3,#08H
AJMP ERROR
INT0SUB: MOV A,R1
MOV B,#0AH
DIV AB
;非法抢答处理程序 ;按键发声 ;INT0(抢答时间R1调整程序) 13
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
MOV R1,#00H
ACALL DELAY1
AJMP INT0SUB
ADD0: INC R1
ACALL DELAY1
AJMP INT0SUB
DEC0: MOV A,R1
JZ SETR1
DEC R1
ACALL DELAY1
AJMP INT0SUB
SETR1: MOV R1,#63H
ACALL DELAY1
AJMP INT0SUB
BACK0: RETI
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: MOV A,R2
CJNE A,#63H,ADD1
MOV R2,#00H
ACALL DELAY1
AJMP INT1SUB
ADD1: INC R2
ACALL DELAY1
AJMP INT1SUB
;如果不是99,R2加1,如果加到99,R1就置0,重新加起。 ;如果R1为0, R1就置99, ;INT1(回答时间R2调整程序) 14
DEC1: MOV A,R2
JZ SETR2
DEC R2
ACALL DELAY1
AJMP INT1SUB
SETR2: MOV R2,#63H ACALL DELAY1 AJMP INT1SUB
BACK1: RETI ;倒计时程序(抢答倒计时和回答倒计时都跳到改程序) COUNT: MOV R0,#00H MOV TH1,#3CH
MOV TL1,#0B0H RECOUNT: MOV A,R6 给R6
MOV B,#0AH
DIV AB MOV 30H,A MOV 31H,B MOV R5,30H MOV R4,31H MOV A,R6 SUBB A,#07H
JNC LARGER MOV A,R0
CJNE A,#0AH,FULL CLR RING AJMP CHECK
FULL: CJNE A,#14H,CHECK SETB RING
MOV A,R6
JZ QUIT MOV R0,#00H
DEC R6 AJMP CHECK
LARGER: MOV A,R0
CJNE A,#14H,CHECK DEC R6 MOV R0,#00H
CHECK: JNB P3.1,QUIT ACALL DISPLAY
JB OK,ACCOUT AJMP RECOUNT
ACCOUT: MOV A,DATA0 JNB P1.0,TRUE1 ;重置定时器中断次数 ;重置定时器 ;R6保存了倒计时的时间,之前先将抢答时间或回答时间 ;除十分出个位/十位 ;十位存于(30H) ;个位存于(31H) ;取十位 ;取个位 ;大于5s跳到LARGER,小于等于5s会提醒 ;1s中0.5s向下运行 ;下面是1s的情况,响并显示号数并清R0,重新计 ;计时完毕 ;一秒标志减1 ;如果1s向下运行,否者跳到查"停/显示" ;计时一秒R6自动减1 ;如按下停止键退出 ;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数 15
JNB P1.1,TRUE2 JNB P1.2,TRUE3 JNB P1.3,TRUE4 JNB P1.4,TRUE5 JNB P1.5,TRUE6 JNB P1.6,TZ3 JNB P1.7,TZ4 AJMP RECOUNT
TZ3: JMP TRUE7 TZ4: JMP TRUE8 QUIT: CLR OK CLR RING
AJMP START TRUE1: ACALL BARK MOV A,R2
MOV R6,A MOV R3,#01H
CLR OK AJMP COUNT
TRUE2:ACALL BARK; MOV A,R2
MOV R6,A
MOV R3,#02H
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; ;如果按下了"停止键"执行的程序 ;正常抢答处理程序 ;按键发声 ;抢答时间R2送R6 ;因为答题的计时不再查询抢答,所以就锁了抢答 16
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 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 HERE: MOV A,R0
CJNE A,#0AH,FLASH CLR RING MOV R3,#0AH MOV R4,#0AH
MOV R5,#0AH AJMP CHECK1
FLASH: CJNE A,#14H,CHECK1 SETB RING
MOV R0,#00H
MOV R3,34H MOV R5,#0BH
MOV R4,#0BH AJMP CHECK1
CHECK1: JNB P3.1,QUIT1 ACALL DISPLAY AJMP HERE
QUIT1: CLR RING
CLR OK
AJMP START DISPLAY:MOV DPTR,#DAT1 MOV A,R3
MOVC A,@A+DPTR ;犯规抢答程序 ;犯规号数暂存与(34H) ;0.5s向下运行->灭并停响 ;三灯全灭 ;下面是1s的情况,响并显示号数并清R0,重新计 ;取回号数 ;显示PP和号数 ;显示程序 查表显示程序,利用P0口做段选码口输出/P2低三位做 17 ;
MOV P2,#0feH
MOV P0,A
ACALL DELAY
MOV DPTR,#DAT2
MOV A,R5
MOVC A,@A+DPTR
MOV P2,#0fdH
MOV P0,A
ACALL DELAY
MOV A,R4
MOVC A,@A+DPTR
MOV P2,#0fbH
MOV P0,A
ACALL DELAY
RET
DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,73H
DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,73H
DELAY1: MOV 35H,#08H
LOOP0: ACALL DISPLAY
DJNZ 35H,LOOP0
RET ;延时(显示和去抖动用到)
DELAY: MOV 32H,#12H
LOOP: MOV 33H,#0AFH
LOOP1: DJNZ 33H,LOOP1
DJNZ 32H,LOOP
RET ;发声程序
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口不断取反使喇叭发出一定频率的声音 OUT: RETI ;T1溢出中断(计时程序)
T1INT: MOV TH1,#3CH
MOV TL1,#0B0H
INC R0
RETI ;INTT0中断服务程序
INTT0:MOV DATA0,P1
CLR EX0
RETI
END
18
五、仿真调试
试验的程序通过Keil软件编译,产生HEX文件如图4-1所示
:
程序在Keil软件上编译结果
通过Proteus进行仿真,如仿真结果所示,按下开始后,数码管开始倒计时,仿真结果如图4-2所示。
19
Proteus仿真的结果
当有选手按下按扭时,数码管显示选手号码并开始倒计时,如图4-3所示
Proteus仿真的结果
通过仿真结果证实,该方案可行。该设计方案同过51系列单片机的P0口作为段选输出,用P2口作为位选输出,动态扫描LED显示管,显示时间。并通过接在P3.0-P3.6口的按键开关控制开始、结束、喇叭提示等功能。P1口接选手按键,控制抢答。本设计实现简单,成本较低很适合我们大学生动手实践。
20
六.源程序
OK EQU 20H ;抢答开始标志位
RING EQU 22H ;响铃标志位
DATA0 EQU 36H ;抢答按键口数据存放地址
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 TR ;查询程序
START: MOV DATA0,#0FFH ;初始化
MOV R5,#0BH
MOV R4,#0BH
MOV R3,#0BH
ACALL DISPLAY ;未开始抢答时候显示PPP
JNB P3.3 ,INT0SUB
JNB P3.4,TZ1 ;倒计时调整
JB P3.0,NEXT ;ddddddd
ACALL DELAY
JB P3.0,NEXT ;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询 SETB EX0 ;开放INT0
ACALL BARK ;按键发声
MOV A,R1
21
MOV R6,A ;送R1->R6,因为R1中保存了抢答时间
SETB OK ;抢答标志位,用于COUNT只程序中判断是否查询抢答 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,TZ1
JNB P1.7,TZ2
AJMP START
TZ1: JMP FALSE7
TZ2: JMP FALSE8
FALSE1: ACALL BARK
MOV R3,#01H
AJMP ERROR
FALSE2: ACALL BARK
MOV R3,#02H
AJMP ERROR
FALSE3: ACALL BARK
MOV R3,#03H
AJMP ERROR
FALSE4: ACALL BARK
MOV R3,#04H
AJMP ERROR
FALSE5: ACALL BARK
MOV R3,#05H
AJMP ERROR
FALSE6: ACALL BARK
MOV R3,#06H
AJMP ERROR
FALSE7: ACALL BARK
MOV R3,#07H
AJMP ERROR
FALSE8: ACALL BARK
MOV R3,#08H
AJMP ERROR
INT0SUB: MOV A,R1
MOV B,#0AH
DIV AB
MOV R5,A
MOV R4,B
;非法抢答处理程序 ;按键发声 ;INT0(抢答时间R1调整程序) 22
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
ACALL DELAY1
AJMP INT0SUB
ADD0: INC R1
ACALL DELAY1
AJMP INT0SUB
DEC0: MOV A,R1
JZ SETR1
DEC R1
ACALL DELAY1
AJMP INT0SUB
SETR1: MOV R1,#63H
ACALL DELAY1
AJMP INT0SUB
BACK0: RETI
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: MOV A,R2
CJNE A,#63H,ADD1
MOV R2,#00H
ACALL DELAY1
AJMP INT1SUB
ADD1: INC R2
ACALL DELAY1
AJMP INT1SUB
DEC1: MOV A,R2
JZ SETR2
;如果R1为0, R1就置99, ;INT1(回答时间R2调整程序) 23
DEC R2
ACALL DELAY1
AJMP INT1SUB
SETR2: MOV R2,#63H
ACALL DELAY1
AJMP INT1SUB
BACK1: RETI ;倒计时程序(抢答倒计时和回答倒计时都跳到改程序) COUNT: MOV R0,#00H ;重置定时器中断次数 MOV TH1,#3CH
MOV TL1,#0B0H
RECOUNT: MOV A,R6
MOV B,#0AH
DIV AB
MOV 30H,A
MOV 31H,B
MOV R5,30H
MOV R4,31H
MOV A,R6
SUBB A,#07H
JNC LARGER
MOV A,R0
CJNE A,#0AH,FULL
CLR RING
AJMP CHECK
FULL: CJNE A,#14H,CHECK
SETB RING
MOV A,R6
JZ QUIT
MOV R0,#00H
DEC R6
AJMP CHECK
LARGER: MOV A,R0
CJNE A,#14H,CHECK
DEC R6
MOV R0,#00H
CHECK: JNB P3.1,QUIT
ACALL DISPLAY
JB OK,ACCOUT
AJMP RECOUNT
ACCOUT: MOV A,DATA0
JNB P1.0,TRUE1
JNB P1.1,TRUE2
JNB P1.2,TRUE3
JNB P1.3,TRUE4
;重置定时器 ;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6 ;除十分出个位/十位 ;十位存于(30H) ;个位存于(31H) ;取十位 ;取个位 ;大于5s跳到LARGER,小于等于5s会提醒 ;1s中0.5s向下运行 ;下面是1s的情况,响并显示号数并清R0,重新计 ;计时完毕 ;一秒标志减1 ;如果1s向下运行,否者跳到查"停/显示" ;计时一秒R6自动减1 ;如按下停止键退出 ;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数 24
JNB P1.4,TRUE5
JNB P1.5,TRUE6
JNB P1.6,TZ3
JNB P1.7,TZ4
AJMP RECOUNT
TZ3: JMP TRUE7
TZ4: JMP TRUE8
QUIT: CLR OK ;如果按下了"停止键"执行的程序 CLR RING
AJMP START;
TRUE1: ACALL BARK
MOV A,R2
MOV R6,A
MOV R3,#01H
CLR OK
AJMP COUNT
TRUE2:ACALL BARK;
MOV A,R2
MOV R6,A
MOV R3,#02H
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
正常抢答处理程序 ;按键发声 ;抢答时间R2送R6 ;因为答题的计时不再查询抢答,所以就锁了抢答 25
CLR OK
AJMP COUNT
TRUE7: ACALL BARK;
MOV A,R2
MOV R6,A
MOV R3,#07H
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,#0AH,FLASH ;0.5s向下运行->灭并停响
CLR RING
MOV R3,#0AH
MOV R4,#0AH
MOV R5,#0AH ;三灯全灭
AJMP CHECK1
FLASH: CJNE A,#14H,CHECK1 ;下面是1s的情况,响并显示号数并清R0,重新计 SETB RING
MOV R0,#00H
MOV R3,34H ;取回号数
MOV R5,#0BH
MOV R4,#0BH ;显示PP和号数
AJMP CHECK1
CHECK1: JNB P3.1,QUIT1
ACALL DISPLAY
AJMP HERE
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 DELAY
26
MOV DPTR,#DAT2
MOV A,R5
MOVC A,@A+DPTR
MOV P2,#0fdH
MOV P0,A
ACALL DELAY
MOV A,R4
MOVC A,@A+DPTR
MOV P2,#0fbH
MOV P0,A
ACALL DELAY
RET
DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,73H
DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,73H
DELAY1: MOV 35H,#08H
LOOP0: ACALL DISPLAY
DJNZ 35H,LOOP0
RET ;延时(显示和去抖动用到)
DELAY: MOV 32H,#12H
LOOP: MOV 33H,#0AFH
LOOP1: DJNZ 33H,LOOP1
DJNZ 32H,LOOP
RET ;发声程序
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口不断取反使喇叭发出一定频率的声音 OUT: RETI ;T1溢出中断(计时程序)
T1INT: MOV TH1,#3CH
MOV TL1,#0B0H
INC R0
RETI ;INTT0中断服务程序
INTT0:MOV DATA0,P1
CLR EX0
RETI
END
27
七、总结
经过将近二周的单片机课程设计,终于完成了八路抢答器的设计,虽然没有完全
达到设计要求,但还是收获良多。通过这次课程设计,使我更进一步地熟悉了单片机芯
片的工作原理和其具体的使用方法。单片机课程设计重点就在于软件算法的设计,需
要有很巧妙的程序算法,这锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。还有了解了课程设计的一般步骤,和设计中应注意的问题。
设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。下面
我对整个设计的过程做一下简单的总结。第一,接到任务以后进行选题。选题是设计
的开端,选择恰当的、感兴趣的题目,这对于整个设计是否能够顺利进行关系极大。
好比走路,这开始的第一步是具有决定意义的,第一步迈向何方,需要慎重考虑。否
则,就可能走许多弯路、费许多周折,甚至南辕北辙,难以到达目的地。因此,选;
题时一定要考虑好了。第二,题目确定后就是找资料了。查资料是做设计的前期准备
工作,好的开端就相当于成功了一半,到图书馆、书店、资料室去虽说是比较原始的
方式,但也有可取之处的。总之,不管通过哪种方式查的资料都是有利用价值的,要
一一记录下来以备后用。第三,通过上面的过程,已经积累了不少资料,对所选的题
目也大概有了一些了解,这一步就是在这样一个基础上,综合已有的资料来更透彻的
分析题目。第四,有了研究方向,就应该动手实现了。其实以前的三步都是为这一步
作的铺垫。通过这次设计,我对数字电路设计中的逻辑关系等有了一定的认识,对以
前学的数字电路又有了一定的新认识,温习了以前学的知识,就像人们常说的温故而
知新嘛,但在设计的过程中,遇到了很多的问题,有一些知识都已经不太清楚了,但
是通过一些资料又重新的温习了一下数字电路部分的内容。在这次设计中也使我们的
同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同
的看法我们更好的理解知识,所以在这里非常感谢帮助我的同学。
在此要感谢我的指导老师,感谢老师给我这样的机会锻炼。在整个设计过程中我
懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信
会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分
体会到了在创造过程中的探索的艰难和成功的喜悦。虽然这个项目还不是很完善,但
是在设计过程中所学到的东西是这次设计的最大收获和财富,使我终身受益。
八、参考文献
[1] 吴亦峰、陈德为.单片机原理与接口技术. 北京:电子工业出版社.2005.
[2] 周润景、张丽娜.基于PROTEUS的电路及单片机仿真. 北京: 航空航天大学出版社,2007.
[3] 胡耀辉、朱朝华等.单片机系统开发实例经典.北京:冶金工业出版社.2006.
[4] 张迎新.单片机初级教程. 北京: 航空航天大学出版社,2007.
28