资源描述
单片机课程设计
摘 要
随着科学技术的发展和普及,各种各样的竞赛越来越多,其中抢答器的作用也就显而易见。目前很多抢答器基本上采用小规模数字集成电路设计,使用起来不够理想。因此设计一更易于使用和区分度高的抢答器成了非常迫切的任务。现在单片机已进入各个领域,以其功耗小、智能化而著称,所以若利用单片机来设计抢答器,便使以上问题得以解决.针对以上情况,本文设计出以STC89C51RC单片机为核心的八路智能抢答器。我们采用了数码管直接指示结果,并自动复位的设计思想,它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过LED数码管显示相应的路数,即使两组的抢答时间相差几微秒,也可分辨出是哪组优先按下的按键,它充分利用了单片机系统的优点,具有结构简单、功能强大、可靠性好、实用性强的特点。
本设计是以八路智能抢答为基本理念。考虑到依需设定限时回答的功能,利用51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,蜂鸣器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为犯规;满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。
关键词:STC89C51RC 4;数码管;按键
目录
引言 1
引言 3
1.设计背景 4
1.1课题背景 4
1.2设计内容 4
1.2.1基本功能 4
2智能抢答器简介 5
2.1方案选择 5
2.2系统设计原理 5
3系统组成硬件部分 5
3.1电源的设计 5
3.2单片机最小系统 5
3.3数码管显示电路 9
3.4按键输入电路 10
3.5报警电路 12
4系统组成软件部分 12
4.1proteus软件简介 12
5电路仿真结果 14
参考文献 16
附录:源程序代码 17
28
引言
最近几年来,随着科技的飞速发展,单片机领域正在不断的走向社会各个角落,还带动传统控制检测日新月异更新。在实时运作和自动控制的单片机应用到系统中,单片机如今是作为一个核心部件来使用,仅掌握单片机方面知识是不够的,还应根据其具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。“单片机原理及应用课程设计”是电子类专业的学科基础科,它是继“汇编语言程序设计”,“接口技术”等课程之后开出的实践环节课程。
1.设计背景
1.1课题背景
由于现在社会竞争力加大,竞赛类项目十分流行,而其中用到的抢答器更是热销,而市场上的抢答器多售价太高,结构复杂,因此我们准备设计一款基于单片机的智能抢答器。该抢答器结构简单,功能也是十分简洁。
1.2设计内容
1.2.1基本功能
1、同时供8名选手比赛,分别用8个按钮K1 ~ K8表示。
2、设置一个由主持人控制的的开始抢答开关K0。
3、抢答器开始工作,在主持人按下抢答按钮K0后,数码管显示抢答倒计时。当某一选手最先按下自己的按钮,则数码管显示该选手号数,表示该选手抢答成功。在主持人按下开始按钮之前按下抢答按钮的动作无效,并且会引发蜂鸣器报警。
4、同时该设计还可以使抢答倒计时由主持人自行更改。
5、参赛选手在规定时间内抢答成功的,则数码管会显示该选手号数和抢答的时间。如果没有人抢答,则本次抢答无效,系统会报警并禁止抢答。
。
2智能抢答器简介
2.1方案选择
针对所要实现的功能,我们选用由STC89C51芯片组成的八路智能抢答系统。
2.2系统设计原理
以STC89C51RC单片机为核心,起着控制作用。系统包括LED显示电路、复位电路、时钟电路、按键输入电路。设计思路分为五个模块:复位电路、晶振电路模块、STC89C51RC、LED显示电路和按键输入电路这五个模块。
3系统组成硬件部分
3.1电源的设计
系统电源使用外接直流5V
3.2单片机最小系统
51单片机是对目前所有兼容intel 8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的8为单片机之一。单片机是在一块芯片内集成了CPU、RAM、ROM、定时器/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。51系列单片机内包含以下几个部件:
一个8位CPU;一个片内振荡器及时钟电路;
4KB的ROM程序存储器;
一个128B的RAM数据存储器;
寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;
32条可编程的I/O口线;
两个16位定时/计数器;
一个可编程全双工串行口;
5个中断源、两个优先级嵌套中断结构。
如图2-2-1所示为STC89C51RC单片机基本构造,其基本性能介绍如下:
STC89C51RC本身内含40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中端口,3个16位可编程定时计数器,2个全双工串行通信口,STC89C51RC可以按照常规方法进行编程,但不可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
图2-2-1 STC89C51RC单片机
STC89C51RC的主要特性如下表所示:
表2-2-1 STC89C51RC主要功能描述
兼容MCS—51指令系统
32个可编程I/O线
4k字节可编程闪烁存储器
可编程UARL通道
三个16位可编程定时/计数器中断
时钟频率0-24MHz
2个外部中断源,共8个中断源
256×8bit内部RAM
2个读写中断口线
可直接驱动LED
软件设置睡眠和唤醒功能
低功耗空闲和掉电模式
STC89C51RC为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
P0口:P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。Flash编程和程序校验期间,P1接收低8位地址。
P2口:P2是一个带有内部上拉电阻的8 位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX @RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash 闪速存储器编程和程序校验的控制信号。
RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个AL脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条 MOVX 和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STC89C51RC由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTAL1:振荡器反相放大器的输出端及内部时钟发生器的输入端。
XTAL2:振荡器反相放大器的输出端。
图2-2-2 单片机最小系统
单片机最小系统说明:
时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。
单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。、
3.3数码管显示电路
显示系统采用四位一体数码管来显示,LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。LED数码管的结构简单,分为七段和八段两种形式,也有共阳和共阴之分。以八段共阳管为例,它有8个发光二极管(比七段多一个发光二极管,用来显示sP,即点),每个发光二极管的阳极连在一起,如图(图2-2-4)所示。这样,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。为方便起见,本文主要讨论八段LED数码显示管,其他类形的显示管与其类似。
图 LED数码管
LED 灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点亮而显示不同的字形,如 H,G,F,E,D,C,B,A全亮显示为8,采用共阴极连接驱动代码,代码表如下表(表2-2-2)所示。
表2-2-2 驱动代码表
显示数值
H,G,F,E,D,C,B,A
驱动代码
0
00111111
3FH
1
00000110
06H
2
01011011
5BH
3
01001111
4FH
4
01100110
66H
5
01101101
6DH
6
01111101
7DH
7
00000111
07H
8
01111111
7FH
9
01101111
6FH
3.4按键输入电路
图2-2-4 按键电路
按键是由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。键盘可分为编码式键盘和非编码式键盘两种。
1.编码键盘通过硬件电路产生被按按键的键码,这种键盘所需程序简单,但硬件电路复杂、价格昂贵通常不被单片机系统采用。
2.非编码键盘常用一些按键排列成行列矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来决定。非编码键盘的硬件接口简单,但是要占用较多的CPU时间,通常采用可编程键盘管理芯片来克服这个缺点。本设计使用两种按键,一种是按键式非编码键盘和轻触式非编码开关。
在接线时由于有四个引脚,连接时需要用万用表进行测量,然后接通两个引脚,原理图如下。
要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。
3.5报警电路
图2-2-5 报警电路
4系统组成软件部分
4.1proteus软件简介
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:
(1)现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
(2)支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
(3)提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。
(4)具有强大的原理图绘制功能。
可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。还可以直接在基于原理图的虚拟原型上编程,再配合显示及输出,能看到运行后输入输出的效果。配合系统配置的虚拟逻辑分析仪、示波器等,Proteus建立了完备的电子设计开发环境。
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。 PROTEUS 是单片机课堂教学的先进助手。
PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台。
5电路仿真结果
图2-2-6抢答器初始状态
图2-2-7 抢答开始后6号抢答成功,并显示其抢答时的剩余时间
图2-2-8六号的回答倒计时开始计时
图2-2-9元件清单
参考文献
[1]孙育才.《单片微型计算机及其应用》. 南京:东南大学出版社.2004
[2]潘新民 王燕芳.《微型计算机控制技术》. 北京:电子工业出版社2003
[4]李群芳.《单片机原理及接口技术》.北京:电子工业出版社,2008
[5]李光飞.《单片机课程设计实例指导》.北京:北京航空航天大学出版社,2004
附录:源程序代码
#include<regg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K0=ff^0;//开始抢答按键
sbit beep=gg^0;//蜂鸣器
sbit K1=ee^0;//1号选手抢答按键
sbit K2=ee^1;//2号选手抢答按键
sbit K3=ee^2;//3号选手抢答按键
sbit K4=ee^3;//4号选手抢答按键
sbit K5=ee^4;//5号选手抢答按键
sbit K6=ee^5;//6号选手抢答按键
sbit K7=ee^6;//7号选手抢答按键
sbit K8=ee^7;//8号选手抢答按键
sbit S1=ff^1;//答题计时键
sbit S2=ff^2;//开始抢答时间调整键
sbit S3=ff^3;//答题计时时间调整键
char s;
uchar num=0;
char time1;//抢答时间
char time2;//答题限时时间
uint m,n;//T0,T1定时器定一秒时
bit flag1,flag2,flag3,flag4; //标志位
bit aa,bb;//时间调整标志位
//延时子函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
uchar code table1[]={
//共阴数码管段码值
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar code table2[]={
//共阴数码管位码值
0x7f,0xbf,
0xdf,0xef
};
//初始化子函数
void init()
{
TMOD=0x11;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
ET0=1;
ET1=1;
EA=1;
dd=0x00;
time1=10;
time2=10;
flag2=1;
beep=0;
}
//开始键扫描子函数
void key1()
{
uchar i=100;
if(K0==0)
{
delay(10);
if(K0==0)
{
while(K0==0&&i)
{
i--;
delay(10);
}
TR0=1;
s=time1;
m=0;
flag1=1;
flag2=1;
flag3=1;
num=0;
beep=0;
flag4=0; //清除违规标志位
aa=0;
bb=0;
}
}
}
//选手抢答按键扫描子函数
void key()
{
uchar i=100;
if(K1==0)
{
delay(10);
if(K1==0)
{
while(K1==0&&i)
{
i--;
delay(10);
}
num=1; //数码管显示1号"1"
TR0=0; //关闭定时器0,时间停止
TR1=1; //打开定时器1,使扬声器响一声
flag2=0; //关闭开始键标志位,使再按其他七个键不会响应
}
}
if(K2==0) //下面七个键的处理同上
{
delay(10);
if(K2==0)
{
while(K2==0&&i)
{
i--;
delay(10);
}
num=2;
TR0=0;
TR1=1;
flag2=0; //重要
}
}
if(K3==0)
{
delay(10);
if(K3==0)
{
while(K3==0&&i)
{
i--;
delay(10);
}
num=3;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K4==0)
{
delay(10);
if(K4==0)
{
while(K4==0&&i)
{
i--;
delay(10);
}
num=4;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K5==0)
{
delay(10);
if(K5==0)
{
while(K5==0&&i)
{
i--;
delay(10);
}
num=5;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K6==0)
{
delay(10);
if(K6==0)
{
while(K6==0&&i)
{
i--;
delay(10);
}
num=6;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K7==0)
{
delay(10);
if(K7==0)
{
while(K7==0&&i)
{
i--;
delay(10);
}
num=7;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K8==0)
{
delay(10);
if(K8==0)
{
while(K8==0&&i)
{
i--;
delay(10);
}
num=8;
TR0=0;
TR1=1;
flag2=0;
}
}
}
//数码管显示子函数
void display()
{
if(flag1==1) //开始键按下,开始计时抢答
{
if(num!=0) //如果有人抢答,则显示相应的几号
{
dd=table1[num]; //显示几号抢到了
ff=table2[0];
delay(2);
dd=0;
ff=0xff;
}
else //否则没人抢答,则前面不显示几号
{
dd=0x00;
ff=0xff;
}
dd=table1[s/10]; //下面为显示抢答倒计时
ff=table2[1];
delay(2);
dd=0;
ff=0xff;
dd=table1[s%10];
ff=table2[2];
delay(2);
ff=0xff;
dd=0x00;
}
else //如果开始键没有按下,则显示F FF(若有违规者,则显示违规号码及 FF)或时间调整
{
if(flag4==1) //违规显示
{
if(num!=0)
{
dd=table1[num]; //显示几号违规了
ff=table2[0];
delay(2);
dd=0x00;
ff=0xff;
dd=table1[15]; //下面显示 FF,表示违规了
ff=table2[1];
delay(2);
dd=0x00; //消隐
ff=0xff;
dd=table1[15];
ff=table2[2];
delay(2);
dd=0x00;
ff=0xff;
}
else
{
dd=0x00;
ff=0xff;
}
}
else //没有人违规才显示调整时间
{
if(aa==1)
{
dd=0x76; //第一位数码管显示"5(S)"(表示抢答时间调整)
ff=table2[0];
delay(2);
dd=0x00;
ff=0xff;
dd=table1[time1/10]; //下面显示调整的抢答时间
ff=table2[1];
delay(2);
dd=0x00;
ff=0xff;
dd=table1[time1%10];
ff=table2[2];
delay(2);
dd=0x00;
ff=0xff;
}
else if(bb==1)
{
dd=0x38; //第一位与第二位数码管合起来显示"T",表示答题时间调整
ff=table2[0];
delay(2);
dd=0x00;
ff=0xff;
dd=table1[time2/10];
ff=table2[1];
delay(2);
dd=0x00;
ff=0xff;
dd=table1[time2%10];
ff=table2[2];
delay(2);
dd=0x00;
ff=0xff;
}
else //否则显示F FF
{
dd=table1[15];
ff=table2[0];
delay(2);
dd=0x00;
dd=table1[15];
ff=table2[1];
delay(2);
dd=0x00; //消隐
ff=0xff;
dd=table1[15];
ff=table2[2];
delay(2);
dd=0x00;
ff=0xff;
}
}
}
}
//调整时间键扫描子函数
void key2()
{
uchar i=100;
if(S2==0) //抢答时间调整
{
delay(10);
if(S2==0)
{
while(S2==0&&i)
{
i--;
delay(10);
}
time1++;
if(time1==61)
{
time1=10;
}
aa=1; //将抢答时间标志位置1
bb=0; //同时关闭答题时间标志位
}
}
if(S3==0) //答题时间调整
{
delay(10);
if(S3==0)
{
while(S3==0&&i)
{
i--;
delay(10);
}
time2++;
if(time2==61)
{
time2=10;
}
bb=1;
aa=0;
}
}
}
//主函数
void main()
{
uchar i=100;
init();//调用初始化子函数
while(1)
{
key1();//调用开始键扫描子函数
if((flag1==0)&(flag2==1)) //当开始键没按下及没有人违规时才可进行时间调整
{
key2();
}
if((flag1==1)&(flag2==0)) //当开始键按下及有人抢答才进行开始回答计时倒计时
{
if(S1==0)
{
delay(10);
if(S1==0)
{
while(S1==0&&i)
{
i--;
delay(10);
}
s=time2;
TR0=1;
m=0;
TR1=1;
}
}
}
if((flag1==0)&(flag2==1)) //违规
{
key();
if(num!=0) //开始键没有按下时,有人按下了抢答器,则置违规标志位
{
flag4=1;
}
}
if((flag1==1)&(flag2==1)) //如果开始键按下且抢答键没有人按下,则进行八路抢答键扫描
{
key();
}
display();//显示到数码管上
}
}
//定时器0中断子函数
void t0() interrupt 1
{
TH0=(65536-2000)/256; //2ms
TL0=(65536-2000)%256;
if(flag3) //开始(START)键按下,嘟一声(长1秒),表示开始抢答
{
beep=~beep;
}
else
beep=0;
if(s<5) //抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声
{
if(s%2==0)
{
flag3=1;
}
else
{
flag3=0;
}
}
m++;
if(m==500) //1秒
{
m=0;
s--;
flag3=0; //关闭开始键按下响一秒的嘟声
if(s==-1)
{
s=20;
TR0=0;
flag1=0; //显示F FF
flag2=1;
num=0;
}
}
}
//定时器1中断子函数
void t1() interrupt 3 //定时器1处理有人按下抢答器嘟一声(长1秒)
{
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
beep=~beep;
n++;
if(n==500)
{
n=0;
TR1=0;
}
}
展开阅读全文