找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18841|回复: 35
打印 上一主题 下一主题
收起左侧

单片机八路抢答器设计文档+Proteus仿真+代码

  [复制链接]
跳转到指定楼层
楼主


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


介绍了数码显示八路抢答器电路的组成、设计及功能,该抢答器除具有基本的抢答功能外,还具有计时和报警的功能。主持人通过时间预设开关预设供抢答的时间,系统将完成自动倒计时。若在规定的时间有人抢答,则计时将自动停止,若在规定的时间无人抢答,则系统中的蜂鸣器将发响,提示主持人本轮抢答无效,实现报警功能,若超过抢答时间则抢答无效。

目录
1概 述              3
2 系统设计内容              4
2.1系统设计依据              5
2.2设计任务和要求              5
2.3设计目的              5
2.4设计要点              5
3 单元电路设计与分析              6
3.1 单片机控制原理              6
3.2抢答器的原理              9
3.3 功能模块电路              10
3.3.1开始抢答电路              10
3.3.2 选手抢答键              10
3.3.3 显示与显示驱动电路              11
3.3.4蜂鸣器音频输出电路              11
4软件设计              12
4.1程序设计              12
4.1.1 系统流程图              12
4.1.2抢答成功流程图              13
4.2 程序代码              13
4.2.1 主程序              13
4.2.2 定时器子程序              18
4.2.3 延时子程序              18
4.2.4 显示子程序              19
4.2.5  红外中断程序              19
5 总原理图及元件清单              21
5.1总原理图              21
5.2元件清单              23
6系统仿真              24
7结论              25
8心得体会              26
9参考文献              27

随着社会的不断进步,电子技术也飞速的向前发展.特别是大规模集成电路的发展,把我们带进了电子化时代。电子产品的日益增多,也让我们的生活越来越方便。特别是计算机的发展,真可谓是突飞猛进。自从1946年世界上第一台计算机的诞生以来,还不到六十年的时间,计算机就取得了举世瞩目的成绩。特别是在通信领域,实现了信息一体化的时代。作为大学生的我们,更需要加强实践能力的培养。课程设计在一定程度上反映了我们对理论知识的理解程度,是理论与实践的桥梁。它不仅能锻炼我们的动手能力,而且能够培养我们对问题的思考能力以及对知识的进一步了解。当你能把你所学到知识化作为现实的东西时,我们能力就提升到一个新台阶。
很多人都认为学习是枯燥无味的,有时觉得与现实太遥远。在学习之余,我们仍然可以找到一点有趣的事情,比如说做一个声控灯泡、数字钟等等。生活中我们要找到自己感兴趣的东西。这次综合课程设计中,我制作了八路抢答器。
抢答器是为智力竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,广泛应用于各种知识竞赛、文娱活动等场合。能够实现抢答器功能的方式有多种,可以采用前期的模拟电路、数字电路或模拟与数字电路相结合的方式,但这种方式制作过程复杂,而且准确性与可靠性不高,成品面积大,安装、维护困难。本节介绍一种利用51单片机作为核心部件进行逻辑控制及信号产生的八路抢答器。近年来,随着单片机档次的不断提高,功能的不断完善,其应用日趋成熟、应用领域日趋扩大,特别是工业测控、尖端武器和日用家电等领域更是因为有了单片机而生辉增色。单片机应用技术已成为一项新的工程应用技术。本次课程设计我们做的是无线八路抢答器,我们采用STC89C51单片机实现抢答功能,采用红外遥控收发实现无线信号的抢答,性能更稳定,更易操作调试。
2 系统设计内容
2.1系统设计依据
   抢答器由计数器、寄存器、集成定时器和译码显示等组合、无线传输与接收、时序电路组成。可分为抢答电路,定时电路,报警电路,无线电路等几个单元部分。每个单元电路分别可以处理一些抢答竞赛中的基本问题。
   本次课程设计设计的是一个多路定时无线抢答器,是一个多于两位选手参赛的一个抢答器,具有锁存和显示功能。同时有主持人控制系统的清零和抢答的开始。抢答开始后,若有任何一名选手按动抢答按钮,抢答器就会显示该选手编号直至系统被主持人清零,并有扬声器发出提示,同时其他人再抢答就无效了。这次设计的抢答器还有自动定时功能,主持人可以设定选手答题的时间。当主持人启动“开始”键后,定时器会自动减计时,这个会显示在显示器上。选手只有在抢答时间内抢答才有效,若在答题时间内没有选手答题,时间到时,报警电路就会发出警报亮灯并且禁止抢答。
