课程设计报告
课程名称: 微机原理课程设计 题 目: 八路抢答器
学 院: 环境与化学工程 系:过程装备与测控工程 专 业: 测控技术与仪器 班 级: 测仪111 学 号: 学生姓名:
起讫日期:指导教师: 杨俊清、杨大勇 、熊剑
摘要
目前,抢答器已经作为一种必不可少的工具广泛应用于各种智力和知识竞赛场合,但一般的抢答器可靠性低,使用寿命短,介于这些不方便因素,此次设计提出了用AT89C51单片机为核心控制元件,设计一个简易的八路抢答器。
本方案以AT89C51单片机作为主控核心,与晶振、数码管、蜂鸣器等通过外围接口实现的八路抢答器,利用了单片机的按键复位电路、时钟电路、定时器/计数器等,设计的八路抢答器不仅具有实时显示抢答选手的号码和抢答时间的功能,同时还利用 C语言编程,使其实现复位和报警的功能。本次设计的系统实用性强、判断精确、操作简单、扩展功能强。
关键字: 抢答电路 报警电路 倒计时电路
一、设计任务、要求 1.1任务
利用单片机、按键、四位数码管、无源蜂鸣器实现具有抢答、计时功能的抢答器。 1.2要求
1)给主持人设置一个开关,用来控制系统的重启(编号显示数码管重置初始时间)和抢答器的倒计时开始。
2)抢答器显示和倒计时的功能。抢答开始后,若有选手按动抢答器按钮,编号立即锁存,并在LED数码上显示选手的编号,同时扬声器给出音响提示。此外,要封锁输入电路,禁止其他选手抢答。 1.3发挥部分
1)抢答器具有定时抢答的功能,且一次抢答的时间可以由主持人设定(如20秒)。当节目主持人启动“开始”键后,要求定时器立即减计时,并用显示器显示。
2)参加选手在设定的时间内抢答,抢答有效,定时器停止工作,显示器上显示选手的编号,并保持到主持人将系统清零为止。 3)如果定时抢答的时间已到,却没有选手抢答时,本次抢答无效,系统自动回复到初始倒计时时间,并封锁输入电路,禁止选手超时后抢答。
二、方案总体设计
本次设计八路数字抢答器,使用了STC89C52单片机芯片控制电路,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。使用四角开关来做抢答选手的按键 ,用一蜂鸣器来进行抢答提醒,编程采用Keil C, 这样通过四个模块: 按键、芯片、蜂鸣器、数码管即可满足设计要求。
2.1单片机引用管脚说明:
2.2总体设计框图
总体方案工作原理:
在每次竞赛开始前,主持人读完比赛规则,可以对抢答器进行的时间进行预设。
比赛开始,主持人读完题之后按下“开始键”,即抢答开始,蜂鸣器提示一次,此时数码管开始显示20s的倒计时;直到有一个选手按下抢答键,对应的会在数码管上显示出该选手的编号和回答剩余的时间,同时蜂鸣器也会发出一次提示音,以示有人抢答本题;如果在规定的20s时间内没有人做出抢答,则此题作废,开始新一轮的抢答。 在倒计时过程中,主持人可以随时按“停止键”结束本次回答或者抢答。在每次抢答前后,主持人都可以按下复位键让系统清零 。
三、硬件设计 3.1单片机最小系统 3.1.1时钟频率控制电路
单片机必须在时钟的驱动下才能工作。AT89C51
中有一个用于构
成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度,电路中两个电容 C1,C2的作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调。C1,C2的典型值为30PF。时钟频率控制电路如下图所示。
3.1.2复位电路
复位操作有上电自动复位和按键手动复位两种方式,本设计采用手动按键复位。
图中复位电路由按键和电解电容C3、电阻R1构成的按键及上电复位电路。由于单片机是高电平复位,所以当按键按下时,单片机的 RESET管脚处于高电平,此时单片机处于复位状态。当上电后由于电容缓慢充电,单片机的9脚电压逐步由高向低转化,经过一段时间后,单片机的9脚处于稳定的低电平状态,此时单片机上电复位完毕。 3.2数码管显示
本设计中采用的是4位七段数码管7SEG-MPX4-CC,属于共阴极的 。数码管显示通常显示分为动态显示和静态显示。其中,静态显示的特点是显示稳定不闪烁,编程简单,显示亮度高,但占用I/O口多,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。而动态显示的稳定性虽没静态显示的好,编程复杂,但是相对静态显示而言占用的端口资源少。设计如图
3.3报警电路的设计
、
图中用到单片机的10、11和12管脚。10管脚具有读入功能,11管脚具有输出功能,而12管脚具有外部数据写功能,单片机通过内部定时器的操作实现交替变换的波形输出驱动蜂鸣器发生。 3.4整体电路原理图
3.5硬件电路图
四、软件设计
4.1系统主程序设计思路
为了能达到公平、公正、合理的设计理念,应该在主持人发布抢答命令之前设定好抢答时间。当时间设定好了之后,主持人发布抢答命令。按下开始按键后,程序开始打开,定时中断开始倒计时,然后调用键盘扫描子程序,当扫描到有人按下了抢答键,马上关闭抢答中断计时器T1,调用显示程序,此时封锁抢答键盘,启动计时器T0。
4.2程序流程图
五、系统仿真与调试
5.1 Keil uVision4软件调试
软件调试是通过对用户程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
本设计用到了Keil uVision4软件,首先打开Keil uVision4,将程序输入;然后进行调试,将程序中的语法错误和逻辑错误纠正,调试完毕后,创建HEX文件,HEX文件用于烧写芯片,将制定程序写入已设计好的电路板中,使其能根据我们的要求实现相应的功能;最后将HEX文件烧写入AT89C51芯片,运行电路,让其实现八路抢答的功能。
5.2 proteus仿真
首先将电路图根据设计要求在软件中准确地画出,即进行ISIS原理图设计,我们的仿真也是完全基于ISIS原理图模块下进行的,在本设计中我们用到的是交互式仿真,用于校验所设计的电路是否能正常
运行 然后将Keil uVision4生成的HEX文件链接到该中原理图,即设计文档的建立。
文档建立好之后, 按OK执行程序。下面是仿真图
初始化状态
8号选手成功抢答
5.3实物
5.4使用说明
主持人按下开始,抢答开始,倒计时。
例如8号抢答,锁定,其他人再抢答无效
六、设计总结和体会
在此次设计中,通过对自己在大学三年时间里所学的知识的回顾,和对所学知识的理解 ,还有同学的帮助完成了此次乘设计,感悟到只有理论水平提高了,才能够将课本知识与实践相整合,理论知识服务于教学实践, 增强自己的动手能力。这个实验十分有意义 我获得很深刻的经验。通过这次课程设计,我们知道了理论和实际的距离,也知道了理论和实际想结合的重要性,,也从中得知了很多书本上无法得知的知识。
七、参考文献
1. 单片机原理及接口技术(第3版),李朝青,北京航空航天大学出
版社,2002
2. 单片机原理课程设计,张一斌 余建坤,中南大学出版社
3. 零起点学Proteus单片机仿真技术,范海绍 李方圆等,机械工业出版社
4. 单片机课程设计指导书,皮大能 南光群 刘金华等,北京理工大学出版社
附录
1,源程序
#include
#define uint unsigned int
#define uchar unsigned char //共阴数码管编码0-f显示 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
sbit BEEP=P3^1;//变量定义
sbit start_stop = P3^2;
sbit reset = P3^3;
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
sbit key5 = P1^4;
sbit key6 = P1^5;
sbit key7 = P1^6;
sbit key8 = P1^7;
sbit state = P3^0;
bit start_stop_flag = 0;
bit key1_flag = 0;
bit key2_flag = 0; bit key3_flag = 0; bit key4_flag = 0; bit key5_flag = 0; bit key6_flag = 0; bit key7_flag = 0; bit key8_flag = 0; bit reset_flag = 0; bit action = 0;
uchar second = 20;
uchar timer0_count = 0; uchar number = 0;
uchar number_display = 0; uint flag = 1; //uint t;
//延时函数
void delay(uint z) {
uint x,y;
for(x=z;x>0;x--) for(y= 120;y>0;y--); }
//蜂鸣器发声延时
void DelayMS(uint x)
{
uchar t;
while(x--)
for(t=0;t
}
//数码管显示驱动函数
void display(uchar number,uchar second) {
uchar second_first,second_second; second_first = second / 10; second_second = second % 10; P0 =0x00;
P2 = 0xfe;
P0 = table[number];
delay(2);
P0 =0x00;
P2 = 0xfd;
P0 = 0x40;
delay(2);
P0 =0x00;
P2 = 0xfb;
P0 = table[second_first];
delay(2);
P0 =0x00;
P2 = 0xf7;
P0 = table[second_second];
delay(2);
P0 =0x00;
}
//蜂鸣器响应按周期t发音
void Play(uchar t)
{
uchar i;
for(i=0;i
{
BEEP=~BEEP;
DelayMS(t);
}
BEEP=0;
}
//开始键扫描函数
void start_stop_keyscan()
{
if(start_stop == 0)
{
delay(8);
if((start_stop == 0)&&(!start_stop_flag)) {
start_stop_flag = 1;
action = 1;
TR0 = 1;
state = 0;
}
}
else
{
start_stop_flag = 0;
}
}
//八位抢答键扫描函数
char key_scan8()
{
if(key1 == 0)
{
delay(8);
if((key1 == 0)&&(!key1_flag)) {
key1_flag = 1;
number = 1; number_display = number; }
}
else
{
key1_flag = 0;
number = 0; }
if(key2 == 0)
{
delay(8);
if((key2 == 0)&&(!key2_flag)) {
key2_flag = 1;
number = 2; number_display = number; }
else
{
key2_flag = 0;
number = 0; }
if(key3 == 0)
{
delay(8);
if(key3 == 0)
{
delay(8);
if((key3 == 0)&&(!key3_flag)) {
key3_flag = 1;
number=3;
number_display=number; }
else
{
key3_flag=0;
number=0;
}
if(key4 == 0)
{
delay(8);
if((key4 == 0)&&(!key4_flag)) {
key4_flag = 1;
number = 4; number_display = number; }
}
else
{
key4_flag = 0;
number = 0; }
if(key5 == 0)
{
delay(8);
if((key5 == 0)&&(!key5_flag)) {
number = 5; number_display = number; }
}
else
{
key5_flag = 0;
number = 0; }
if(key6 == 0)
{
delay(8);
if((key6 == 0)&&(!key6_flag)) {
key6_flag = 1;
number = 6; number_display = number; }
}
else
{
number = 0; }
if(key7 == 0)
{
delay(8);
if((key7 == 0)&&(!key7_flag)) {
key7_flag = 1;
number = 7; number_display = number; }
}
else
{
key7_flag = 0;
number = 0; }
if(key8 == 0)
{
delay(8);
if((key8 == 0)&&(!key8_flag))
key8_flag = 1;
number = 8; number_display = number; }
}
else
{
key8_flag = 0;
number
}
if(number_display
{
return 1;
}
else
{
return 0;
}
}
}
void reset_keyscan()
= 0; //复位键扫描函数 != 0)
if(reset == 0)
{
delay(8);
if((reset == 0)&&( !reset_flag)) {
reset_flag = 1;
number_display = 0; state = 1;
}
}
else
{
reset_flag = 0;
}
}
//主函数
void main()
{
// uint t;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA= 1;
ET0= 1;
TR0=0;
while( 1)
{
if(number_display!=0)
Play(number_display/2); //蜂鸣器发声 start_stop_keyscan();
reset_keyscan();
while(action)
{
while(!key_scan8())
{
display(number_display,second);
if(second == 0)
{
second = 20;
break;
}
}
TR0 = 0;
?
display(number_display,second); action = 0;
break;
}
display(number_display,second); }
}
//中断服务函数
void timer0() interrupt 1 {
// uint i;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; timer0_count ++;
if(timer0_count == 20) {
timer0_count = 0;
second --;
if(second == 0)
{
Play(2);
TR0 = 0;
number_display = 0; state = 1; action = 0; }
}
}
课程设计报告
课程名称: 微机原理课程设计 题 目: 八路抢答器
学 院: 环境与化学工程 系:过程装备与测控工程 专 业: 测控技术与仪器 班 级: 测仪111 学 号: 学生姓名:
起讫日期:指导教师: 杨俊清、杨大勇 、熊剑
摘要
目前,抢答器已经作为一种必不可少的工具广泛应用于各种智力和知识竞赛场合,但一般的抢答器可靠性低,使用寿命短,介于这些不方便因素,此次设计提出了用AT89C51单片机为核心控制元件,设计一个简易的八路抢答器。
本方案以AT89C51单片机作为主控核心,与晶振、数码管、蜂鸣器等通过外围接口实现的八路抢答器,利用了单片机的按键复位电路、时钟电路、定时器/计数器等,设计的八路抢答器不仅具有实时显示抢答选手的号码和抢答时间的功能,同时还利用 C语言编程,使其实现复位和报警的功能。本次设计的系统实用性强、判断精确、操作简单、扩展功能强。
关键字: 抢答电路 报警电路 倒计时电路
一、设计任务、要求 1.1任务
利用单片机、按键、四位数码管、无源蜂鸣器实现具有抢答、计时功能的抢答器。 1.2要求
1)给主持人设置一个开关,用来控制系统的重启(编号显示数码管重置初始时间)和抢答器的倒计时开始。
2)抢答器显示和倒计时的功能。抢答开始后,若有选手按动抢答器按钮,编号立即锁存,并在LED数码上显示选手的编号,同时扬声器给出音响提示。此外,要封锁输入电路,禁止其他选手抢答。 1.3发挥部分
1)抢答器具有定时抢答的功能,且一次抢答的时间可以由主持人设定(如20秒)。当节目主持人启动“开始”键后,要求定时器立即减计时,并用显示器显示。
2)参加选手在设定的时间内抢答,抢答有效,定时器停止工作,显示器上显示选手的编号,并保持到主持人将系统清零为止。 3)如果定时抢答的时间已到,却没有选手抢答时,本次抢答无效,系统自动回复到初始倒计时时间,并封锁输入电路,禁止选手超时后抢答。
二、方案总体设计
本次设计八路数字抢答器,使用了STC89C52单片机芯片控制电路,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。使用四角开关来做抢答选手的按键 ,用一蜂鸣器来进行抢答提醒,编程采用Keil C, 这样通过四个模块: 按键、芯片、蜂鸣器、数码管即可满足设计要求。
2.1单片机引用管脚说明:
2.2总体设计框图
总体方案工作原理:
在每次竞赛开始前,主持人读完比赛规则,可以对抢答器进行的时间进行预设。
比赛开始,主持人读完题之后按下“开始键”,即抢答开始,蜂鸣器提示一次,此时数码管开始显示20s的倒计时;直到有一个选手按下抢答键,对应的会在数码管上显示出该选手的编号和回答剩余的时间,同时蜂鸣器也会发出一次提示音,以示有人抢答本题;如果在规定的20s时间内没有人做出抢答,则此题作废,开始新一轮的抢答。 在倒计时过程中,主持人可以随时按“停止键”结束本次回答或者抢答。在每次抢答前后,主持人都可以按下复位键让系统清零 。
三、硬件设计 3.1单片机最小系统 3.1.1时钟频率控制电路
单片机必须在时钟的驱动下才能工作。AT89C51
中有一个用于构
成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度,电路中两个电容 C1,C2的作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调。C1,C2的典型值为30PF。时钟频率控制电路如下图所示。
3.1.2复位电路
复位操作有上电自动复位和按键手动复位两种方式,本设计采用手动按键复位。
图中复位电路由按键和电解电容C3、电阻R1构成的按键及上电复位电路。由于单片机是高电平复位,所以当按键按下时,单片机的 RESET管脚处于高电平,此时单片机处于复位状态。当上电后由于电容缓慢充电,单片机的9脚电压逐步由高向低转化,经过一段时间后,单片机的9脚处于稳定的低电平状态,此时单片机上电复位完毕。 3.2数码管显示
本设计中采用的是4位七段数码管7SEG-MPX4-CC,属于共阴极的 。数码管显示通常显示分为动态显示和静态显示。其中,静态显示的特点是显示稳定不闪烁,编程简单,显示亮度高,但占用I/O口多,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。而动态显示的稳定性虽没静态显示的好,编程复杂,但是相对静态显示而言占用的端口资源少。设计如图
3.3报警电路的设计
、
图中用到单片机的10、11和12管脚。10管脚具有读入功能,11管脚具有输出功能,而12管脚具有外部数据写功能,单片机通过内部定时器的操作实现交替变换的波形输出驱动蜂鸣器发生。 3.4整体电路原理图
3.5硬件电路图
四、软件设计
4.1系统主程序设计思路
为了能达到公平、公正、合理的设计理念,应该在主持人发布抢答命令之前设定好抢答时间。当时间设定好了之后,主持人发布抢答命令。按下开始按键后,程序开始打开,定时中断开始倒计时,然后调用键盘扫描子程序,当扫描到有人按下了抢答键,马上关闭抢答中断计时器T1,调用显示程序,此时封锁抢答键盘,启动计时器T0。
4.2程序流程图
五、系统仿真与调试
5.1 Keil uVision4软件调试
软件调试是通过对用户程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
本设计用到了Keil uVision4软件,首先打开Keil uVision4,将程序输入;然后进行调试,将程序中的语法错误和逻辑错误纠正,调试完毕后,创建HEX文件,HEX文件用于烧写芯片,将制定程序写入已设计好的电路板中,使其能根据我们的要求实现相应的功能;最后将HEX文件烧写入AT89C51芯片,运行电路,让其实现八路抢答的功能。
5.2 proteus仿真
首先将电路图根据设计要求在软件中准确地画出,即进行ISIS原理图设计,我们的仿真也是完全基于ISIS原理图模块下进行的,在本设计中我们用到的是交互式仿真,用于校验所设计的电路是否能正常
运行 然后将Keil uVision4生成的HEX文件链接到该中原理图,即设计文档的建立。
文档建立好之后, 按OK执行程序。下面是仿真图
初始化状态
8号选手成功抢答
5.3实物
5.4使用说明
主持人按下开始,抢答开始,倒计时。
例如8号抢答,锁定,其他人再抢答无效
六、设计总结和体会
在此次设计中,通过对自己在大学三年时间里所学的知识的回顾,和对所学知识的理解 ,还有同学的帮助完成了此次乘设计,感悟到只有理论水平提高了,才能够将课本知识与实践相整合,理论知识服务于教学实践, 增强自己的动手能力。这个实验十分有意义 我获得很深刻的经验。通过这次课程设计,我们知道了理论和实际的距离,也知道了理论和实际想结合的重要性,,也从中得知了很多书本上无法得知的知识。
七、参考文献
1. 单片机原理及接口技术(第3版),李朝青,北京航空航天大学出
版社,2002
2. 单片机原理课程设计,张一斌 余建坤,中南大学出版社
3. 零起点学Proteus单片机仿真技术,范海绍 李方圆等,机械工业出版社
4. 单片机课程设计指导书,皮大能 南光群 刘金华等,北京理工大学出版社
附录
1,源程序
#include
#define uint unsigned int
#define uchar unsigned char //共阴数码管编码0-f显示 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
sbit BEEP=P3^1;//变量定义
sbit start_stop = P3^2;
sbit reset = P3^3;
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
sbit key5 = P1^4;
sbit key6 = P1^5;
sbit key7 = P1^6;
sbit key8 = P1^7;
sbit state = P3^0;
bit start_stop_flag = 0;
bit key1_flag = 0;
bit key2_flag = 0; bit key3_flag = 0; bit key4_flag = 0; bit key5_flag = 0; bit key6_flag = 0; bit key7_flag = 0; bit key8_flag = 0; bit reset_flag = 0; bit action = 0;
uchar second = 20;
uchar timer0_count = 0; uchar number = 0;
uchar number_display = 0; uint flag = 1; //uint t;
//延时函数
void delay(uint z) {
uint x,y;
for(x=z;x>0;x--) for(y= 120;y>0;y--); }
//蜂鸣器发声延时
void DelayMS(uint x)
{
uchar t;
while(x--)
for(t=0;t
}
//数码管显示驱动函数
void display(uchar number,uchar second) {
uchar second_first,second_second; second_first = second / 10; second_second = second % 10; P0 =0x00;
P2 = 0xfe;
P0 = table[number];
delay(2);
P0 =0x00;
P2 = 0xfd;
P0 = 0x40;
delay(2);
P0 =0x00;
P2 = 0xfb;
P0 = table[second_first];
delay(2);
P0 =0x00;
P2 = 0xf7;
P0 = table[second_second];
delay(2);
P0 =0x00;
}
//蜂鸣器响应按周期t发音
void Play(uchar t)
{
uchar i;
for(i=0;i
{
BEEP=~BEEP;
DelayMS(t);
}
BEEP=0;
}
//开始键扫描函数
void start_stop_keyscan()
{
if(start_stop == 0)
{
delay(8);
if((start_stop == 0)&&(!start_stop_flag)) {
start_stop_flag = 1;
action = 1;
TR0 = 1;
state = 0;
}
}
else
{
start_stop_flag = 0;
}
}
//八位抢答键扫描函数
char key_scan8()
{
if(key1 == 0)
{
delay(8);
if((key1 == 0)&&(!key1_flag)) {
key1_flag = 1;
number = 1; number_display = number; }
}
else
{
key1_flag = 0;
number = 0; }
if(key2 == 0)
{
delay(8);
if((key2 == 0)&&(!key2_flag)) {
key2_flag = 1;
number = 2; number_display = number; }
else
{
key2_flag = 0;
number = 0; }
if(key3 == 0)
{
delay(8);
if(key3 == 0)
{
delay(8);
if((key3 == 0)&&(!key3_flag)) {
key3_flag = 1;
number=3;
number_display=number; }
else
{
key3_flag=0;
number=0;
}
if(key4 == 0)
{
delay(8);
if((key4 == 0)&&(!key4_flag)) {
key4_flag = 1;
number = 4; number_display = number; }
}
else
{
key4_flag = 0;
number = 0; }
if(key5 == 0)
{
delay(8);
if((key5 == 0)&&(!key5_flag)) {
number = 5; number_display = number; }
}
else
{
key5_flag = 0;
number = 0; }
if(key6 == 0)
{
delay(8);
if((key6 == 0)&&(!key6_flag)) {
key6_flag = 1;
number = 6; number_display = number; }
}
else
{
number = 0; }
if(key7 == 0)
{
delay(8);
if((key7 == 0)&&(!key7_flag)) {
key7_flag = 1;
number = 7; number_display = number; }
}
else
{
key7_flag = 0;
number = 0; }
if(key8 == 0)
{
delay(8);
if((key8 == 0)&&(!key8_flag))
key8_flag = 1;
number = 8; number_display = number; }
}
else
{
key8_flag = 0;
number
}
if(number_display
{
return 1;
}
else
{
return 0;
}
}
}
void reset_keyscan()
= 0; //复位键扫描函数 != 0)
if(reset == 0)
{
delay(8);
if((reset == 0)&&( !reset_flag)) {
reset_flag = 1;
number_display = 0; state = 1;
}
}
else
{
reset_flag = 0;
}
}
//主函数
void main()
{
// uint t;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA= 1;
ET0= 1;
TR0=0;
while( 1)
{
if(number_display!=0)
Play(number_display/2); //蜂鸣器发声 start_stop_keyscan();
reset_keyscan();
while(action)
{
while(!key_scan8())
{
display(number_display,second);
if(second == 0)
{
second = 20;
break;
}
}
TR0 = 0;
?
display(number_display,second); action = 0;
break;
}
display(number_display,second); }
}
//中断服务函数
void timer0() interrupt 1 {
// uint i;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; timer0_count ++;
if(timer0_count == 20) {
timer0_count = 0;
second --;
if(second == 0)
{
Play(2);
TR0 = 0;
number_display = 0; state = 1; action = 0; }
}
}