片机课程设计报告

片机课程设计报告本文简介:目录前言--------------------------------------------------------------------------21课程设计的目的和要求------------------------------------------------------21.1、课
片机课程设计报告本文内容:
目
录
前言--------------------------------------------------------------------------2
1
课程设计的目的和要求------------------------------------------------------2
1.1、
课程设计的目的-----------------------------------------------------2
1.2、
课程设计的基本要求-------------------------------------------------2
2
系统设计------------------------------------------------------------------2
2.1基本工作原理-----------------------------------------------------------2
2.2系统设计-----------------------------------------------------------2
2.2.1系统组成方案---------------------------------------------------2
2.2.2扩展单元编址---------------------------------------------------2
2.2.3
按键、显示功能的定义--------------------------------------------2
2.3
软件总体设计-----------------------------------------------------2
2.3.1
存储单元的分配、标志位的定义------------------------------------2
2.3.2主程序框图及清单-----------------------------------------------3
3
硬件设计------------------------------------------------------------------3
3.1主控制器---------------------------------------------------------------3
3.1.1
80C51内部结构--------------------------------------------------3
3.1.2
80C51引脚封装与功能表------------------------------------------4
3.1.3
P0P1P2P3口内部结构及作为I/O端口时的使用-----------------------6
3.1.4
晶体振荡器电路-------------------------------------------------6
3.1.5
复位电路--------------------------------------------------------7
3.2
DS18B20原理及引脚介绍-------------------------------------------------7
3.3
LED显示驱动电路-------------------------------------------------------8
4
软件设计------------------------------------------------------------------8
5.Proteus仿真系列图…………………………………………………………………………….13
6
系统操作说明………………………………………………………………………………….16
7
结束语-------------------------------------------------------------------16
8
参考文献-----------------------------------------------------------------17
9
系统原理图---------------------------------------------------------------17
附录1-----------------------------------------------------------------------17
1.课程设计的目的和要求
1.1课程设计的目的
本次课程设计的目的主要是学会利用单片机采用软硬件结合的方法设计电子产品,一方面是学会以软代硬,用软件程序实现硬件功能,简化电路,另一方面就是学会设计硬件电路,科学布局电子电子元器件,掌握电路焊接的基本方法。
1.2课程设计的基本要求
基本要求:
(1)给主持人设置一个开关,用来控制系统的清零(编号显示数码管灭灯)和抢答器的开始。
(2)抢答器具有数据锁存和显示的功能。抢答开始后,若有选手按动抢答器按钮,编号立即锁存,并在LED数码上显示选手的编号,同时扬声器给出音响提示。此外,要封锁输入电路,禁止其他选手抢答。
发挥部分:
(1)抢答器具有定时抢答的功能,且一次抢答的时间和答题的时间可以由主持人设定(如30秒)。当节目主持人启动“开始”键后,要求定时器立即减计时,并用显示器显示,同时扬声器发出短暂的声响,声响持续时间0.5秒左右。
(2)参加选手在设定的时间内抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答时刻的时间,并保持到主持人将系统清零为止。
(2)如果定时抢答的时间已到,却没有选手抢答时,本次抢答无效,系统短暂报警,并封锁输入电路,禁止选手超时后抢答,时间显示器上显示FF。
(3)选手如果在主持人按开始键之前违规抢答,系统报警,LED显示违规选手号码和FF,直到主持人按下停止键。
2.系统设计
2.1
基本原理
抢答器的工作原理是采用单片机最小系统,用程序查询方式采用动态显示组号。主持人按下开始抢答键才可以抢答。主持人没有按下开始抢答按纽(P3.0),有人抢答则抢答违规,报警并显示组号,主持人按下开始抢答开关重新抢答。主持人按下开始抢答按纽(P3.0),蜂鸣响声提示,数码管30秒倒计时抢答,蜂鸣器响声提示并显示他的组号,30秒内有人抢答则开始60秒倒计时(60秒内必须回答完问题),最后五秒倒计时警报。单片机最小系统、抢答按键模块(四位并行数码显示)、显示模块、显示驱动模块、抢答开关模块、蜂鸣器音频输出模块。
2.2.1系统设计
基本要求
(1).给主持人设置一个开关,用来控制系统的清零(编号显示数码管灭灯)和抢答器的开始。
(2).抢答器具有数据锁存和显示的功能。抢答开始后,若有选手按动抢答器按钮,编号立即锁存,并在LED数码上显示选手的编号,同时扬声器给出音响提示。此外,要封锁输入电路,禁止其他选手抢答。
发挥部分:
(3)抢答器具有定时抢答的功能,且一次抢答的时间和答题的时间可以由主持人设定(如30秒)。当节目主持人启动“开始”键后,要求定时器立即减计时,并用显示器显示,同时扬声器发出短暂的声响,声响持续时间0.5秒左右。
(4)参加选手在设定的时间内抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答时刻的时间,并保持到主持人将系统清零为止。
(5)如果定时抢答的时间已到,却没有选手抢答时,本次抢答无效,系统短暂报警,并封锁输入电路,禁止选手超时后抢答,时间显示器上显示FF。
(6)选手如果在主持人按开始键之前违规抢答,系统报警,LED显示违规选手号码和FF,直到主持人按下停止键。
系统组成
抢答器的实现方式有种多样,通过纯电子器件搭建电路实现,如优先编码器,锁存器,555定时器译码器等,纯电子器件实现没有软件参与,调试简单,但是它不易于扩展和修改,而且电路结构复杂,调试困难电子,电子器件管脚很多,实际搭建起来费时费力,焊接很容易出错。于是,我想到了用单片机实现。该系统采用51系列单片机AT89C51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。其原理框图如下:
抢答按扭
优先编
码电路
锁存器
译码电路
译码显示
主持人控制开关
控制电路
报警电路
秒脉冲产生电路
定时电路
译码电路
显示电路
在实际电路设计中,需要先通过仿真软件测试电路以及编译的程序,检查外围电路设计是否合理,软件编译是否正确,以及软件和硬件电路能否正常配合工作,能否准确的实现所设计的功能。如果测试通过,电路仿真没有问题能完全实现功能的话就可以实际的做板子的焊接工作了。在老师的指导下我选择了常用的单片机仿真软件proteus7.0以及keil
进行仿真
2.2.2
扩张单元地址
无扩展单元
2.2.3
按键、显示功能的定义
P1口的八位分别接8位选手的按键,作抢答按键口
P3.1接复位键,按下程序复位
P3.2接抢答时间调整键,按下进入抢答时间调整
P3.3接答题时间调整键,按下进入答题时间调整
P3.4接时间调整加1键,按下被调时间加1
P3.5接时间调整减1键,按下被调时间减1
RST接单片机复位键,按下单片机复位
四位八段数码管,第一位显示抢答选手号,第三、四位显示倒计时间,第二位不用把选手号和倒计时间隔开
2.3软件总体设计
2.3.1
存储单元的分配、标志位的定义
OK
EQU
20H:抢答开始标志位
RING
EQU
22H:响铃标志位
P3.0抢答开始标志位
P3.1复位标志位
P3.2抢答时间调整标志位
P3.3答题时间调整标志位
P3.4时间调整加1标志位
P3.5时间调整减1标志位
P3.6蜂鸣取反标志位
R0作定时1秒的指针
R1做抢答时间的存储单元
R2做答题时间的存储单元
R3
做选手号的存储单元
R6
做倒计时指针
P0口做送显段码口
P1口做选手抢答按键口
P2口做送显位选口
P3口做功能键口
2.3.2主程序框图及清单
系统初始化模块
按键模块
非法抢答模块
正确抢答模块
调整抢答时间
调整回答时间模块
数码显示模块
89C52
1个
USB
1个
共阴四联八段数码管
1个
开关
20个
蜂鸣器
1
30p
4个
晶振12M
1个
排阻10K
1个
10K电阻
2个
10uf
2个
3.
硬件设计
3.1主控制器
3.1.1
89C51内部结构
3.1.2
89C51引脚封装与功能表
(1)
Vcc(40引脚):接+5V电源
(2)
Vss(20引脚):接地
(3)
P0口:8位双向I/O口线,为P0.0-P0.7
(4)
P1口:8位准双向I/O口线,为P1.0-P1.7
(5)
P2口:8位准双向I/O口线,为P2.0-P2.7
(6)
P3口:8位准双向I/O口线,为P3.0-P3.7
(7)
XTAL1:片内晶振电路的输入端
(8)
XTAL2:片内晶振电路的输出端
(9)
RST/VPP:复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
(10)
ALE/PROG:地址所存允许信号。
(11)
PSEN:外部存储器读选通讯信号。
(12)
EA/VPP:程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
3.1.3
P0P1P2P3口内部结构及作为I/O端口时的使用
P0口和P2的结构
P0口的结构:下图为P0口的某位P0.n(n=0~7)结构图,它由一个输出锁存器、两个三态输入缓冲器和输出驱动电路及控制电路组成。从图中可以看出,P0口既可以作为I/O用,也可以作为地址/数据线用。
P0口作为普通I/O口:
①输出时,CPU发出控制电平“0”封锁“与”门,将输出上拉场效应管T1截止,同时使多路开关MUX把锁存器与输出驱动场效应管T2栅极接通。故内部总线与P0口同相。由于输出驱动级是漏极开路电路,若驱动NMOS或其它拉流负载时,需要外接上拉电阻。P0的输出级可驱动8个LSTTL负载。
②输入时----分读引脚或读锁存器
读引脚:由传送指令(MOV)实现;
下面一个缓冲器用于读端口引脚数据,当执行一条由端口输入的指令时,读脉冲把该三态缓冲器打开,这样端口引脚上的数据经过缓冲器读入到内部总线。
读锁存器:有些指令如:ANL
P0,A称为“读-改-写”
指令,需要读锁存器。上面一个缓冲器用于读端口锁存器数据。
原因:如果此时该端口的负载恰是一个晶体管基极,且原端口输出值为1,那么导通了的PN结会把端口引脚高电平拉低;若此时直接读端口引脚信号,将会把原输出的“1”电平误读为“0”电平。现采用读输出锁存器代替读引脚,图中,上面的三态缓冲器就为读锁存器Q端信号而设,读输出锁存器可避免上述可能发生的错误。**
说明:
(1)P0口必须接上拉电阻;
(2)在读信号之前数据之前,先要向相应的锁存器做写1操作的I/O口称为准双向口;
三态输入缓冲器的作用:
(ANL
P0,A)
准双向口:
从图中可以看出,在读入端口数据时,由于输出驱动FET并接在引脚上,如果T2导通,就会将输入的高电平拉成低电平,产生误读。所以在端口进行输入操作前,应先向端口锁存器写“1”,使T2截止,引脚处于悬浮状态,变为高阻抗输入。这就是所谓的准双向口。
P0作为地址/数据总线
在系统扩展时,P0端口作为地址/数据总线使用时,分为:
(1)P0引脚输出地址/数据信息:CPU发出控制电平“1”,打开“与”门,又使多路开关MUX把CPU的地址/数据总线与T2栅极反相接通,输出地址或数据。由图上可以看出,上下两个FET处于反相,构成了推拉式的输出电路,其负载能力大大增强。
P0作为地址/数据总线----真正的双向口
(2)P0引脚输出地址/输入数据:
输入信号是从引脚通过输入缓冲器进入内部总线。此时,CPU自动使MUX向下,并向P0口写“1”,“读引脚”控制信号有效,下面的缓冲器打开,外部数据读入内部总线。
P2的内部结构
P2口作为普通I/O口:CPU发出控制电平“0”,使多路开关MUX倒向锁存器
输出Q端,构成一个准双向口。其功能与P1相同。
P2口作为地址总线:在系统扩展片外程序存储器扩展数据存储器且容量超过256B
(用MOVX
@DPTR指令)时,CPU发出控制电平“1”,使多路开关MUX倒内部地址线。此时,P2输出高8位地址。
P1口、P3口的内部结构
①P1口的一位的结构
它由一个输出锁存器、两个三态输入缓冲器和输出驱动电路组成----准双向口。
②P3的内部结构
作为通用I/O口与P1口类似----准双向口(W=1)
P3第二功能(Q=1)
此时引脚部分输入(Q=1、W=1),部分输出(Q=1、W输出)。
P3第二功能各引脚功能定义:
P3.0:RXD串行口输入
P3.1:TXD串行口输出
P3.2:INT0外部中断0输入
P3.3:INT1外部中断1输入
P3.4:T0定时器0外部输入
P3.5:T1定时器1外部输入
P3.6:WR外部写控制
P3.7:RD外部读控制
综上所述:当P0作为I/O口使用时,特别是作为输出时,输出级属于开漏电路,必须外接上拉电阻才会有高电平输出;如果作为输入,必须先向相应的锁存器写“1”,才不会影响输入电平。
当CPU内部控制信号为“1”时,P0口作为地址/数据总线使用,这时,P0口就无法再作为I/O口使用了。
P1、P2和P3口为准双向口,在内部差别不大,但使用功能有所不同。
P1口是用户专用8位准双向I/O口,具有通用输入/输出功能,每一位都能独立地设定为输入或输出。当有输出方式变为输入方式时,该位的锁存器必须写入“1”,然后才能进入输入操作。
P2口是8位准双向I/O口。外接I/O设备时,可作为扩展系统的地址总线,输出高8位地址,与P0口一起组成16位地址总线。对于8031而言,P2口一般只作为地址总线使用,而不作为I/O线直接与外部设备相连。
3.1.4
晶体振荡器电路
3.1.5
复位电路
3.1.6
蜂鸣器驱动电路
3.3
八段数码管显示驱动电路
4.软件设计
在本设计中包括了以下主要的程序:主程序,查询程序,非法抢答程序,抢答时间调整程序,回答时间调整程序,倒计时程序,正常抢答处理程序,犯规处理程序,显示及发声程序。整个程序主要由定时器T0、定时器T1、外部中断0和外部中断1和主程序构成。主流程图如4.2.1所示:
主程序流程图
INT0用于调整抢答时间,设计流程图如下:
INT1用于调整答题时间,设计流程图如下:
定时器T0用于使扬声器发声,当需要响铃时,把响铃标志位置一,每次中断都对P3.6取反,扬声器发声,改变定时器初值,可改变扬声器频率。这里用绿灯闪烁代替。程序流程图如下:
定时器T1用于倒计时,每次中断为50ms,当计数标志为20时即为一秒,显示数字减一。其流程图如下:
5.Proteus仿真系列组图
5.1
复位图
图5.1复位显示三个FFF
该图显示当单片机复位后,在4位七段数码管上显示的初始状态“F
FF”字符。
5.2
设置计时时间
图5.2
计时时间为17秒
该图显示通过加一按键操作后在4位数码管上显示的计时时间为17秒。
5.3
非法抢答并显示座号
图5.3
三号选手非法抢答
该图显示的是若三号选手非法抢答时候,第一位字符显示单片机判定的非法选手“3”号选手,在4位数码管上的后两位显示非法抢答字符“FF”。
5.4
抢答成功并显示倒计时
图5.4
六号选手抢答
图中显示的是若6号选手抢答成功的时候,4位数码管只显示第一位,表示六号选手抢答成功。
5.5
抢答成功并显示倒计时
图5.4
六号选手抢答
图中显示的是若6号选手抢答成功并开始答题的情形,4位数码管的第一显示是“6”号选手抢答成功,最后两位显示选手答题倒计时时间还有25秒。
6.系统操作说明
本系统共有七个功能键
按键A为单片机复位键
按键B为抢答开始键
按键C为抢答复位键
按键D为答题开始键
按键E为抢答时间调整键
按键F为答题时间调整键
按键G为时间加1键
按键H为时间减1键
7.结束语-
本文研究与设计的八路多功能抢答器采用了通用的电子元器件,利用AT89C51单片机及外围接口实现抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来。理论联系实践,体现出大学生动手能力。通过查资料和搜集有关的文献,培养了自学能力和动手能力。并且由原先的被动的接受知识转换为主动的寻求知识,这可以说是学习方法上的一个很大的突破。在以往的传统的学习模式下,我们可能会记住很多的书本知识,但是通过毕业论文,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。把握重点、攻克难关,学到用到、活学活用。在设计过程中由于时间仓促有很多地方难免存在不足之处,硬件设计已经完成,在软件设计中有些功能还尚未开发出来。但在以后的工作中,我们会严格要求自己,追求完美。
整个设计通过了软件和硬件上的调试、仿真。我想这对于自己以后的学习和工作都会有很大的帮助的。在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计中的问题。而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力。它才是一个设计的灵魂所在。因此在整个设计过程中大部分时间是用在程序上面的。很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对单片机的结构很熟悉。因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。
但是,通过这次设计我也发现自己的很多不足之处。在设计过程中我发现自己考虑问题很不全面,自己的专业知识掌握的很不牢固,所掌握的计算机应用软件还不够多,我希望自己的这些不足之处能在今后的工作和学习中得到改善。而且,通过这次设计,我懂得了学习的重要性,学会了坚持和努力,这将为以后的学习做出了最好的榜样!
7
.
参考文献
单片机原理与应用技术,张毅刚
彭喜元
编著,电子工业出版社
8
.
系统原理图
9.附录
程序:
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,#0F5H
MOV
TL0,#0FFH;越高发声频率越高,越尖
MOV
TH1,#3CH
MOV
TL1,#0B0H;100ms为一次溢出中断
SETB
EA
SETB
ET0
SETB
ET1
SETB
EX0
SETB
EX1;允许四个中断,T0/T1/INT0/INT1
CLR
OK
CLR
RING
SETB
TR1
SETB
TR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
;=====查询程序=====
START:
MOV
R5,#0BH
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
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
ACALL
DELAY1
AJMP
INT0SUB
ADD0:
INC
R1
ACALL
DELAY1
AJMP
INT0SUB
DEC0:
MOV
A,R1
JZ
SETR1;如果R1为0,R1就置99,
DEC
R1
ACALL
DELAY1
AJMP
INT0SUB
SETR1:
MOV
R1,#63H
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:
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
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: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
LARGER;大于5s跳到LARGER,小于等于5s会提醒
MOV
A,R0
CJNE
A,#05H,FULL;1s中0.5s向下运行
CLR
RING
AJMP
CHECK
FULL:
CJNE
A,#0AH,CHECK;下面是1s的情况,响并显示号数并清R0,重新计
SETB
RING
MOV
A,R6
JZ
QUIT;计时完毕
DEC
R6
MOV
R0,#00H
AJMP
CHECK
LARGER:
MOV
A,R0
CJNE
A,#0AH,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
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,TRUE7
JNB
ACC.7,TRUE8
AJMP
RECOUNT
QUIT:
CLR
OK;如果按下了“停止键“执行的程序
CLR
RING
AJMP
START
;=====正常抢答处理程序=====
TRUE1:MOV
R3,#01H
AJMP
LOOPX0
TRUE2:MOV
R3,#02H
AJMP
LOOPX0
TRUE3:MOV
R3,#03H
AJMP
LOOPX0
TRUE4:MOV
R3,#04H
AJMP
LOOPX0
TRUE5:MOV
R3,#05H
AJMP
LOOPX0
TRUE6:
MOV
R3,#06H
AJMP
LOOPX0
TRUE7:MOV
R3,#07H
AJMP
LOOPX0
TRUE8:MOV
R3,#08H
AJMP
LOOPX0
;=====犯规抢答程序=====
ERROR:
MOV
R0,#00H
MOV
TH1,#3CH
MOV
TL1,#0B0H
MOV
34H,R3;犯规号数暂存与(34H)
HERE:
MOV
A,R0
CJNE
A,#05H,FLASH;0.5s向下运行->灭并停响
CLR
RING
MOV
R3,#0AH
MOV
R4,#0AH
MOV
R5,#0AH;三灯全灭
AJMP
CHECK1
FLASH:
CJNE
A,#0AH,CHECK1;下面是1s的情况,响并显示号数并清R0,重新计
SETB
RING
MOV
R0,#00H
MOV
R3,34H;取回号数
MOV
R5,#0BH
MOV
R4,#0BH;显示FF和号数
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
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
;“灭“,“1“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“,“灭“,“F“DAT2:DB
3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;第一个为零,其他与上相同,因为十位如果为零显示熄灭
;====加减时间延时(起到不会按下就加N个数)======
DELAY1:
MOV
35H,#08H
LOOP0:
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,#0FH
MOV
A,R7
;每隔30~35个机器周期读一次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暂存
AJMP
LOOP2
AA1:
DEC
R7
AJMP
AA0
;=====发声程序=====
BARK:
SETB
RING
ACALL
DELAY1
ACALL
DELAY1
CLR
RING;按键发声
RET
;=====TO溢出中断(响铃程序)=====
T0INT:
MOV
TH0,#0F5H
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
LOOPX0:ACALL
BARK
MOV
A,R2
MOV
R6,A;抢答时间R2送R6
MOV
DPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,MOV
A,R3
MOVC
A,@A+DPTR
MOV
P2,#0feH
MOV
P0,A
LOOPX:
JB
P2.7,LOOPX
CLR
OK;因为答题的计时不再查询抢答,所以就锁了抢答
MOV
A,R2
MOV
B,#10
DIV
AB
MOV
R5,A
MOV
R4,B
ACALL
BARK
ACALL
COUNT
END