2.2设计任务和要求
以单片机为核心,设计一个8位竞赛抢答器。
1)抢答器同时供8名选手或2个代表队比赛,分别用8个按钮S0-S7表示。
2)设置一个系统清除和抢答控制开关S,该开关由主持人控制。
3)抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。
4)抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30s等)。当主持人启动“开始”按键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续时间为0.5s左右。
5)参赛选手在设定时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手编号和抢答时间,并保持到主持人将系统清除为止。
6)如果定时时间到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00;
7)设计出软件编程方法,并写出源代码;
8)主机与从机实现无线抢答
9)用PROTEUS进行仿真;
10)论文格式要符合学院的统一规定,结构要合符逻辑,表达要得体。
2.3 设计目的
通过设计学习单片机最小系统的基本设计方法,掌握单片机应用系统的开发调试过程。
(1)学习单片机开发工具功能、特点和使用方法。
(2)学会单片机控制系统程序的编制和编制和调试方法。
(3)设计单片机抢答器硬件电路,绘制出电路原理图。
(4)编制并调试出键盘扫描程序和显示驱动程序。
(5)掌握单片机定时器的基本用法,编制出定时器的中断程序。
2.4 设计要点
根据控制系统的工作原理和执行装置,可以将系统设计分为硬件和软件两大部分。硬件设计部分,包括编写电路原理图、合理选择元器件、焊接各个元器件,然后对硬件性能进行调试、测试,以达到设计要求。软件设计部分,首先在设计之前完成系统总框图和确定各个功能模块,然后进行具体设计,包括各模块的流程图,选择合适的编程语言和软件应用程序,进行编程设计等;最后是通过软件对程序进行调试、测试,以及仿真,以达到性能的最优化。
下面是软硬件设计方法确定的。软件设计的方法与开发环境的选取有着直接的关系,本系统由于是采用51系列单片机,因此使用Keil C语言进行开发。此编程工具相比汇编语言具有结构化、适用范围大、可移植性好等特点。本系统软件设计采用模块化系统设计方法,先编写各个功能模块子程序,然后进行组合与调整,经过调试后,可以进行仿真测试,已达到设计功能要求。为配合软件的灵活设计,硬件电路是采用结构化系统设计方法,该方法保证设计电路的标准化、模块化。硬件电路的设计最重要的选择用于控制的单片机,再确定与之配套的外围芯片,使所设计的系统既经济又高性能。硬件电路设计可以在焊接元器件之前画出详细电路图,标出芯片的型号、器件参数值,根据电路图在仿真软件上进行调试,发现设计错误时立即修改,高效,准确地完成硬件设计。
3单元电路设计与分析
3.1 单片机控制原理
单片机(SCM)是单片微型计算机(Single Chip Microcomputer)的简称。它是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。它的最大优点是体积小,可放在仪表内部。但存储量小,输入输出适配器简单,功能较低。目前,单片机在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。
简单的说,用单片机系统来设计抢答器,实现两组的抢答时间即使是相差几微秒,也可分辨出哪组优先答题。
P0端口(P0.0-P0.7):P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
STC89C51是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

图3-2 STC89C51单片机引脚图

单片机是美国STC公司最新推出的一种新型51内核的单片机。片内含有Flash程序存储器、SRAM、UART、SPI、PWM等模块。
(一)STC89C51主要功能、性能参数如下:
(1)内置标准51内核,机器周期:增强型为6时钟,普通型为12时钟;
(2)工作频率范围:0~40MHZ,相当于普通8051的0~80MHZ;
(3)STC89C51RC对应Flash空间:4KB;
(4)内部存储器(RAM):512B;
(5)定时器\计数器:3个16位;
(6)通用异步通信口(UART)1个;
(7)中断源:8个;
(8)有ISP(在系统可编程)\IAP(在应用可编程),无需专用编程器\仿真器;
(9)通用I\O口:32\36个;
(10)工作电压:3.8~5.5V;
(11)外形封装:40脚PDIP、44脚PLCC和PQFP等。
(二)STC89C51单片机的引脚说明:
VCC:供电电压。
GND:接地。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
(三)STC89C51单片机最小系统:
最小系统包括单片机及其所需的必要的电源、时钟、复位等部件,能使单片机始终处于正常的运行状态。电源、时钟等电路是使单片机能运行的必备条件,可以将最小系统作为应用系统的核心部分,通过对其进行存储器扩展、A/D扩展等,使单片机完成较复杂的功能。
STC89C51是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。用STC89C52单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,结构如图2-3所示,由于集成度的限制,最小应用系统只能用作一些小型的控制单元。         

