㈠ 51单片机四路抢答器毕业论文 只要四路
第一章 绪论设计的四路数字抢答器,每路设计一抢答按钮供选手使 用,并设置一个系统清除和抢答控制总开关 S,该开关由主持 人控制。 抢答器具有限时抢答功能,每一轮的限时抢答时间设定为 30 秒。主持人启动"开始"键后,在设定的时间内,参赛选手 进行抢答有效,否则无效。 抢答器具有锁存与显示功能。选手抢答成功则显示相应 的编号,此时其他选手无法抢答。优先抢答选手的编号一直 保持到主持人将系统清除为止。用计时器数码管显示当前剩 余的答题时间, 当答题剩余时间为 5 秒时,小灯闪烁提示;当答题时间结束 时,蜂鸣器发出响声,提示答题者答题时间到。 本课题我们主要采用单片机电路来实现的,主要设计思 路是:在主持人下达命令之后,若选手在 30s 内没有闭合开 关,就进入下一环节;若有选手闭合开关,主机就能够准确 判断出第一抢答信号并将其锁存,同时将其余输入信号封锁, 使其它抢答无效,此时主持人根据屏幕上显示的号码判断是 哪位选手可以做答,此时最先闭合开关的选手开始进入答题 倒计时,若在 60s 内答题则视为有效;否则无效。 程序流程图如图 1-1.1-2 所示: 选手发送图: 开始 初始化:P0.P2 口清零 定时器 T1 方式选择;串行口发送方式选 择;启动定时器 1 并装入初值 判断抢答是否成功 向主机发送选手号 显示答题倒计时 图 1-1 主持人接受图:开始 初始化: P0.P1.P2.口清零, 串行口接受方式选择,T1 接收方 式选择,启动计数器 T1,并装入初值,开总中断和串行口 中断 总开关是否按下 允许接收,并显示抢答时间倒计时 是否接受到抢答信号 显示优先按下键的选手号码, 并屏蔽其他选手 号码 图 1-2 系统方案论证 第二章 系统方案论证方案一:如图 2-1,采用一个单片机,一个计时器,一个 数码管,选手通过按下开关作为输入信号,完成抢答输入信 号的触发。主持人根据选手的输入信号准确判断出最先按下 开关的选手,并屏蔽其他抢答信号,让优先按键的选手开始 作答,同时计时器开始计时倒计时。电路主要运用了定时器 和计数器,该电路的优点是电路图比较简单,缺点是抗干扰 能力差,缺乏实际利用价值。 图 2-1 方案二:采用五个单片机,五个计时器,一个数码管, 电路主要运用串行口中断和定时器计数器的工作原理。接通 电源后, 主持人将开关拨到"清零"状态, 抢答器处于禁止状态, 编号显示器灭灯,主持人将开关置开始"状态,宣布"开始"抢 答器工作,开始抢答时间倒计时,如果在抢答时间倒计时内 无人抢答,则直接进入下一环节,若有人在这时间内优先抢 答,则其开始作答,与此同时抢答倒计时,改换成作答倒计 时,当倒计时到 5s 时,信号灯闪烁提醒作答选手,当计时结 束时,蜂鸣器发出报警声响提示选手。选手抢答实行优先锁 存,优先抢答,选手的编号一直保持到裁判将系统清零为止。 该电路的缺点是电路复杂,优点是便于每位选手观看倒计时, 实用性较好,在实际生活中应用较多。 通过以上两个方案的比较,我们不难发现第二个电路增 加了一些控制电路,控制起来比较容易一些,效果和实用性 比第一个好,故本实验采用第二个原理图。 系统图各位选手通过按键发送请求信号告知主持人,主持人通 过数码管上号码告诉哪位选手可以答题,如图 2-2 1号 4号 主 持 人 2号 3号 图 2-2 第三章 理论分析本课题的电路采用单片机 AT89C51 作为控制芯片, 分别是 主持人和每位参赛选手都有自己的控制器。每位选手的控制 芯片 P0 和 P2 口上都接一个共阴极的数码管作为答题倒计时 的显示。P1^4 口接一按键,按键的另一端接地,供选手抢答 使用。 P1^6 接音频放大电路, 并在其输出端接一个喇叭,作 为答题剩余时间提醒。当选手按下按键抢答成功时,它就会 通过控制芯片上的串行口发送自己的选手号,同时也启动了 答题倒计时,当答题时间只剩下 5 秒时,喇叭就会发出“叮 咚”提醒选手抓紧时间答题。 主持人的控制芯片的 P0 . P1 和 P2 口都接一共阴极的数码 管,其中 P1 口的数码管用来显示抢答成功选手的号码。P1 和 P2 口的数码管开始时用来显示允许抢答的时间限制,当有 选手抢答成功时,就转为显示抢答时间倒计时。P3^7 接开关 和指示灯,当开关按下指示灯亮时才允许选手们进行抢答。当 有一号选手抢答成功,则通过软件关闭串行口中断屏蔽其他 的选手。 选手向主持人发送自己的选手号码是采用串行口单工通 讯的原理。 每个控制芯片内部都有一个功能强大的全双工的 异步通信串行口, 其内部有两个物理上独立的接收. 发送缓冲 期 SBUF,可同时发送. 接收数据。每次串行口的使用,串行 口需初始化后, 才能完成数据的输入、输出。其初始化过程如 下: (1) 按选定串行口的操作模式设定 SCON 的 SM0、SM1 两 位二进制编码。(2) 对于操作模式 2 或 3, 应根据需要在 TB8 中写入待发送的第 9 位数据。(3) 若选定的操作模式不 是模式 0, 还需设定接收/发送的波特率。设定 SMOD 的状态, 以控制波特率是否加倍。 若选定操作模式 1 或 3, 则应对定 时器 T1 进行初始化以设定其溢出率。 这些初始化须通过软件 编程来实现。 本设计采用的是模式 2--9 位数据异步通讯方式。 其工作原理为: (1).一帧为 11 位:9 位数据位,1 个起始位(0),1 个停 止位(1)。第 9 位数据位在 TB8/RB8 中,常用作校验位和多机 通讯标识位(2).RXD:接收数据端,TXD:发送数据端。(3). 波特率: 方式 2:B=(2SMOD/64)×fosc ,本设计用定时器 1 来产生。(4).发送:先装入 TB8,写入 SBUF 并启动发送, 发送结束,TI=1。接收:REN=1,允许接收。接收完一帧,若 RI=0 且第 9 位为 1 (或 SM2=0),将接收数据装入接收 SBUF, 第 9 位装入 RB8,使 RI=1;否则丢弃接收数据,不置位 RI。 原理图如下: 图3 试验及数据分析 第四章 试验及数据分析 1. 实验环境在实验室里用 proteus 仿真,用 keil 编程,最后得到仿真 结果。 2. 数据(1)主机工作 ) 主持人闭和开关后,数码管显示零,计时器显示抢答倒 计时,从 30s 开始倒计时。如图 4-2-1: 图 4-2-1 (2)选手一抢答 ) 在抢答倒计时时间内,选手一闭合开关,主机数码管上 显示”1”,选手一旁边的发光二极管亮,与此同时,主持人和选 手一的计时器开始显示答题倒计时,时间在 60s 内,如图 4-2-2: 图 4-2-2 (3)选手二抢答 ) 在抢答倒计时时间内,选手二闭合开关,主机数码管上 显示”2”,选手二旁边的发光二极管亮,与此同时,主持人和选 手二的计时器开始显示答题倒计时,时间在 60s 内,如图 4-2-3: 图 4-2-3 (4)选手三抢答 ) 在抢答倒计时时间内,选手三闭合开关,主机数码管上 显示”3”,选手三旁边的发光二极管亮,与此同时,主持人和选 手三的计时器开始显示答题倒计时,时间在 60s 内,如图 4-2-4: 图 4-2-4 (5)选手四抢答 ) 在抢答倒计时时间内,选手四闭合开关,主机数码管上 显示”4”,选手四旁边的发光二极管亮,与此同时,主持人和选 手四的计时器开始显示答题倒计时,时间在 60s 内,如图 4-2-5: 图 4-2-5 3. 分析抢答器由单片机以及外围电路组成,由于采用单片机, 使得外围电路非常简单,有如下功能抢答限时、选手答题计 时抢答自锁,灯光指示、暂停复位、电子音乐报声;抢答规 定时限 0-30 秒可调; 面板上设有组号与计时窗口, 显示清晰, 同步显示,互不干扰集抢答器、数显倒计时器于一机; 可设 定抢答、答题两种倒计时时间;抢答器具有锁存与显示功能。 即选手按动按钮, 锁存相应的编号, 并在 LED 数码管上显示; 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定, 本次时间设定为 30 秒,当主持人启动"开始"键后,定时器进 行减计时等等,总之抢答器很有实用价值。 第五章 心得体会今年参加了全国大学生电子设计大赛培训,培训过程中 的艰辛只有亲身经历过才知道里面的酸甜苦辣,我相信这段 时间会给我们留下美好的回忆。在经历了艰苦的培训之后, 我们组只有一个信念,就是无论如何也要尽我们最大的努力, 让老师选上我们,只有选上了,我们的梦想才真的开始了, 否则前面的付出就付诸东流了。 我们做的是抢答器。我们本来很快就有思路了,但给老 师一看的时候,他说太没难度了,会影响我们的选拔分,没 办法,我们只好把难度往上提了,这一提难度我们可就连续 整了 3 天,在这 3 天我们除下吃饭和睡觉的时间不在外,其 余时间通通泡在实验室内,最终通过我们的集体努力,我们 的实验也算有所成果吧。 通过参加这次培训,发现有了很多的体会和收获:首先 是学习能力的加强。这种学习能力包括获取资料的能力、理 解前人思路的能力、系统设计能力、动手能力、分析排除故 障能力、表达能力等多方面,电子设计竞赛的赛制就决定了 上述能力缺一不可。其次是团队精神的培养。电子设计竞赛 要求三人组队参赛,集体计算成绩,这就使得三个人必须互 相信任、互相配合、分工合作。在顺境时要相互提醒保持冷 静,逆境时要相互鼓励共度难关,不能相互埋怨。 我们组永远忘不了这次经历,永远忘不了和我们一起奋 斗的老师和学哥,我们永远坚信我们组是最棒的! 参 考 文 献 [1] 余发山, 单片机原理及应用技术 ,中国矿业大学出版社, 2003; [2]王卫东,基于单片机的最简连线抢答器的设计与制作,1999; [3]李朝青.2001.单片机原理与接口技术.北京:北京航空航天 大学出版社.94-103,339-348; [4] 沈庆阳、郭庭吉 版社; [5]李朝青主编,《单片机原理与接口技术》,北京航天航空大学 出版社,1994; [6]何立民主编,《单片机应用与设计》,北京航天航空大学出版 社,1990; 8051 单片机实践与应用 清华大学出
电子科协竞赛项目报告书 参赛作品: 单片机的 参赛作品:基于 51 单片机的四路电子抢答器 作品 小 组 成 员: TH XZ 专 业 班 级: 电信 1005 班 报告提交日期: 2011 报告提交日期: 2011 年 3 月 16 日 日期 目录 1 设计要求与功能 ........................................................................................................... 4 1.1 设计基本要求…………………………………………………………………...4 2 硬件设计 ...................................................................................................................... 4 2.1 控制系统及所需元件…………………………………………………………. 4 2.2 抢答器显示模块………………………………………………………………...5 2.3 电源方案的选择 ............................................................................................... 6 2.4 抢答器键盘的选择 ........................................................................................... 6 2.5 蜂鸣器模块 ........................................................................................................ 7 2.6 外部振荡电路 .................................................................................................... 7 3 程序设计 ...................................................................................................................... 7 3.1 程序流程图 ........................................................................................................ 7 3.2 系统的调试…… ………………………………….. …………………………9 3.3 焊接的问题及解决……………………………………………………… …10 4 总结 ............................................................................................................................. 10 附录 C 程序 ................................................................................................................... 11 II 一设计要求与功能 1.1 设计基本要求(1)抢答器同时供 4 名选手或 4 个代表队比赛使用,分别用 4 个按钮 K1~ K4 表示。 (2)设置裁判开关 k5 和清零开关 k6,该开关由主持人控制,当主持人按 下 k6,系统复位,预备抢答,当主持人按下总控制控制开关 k5,开始抢答; (3) 抢答器具有定时抢答功能, 抢答时间为倒计时 15 秒。 当主持人启动 “开 始”键后,定时器进行减计时,同时扬声器发出短暂的提示声响,声响持续的时 间 0.5 秒左右,当计时小于 5 秒后,每减少一秒,便报警一次以提示选手。 (4)抢答器具有锁存功能,参赛选手在设定的时间内进行抢答,抢答有效, 蜂鸣器发声,计时停止,数码管上显示选手的编号和时间,选手相应的信号灯被 点亮,其他选手再抢答时无效。 (5)如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答。 等待下一轮抢答。 。 二 硬件设计 2.1 控制系统及所需元件控制系统主要由单片机应用电路、存储器接口电路、显示接口电路组成。其 中单片机 STC89C52 是系统工作的核心,它主要负责控制各个部分协调工作。 所需元件:该系统的核心器件是 STC89C52。各口功能: P0.0-P0.3 是数码管的位选口; P2.0-P2.7 是数码管的段选口,为其传送段选信号; P1.0-P1.3 是 4 组抢答信号的输入口; P1.4、P1.5 由裁判控制,分别是抢答开始\复位功能键; P1.6 为蜂鸣器的控制口; P3.4-P3.7 为选手信号灯输出口; 在其外围接上电复位电路、数码管电路、LED 发光二极管、按键电路及扬声 器电路。 电子抢答器用单片机来设计制作完成的, 由于其功能的实现主要是通过软件 3 编程来完成的,所以采用单片机 STC89C52,它是一个低电压,高性能 CMOS 8 位 单片机,片内含 8k bytes 的可反复擦写的 Flash 只读程序存储器和 512 bytes 的随机存取数据存储器(RAM) ,器件采用 ATMEL 公司的高密度、非易失性存储技 术生产,兼容标准 MCS-51 指令系统,片内置通用 8 位中央处理器和 Flash 存储 单元,功能强大的 STC89C52 单片机可为您提供许多较复杂系统控制应用场合。 下图为其 I/O 口引脚图: STC89C52 管脚图 2.2. 抢答器显示模块显示模块分为数码管模块和 LED 信号灯模块 分别采用四位一体共阴极数码管和四个发光二极管,体积小,功耗低,故障 率低,程序编译容易,资源占用较少。 (见图 1,图 2) 图1 4 图2 2.3 电源方案的选择系统需要 5V 电源来驱动单片机 STC89C52。 利用电脑的 USB 接口可以提供 5V 电压来驱动单片机。 2.4 抢答器键盘的选择键盘是单片机不可缺少的输入设备,是实现人机对话的纽带。键盘按结构形 式可以分为非编码键盘和编码键盘,前者用软件方法产生键码,而后者则用硬件 方法来产生键码。 在单片机中使用的都是非编码键盘, 因为非编码键盘结构简单, 成本低廉,非编码键盘的类型很多,常用的有独立式键盘,行列式键盘等。 本设计采用独立式键盘。 键盘接口中使用多少根 I/O 线,键盘中就有几个按键,键盘接口使用了 6 根 I/O 口线,该键盘就有 6 个按键,这种类型的键盘,其按键比较少,且键盘中 各按键的工作互不干扰。因此可以根据实际需要对键盘中的按键灵活的编码。如 图所示。 最简单的编码方式就是根据 I/O 输入口所直接反映的相应按键, 按下的状态 进行编码,称按键直接状态码,对于这样编码的独立式键盘,CPU 可以通过直接 读取 I/O 口的状态来获取按键的直接状态编码值,根据这个值直接进行按键识 别,这样形式的键盘结构简单,按键识别容易。 5 独立式键盘的缺点是需要占用比较多的 I/O 口线, 当单片机应用系统键盘中 需要的按键比较少或 I/O 口线比较富余时,可以采用这样类型的键盘。 其模块电路图如图 4 所示。采用六个 BUTTON 按钮作为抢答的选择按钮,与 STC89C52 的 P1.0-P1.5 相连。 图 4 键盘模块 2.5 蜂鸣器模块蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计 算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等 电子产品中作发声器件,其图形如图所示. 6 2.6 外部振荡电路外部振荡电路单片机必须在 AT89C52 的驱动下才能工作.在单片机内部有一个 时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部 的各个单元,外部振荡电路见图所示。 三 程序设计 3.1 程序流程图: 程序流程图:开始 初始化部分 N K5= =0 Y 启动中断,数码管开始倒计时 N 若有选手抢答 Y 中断停止,数码管显示选手的标号并点亮信号灯 结束抢答器主程序流程图 7 定时器 0 中断 N 1 秒时间到? Y 秒加 1 数码管显示秒值 中断返回 抢答器定时器中断流程图 扫 描 键 盘 Y K0 键按下 N Y K1 键按下 N Y K2 键按下 N K3 键按下 N 与 K2 键对应的发光二极管亮及数码管显示 与 K1 键对应的发光二极管亮及数码管显示 与 K0 键对应的发光二极管亮及数码管显示 Y 与 K3 键对应的发光二极管亮及数码管显示 扫描停止 键盘扫描流程图 主程序我们组所设计的抢答器的程序采用的是 C 程序设计,C 语言的显着特点是用 二进制来编写程序,程序的各个部分除了必要的信息交流外彼此之间相互独立。 8 这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C 语言是以函数 形式提供给用户的,这些函数可方便的调用,并具有多种循环、 条件语句控制程序 流向,从而使程序完全结构化。虽然 C 语言也是强类型语言,但它的语法比较灵 活,允许程序编写者有较大的自由度。本次设计的主程序中包括时钟设计程序, 定时器中断子程序,LED 显示程序以及按键控制子程序,具体程序见附件。 3.2 系统的调试系统调试包括硬件调试和软件调试,而且两者是密不可分的。我们设计好的 硬件电路和软件程序,只有经过联合调试,才能验证其正确性;软硬件的配人情 况以及是否达到设计任务的要求,也只有经过调试,才能发现问题并加以解决、 完善,最终开发成实用产品。 硬件调试分单元电路调试和联机调试, 单元电路试验在硬件电路设计时已经 进行,这里的调试只是将其制成印刷电路板后试验电路是否正确,并排除一些加 工工艺性错误(如错线、开路、短路等) 。这种调试可单独模拟进行,也可通过 开发装置由软件配合进行。硬件联机调试则必须在系统软件的配合下进行。 软件调试一般包括分块调试和联机调试两个阶段。 程序的分块调试一般在单 片机开发装置上进行, 可根据所调程序功能块的入口参量初值编制一个特殊的程 序段,并连同被调程序功能块一起在开发装置上运行;也可配合对应硬件电路单 独运行某程序功能块,然后检查是否正确,如果执行结果与预想的不一致,可以 通过单步运行或设置断点的方法, 查出原因并加以改正, 直到运行结果正确为止。 这时该 程序功能块已调试完毕,可去掉附加程序段。其它程序功能块可按此法 进行调试。 程序联机调试就是将已调试好的各程序功能块按总体结构联成一个完 整程序,在所研制的硬件电路上运行。从而试验程序整体运行的完整性、正确性 和与硬件电路的配合情况。在联调中可能会有某些支路上的程序、功能块因受条 件制约而得不到相应的输入参数,这时,调试人员应创造条件进行模拟调试。在 联调中如发现硬件问题也应及时修正,直到单片机系统的软件、硬件全部调试成 功为止。系统调试完成后,还要进行一段时间的试运行,从而检验系统的稳定性 和抗干扰能力,验证系统功能是否达到设计要求,是否达到预期的效果。 9 3.3 焊接的问题及解决一般来说,造成硬件问题的首要问题就是焊接了,也就是说焊接的好与坏直 接响产品的正常运行。 造成焊接质量不高的常见原因是:①焊锡用量过多,形成焊 点的锡堆积;焊锡过少,不足以包裹焊点。②冷焊。焊接时烙铁温度过低或加热 时间不足,焊锡未完全熔化、浸润、焊锡表面不光亮(不光滑),有细小裂纹(如同 豆腐渣一样!)。 ③夹松香焊接,焊锡与元器件或印刷板之间夹杂着一层松香,造成 电连接不良。若夹杂加热不足的松香,则焊点下有一层黄褐色松香膜;若加热温 度太高,则焊点下有一层碳化松香的黑色膜。对于有加热不足的松香膜的情况, 可以用烙铁进行补焊。 对于已形成黑膜的,则要"吃"净焊锡,清洁被焊元器件或印 刷板表面,重新进行焊接才行。④焊锡连桥。指焊锡量过多,造成元器件的焊点之 间短路。这在对超小元器件及细小印刷电路板进行焊接时要尤为注意。⑤焊剂过 量,焊点明围松香残渣很多。当少量松香残留时,可以用电烙铁再轻轻加热一下, 让松香挥发掉,也可以用蘸有无水酒精的棉球,擦去多余的松香或焊剂。 ⑥焊点表 面的焊锡形成尖锐的突尖。这多是由于加热温度不足或焊剂过少,以及烙铁离开 焊点时角度不当浩成的内。 。 总 结 经过近半个月的努力,在我们合作下,我们较好的完成了这次设计项目,通 过此次电子制作比赛,我们重新认识到了自学的重要性,以及学以致用的道理。 我们在图书馆和网上查阅了大量的资料,同时也认识到了图书馆的重要作用。 通过此次的抢答器的设计,让我们更加重视到专业知识的重要性及动手能力的 必要性,在整个制作过程中,我们出现很多问题,但我们并没有因此而放弃, 在不断调试和失败中,我们不仅学到了专业知识,更是磨炼了我们的心智,让 我们受益匪浅。任何事情只要去做,多多去尝试,努力的要以自己去做为前提 的心态,那么任何事情即使做的不好,也会受益很多,不是有句话叫做:心态 决定的成败的话吗,实在是有理。无论做什么事情都不可能一帆风顺,碰到阻 碍不要舍弃,不要踟蹰不前,不经历风雨,怎么见彩虹! 在今后的学习过程中,应该多到图书馆看一些专业方面的书籍,比如 protel 画图,proteus 仿真软件,以丰富自己的知识,掌握更多的硬件与软件设计技巧, 使我们在今后的制作中提高效率。 这次设计任务也使我们加深了对单片机及接口 10 技术的理解和应用,由于知识水平的局限,设计中可能会存在着一些不足,我们 真诚的接受老师和同学的批评和指正.。 附录( 程序) 附录(C 程序) #include<reg52.h> #define uchar unsigned char #define uint unsigned int Uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管 0~9 编码 uint i,j,time,num; uchar ge,shi; bit flag,flag1; sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2; sbit k4=P1^3;sbit k5=P1^4;sbit k6=P1^5; //k1~k4 为选手按键,k5 为主持人开关,k6 为复位键 sbit beep=P1^6;//定义蜂鸣器的端口 sbit wei1=P0^0;sbit wei2=P0^1; sbit wei3=P0^2;sbit wei4=P0^3;//定义数码管的位选端口 sbit led1=P3^4;sbit led2=P3^5; sbit led3=P3^6;sbit led4=P3^7;//定义 LED 灯的端口 void delay(uint a)//延时函数 { uint i,j; for(i=a;i>0;i--) for(j=110;j>0;j--); } 11 void display()//显示函数 { shi=time/10; ge=time%10; P2=table[num];//显示选手编号 wei1=0;delay(1); wei1=1; P2=table[shi]; wei3=0; delay(1); wei3=1; P2=table[ge]; wei4=0; delay(1); wei4=1; } void keyscan() { if(k1==0)//按键按下 { delay(10);//延时去抖动 if(k1==0) { num=1;led1=0;flag=1;TR0=~TR0;TR1=0;//开定时器 0,关定时器 1 beep=1;delay(500);beep=0;//蜂鸣器响 500 毫秒 while(!k1);//等待按键释放 } } if(k2==0) { delay(10); if(k2==0) //显示时间 12 { num=2;led2=0;flag=1;TR0=~TR0;TR1=0; beep=1;delay(500);beep=0; while(!k2); } } if(k3==0) { delay(10); if(k3==0) { num=3;led3=0;flag=1;TR0=~TR0;TR1=0; beep=1;delay(500);beep=0; while(!k3); } } if(k4==0) { delay(10); if(k4==0) { num=4;led4=0;flag=1;TR0=~TR0;TR1=0; beep=1;delay(500);beep=0; while(!k4); } } display();//显示选手编号和时间 if(time==0) { TR0=0; TR1=0; flag=1;//关计时器 0 和 1 13 } if(time==6) TR1=1; } void init() { TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1;ET0=1;ET1=1; beep=0;//作品上蜂鸣器是赋高电平响,开始置低关闭 } void main() { init();//初始化 while(1) { display(); if(k6==0) { delay(10); if(k6==0) { P3=0xff;//关闭所有 LED 灯 flag1=k6; time=15; wei1=0; num=0; P2=table[num]; 14 while(!flag1) { if(k5==0) { delay(10); if(k5==0) { flag1=1;flag=k5; TR0=1; beep=1;delay(500);beep=0; while(!k5); while(!flag) keyscan();//扫描键盘 } } } } } } } void time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; i++; if(i==20) { i=0; time--; } } 15 void time1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; j++; if(j==10) { j=0; beep=~beep; } } 16
㈡ 基于单片机的简易八路抢答器设计
ORG0000H
JMPBEGIN
ORG0030H
TABLE:;共阴极数码管显示代码表
DB3FH,06H,5BH,4FH,66H;01234
DB6DH,7DH,07H,7FH,6fh;56789
DELAY:MOVR5,#20
LOOP4:MOVR6,#50H;延时20X20ms
LOOP5:MOVR7,#100
DJNZR7,$
DJNZR6,LOOP5
DJNZR5,LOOP4
RET
;---------------------------------------
BEGIN:MOVP2,#0FFH;P2口置高电平,准备接收信号
MOVR4,#0
MOVA,R4;R4位标志值送A寄存器
AGAIN:MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP1,A
LOOP1:MOVA,P3;接收p3口的抢答信号
CPLA
JZLOOP1
LOOP2:RRCA;有人抢答信号则逐次移动判断哪一位抢答
INCR4
JNCLOOP2
;********************
MOVA,R4
MOVCA,@A+DPTR;找到相应位显示代码
MOVP1,A
LEDDIS:
MOVA,#0FFH
CLRC
LEDDIS1:
RLCA
DJNZR4,LEDDIS1
MOVP0,A
LOOP3:JNBP2.2,BEGIN;若主持人按下复位信号键,则转向主程序
CPLP2.0;若没按复位信号键,则通过p2.2口给出高低信号驱动蜂鸣器
LCALLDELAY;调用延时子程序
SJMPLOOP3;p2.2口反复间隔0.4s变化,驱动蜂鸣器
END
㈢ 设计抢答器的意义
㈣ 如何设计基于单片机的多功能8路抢答器
八路抢答器的设计
摘要
本文介绍了一种采用数字电路制作的多功能数显抢答器,它主要采用了74系列的常用集成电路,它除了具有基本的抢答功能之外,还具有定时报警的功能,和数显的功能,当抢答开始后,系统会自动倒计时,并且时间是可以预设的,期间有人抢答的话系统会停止计时,如果期间没人抢答,系统会有短暂的报警,提示抢答结束。
关键字
单片机、PLC、抢答、报警、数显
一、 设计目的
在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性。
二、 方案
制作抢答器可以用好多的方法,可以用单片机来完成,它的功能强大制作简单,并且外围的元件也很少;也可以用PLC来实现,他的制作也是比较简单;还可以用我们学过的EDA技术来制作;最后也可以用数字电路来实现,它的原理比较简单,集成块的价格也比较便宜且很容易购买,与我们学完的〈〈数字电路〉〉联系紧密,能将我们所学知识用于实际,对巩固所学知识有重要意义,用了一些成型电路,如NE555标准秒脉冲电路等,使总体方案易于实现。
方案一〈采用数字电路〉
1、原理方框图
定时抢答器的总体框图如图1所示,它由主体电路和扩展电路两部分组成。主体电路完成基本的抢答功能,即开始抢答后,当选手按动抢答键时,能显示选手的编号,同时能封锁输入电路,禁止其他选手抢答。扩展电路完成定时抢答的功能。
图1
图1所示的定时抢答器的工作过程是:接通电源时,节目主持人将开关置于“清除”位置,抢答器处于禁止工作状态,编号显示器灭灯,定时显示器显示设定的时间,当节目主持人宣布“抢答开始”,同时将控制开关拨到“开始”位置,扬声器给出声响提示,抢答器处于工作状态,定时器倒计时。当定时时间到,却没有选手抢答时,系统报警,并封锁输入电路,禁止选手超时后抢答。当选手在定时时间内按动抢答键时,抢答器要完成以下四项工作:
①优先编码电路立即分辨出抢答者的编号,并由锁存器进行锁存,然后由译码显示电路显示编号;
②扬声器发出短暂声响,提醒节目主持人注意;
③控制电路要对输入编码电路进行封锁,避免其他选手再次进行抢答;
④控制电路要使定时器停止工作,时间显示器上显示剩余的抢答时间,并保持到主持人将系统清零为止。当选手将问题回答完毕,主持人操作控制开关,使系统回复到禁止工作状态,以便进行下一轮抢答。
方案二〈采用单片机〉
1、原理方框图
此电路完成的功能如图2所示,当主持人宣布抢答开始的时候,按下开始按钮,此时电路进入抢答状态,选手的输入采用了扫描式的输入,之后把相应的信息送往单片机,再由单片机输出到显示输出电路中。此时有人第一按下相应的抢答按钮,经过单片机的控制选择,在八段显示器上显示相应的号码,并锁存,同时禁止其他按钮的输入。
(图2)
方案三〈采用PLC〉
1、原理方框图
此电路的功能如图3所示,当主持人打开启动开关后,在设定时间TO 内,如果某组抢先按下抢答按钮,则驱动音效电路①发出声响,指示灯LI亮,并且在8段数码管显示器上显示出抢答成功的组号,此时电路实现互锁,其他组再按下抢答按钮为无效;
如果在时间TO内,无人应答,则驱动音效电路②发出声响,指示灯L2亮,表示抢答者均放弃该题;
在抢答成功后,主持人打开限时开关SW2,启动计时器,在设定的时间TI 内回答有效,当到达设定时间TI时,驱动音效电路③,指示灯L3亮,表示答题时间到。
(图3)
三、 方案选择
方案比较
数字电路
单片机
PLC
制作难度
低
一般
一般
实现难度
一般
低
低
价格
低
一般
高
电路原理
简单
一般
一般
设计难度
简单
高
一般
通过上面的方案比较,数字电路的制作方案比较容易实现,并且在原理方面也是比较简单,所以我选择采用第一种方案来完成抢答器电路。
四、 设计系统功能
1.基本功能:
(1) 同时供8名选手比赛,分别用8个按钮S0 ~ S7表示。
(2)设置一个系统清除和抢答控制开关S,该开关由主持人控制。
(3)抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,扬声器发出声响提示,并在七段数码管上显示选手号码。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
2.扩展功能:
(1)抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。当主持人启动"开始"键后,定时器进行减计时。
(2)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。在这段(3)如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
五、 各部分单元电路的设计
(1)抢答器的主体电路设计
抢答电路的功能有两个:一是能分辨出选手按键的先后,并锁存优先抢答者的编号,供译码显示电路用;二是要使其他选手的按键操作无效。选用优先编码器74148和DFF锁存器可以完成上述功能,其电路组成如图4所示。其工作原理是:当主持人控制开关处于“清除”位置时,RS触发器的端为低电平,输出端(4Q~1Q)全部为低电平。于是74LS48的 =0,显示器灭灯;74148的选通输入端 =0,74LS148处于工作状态,此时锁存电路不工作。当主持人开关拨到“开始”位置时,优先编码电路和锁存电路同时处于工作状态,即抢答器处于等待工作状态,等待输入端 7... 0输入信号,当有选手将键按下时(如按下S5),74LSl48的输出=010, =0,经RS锁存器后,CTR=l, =1,74LS279处于工作状态,4Q3Q2Q=101,经74LS48译码后,显示器显示出“5”。此外,CTR=1,使74l48的端为高电平,74LSl48处于禁止工作状态,封锁了其它按键的输入。当按下的键松开后,74LSl48的为高电平,但由于CTR维持高电平不变,所以74LSl48仍处于禁止工作状态,其它按键的输入信号不会被接收。这就保证了抢答者的优先性以及抢答电路的准确性。当优先抢答者回答完问题后,由主持人操作控制开关S,使抢答电路复位,以便进行下一轮抢答。
(图4)
74LS148为8线-3线优先编码器,表1为其功能表。
表1 74LS148的功能真值表
(2)定时电路设计
原理及设计:该部分主要由555定时器秒脉冲产生电路、十进制同步加减计数器74LS192减法计数电路、74LS48译码电路和2个7段数码管即相关电路组成。具体电路如图5所示。两块74LS192实现减法计数,通过译码电路74LS48显示到数码管上,其时钟信号由时钟产生电路提供。74192的预置数控制端实现预置数,由节目主持人根据抢答题的难易程度,设定一次抢答的时间,通过预置时间电路对计数器进行预置,如果要设置为30S,就可以在计数器的预置数控制端输入00110000。时钟脉冲由秒脉冲电路提供。按键弹起后,计数器开始减法计数工作,并将时间显示在共阴极七段数码显示管上,当有人抢答时,停止计数并显示此时的倒计时时间;如果没有人抢答,且倒计时时间到时,输出低电平到时序控制电路,控制报警电路报警,同时以后选手抢答无效。具体电路如图5所示。
(图5)
秒脉冲产生电路:秒脉冲由NE555提供,它的的3端输出的脉冲的频率为
,结合我们的实际经验及考虑到元器件的成本,我们选择的电阻值为R1=15K,R2=68K,C=10uF,代入到上式中即得,即秒脉冲。
(3)报警电路的设计
采用555定时器和三极管构成的报警电路如图6所示。其中555构成多谐振荡器,振荡频率
其输出信号经三极管推动扬声器。PR为控制信号,当PR为高电平时,多谐振荡器工作,当PR为低电平的时候,电路停振。
(图6)
(4)时序控制电路设计
与门G1 的作用是控制时钟信号CP的放行与禁止,门G2的作用是控制74LS148的输入使能端(即图二中的5端)。图7的工作原理是:主持人控制开关从"清除"位置拨到"开始"位置时,来自于图2中的74LS279的输出 1Q,即CTR=0,经G3反相,输出为1,则NE555产生的时钟信号CP能够加到74LS192的CPD时钟输入端,定时电路进行递减计时。同时,在定时时间未到时,则"定时到信号"为 1,门G2的输出 =0,使 74LS148处于正常工作状态。当选手在定时时间内按动抢答按键时,CTR=1,经G3反相,输出为0,封锁 CP信号,定时器处于保持工作状态;同时,门G2的输出 =1,74LS148处于禁止工作状态。当定时时间到时,则"定时到信号"为0,/ST=1,74LS148处于禁止工作状态,禁止选手进行抢答。同时,门G1处于关门状态,封锁时钟CP信号,使定时电路保持00状态不变,此次抢答结束。
(图7)
集成单稳态触发器74LS121用于控制报警电路及发声的时间(其功能表见表2),具体原理如下:主要由555时钟电路(用于控制报警声音频率)、蜂鸣器即相关的延时电路和控制电路组成。单稳态触发器74121通过信号/Ys、BO2、S控制报警与否和报警时间,555时钟电路产生脉冲时钟。在规定的时间有人抢答时,/Ys由1跳变到0,74121有状态2,即Q输出暂态高电平,蜂鸣器连续发声报警,持续时间为 =2.15秒;如果在规定时间内无人抢答,BO2由1跳变到0,74121有状态1,Q输出暂态高电平,蜂鸣器连续发声报警持续时间为
结合图6所示报警电路,分析 计算如下: 。取C=100uF, R=25K,。有=2.15秒。(原理图见图8)
(图8)
表2 74121功能表
(6) 电源电路
电源电路采用三端集成线性稳压集成块,L7805CV,因为它的外围电路比较简单,并且工作比较稳定,很适合74系列的集成块。它的稳压精度为2%,工作电流1.5A,封装为TO-220(A),工作温度也很不错,并且具有过温保护和短路保护,最大输入电压为35V,能对电路的长时间工作有很大的保障。(具体电路见图9)
(图9)
六、 总结
毕业设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。下面我对整个毕业设计的过程做一下简单的总结。
第一,接到任务以后进行选题。选题是毕业设计的开端,选择恰当的、感兴趣的题目,这对于整个毕业设计是否能够顺利进行关系极大。好比走路,这开始的第一步是具有决定意义的,第一步迈向何方,需要慎重考虑。否则,就可能走许多弯路、费许多周折,甚至南辕北辙,难以到达目的地。因此,选;题时一定要考虑好了。
第二,题目确定后就是找资料了。查资料是做毕业设计的前期准备工作,好的开端就相当于成功了一半,到图书馆、书店、资料室去虽说是比较原始的方式,但也有可取之处的。总之,不管通过哪种方式查的资料都是有利用价值的,要一一记录下来以备后用。
第三,通过上面的过程,已经积累了不少资料,对所选的题目也大概有了一些了解,这一步就是在这样一个基础上,综合已有的资料来更透彻的分析题目。
第四,有了研究方向,就应该动手实现了。其实以前的三步都是为这一步作的铺垫。
通过这次设计,我对数字电路设计中的逻辑关系等有了一定的认识,对以前学的数字电路又有了一定的新认识,温习了以前学的知识,就像人们常说的温故而知新嘛,但在设计的过程中,遇到了很多的问题,有一些知识都已经不太清楚了,但是通过一些资料又重新的温习了一下数字电路部分的内容。在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。
在此要感谢我的指导老师,感谢老师给我这样的机会锻炼。在整个毕业设计过程中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中的探索的艰难和成功的喜悦。虽然这个项目还不是很完善,但是在设计过程中所学到的东西是这次毕业设计的最大收获和财富,使我终身受益。
㈤ AT89S51单片机八路抢答器工作原理
基于MCS-51系列单片机AT89S51的八路抢答器
基于MCS-51系列单片机AT89S51的八路抢答器
前言
随着现代电子电路的快速发展,以及电子行业对现有电子工程技术的不断需求,特别是对实际操作实践的电子人才的需求越来越多,所以加强学生动手能力、重视实践应该是电子发展需求的必然趋向。实践动手能力的培养是一种综合能力,这种能力当然是在一定难度的前提下完成的,通过一定数量的实践才能逐步形成的。因此在培养实践能力的同时,要通过实践来不断的发现问题和解决问题的途径和方法,从而提高实践能力。
近年来,随着单片机档次的不断提高,功能的不断完善,其应用日趋成熟、应用领域日趋扩大,特别是工业测控、尖端武器和日用家电等领域更是因为有了单片机而生辉增色。单片机应用技术已成为一项新的工程应用技术。本次实习设计的题目为基于单片机的抢答器。
在本次的课程设计中我主要负责了该系统的印制电路板PCB的制作
一、方案论证
方案一:系统各部分采用中小规模集成数字电路,用机械开关按钮作为控制开关,完成抢答输入信号的触发。该方案的特点是中小规模集成电路应用技术成熟,性能可靠,能方便地完成选手抢答的基本功能,但是由于系统功能要求较高,所以电路连接集成电路相对较多,而且过于复杂,并且制作过程工序比较烦琐,使用不太方便。
方案二:该系统采用MCS-51系列单片机AT89S51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改性。CS-51单片机特点如下:
1>可靠性好:单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以烧写在ROM许多信号通道都在同一芯片,因此可靠性高。
2>易扩充:单片机有一般电脑所必须的器件,如三态双向总线,串并行的输入及输出引脚,可扩充为各种规模的微电脑系统
3>控制功能强:单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的条件分支跳跃指令。原理框图如1-1所示;
图1-1
方案比较及其选用依据,显然方案二比方案一简单的多,不但从性能上优于方案一,而且在使用上及其功能的实现上都较方案一简洁,并且由于单片机具有优越的高集成电路性,使其工作速度更快、效率更高。另外AT89S51单片机采用12MHz的晶振,提高了信号的测量精度,并且使该系统可以通过软件改进来扩张功能。而方案一采用了中小规模集成电路,有其复杂的电路性能,从而可能会使信号的输入输出产生延时及不必要的误差。依此依据选择方案二比较适合。
二、原理分析
1.本电路采用单片机AT89C51作为控制芯片,单片机的P0口外接八个发光二极管,每个发光二极管分别作为八位选手的信号指示灯。并在各个外接电路上并接开关按键,按键另一端接地。发光二极管采用共阳极接法,由于P0口为高电平呈输入状态,当有按键按下时,P0口呈低电平与按键对应的发光二极管满足点亮条件点亮。在程序编程上采用查询,查询P0口P0。0到P0。7的八个端口呈低电平,即查询是哪个选手先按键,然后将选手号码的字节数据送至串行口输出并在数码管上显现出来。
2.蜂鸣器是利用三极管处于开关状态是的导通与截止工作,在三极管导通时蜂鸣器工作,三极管截止时蜂鸣器不工作。三极管采用8550PNP型基极接于P1。2口置其低电平时三极管导通,置其高电平时三极管截止。
3.数码管采用共阳极七段显示,其内部发光二极管为共阳极接高电平,当对应发光二极管一端为低电平时发光二极管点亮,显示的数字或字符由送入的字节数据控制,字节数据的输出采用串形口工作模式0,8位串行字节数据的输出通过RXD端口送出,TXD端用于送出同步移位脉冲,作为外接器件的同步移位信号。数据的发送是在TI=0的情况下,由一写发送缓冲器的指令开始CPU执行完该指令,串行口即将8位数据从RXD端送出,同时TXD端发出同步移位脉冲。8位数据发送完毕后由硬件置位TI=1,通过查询TI位来确定是否发送完一组数据,TI=1表示发送缓冲器已空,当要发送下一组数据时用软件使TI清零,然后即可发送下一组数据。
4.软件设计分析首先在程序的开始为选手设置了一段违规程序,该程序的作用是为了防止选手在主持人没有按下抢答键时,有的选手已经提前抢答了,本次抢答为无效抢答,并有报警和记录下该位选手的选号,做违规处理,如果选手超出了在规定的提前抢答次数,则该选手将被取消以后的抢答资格。如果在主持按下抢答键时再抢答,该次抢答被视为有效抢答,在主持按下回答问题的键时选手就可以在规定的时间内回答问题了
图1-2
<1>选手查询程序:
ORG0000H
START:CLRA
MOVA,#0FFH
MOVP0,A
LOP:JNBP2。4,LP
JNBP0。0,SA1
JNBP0。1,SA2
JNBP0。2,SA3
JNBP0。3,SA4
JNBP0。4,SA5
JNBP0。5,SA6
JNBP0。6,SA7
JNBP0。7,SA8
SJMPLOP
SA1:AJMPSB1
SA2:AJMPSB2
SA3:AJMPSB3
SA4:AJMPSB4
SA5:AJMPSB5
SA6:AJMPSB6
SA7:AJMPSB7
SA8:AJMPSB8
LP:MOVR0,#9
LOP1:LCALLLED
LCALLDEL
JNBP0。0,SIP1
JNBP0。1,SIP2
JNBP0。2,SIP3
JNBP0。3,SIP4
JNBP0。4,SIP5
JNBP0。5,SIP6
JNBP0。6,SIP7
JNBP0。7,SIP8
DECR0
CJNER0,#0,LOP1
MOVR0,#0
LCALLLED
LCALLDEL
SJMPLOP
SIP1:AJMPDIP1
SIP2:AJMPDIP2
SIP3:AJMPDIP3
SIP4:AJMPDIP4
SIP5:AJMPDIP5
SIP6:AJMPDIP6
SIP7:AJMPDIP7
SIP8:AJMPDIP8
SB1:MOVR2,#1
LCALLLED1
LCALLDE
SJMPLP1
SB2:MOVR2,#2
LCALLLED1
LCALLDE
SJMPLP1
SB3:MOVR2,#3
LCALLLED1
LCALLDE
SJMPLP1
SB4:MOVR2,#4
LCALLLED1
LCALLDE
SJMPLP1
SB5:MOVR2,#5
LCALLLED1
LCALLDE
SJMPLP1
SB6:MOVR2,#6
LCALLLED1
LCALLDE
SJMPLP1
SB7:MOVR2,#7
LCALLLED1
LCALLDE
SJMPLP1
SB8:MOVR2,#8
LCALLLED1
LCALLDE
SJMPLP1
LP1:JNBP2。4,LOP2
SJMPLP1
DIP1:MOVR2,#1
LCALLLED1
LCALLDE
SJMPLH1
DIP2:MOVR2,#2
LCALLLED1
LCALLDE
SJMPLH1
DIP3:MOVR2,#3
LCALLLED1
LCALLDE
SJMPLH1
DIP4:MOVR2,#4
LCALLLED1
LCALLDE
SJMPLH1
DIP5:MOVR2,#5
LCALLLED1
LCALLDE
SJMPLH1
DIP6:MOVR2,#6
LCALLLED1
LCALLDE
SJMPLH1
DIP7:MOVR2,#7
LCALLLED1
LCALLDE
SJMPLH1
DIP8:MOVR2,#8
LCALLLED1
LCALLDE
SJMPLH1
LH1:JNBP2。4,LOOP
SJMPLH1
LOP2:MOVA,#11H
MOVSBUF,A
JNBTI,$
CLRTI
LCALLDEL
AJMPLOP
<2>串行输出程序:
该部分程序的设计利用了单片机的串行模式0输出,该输出方式占用IO口少。可以省去许多IO口作为功能的扩展使用。在该模式下,我们采用了输出查询的方式,就是要借助发送标志TI,当程序执行到发送标志位时,查询其标志位TI的值,只要TI的值是0程序就继续查询,知道查询到TI为1时才结束,然后在进入下一组数据的发送。由于串行输出时送进去的数都是十进制数,以致计算机不能识别,所以还要把送进去的十进制数转化成而进制数,这样才能输出。因此在输出程序前必须有拆字程序,把原来送进去的十进制数转化成二进制数,然后在输出并通过数码管显示出来。但是如果在显示选手选号与显示选手回答问题所用的到计同用一段串行输出程序时就会造成程序的混乱,所以在此处设计了两段初始值不同的显示程序,从而可能增加了程序的烦琐化。
LED1:MOVA,R2
MOVB,#10
DIVAB
MOVR1,A
MOVR3,B
MOVA,R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
MOVA,R3
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
RET。
LED:MOVA,R0
MOVB,#10
DIVAB
MOVR1,A
MOVR3,B
MOVA,R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
MOVA,R3
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
RET
DE:CLRP1。2
LCALLDEL01
SETBP1。2
LCALLDEL01
RET
TAB:DB11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H
RET
<3>倒计时程序
该程序为选手回答问题时的30秒倒计时程序,其中前25秒为正常的倒计时,在后5秒倒计时时伴随有报警声,用于提示选手回答问题的剩余时间。如果该选手在正常的倒计时内没有完成问题的回答,那么倒计时将被清零。
LOOP:MOVR0,#30
LPP:LCALLLED
LCALLDEL
JNBP2。4,LOP2
DECR0
CJNER0,#5,LPP
MOVR0,#5
LPP1:JNBP2。4,LOP2
LCALLLED
LCALLDE
DECR0
CJNER0,#0,LPP1
MOVR0,#0
LCALLLED
LCALLDEL
LJMPSTART
<4>延时程序
该系统设计了两段延时程序,一段1秒延时,是为了30秒倒计时调用和程序中一秒延时所用;另一段为0。5秒延时,用于报警。程序的设计中报警时间为一秒,但是由于在硬件的设计时只设计了一个按键,这样就会造成连续按键时会使所设定的报警声不断的响,这是设计中不允许的,所以在软件编程时设计了一个0。5秒的延时,被报警时所调用,这样就使报警声能很清楚地区分出来了
DEL:MOVR6,#20DEL01:MOVR6,#10
DEL1:MOVR5,#100DEL11:MOVR5,#100
DEL2:MOVR4,#250DEL21:MOVR4,#250
DJNZR4,$DJNZR4,$
DJNZR5,DEL2DJNZR5,DEL21
DJNZR6,DEL1DJNZR6,DEL11
RETRET
<5>报警程序
该段程序主要是用于本系统中的所有报警使用,报警时间延时为1秒钟。
DE:CLRP1。2
LCALLDEL01
SETBP1。2
LCALLDEL01
RET
三、制作过程
五、参考文献
曾峰,巩海洪,曾波,电子工业出版社,印刷电路板(PCB)设计与制作2005.8
梅海凤,王艳秋,张军,汪毓铎,清华大学出版社单片机原理与接口技术2004.2
北京交通大学出版社
第二个文献:基于51单片机八路抢答器设计程序及电路图
基于51单片机八路抢答器设计程序及电路图
说明:本人的这个设计改进后解决了前一个版本中1号抢答优先的问题,并增加了锦囊的设置,当参赛选手在回答问题时要求使用锦囊,则主持人按下抢答开始键,计时重新开始。
;八路抢答器电路请看下图是用ps仿真的,已经测试成功
<单片机八路抢答器电路图>
;============================================================
;================单片机八路抢答器程序=====================
;================51hei=======================
;================2008年5月=======================
;============================================================
OKEQU20H;抢答开始标志位
RINGEQU22H;响铃标志位
ORG0000H
AJMPMAIN
ORG0003H
AJMPINT0SUB
ORG000BH
AJMPT0INT
ORG0013H
AJMPINT1SUB
ORG001BH
AJMPT1INT
ORG0040H
MAIN:MOVR1,#30;初设抢答时间为30s
MOVR2,#60;初设答题时间为60s
MOVTMOD,#11H;设置未定时器/模式1
MOVTH0,#0F0H
MOVTL0,#0FFH;越高发声频率越高,越尖
MOVTH1,#3CH
MOVTL1,#0B0H;50ms为一次溢出中断
SETBEA
SETBET0
SETBET1
SETBEX0
SETBEX1;允许四个中断,T0/T1/INT0/INT1
CLROK
CLRRING
SETBTR1
SETBTR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
;=====查询程序=====
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只程序中判断是否查询抢答
MOVR7,#01H;读抢答键数据信号标志,这里表示只读一次有用信号
MOVR3,#0AH;抢答只显示计时,灭号数
AJMPCOUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
NEXT:JNBP1.0,FALSE1
JNBP1.1,FALSE2
JNBP1.2,FALSE3
JNBP1.3,FALSE4
JNBP1.4,FALSE5
JNBP1.5,FALSE6
JNBP1.6,FALSE7
JNBP1.7,FALSE8
AJMPSTART
;=====非法抢答处理程序=====
FALSE1:MOVR3,#01H
AJMPERROR
FALSE2:MOVR3,#02H
AJMPERROR
FALSE3:MOVR3,#03H
AJMPERROR
FALSE4:MOVR3,#04H
AJMPERROR
FALSE5:MOVR3,#05H
AJMPERROR
FALSE6:MOVR3,#06H
AJMPERROR
FALSE7:MOVR3,#07H
AJMPERROR
FALSE8:MOVR3,#08H
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
;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
REPEAT:MOVA,R2;使用锦囊时重新计时
MOVR6,A
CLRRING
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,FULL;1s中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;如按下停止键退出
JNBOK,CHECKK;只在回答倒计时才有效
AJMPNEXTT
CHECKK:JNBP3.0,REPEAT;判断是否使用锦囊
NEXTT:ACALLDISPLAY
JBOK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
AJMPRECOUNT
ACCOUT:
MOVA,36H
JNBACC.0,TRUE1
JNBACC.1,TRUE2
JNBACC.2,TRUE3
JNBACC.3,TRUE4
JNBACC.4,TRUE5
JNBACC.5,TRUE6
JNBACC.6,TZ1
JNBACC.7,TZ2
AJMPRECOUNT
TZ1:JMPTRUE7
TZ2: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
TRUE5:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#05H
CLROK
AJMPCOUNT
TRUE6:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#06H
CLROK
AJMPCOUNT
TRUE7:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#07H
CLROK
AJMPCOUNT
TRUE8:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#08H
CLROK
AJMPCOUNT
;=====犯规抢答程序=====
ERROR:MOVR0,#00H
MOVTH1,#3CH
MOVTL1,#0B0H
MOV34H,R3;犯规号数暂存与(34H)
HERE:MOVA,R0
CJNEA,#06H,FLASH;0.3s向下运行->灭并停响
CLRRING
MOVR3,#0AH
MOVR4,#0AH
MOVR5,#0AH;三灯全灭
AJMPCHECK1
FLASH:CJNEA,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清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
ACALLDELAY2
MOVDPTR,#DAT2
MOVA,R5
MOVCA,@A+DPTR
MOVP2,#0fdH
MOVP0,A
ACALLDELAY2
MOVA,R4
MOVCA,@A+DPTR
MOVP2,#0fbH
MOVP0,A
ACALLDELAY2
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
;=====延时4236个机器周期(去抖动用到)=====
DELAY:MOV32H,#12H
LOOP:MOV33H,#0AFH
LOOP1:DJNZ33H,LOOP1
DJNZ32H,LOOP
RET
;=====延时4236个机器周期(显示用到)=====
DELAY2:MOV32H,#43H
LOOP3:MOV33H,#1EH
MOVA,R7;每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转到正常抢答处理
JNZAAAA1;没读到有效数据时继续转到AAAA1
LOOP2:DJNZ33H,LOOP2
DJNZ32H,LOOP3
RET
;=====读抢答按键数据口程序=====
;由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口
;然而在检测按键口时动态扫描要调用三次(4ms)延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号最低.
;故采用在延时子程序中加了读数据口程序.保证了灵敏度和可靠性
AAAA1:MOVA,P1
CJNEA,#0FFH,AA1;当不全为1时的数据为有效数据
AA0:MOV36H,A;将有效数据送到36H暂存
AJMPLOOP2
AA1:DECR7
AJMPAA0
;=====发声程序=====
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
仅供参考。
㈥ 单片机八人抢答器程序设计
;------------------------------------------
KAI BIT P3.7 ;开始
;------------------------------------------
ORG 0000H
JMP START
START:
;----------------------;下面是清零(复位)
MOV P0, #0C0H ;显示0
MOV P2, #255 ;熄灯
MOV R4, #0
;----------------------;下面等待按下"开始"键
KAISHI:
JB KAI, KAISHI ;没有按"开始",就循环
CALL DELAY ;延时
JB KAI, KAISHI ;消抖
JNB KAI, $ ;等待释放
;----------------------
MOV P0, #0CH ;显示P
WAIT: ;等待抢答
MOV A, P1
CPL A
JZ WAIT ;继续等待
;----------------------
XS: ;查找选手按键的位置
CPL A
MOV P2, A
JNB ACC.0, J0
JNB ACC.1, J1
JNB ACC.2, J2
JNB ACC.3, J3
JNB ACC.4, J4
JNB ACC.5, J5
JNB ACC.6, J6
; JMP J7
J7: INC R4
J6: INC R4
J5: INC R4
J4: INC R4
J3: INC R4
J2: INC R4
J1: INC R4
J0: INC R4
MOV A, R4
MOV DPTR, #D_TAB
MOVC A, @A + DPTR
MOV P0, A
;----------------------;下面等待按下复位键
W_FW:
JB KAI, W_FW ;没有按,则转
CALL DELAY ;延时
JB KAI, W_FW ;消抖
JNB KAI, $ ;等待释放
JMP START
;------------------------
D_TAB:
DB 0C0H,0F9H,0A4H,0B0H, 99H ;共阳极0-9
DB 92H, 82H,0F8H, 80H, 90H,0BFH ;-
;------------------------------------------
DELAY: ;延时约10ms
MOV R6, #20
DJNZ R7, $
DJNZ R6, $ - 2
RET
;==========================================
END
;以上程序已经调好。
㈦ 单片机八路抢答器程序
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.如果想重新计数,重置TH1/TL1就可以了
;=====查询程序=====
START: MOV R5,#0BH
MOV R4,#0BH
MOV R3,#0BH
ACALL DISPLAY;未开始抢答时候显示FFF
JB P3.0,NEXT;ddddddd
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,#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
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
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,#06H,FLASH;0.3s向下运行->灭并停响
CLR RING
MOV R3,#0AH
MOV R4,#0AH
MOV R5,#0AH;三灯全灭
AJMP CHECK1
FLASH: CJNE A,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清R0,重新计
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
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,#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暂存
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口不短取反使喇叭发出一定频率的声音
OUT: RETI
;=====T1溢出中断(计时程序)=====
T1INT: MOV TH1,#3CH
MOV TL1,#0B0H
INC R0
RETI
END
㈧ 怎么设计基于51单片机的八位抢答器课程设计用c语言
你的描述不详:下面我给出方法,自已参考:
1:主持人端有一个单片机设备 且设备有一个或多个按键,单个按键,那么就做成按键复用,如果是多个按键,那就可以按要求设置按键功能和数量。参赛队每队一个设备,如果不方便能过连线来通讯,就采用无线通讯,抢答端只需一个按键按键,同时在按键里或边上用指示灯来指示状诚。
2:逻辑,当主持人按下抢答键时,主持人端设备向8个参赛队发送抢答开始信号数据,参赛队8个设备向主持端应答,判断收到应答后,开始计时10秒,某一队按下按键时,这队会向主持端发送本队的编号即可,说到这里,后面的基本上都是一样的原理,就是收发数据,应答,判断数据类型和功能。即可达到你的要求。