设计题目:数码管抢答器 设计要求:
1.基于proteus与keil软件完成相应设计 2.采用汇编语言编程
3.本数码抢答器可供8个参赛队使用。 4.哪个队的选手最先按下抢答按钮,数码管就显示哪个队对应的号码,即表示该队抢答成功,其他队的选手在本轮中即使再按下抢答按钮,也不能进行抢答和显示队号。
摘要 ........................................................................................... 3 第一章 绪论 ............................................................................. 4
1.1 单片机抢答器的背景 ................................................... 4
1.2 抢答器的应用 ......................................................... 4
第2章 总体方案的设计 ......................................................... 5
2.1 功能要求 ............................................................. 5 2.2 设计思路 ............................................................. 5 2.3 系统功能框图 ......................................................... 6 2.4 设计方案 ............................................................. 6
第3章 硬件电路的设计 ......................................................... 8
3.1 硬件主要组成电路 ..................................................... 8 3.2 电路工作的基本原理 ................................................... 8 3.3 主控电路的设计 ....................................................... 8 3.4 按键电路的设计 ...................................................... 9 3.5 显示电路的设计 ..................................................... 10
第4章软件的设计 ................................................................. 11
4.1 软件介绍 ............................................................ 11 4.2 语言选择 ............................................................ 11 4.3 软件总体设计 ........................................................ 11 4.3系统程序 ............................................................ 12
第5章protues仿真 ............................................................. 16
5.1仿真电路图(见附录电路图) .......................................... 16 5.2 仿真过程与结果分析 .................................................. 16 图5—1 系统初始状态 .................................................. 16 图5-2 加减秒数 ...................................................... 17 图5-3 7号选手犯规 .................................................. 17
总结 ......................................................................................... 19
参考文献 ................................................................ 20 附录1 源程序 .......................................................... 21 附录2 电路原理图 ....................................................... 29
摘要
能够实现抢答器功能的方式有多种,可以采用前期的模拟电路、数字电路或模拟与数字
电路相结合的方式。近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测日新月异更新。本文介绍一种用AT89C51作为核心部件进行逻辑控制及信号产生的单片机技术和汇编语言编程设计的8路数字抢答器。文章对抢答器的背景与现状、硬件设计、软件设计及其仿真都做了详细的介绍,使我们不仅答器的原理及设计有了深入的了解,也对单片机的设计研发过程有了更加深刻的体会
本设计主要采用单片机控制,采用手动抢答的方式,有人抢答后,系统自动封锁其他人的抢答按钮,使其不能再抢答,从而实现抢答功能。该系统还增加了抢答倒计时和答题倒计时功能,另外抢答倒计时和答题倒计时的时间都可以调整。若有人在主持人按下开始按钮之前按下抢答按钮,系统自动视其为犯规,抢答器自动报警,
显示器同时显示犯规选手的号码,使抢答达到公平、公开的效果。
关键字:单片机 抢答器 倒计时 显示器 AT89C5 自动封锁
第一章 绪论
1.1 单片机抢答器的背景
在知识竞赛中,特别是做抢答题时,在抢答过程中,为了更确切的知道哪一组或哪一位选手先抢答到题,必须要有一个系统来完成这个任务。若在抢答中,只靠人的视觉(或者是听觉)是很难判断出哪一组(或哪一个选手)先抢答到题的。利用单片机编程来设计抢答器,可以使以上问题得以解决,即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组(或哪个选手)先抢答到题的。本文主要介绍了抢答器的工作原理及设计,以及它的实际用途
1.2 抢答器的应用
随着我国经济和文化事业的发展,在很多的公开竞争场合要求有公正的竞争裁决,诸
如证券、股票交易及各种智力竞赛等,因此出现了抢答器。抢答器一般是由很多电路组成的,线路复杂,可靠性不高,功能也比较简单,特别是当抢答路数很多时,实现起来就更为困难。因此我们设计了以单片机为核心的新型智能的抢答器,
在保留原始抢答器的基本功能的同时又增加了数码管显示电路实现了其它功能。抢答器又称为第一信号鉴别器,因此能广泛应用于各种知识竞赛、文艺活动等场合。
第2章 总体方案的设计
2.1 功能要求
本次设计要求在熟练使用51系列单片机的基础上,设计出相关的外围电路,并利用所选用的常用芯片设计出抢答器,要求可通过软件实现调整抢答器的答题或抢答时间,LED显示器可显示抢答或答题时间的倒计时,在时间快要用尽或者有人犯规的情况下,蜂鸣器可发出声音报警。
2.1.1 工作原理及设计方案
抢答器是为竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,竞赛者可以分为若干组,抢答时各组对主持人提出的问题要在最短的时间内做出判断,并按下抢答按键回答问题。当第一个人按下按键后,则在显示器上显示该组的号码,同时电路将其他各组按键封锁,使其不起作用。回答完问题后,由主持人将所有按键恢复,重新开始下一轮抢答。抢答器具有定时抢答功能,且一次抢答的时间可以由主持人设定(如,30秒)。当主持人启动\"开始\"键后,定时器进行减计时。参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。如果定时时间已到,无人抢,本次抢答无效,系统通过一个指示灯报警并禁止抢答,定时显示器上显示00。因此要完成抢答器的逻辑功能,该电路至少应包括输入开关、数字显示、判别组控制以及组号锁存等部分。
2.2 设计思路
1. 抢答器供8名选手比赛,分别用8个按钮S0 ~ S7表示。这个功能只需要通 过管脚
分配把按钮分配到实验版上的拨动开SW0到SW7关,让每个选手拨动开关后产生相应的信号就可以了。不同的选手拨动按钮发出信号通过74LS148编码器进行编码,编码后输出信号进行下一步的译码和锁存。
2. 设置一个系统清除和抢答控制开关S,该开关由主持人控制。在这里首先通过管脚分配把开关S分配到相应一个拨动开关,这个就是开关SW16。该开关联系到一个相应的线路,这个线路通过与非门连接其他信号,从而达到清零的功能。
3. 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。74LS373具有锁存功能,可以在一个选手按下按钮后进行锁存,其他的选手不能在抢答。锁存相应的编号时,由于编码器编的是从0到7,如果0号选手抢答,与清零的时候可能造成混淆,所以要加上加法器,对编码器的0到7都加上1。加法器是用74LS83这样在后面的74LS47译码器上就可以显示1到8的号码。 4. 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如,30秒)。当主持人启动\"开始\"键后,定时器进行减计时。74LS192有减法功能,通过使用
74LS192可以对设定的时间进行自减。只需要给定74LS192秒脉冲就可以。同时74LS192结合74LS47可以对所设定的抢答时间和选手抢答的时间显示出来。
5. 参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。选手进行抢答,通过编码器,锁
存器,加法器,译码器,显示出来。当某个选手抢答有效,通过74LS148编码器的GSN端口连接到控制清零端的与非门就可以进行禁止其他选手的抢答,同时把该选手的号码显示在数码管上,同时通过74LS148编码器的GSN端口间的效果。 6. 如果定时时间已到,无人抢答,本次抢答无效,系统通过一个指示灯报警并禁止抢答,定时显示器上显示00。当时间到的时候,减法器74LS192的十位的LDN
端口发出一个高电平,在这个端口上连接上一个显示灯,作为报警用。同时减法器74LS192的十位的BON端口会发出一个低电平,可以连接到脉冲上,让脉冲停止,数码管上显示的是00. 2.3 系统功能框图 八位数码管显示
选手抢答按钮 单片机 蜂鸣器报警电路 主持人控制开始与结束按钮 时间调整按钮 图2-1 系统功能框图 开始键按下后,抢答倒计时开始,同时系统扫描选手抢答按钮,选手按下按钮,显示器显示选手号,同时进入答题计时,答题计时结束后,系统自动复位,显示器显示“FFF”。
2.4 设计方案
整体的电路可以分为两部分,一个是抢答电路,第二部分是定时,报警电路。
1 .抢答的部分:抢答器供8名选手比赛,分别用8个按钮S0 ~ S7表示。通过管脚分配把按钮分配到实验版上的拨动开SW0到SW7关,让每个选手拨动开关后产生相应的信号。不同的选手拨动按钮发出信号通过74LS148编码器进行编码,编码后输出信号进行下一步的译码和锁存。设置一个系统清除和抢答控制开关S,开关由主持人控制。通过管脚分配把开关S分配到相应一个拨动开关SW16。该开关联系到一个相应的线路,这个线路通过与非门连接其他信号,从而达到清零的功能。抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。74LS373具有锁存功能,可以在一个选手按下按钮后进行锁存,其他的选手不能在在有选手抢答后再进行抢答。锁存相应的编号时,由于编码器编的是从0到7,如果0号选手抢答,与清零的时候可能造成混淆,所以要加上加法器,对编码器的0到7都加上1。加法器是使用用74LS83,加1
后在就可以在数码显示管上显示1到8的号码。
2.定时抢答功能,和报警部分:一次抢答的时间由主持人设定(如,30秒)。当主持人启动\"开始\"键后,定时器进行减计时。74LS192具有减法功能,通过使用74LS192可以对设定的时间进行自减。74LS192进行工作的时候需要给定秒脉冲。同时74LS192结合74LS47可以对所设定的抢答时间和选手抢答的时间显示出来。参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。选手进行抢答,通过编码器,锁存器,加法器,译码器,显示出来。当某个选手抢答有效,通过74LS148编码器的GSN端口连接到控制清零端的与非门就可以进行禁止其他选手的抢答,同时把该选手的号码显示在数码管上,同时通过74LS148编码器的GSN端口可以停止74LS192的脉冲,从而让脉冲停止,达到显示抢答时间的效果。若定时时间已到,无人抢答,本次抢答无效,系统通过一个指示灯报警并禁止抢答,定时显示器上显示00。当时间到的时候,减法器74LS192的十位的LDN端口发出一个高电平,在这个端口上连接上一个显示灯,作为报警用。同时减法器74LS192的十位的BON端口会发出一个低电平,可以连接到脉冲上,让脉冲停止输到加法器上,那么数码管显示的是00。
第3章 硬件电路的设计
3.1 硬件主要组成电路
报警电路。硬件电路主要由AT89C51单片机及其外围电路(包括复位电路、外部晶振)、按键电路、显示电路、蜂鸣器
3.2 电路工作的基本原理
整个电路由按键控制,当按下相应的按键时,单片机开始工作,抢答倒计时开,同时
系统扫描选手抢答按钮,选手按下按钮,显示器显示选手号,同时进入答题计时,答题计时结束后,系统自动复位,显示器显示“FFF”。
3.3 主控电路的设计
3.3.1 关于AT89C51单片机
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable
and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
3.3.2振荡器电路的设计
一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容,请注意一般IC的引脚都有等效输入电容,这个不能忽略。
一般的晶振的负载电容为15p或30p,如果再考虑元件引脚的等效输入电容,则两个22p的电容构成晶振的振荡电路就是比较好的选择。
图3-1 振荡电路 3.3.3复位电路的设计
复位即是在复位端加不小于指定宽度的低电平(低电平复位)或高电平(高电 8 平复
位)信号使单片机的硬件处于初始状态。以MCS-51系列单片机为例,复位端为RST/Vpd,高电平复位。在振荡电路运行时,使RST引脚至少保持两个机器周期(24
个振荡周期)高电平,实现一次复位动作。CPU响应内部复位,将ALE和PSEN引脚置为输入方式,并在RST端变低以前重复执行内部复位。
图3-2 复位电路
3.4 按键电路的设计
当按键较多时,就用到了矩阵键盘。矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘,在行线和列线的每个交叉点上设置一个按键,这样键盘上按键的个数就是4*4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
但由于本设计的按键不多,所以我们采用独立键盘,编写程序也比较简单,运行速度较
快。
3.5 显示电路的设计
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
数码管的驱动方式: 数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。本设计由于只用两个数码管,所以采用静态显示驱动,这里只介绍静态显示驱动。
静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,一个89C51单片机可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,增加了硬件。
第4章软件的设计
4.1 软件介绍
4.1.1 Proteus软件简介
Proteus的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和
IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。该软件的特点有以下几点:1:全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。2:具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS一232动态仿真、1 C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。3:支持大量的存储器和外围芯片。总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真51、AVR、PIC。Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象
4.1.2 Keil软件简介
这从近年来各仿真机厂商纷纷宣布全面支持 Keil 即可看出。Keil 提供了包括 C Keil 软件是目前最流行开发 MCS-51 系列单片 机的软件, 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通 过一个集成开发环境(uVision)将这些部份组合在一起。
4.2 语言选择
在目前单片机的发展中,其编程语言主要有C语言和汇编语言。C语言是高级语言,编写起来比较程序比较简便且易维护,汇编语言介于机器语言和高级语言之间,更接近于硬件,但编写起来比较冗长。但介于本次程序不是太复杂,本人较C语言来说更熟悉汇编,所以本次设计的程序采用汇编语言来编写。
4.3 软件总体设计
本程序采用子程序设计,在主程序中调用子程序来完成特定的功能,这样程序会通俗
易懂,同时也有利于程序的调试和修改。
本程序的程序流程图如下:
初始化 FFF 显示
非法抢答处理 正常抢 开始键按 显示犯规 显示抢答号 并倒计时 开始键按 加Y 一键按Y 调 整 抢 答时 减一键按 回答时间 图4-1 系统流程图 4.3系统程序
正常抢答处理程序:
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
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 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; 显示FF和号数 AJMP CHECK1 CHECK1: JNB P3.0,QUIT1 ACALL DISPLAY AJMP HERE QUIT1: CLR RING CLR OK AJMP START 显示程序:
DISPLAY:MOV DPTR,#DAT1; 查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出
MOV A,R5
MOVC A,@A+DPTR MOV P2,#01H MOV P0,A ACALL DELAY MOV DPTR,#DAT2 MOV A,R4
MOVC A,@A+DPTR MOV P2,#02H MOV P0,A
ACALL DELAY MOV A,R3
MOVC A,@A+DPTR MOV P2,#04H MOV P0,A ACALL DELAY 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 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 END
第5章protues仿真
5.1仿真电路图(见附录电路图) 5.2 仿真过程与结果分析 5.2.1 仿真过程操作如下
1)在Proteus中画出系统电路图,即附录1;
2)将程序在Keil中编译并生成hex文件
3)把在Keil中编译生成的HEX文件载入AT89C51; 4)进行仿真
5.2.2 仿真结果显示
图5—1
系统初始状态
图5-2
加减秒数
图5-3
7号选手犯规
图5-4 3号选手正常抢答过程
5.2.3仿真结果分析
该抢答器基本上满足了结果的显示,主持人未按下开始键,选手按下按钮抢答,蜂鸣器开始报警,按下开始后,在规定抢答时间内抢答有效,此时也进入答题时间,最后5s内蜂鸣器报警提醒,若超过抢答时间仍未有人抢答,系统报警,数码管复位。
总结
在本次课程设计中,我选择的课题以51单片机为基础,通过复习相关知识,查阅有关资料,并利用所学知识学习新的知识,根据所掌握的知识选择设计方案和所需器件。通过本次设计,提高我对以往知识的认知度,也提高了用旧的知识和已有的学习能力学习新知识的能力,总之,通过此次设计受益良多。 在本次设计中,使用了AT89C51这个单片机,在原有8051单片机的基础上学会了89C51的编程及其外围电路的设计和连接。通过此次设计熟悉了该协议,并了解了该协议的编程原理,掌握了该芯片的读写原理。此外,该设计还用到了电路设计中常用的LED八段数码管显示电路,其中使用了静态显示,同时也复习了动态显示的相关知识。在显示电路中,用到了驱动芯片,通过查阅资料,了解了常用的驱动芯片,并从中选取了一个适合本次设计的74HC245作为驱动,同时也为以后从事这方面的设计和研究打下了很好的基础。 此外,在程序的编写过程中,根据设计的要求和自己所要增加的功能写出程序流程图,在此基础上,根据单片机的指令系统和芯片的功能写出相应的程序,然后再进行程序调试和修改,使得能够实现所要求的功能。程序要尽量做到由各个子程序组成,尽量在多加些注释,总之,只要能做到以上几点,我们就能达到既能把课题完成又能锻炼自己的能力的目的。因此,我们的设计不仅仅是一个重新学习的过程,而且也是对我们学习和动脑能力的培养。另外在设计中通过与导师以及周围同学的沟通,学会了团队合作,为以后走向社会参与社会竞争奠定了基础。
参考文献
[1]伍时和.数字电子技术基础[M].北京.清华大学出版社.2009 [2]贾秀美.数字电路硬件设计实践[M].北京.高等教育出版社.2008
[3]康华光.电子技术基础-数字部分(第五版)[M].南昌.高等教育出版.2006 [4]张毅刚.单片机原理及应用[M].北京.高等教育出版社.2003.
[5]谢字美主编:电子线路设计.实验.测试[M].武昌.华中科技大学出版社.2005 [6]候建军.数字电路实验一体化教程[M].南京.人民邮电出版社.2006
附录1 源程序
OK EQU 20H;抢答开始标志位 RING EQU 22H;响铃标志位
ORG 00OK EQU 20H;抢答开始标志位 00H
AJMP MAIN ORG 0003H AJMP INT0SUB ORG 000BH AJMP T0INT ORG 0013H AJMP INT1SUB ORG 001BH AJMP T1INT ORG 0040H
MAIN: MOV R1,#0FH; 初设抢答时间为15s MOV R2,#0AH; 初设答题时间为10s MOV TMOD,#11H;
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.如果想重新TH1/TL1就可以了查询程序: START:
MOV R5,#0BH MOV R4,#0BH MOV R3,#0BH
ACALL DISPLAY; 未开始抢答时候显示FFF JB P3.1,NEXT ACALL DELAY
JB P3.1,NEXT;去抖动,如果\"开始键\"按下就向下执行,否者跳到非法抢答查询 ACALL BARK;按键发声 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,FALSE7 JNB P1.7,FALSE8 AJMP START 非法抢答处理程序:
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 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.2,INC0; P3.2为+1s键,如按下跳到INCO JNB P3.3,DEC0; P3.3为-1s键,如按下跳到DECO JNB P3.0,BACK0; P3.0为确定键,如按下跳到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 16 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.2,INC1 JNB P3.3,DEC1 JNB P3.0,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
倒计时程序(抢答倒计时和回答倒计时都跳到该程序): 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,#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.0,QUIT;
ACALL DISPLAY JB OK,ACCOUT; AJMP RECOUNT ACCOUT:
JNB P1.0,TRUE1 JNB P1.1,TRUE2 JNB P1.2,TRUE3 JNB P1.3,TRUE4
JNB P1.4,TRUE5 JNB P1.5,TRUE6 JNB P1.6,TRUE7 JNB P1.7,TRUE8 AJMP RECOUNT 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 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 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; 显示FF和号数 AJMP CHECK1 CHECK1:
JNB P3.0,QUIT1 ACALL DISPLAY AJMP HERE QUIT1: CLR RING CLR OK AJMP START 显示程序:
DISPLAY:MOV DPTR,#DAT1; MOV A,R5
MOVC A,@A+DPTR MOV P2,#01H MOV P0,A ACALL DELAY MOV DPTR,#DAT2 MOV A,R4 MOVC A,@A+DPTR MOV P2,#02H MOV P0,A ACALL DELAY MOV A,R3 MOVC A,@A+DPTR MOV P2,#04H MOV P0,A ACALL DELAY 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 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 OUT:
RETI ;;;;T1溢出中断(计时程序): T1INT:
MOV TH1,#3CH MOV TL1,#0B0H INC R0 RETI
END
附录2 电路原理图
因篇幅问题不能全部显示,请点此查看更多更全内容