图3-3 单片机最小系统原理框图

(1) 时钟电路
STC89C51单片机的时钟信号通常有两种方式产生:一是内部时钟方式,二是外部时钟方式。内部时钟方式如图2-4所示。在STC89C51单片机内部有一振荡电路,只要在单片机的XTAL1(18)和XTAL2(19)引脚外接石英晶体(简称晶振),就构成了自激振荡器并在单片机内部产生时钟脉冲信号。图中电容C1和C2的作用是稳定频率和快速起振,电容值在5~30pF,典型值为30pF。晶振CYS的振荡频率范围在1.2~12MHz间选择
,典型值 为12MHz和6MHz。
         图3-4 STC89C51内部时钟电路

(2) 复位电路
当在STC89C51单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作(若该引脚持续保持高电平,单片机就处于循环复位状态)。
复位电路通常采用上电自动复位和按钮复位两种方式。
最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充放电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST(9)端与电源Vcc接通而实现的。按键手动复位电路见图2-5。时钟频率用11.0592MHZ时C取10uF,R取10kΩ。
图3-5 STC89C51复位电路

(3) STC89C51中断技术概述
中断技术主要用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并作出快速响应、及时处理。这是由片内的中断系统来实现的。当中断请求源发出中断请求时,如果中断请求被允许,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断服务请求。中断服务处理程序处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。
图3-6为整个中断响应和处理过程


如果单片机没有中断系统,单片机的大量时间可能会浪费在查询是否有服务请求发生的定时查询操作上。采用中断技术完全消除了单片机在查询方式中的等待现象,大大地提高了单片机的工作效率和实时性。
3.2抢答器的原理
抢答器的工作原理是采用单片机最小系统,用程序查询方式采用动态显示组号。主持人按下开始抢答键才可以抢答。主持人没有按下开始抢答按纽(P3.0),有人抢答则抢答违规,报警并显示组号,主持人按下开始抢答开关重新抢答。主持人按下开始抢答按纽(P3.0),蜂鸣响声提示,数码管30秒倒计时抢答,蜂鸣器响声提示并显示他的组号,30秒内有人抢答则开始60秒倒计时(60秒内必须回答完问题),最后五秒倒计时警报。单片机最小系统、抢答按键模块(四位并行数码显示)、显示模块、显示驱动模块、抢答开关模块、蜂鸣器音频输出模块。由于仿真中没有无线芯片,所以选手抢答用按键代替如下图:
图3.2抢答器总原理图
3.3 功能模块电路
3.3.1开始抢答电路
图3.3.1开始抢答电路
3.3.2 选手抢答键
图3.3.2 选手抢答电路
3.3.3 显示与显示驱动电路
在此次课程设计电路中当一个问题结束主持人后按下复位开关后进行下一题的准备。
89C51的P1口做一个为选手抢答的输入按键引脚,P1.0至P1.7轮流输出低电位,给每一个选手编号1至8,当选手按下按钮时,P1口个端口的电平变化从P1口输入,经单片机处理后从P0输出由数码管显示抢答者编号。由于仿真中没有无线芯片,所以选手抢答用按键代替如下图:
此电路包括显示和驱动,显示采用数码管,驱动用P2口, 违规者编号、抢答30秒倒计时、正常抢答者编号和回答问题时间60秒倒计时,数码管采用动态显示。驱动电路P2口,查询显示程序利用P0口做段选码口输出P2低3位做位选码输出,当为低电平则能驱动数码管使其显示数字。在+5V电压下接1k的上拉电阻,保证正常压降,驱动数码管更亮。
图3.3.3 显示与显示驱动电路
3.3.4蜂鸣器音频输出电路
通过控制不同频率的矩形脉冲来控制蜂鸣器发声。此次课程设计中只需要一些简单的提示声音和稍微显眼的灯控,有抢答违规,开始抢答,抢答时间结束和回答时间到得提示声和亮灯提醒。
图3.3.4蜂鸣器音频输出电路

4软件设计
4.1程序设计
4.1.1 系统流程图





4.1.2抢答成功流程图

