[关键词] AT89C51单片机、30秒倒计时器、LED
设计和制作 30 秒倒计时器的方法有很多种。本文介绍的30秒倒计时器采用AT89C51单片机作为控制单元,用两个数码管显示时间,用三个按钮分别控制计时器的启动、复位和暂停。倒计时器的初始状态显示“30”。当裁判按下计时按钮时,30秒倒计时开始。当计时器到0时,计时器发出声光报警,提醒裁判计时时间已到。
1、电路设计
30秒倒计时器电路主要由电源电路、单片机最小系统、按键输入、显示驱动电路、报警电路组成。 30秒倒计时器控制电路如图1所示。
图1 30秒倒计时器电路原理图
1.按键输入
“30秒倒计时器”使用三个按钮完成计数器的开始计数、复位、暂停/继续计数等功能。
(1)K1键:启动按钮(P3.2)。
按K1键,计数器开始倒计时,数码管显示每秒从30开始倒计时的数字。当数字减少到零时,报警电路发出声光报警信号。当计数器处于暂停状态时,按K1键将返回计时状态。
(2)K2键:复位键(P3.3)。
按K2键,无论计数器工作在什么状态,计数器都会立即复位到预设值“30”。在报警状态下,按K2键也可以取消报警。
(3)K3键:暂停/定时切换按钮(P3.4)。
当计数器处于计时状态时,按下该键,计数器暂停计时,数码显示数字保持不变;当计数器处于暂停状态时,按此键,计数器返回计时状态;初始状态下,该键无效。
2、显示驱动电路
“30秒倒计时器”采用两个普通正数码管显示时间,数码管显示方式为动态显示。在显示驱动电路中,数码管的段码引脚通过470欧姆电阻连接到单片机的P1口。两个片选引脚分别通过9012连接到正5V电源,并由P3.0和P3.1控制。
4、报警电路
当计时时间减到0且显示数码管显示“00”时,由P3.5控制发光二极管D1发出光报警,由P3.7控制蜂鸣器发出报警声。声音警报。
2. 软件编程思想
1. 全局变量
“30秒倒计时器”动作过程主要由三个全局变量控制。第一个是位变量“act”。当“act”为“1”时,倒计时开始,当“act”为“0”时,倒计时停止。 “act”的初始值为“0”,可以通过按钮操作将其设置为“1”或清除。 “0”。第二个全局变量是char变量“time”,它存储倒计时时间。当倒计时时间为0时,将发出声光报警。变量“time”的初始值为30。当“act”为1时,定时中断服务程序每1秒将其减1。当减到0时,保持为0。按“复位键”,将“时间”复位为30。第三个全局变量是int变量“t”,记录响应定时中断0的次数根据初始化定义,定时器0工作在模式1,每1ms发出一次中断请求。控制程序只允许定时器0中断,因此不允许比定时器0中断更高级别的中断,因此每个请求都会立即响应。响应后,将中断服务程序中的全局变量“t”加1,记录响应中断的次数。每 1,000 个响应等于 1 秒。变量“t”的初始值为0,在中断服务程序中将其加1。当“t”为2000时,由中断服务程序将其清为0。在按钮驱动中,当按下开始按钮、复位按钮或暂停/开始按钮时,“t”被清0,以便从0ms开始计时。
2、控制流程
主程序主要用于检测全局变量“时间”,并在“时间”为0时发出“声光报警”。按钮驱动、显示驱动和“时间”操作均在定时器0中断服务程序中进行。其控制流程如图2所示。
图2 控制流程图
3、软件程序设计
1.数码管驱动器
定时器的两个数码管以动态显示方式显示计时时间“time”(全局变量)。 LED1显示“时间”的十位,LED2显示“时间”的个位。
(1)定义段码数据端口和片选信号
根据实际电路,在C51中定义段码的数据端口为P1,两个片选信号为P3.0和P3.1。定义如下:
#定义段P1
sbit wei1=P3^0;
sbit wei2=P3^1;
(2) 定义字形代码
LED显示数字0~9和所有消光的字形码表放在数组zixing[]中。字形代码是一个固定的表。定义时加上关键字“code”表示该表存储在程序存储器中。
无符号字符代码 zixing[]=
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff
};
(3)定义数码管LED1和LED2的显示变量
为了增加驱动程序的可移植性,作者为数码管LED1和LED2定义了显示变量。显示变量是该驱动程序的外部接口。外部程序只要改变显示变量的值就可以改变数码管显示的值。它的定义如下:
无符号字符 led_str[2]={10,10};
led_str[0]直接对应数码管LED1,led_str[1]直接对应数码管LED2。在这个项目中,一个特殊的子程序将全局变量时间计算拆分为 led_str[0] 和 led_str[1]。
无效js()
led_str[1]=时间/10;
led_str[0]=时间;
(4)数码管驱动器
在定时中断服务程序中调用并执行数码管驱动程序“void chushi(char i)”。根据初始化程序的定义,每隔1ms执行一次定时中断服务程序。全局变量“t”用于定时中断服务程序中,记录进入服务程序的次数。当“t”达到2000时,将被定时中断服务程序清零。
数码管驱动器的参数“char i”用于判断当前LED1或LED2是否点亮。当参数为“0”时,LED1 点亮,当参数为“1”时,LED2 点亮。如果我们希望LED1在偶数次进入定时中断服务程序时点亮,LED2在进入奇数次定时中断服务程序时点亮,我们可以通过程序调用轻松实现语句“chushi(t%2);”。
进入数码管驱动后,首先调用子函数js()计算当前的led_str[0]和led_str[1]。接下来,关闭两个数码管以防止出现余辉。最后点亮需要点亮的数码管并发送字库代码。驱动代码如下:
void chushi(char i)
js();//计算显示变量
duan=0xff;//去除余辉
wei1=i; wei2=!i;//判断芯片选择
段=紫星[led_str[i]]; //发送字体代码
2. 按键驱动
按键驱动分为按键识别和按键功能执行两部分。按键功能可以在按钮按下时执行,也可以在按钮抬起后执行。在本文中,它被设计为在按钮抬起后执行。
(1) 定义按键I/O地址
根据实际电路,三个按钮(启动按钮、复位按钮、暂停/启动按钮)分别连接到P3口的P3.2、P3.3、P3.4引脚。为了方便key值检索,将P3端口定义为“iokey”,可以在程序中定义如下:
#定义iokey P3
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
(2)按钮驱动流程
按键识别的一般流程为:在I/O上写入“1”→判断是否有按键按下→延时去抖→判断按键值→等待按键抬起→执行按键功能。按钮驱动中定义了两个静态变量“ts”和“kv”,分别用于延迟去抖和键值存储。
(3) 延迟去抖
静态变量“ts”用于延迟去抖。关键驱动程序在定时中断服务程序中每1ms执行一次。每次检测到按键时,“ts”加1,当未检测到按键时,“ts”清零。如果按键连续按下20ms,则当按键驱动程序连续执行20次时,将检测到按键按下。此时静态变量ts累加到20,确认按键有效。
为了防止按键持续按下时“ts”累积溢出,可以在确认按键按下后将“ts”的值保持为20,或者大于20的值,例如21。
(4)获取键值
确认按键按下后,可以通过读取按键的I/O口状态来获取按键值。为了读取P3.2、P3.3和P3.4引脚的状态并屏蔽P3端口其他引脚的影响,可以将读取的值按位或运算为11100011B(0xE3),然后发送到静态变量“千伏”。
静态变量“kv”存储键的键值。当没有按键按下或者按键抬起时kv值为0。当按下开始键key1时,kv=11111011B(0xFB),当按下复位键key2时,kv=11110111B(0xF7),当按下暂停/开始键key3时,kv=11101111B(0xEF)。
(5) 执行关键功能
当按键抬起后第一次执行按键驱动程序时,静态变量“kv”保存按键按下时获得的最后一个按键值。以键值作为参数调用键执行程序“actkey(kv);”执行关键功能。调用后kv值立即清0,确保按键后立即执行按键功能。驱动代码如下:
无效键()
静态无符号字符 kv=0;
静态无符号字符 ts=0;
键1=1;键2=1;键3=1;
if(!(key1&key2&key3))
ts++;
如果(ts>=20)ts=20; //有一个键被按下
如果(ts==20)
kv=iokey|0xe3; //获取键值
别的
{//没有按键按下或按键抬起
动作键(kv);
ts=0;
kv=0;
函数actkey(kv)用于根据键值“kv”执行相应操作。当“kv”等于0xFB时,表示按下了开始键key1,函数actkey(kv)将全局变量act赋值为“1”。当“kv”等于0xF7时,表示按下了复位键key2,函数actkey(kv)将全局变量“time”复位为“30”。当“kv”等于0xEF时,表示按下了暂停/开始键,函数actkey(kv)将全局变量act取反。每按下一个按钮,全局变量“t”就清为0。目的是每当定时器复位或启动定时器时,定时器中断次数都从0开始计算。否则,第一秒定时器将不准确。 。程序代码如下:
void actkey(无符号字符 k)
开关(k)
案例 0xfb:act=1;t=0;break;
情况 0xf7:时间=30;t=0;休息;
情况 0xef:act=~act;t=0;休息;
4. 结论
在编程过程中,本文采用面向对象的编程思想,封装了两个LED数码管和三个独立的按钮。在定时中断服务程序中调用其驱动程序时,程序员只需操作其接口:数组“led_str[2]”和函数“actkey(unsigned char k)”,无需直接对硬件进行编程即可改变功能,增强了软件的多功能性和可移植性。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请联系本站,一经查实,本站将立刻删除。如若转载,请注明出处:https://www.xiufubahen.com/html/tiyuwenda/6283.html