5 总原理图及元件清单
5.1总原理图

5.2元件清单
本系统采用单片机作为整个控制核心。控制系统主要由:显示模块、控制模块、报警模块、抢答模块和无线模块组成。工作时,该系统通过矩阵键盘输入抢答信号,经单片机的处理后,输出控制信号,利用一个4位数码管来完成显示功能并伴随蜂鸣器报警,用按键来让选手进行抢答,在数码管上显示哪一组先答题,从而实现整个抢答过程。
当主持人按下开始键时,向单片机P3.2引脚输入一个低电平信号,表示整个电路开始工作,此时数码管前两位显示选手编号(无人抢答显示00),后两位显示倒计时剩余时间。若在25秒内仍然无人抢答,蜂鸣器在最后8秒发出连续报警,提示抢答时间快要结束;若在30秒内有人抢答,并且抢答成功,则将选手编号显示在数码管前两位上,后两位显示抢答剩余时间,同时蜂鸣器发出一声报警,提示其他没有抢答的选手此题已被人抢答成功。若在抢答过程中遇见特殊情况,主持人则可以通过时间加,时间减按键来进行时间调节。若要开始新的一轮抢答,主持人按下复位键再按开始键即可。
此次用单片机控制的抢答器思路简单明了,可操作性强,可靠性高,扩展功能强,能够完全实现普通抢答器的基本功能。


6系统仿真




7结论
1设计思路是整个设计的灵魂 拿下每个课题能有一个非常清晰的设计思路是至关重要的。 只有对课题的充分理解,对各种器件的熟练掌握,勾画出基本的 设计图是成功的关键, 必须多花时间在设计上才能为后续工作提 , 供更扎实的基础。翻阅各种资料,上网查询填补所需知识的空白 是必要的。
2将电路分为几个模块,模块与模块间连接最好围绕着电源的正负极来进行模块与模块间的连接。
3在网上寻找到的一些原理图,可能未经过验证,所以使用前要验证一下,确保正确后才采纳。
4研究明白电路中各电子元件的作用,会让你对电路更加透彻,也会让你尽量避免焊接时的错误,导致飞线的产生。
8心得体会
通过本次课程设计,把我们在课堂上学到的数字电路知识运用到实际当中。如各种常见芯片的功能, 各种组合逻辑电路和时序逻辑电路的设计,在此次设计中,当然也遇到了许多问题,毕竟这是第一次设计 一个很实际的硬件的器件。在进行一个综合性的硬件设计时,要全面考虑问题,如想用其他信号来控制一个信号,就要考虑到和 这个信号直接或间接关系的信号,必须是最重要相关的信号,然后用真值表来解决他们的关系,通过门电 路来实现。这一个星期的课程设计,让我真正理解了书本上知识,也让我知道我们课本上的知识在实际中 怎么应用,理论联系实际。通过此次设计,我对理论知识的学习有了很大的兴趣,现在我可以主动的去 学习,我明白自己该学习那个方面,重点是什么。我也掌握的了在理论中遇到问题,应该怎样去解决,在 实际中遇到迷团应该怎样去检查调试。我也掌握的了在理论中遇到问题,应该怎样去解决,在实际中遇到迷团应该怎样去检查调试。在这次设计过程中还了解到在设计的时候不仅是设计好,更重要的是想方设法在功能实现的同时降低成本。


单片机源程序如下:
  1. /*************************************************************
  2.                       八路抢答器系统

  3. 补充说明:
  4. ***************************************************************/
  5. #include<reg52.h>                   //头文件
  6. #include<SMG.h>
  7. #include<EEPROM.h>
  8. #include<INTERRUPT.h>

  9. #define uchar unsigned char//宏定义
  10. #define uint unsigned int

  11. /**********************引脚定义************************/
  12. sbit key_zhu=P2^2;           //主持人键
  13. sbit key_jia=P2^1;           //加键
  14. sbit key_jian=P2^0;           //减键

  15. sbit key_1=P1^1;           //八位选手按键定义
  16. sbit key_2=P1^3;
  17. sbit key_3=P1^5;
  18. sbit key_4=P1^7;
  19. sbit key_5=P3^1;
  20. sbit key_6=P3^3;
  21. sbit key_7=P3^5;
  22. sbit key_8=P3^7;

  23. sbit led_1=P1^0;           //八位LED灯按键定义
  24. sbit led_2=P1^2;
  25. sbit led_3=P1^4;
  26. sbit led_4=P1^6;
  27. sbit led_5=P3^0;
  28. sbit led_6=P3^2;
  29. sbit led_7=P3^4;
  30. sbit led_8=P3^6;
  31. /**********************变量定义************************/
  32. uchar zhu_f=0;                   //比赛进行阶段标记位,=0表示没有按。=1表示在设置倒计时的时间。=2表示开始抢答
  33. uchar qiang_f=0;           //抢答犯规标记,=0没有犯规。=1表示有人犯规
  34. uchar wan_f=0;                   //抢答完成标记,=0抢答没完成后还没有开始。=1表示抢答完成
  35. uchar time=30;                   //倒计时时间
  36. uchar T0_num;                   //定时器0计数
  37. uchar number;                   //抢答成功选手的编号,或犯规选手的编号。=0的时候表示没有

  38. /********************************************************
  39. 函数名称:void delayms(uint ms)
  40. 函数作用:毫秒延时函数
  41. 参数说明:
  42. ********************************************************/
  43. void delayms(uint ms)
  44. {
  45.         unsigned char i=100,j;
  46.         for(;ms;ms--)
  47.         {
  48.                 while(--i)
  49.                 {
  50.                         j=10;
  51.                         while(--j);
  52.                 }
  53.         }
  54. }
  55. /********************************************************
  56. 函数名称:void bajing()
  57. 函数作用:抢答犯规报警提示
  58. 参数说明:
  59. ********************************************************/
  60. void bajing()
  61. {
  62.         buzz=0;                   //开蜂鸣器
  63.         delayms(10);
  64.         buzz=1;                   //关蜂鸣器
  65.         delayms(10);
  66. }
  67. /********************************************************
  68. 函数名称:uchar qianda()
  69. 函数作用:抢答按键检测,返回抢答编号
  70. 参数说明:
  71. ********************************************************/
  72. uchar qianda()
  73. {
  74.         uchar temp=0;
  75.         if(key_1==0)                                  //一号犯规,下同
  76.                 temp=1;                          //记录1号
  77.         else
  78.                 if(key_2==0)
  79.                         temp=2;
  80.                 else
  81.                         if(key_3==0)
  82.                                 temp=3;
  83.                         else
  84.                                 if(key_4==0)
  85.                                         temp=4;
  86.                                 else
  87.                                         if(key_5==0)
  88.                                                 temp=5;
  89.                                         else
  90.                                                 if(key_6==0)
  91.                                                         temp=6;
  92.                                                 else
  93.                                                         if(key_7==0)
  94.                                                                 temp=7;
  95.                                                         else
  96.                                                                 if(key_8==0)
  97.                                                                         temp=8;       
  98.         return temp;       
  99. }
  100. /********************************************************
  101. 函数名称:void led_kongzhi(uchar num,bit mode)
  102. 函数作用:LED灯控制
  103. 参数说明:num控制哪一个灯,k=1,点亮,=0关闭。mode=0全灭后在控制这个灯,=1单独控制这个灯
  104. ********************************************************/
  105. void led_kongzhi(uchar num,bit k,bit mode)
  106. {
  107.         if(mode==0)
  108.         {
  109.                 led_1=1;           //八位LED灯全灭
  110.                 led_2=1;
  111.                 led_3=1;
  112.                 led_4=1;
  113.                 led_5=1;
  114.                 led_6=1;
  115.                 led_7=1;
  116.                 led_8=1;       
  117.         }       
  118.         if(k==1)
  119.         {
  120.                 switch (num)          //控制对应LED灯亮
  121.                 {
  122.                         case 1:led_1=0;
  123.                                 break;
  124.                         case 2:led_2=0;
  125.                                 break;
  126.                         case 3:led_3=0;
  127.                                 break;
  128.                         case 4:led_4=0;
  129.                                 break;
  130.                         case 5:led_5=0;
  131.                                 break;
  132.                         case 6:led_6=0;
  133.                                 break;
  134.                         case 7:led_7=0;
  135.                                 break;
  136.                         case 8:led_8=0;
  137.                                 break;
  138.                 }
  139.         }
  140.         else
  141.         {
  142.                 switch (num)          //控制对应LED灯灭
  143.                 {
  144.                         case 1:led_1=1;
  145.                                 break;
  146.                         case 2:led_2=1;
  147.                                 break;
  148.                         case 3:led_3=1;
  149.                                 break;
  150.                         case 4:led_4=1;
  151.                                 break;
  152.                         case 5:led_5=1;
  153.                                 break;
  154.                         case 6:led_6=1;
  155.                                 break;
  156.                         case 7:led_7=1;
  157.                                 break;
  158.                         case 8:led_8=1;
  159.                                 break;
  160.                 }       
  161.         }
  162. }
  163. /********************************************************
  164. 函数名称:void scan(void)
  165. 函数作用:按键检测函数
  166. 参数说明:
  167. ********************************************************/
  168. void scan(void)
  169. {       
  170.         uchar qiangda_num=0;
  171.         //主持人键
  172.         if(key_zhu==0)                   //按键按下
  173.         {
  174.                 delayms(7);                   //显示消抖
  175.                 if(key_zhu==0&&zhu_f!=2&&qiang_f==0&&wan_f==0)//判断是否有人犯规或者抢答是否开始或者抢答是否完成
  176.                 {
  177.                         zhu_f++;           //比赛阶段标记+1
  178.                         if(zhu_f==2)   //比赛正式开始
  179.                         {
  180.                                 TR0=1;           //比赛开始,开启定时
  181.                                 wan_f=0;   //清除比赛完成标志
  182.                                 bajing();  //提示比赛开始
  183.                         }                       
  184.                 }
  185.                 else
  186.                         if(key_zhu==0&&qiang_f==1)   //判断是否有人犯规
  187.                         {
  188.                                 buzz=1;                                         //清除报警
  189.                                 qiang_f=0;                                 //清除抢答标志
  190.                                 number=0;                                 //清除选手编号
  191.                                 time=EEPROM_read(0x2000);//重新读取存储的抢答总时长
  192.                                 led_kongzhi(0,0,0);
  193.                         }
  194.                         else                                                 
  195.                                 if(key_zhu==0&&wan_f==1) //判断是否有人完成
  196.                                 {
  197.                                         buzz=1;                                 //清除报警
  198.                                         wan_f=0;                         //清除完成标志
  199.                                         number=0;                         //清除选手编号
  200.                                         time=EEPROM_read(0x2000);//重新读取存储的抢答总时长
  201.                                         led_kongzhi(0,0,0);
  202.                                 }
  203.                                 else
  204.                                         if(key_zhu==0&&zhu_f==2) //暂停比赛
  205.                                         {
  206.                                                 TR0=0;                                 //关闭定时
  207.                                                 zhu_f=1;                         //重新回到设置比赛时间阶段
  208.                                                 bajing();                         //提示暂停比赛
  209.                                         }
  210.                 while(!key_zhu);//检测按键松开
  211.         }

  212.         //加值键,支持连按
  213.         if(key_jia==0&&zhu_f==1&&qiang_f==0)         //判断是否在设置倒计时时间
  214.         {
  215.                 delayms(7);                                                         //延时消抖
  216.                 if(key_jia==0)                                                 //再次判断按键按下
  217.                 {
  218.                         if(time<99)                             //比赛时间最大值99S
  219.                                 time++;                                                  //比赛时间+1S
  220.                         EEPROM_delete(0x2000);                         //擦除EEPROM煽区
  221.                         EEPROM_write(0x2000,time);                 //写入【比赛时间】数据保存
  222.                         display(time/10,time%10,10,0);         //显示设置比赛时间
  223.                 }
  224.         }

  225.         //减值键,支持连按
  226.         if(key_jian==0&&zhu_f==1&&qiang_f==0)         //判断是否在设置倒计时时间
  227.         {
  228.                 delayms(7);                                                         //延时消抖
  229.                 if(key_jian==0)                                                 //再次判断按键按下
  230.                 {
  231.                         if(time!=0)                                                   //比赛时间最小值0S
  232.                                 time--;                                 //比赛时间-1S
  233.                         EEPROM_delete(0x2000);                         //擦除EEPROM煽区
  234.                         EEPROM_write(0x2000,time);                 //写入【比赛时间】数据保存
  235.                         display(time/10,time%10,10,0);         //显示设置比赛时间
  236.                 }
  237.         }
  238.         //选手按键
  239.         qiangda_num=qianda();
  240.         if(qiangda_num!=0)                              //判断是否有选手按下按键
  241.         {
  242.                 if(zhu_f!=2&&qiang_f==0&&wan_f==0)//如果还没有开始抢答时按下
  243.                 {
  244.                         zhu_f=1;
  245.                         buzz=0;                                                  //蜂鸣器报警
  246.                         qiang_f=1;                                          //抢答犯规标记
  247.                         number=qiangda_num;
  248.                         led_kongzhi(number,1,0);
  249.                 }
  250.                 else
  251.                         if(zhu_f==2&&wan_f==0)                         //在开始抢答时按下
  252.                         {
  253.                                 wan_f=1;                                         //标记抢答完成
  254.                                 zhu_f=0;                                         //主持人标记复位
  255.                                 TR0=0;                                                 //关闭倒计时定时器
  256.                                 number=qiangda_num;
  257.                                 led_kongzhi(number,1,0);
  258.                                 bajing();                                         //提示有人抢答完成
  259.                         }
  260.         }  
  261. }

  262. /*********************************************************
  263. 函数名称:void main()
  264. 函数作用:主函数函数
  265. 参数说明:
  266. *********************************************************/
  267. void main()
  268. {
  269.         uchar i=0;
  270.         T0_init();                                                 //定时器初始化
  271.         if(key_jian==0)          
  272.         {
  273.                 delayms(100);
  274.                 if(key_jian==0)
  275.                 {
  276.                         EEPROM_delete(0x2000);         //擦除EEPROM煽区
  277.                         EEPROM_write(0x2000,30); //写入【比赛时间】数据保存
  278.                 }
  279.         }
  280.         time=EEPROM_read(0x2000);                 //读取存储的【比赛时间】数据

  281.         for(i=0;i<9;i++)
  282.         {
  283.                 led_kongzhi(i,1,1);
  284.                 delayms(10);       
  285.         }

  286.         for(i=9;i>0;i--)
  287.         {
  288.                 led_kongzhi(i-1,0,1);
  289.                 delayms(10);       
  290.         }
  291.         led_kongzhi(0,0,0);
  292.         while(1)                                                 //死循环
  293.         {
  294.                 scan();                                                 //按键检测处理
  295.                 if(zhu_f==0&&wan_f==0)                 //判断是否还没进入比赛阶段
  296.                         display(10,10,10,10);         //未进入,显示"----"
  297.                 else
  298.                         if(zhu_f==0&&wan_f==1)         //进入比赛阶段,并且处于设置比赛时间
  299.                                 display(time/10,time%10,10,number);//显示设置比赛时间
  300.                         else
  301.                                 if(zhu_f!=0)                 
  302.                                 {               
  303.                                         if(qiang_f==1)   //设有人犯规
  304.                                                 display(11,11,10,number);                   //显示FF-犯规编号
  305.                                         else
  306.                                                 display(time/10,time%10,10,number);//显示比赛剩余时间和抢答者编号,未抢答显示0
  307.                                 }               
  308.         }
  309. }
复制代码

所有资料51hei提供下载:
八路抢答器.rar (905.64 KB, 下载次数: 735)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏23 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-12-29 22:40 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:555857 发表于 2019-6-11 19:52 | 只看该作者
你好,有那个原理图的源文件是要Altium Designer才能打开吧

51hei.png (16.04 KB, 下载次数: 128)

51hei.png
回复

使用道具 举报

地板
ID:560514 发表于 2019-6-12 02:26 来自手机 | 只看该作者
不错呦,加油加油
回复

使用道具 举报

5#
ID:555254 发表于 2019-6-12 20:07 | 只看该作者
不错,可以吆
回复

使用道具 举报

6#
ID:560514 发表于 2019-6-14 02:37 来自手机 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

7#
ID:561196 发表于 2019-6-14 23:42 | 只看该作者
byxiao 发表于 2019-6-14 02:37
好资料,51黑有你更精彩!!!

代码编译没有错误吗?我的显示有错误
回复

使用道具 举报

8#
ID:568328 发表于 2019-6-20 21:12 | 只看该作者
运行有错误吗
回复

使用道具 举报

9#
ID:335259 发表于 2019-10-19 17:15 | 只看该作者
谢谢分享
回复

使用道具 举报

10#
ID:641195 发表于 2019-11-13 21:42 | 只看该作者
原理图文件用proteus8软件打不开啊?请问怎么解决呢?
回复

使用道具 举报

11#
ID:659682 发表于 2019-12-9 21:17 | 只看该作者
感谢大佬分享
回复

使用道具 举报

12#
ID:659682 发表于 2019-12-9 21:18 | 只看该作者
屏幕不会亮怎么办
回复

使用道具 举报

13#
ID:656668 发表于 2019-12-9 23:05 来自手机 | 只看该作者
资料很详细,值得学习
回复

使用道具 举报

14#
ID:27825 发表于 2019-12-10 09:03 | 只看该作者
好资料要分享,谢谢
回复

使用道具 举报

15#
ID:660581 发表于 2019-12-10 14:38 | 只看该作者
admin 发表于 2018-12-29 22:40
好资料,51黑有你更精彩!!!

感谢老铁,牛逼啊
回复

使用道具 举报

16#
ID:559822 发表于 2019-12-30 14:40 | 只看该作者
收藏学习下 感谢~
回复

使用道具 举报

17#
ID:712713 发表于 2020-3-24 14:18 | 只看该作者
你实验里用的不是AT89CC51吗,为什么上面介绍的是STC89C51,单片机小白很懵
回复

使用道具 举报

18#
ID:721251 发表于 2020-4-20 16:46 | 只看该作者
1428006092 发表于 2020-3-24 14:18
你实验里用的不是AT89CC51吗,为什么上面介绍的是STC89C51,单片机小白很懵

PROTEUS 里面 AT89c51 就是STC89C51
回复

使用道具 举报

19#
ID:783325 发表于 2020-6-18 16:35 | 只看该作者
不错,支持
回复

使用道具 举报

20#
ID:769869 发表于 2020-6-18 20:40 来自手机 | 只看该作者
你好有原理图的原文件吗
回复

使用道具 举报

21#
ID:783591 发表于 2020-6-18 21:25 来自手机 | 只看该作者
at89c51和at89c52的一样吗
回复

使用道具 举报

22#
ID:786512 发表于 2020-6-22 11:54 | 只看该作者
谢谢分享
回复

使用道具 举报

23#
ID:781769 发表于 2020-6-27 10:28 | 只看该作者
感谢大佬,不过我在测试中出现问题,主函数里面选手抢答倒计时的部分是不是不完整呀
回复

使用道具 举报

24#
ID:844250 发表于 2020-11-16 14:59 来自手机 | 只看该作者
1428006092 发表于 2020-3-24 14:18
你实验里用的不是AT89CC51吗,为什么上面介绍的是STC89C51,单片机小白很懵

PROTEUS 里面 AT89c51 就是STC89C51
回复

使用道具 举报

25#
ID:863848 发表于 2020-12-20 23:13 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

26#
ID:865659 发表于 2020-12-23 13:20 | 只看该作者
很好,可以用来学习
回复

使用道具 举报

27#
ID:870739 发表于 2020-12-30 10:03 | 只看该作者
469497 发表于 2020-6-18 21:25
at89c51和at89c52的一样吗

差不多一样的,c52的存储大一些相对c51比较大,但一般应用没什么区别,不过c52贵一些。
回复

使用道具 举报

28#
ID:910440 发表于 2021-4-26 18:13 | 只看该作者
搞了半天才打开,原来需要下载winrar才能解压
回复

使用道具 举报

29#
ID:197229 发表于 2021-4-27 04:09 | 只看该作者

下载的资料 怎么会是这样呢?

回复

使用道具 举报

30#
ID:328014 发表于 2021-4-27 05:40 | 只看该作者
bomb1999 发表于 2021-4-27 04:09
下载的资料 怎么会是这样呢?

你的上一楼有答案,楼主不是用的你那个压缩软件压缩的
回复

使用道具 举报

31#
ID:925547 发表于 2021-5-23 10:54 | 只看该作者
运行有错误吗
回复

使用道具 举报

32#
ID:960164 发表于 2021-8-13 10:35 来自手机 | 只看该作者
从何说起——35 发表于 2020-6-18 16:35
不错,支持

能发一下proteus仿真原理图给我吗
回复

使用道具 举报

33#
ID:92810 发表于 2021-11-2 14:52 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

34#
ID:1010438 发表于 2022-3-14 22:01 | 只看该作者
很好,可以用来学习
回复

使用道具 举报

35#
ID:1010864 发表于 2022-3-20 09:53 | 只看该作者
想请问一下,为什么仿真里运行时蜂鸣器不响?
回复

使用道具 举报

36#
ID:1102312 发表于 2023-12-13 12:35 | 只看该作者
469497 发表于 2020-6-18 21:25
at89c51和at89c52的一样吗

不一样 但是区别不大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表