目录
一、电路原理分析
数码管亮灭、闪烁控制需要在数码管显示、键盘基础上编写,硬件电路原理分析参考本专栏前面博文,本处略过。
二、程序设计
蓝桥杯竞赛中经常出现数码管的闪烁控制要求,在修改系统工作参数时,作为被修改数据的提示信息,有时还有闪烁时间要求。
数码管的闪烁是由数码管的亮灭交替来实现,程序的设计思路是:首先实现数码管的亮灭控制,然后通过定时器实现亮灭的交替控制。本文以一个数码管闪烁控制为例。
1、数码管亮灭控制程序设计
以第一个数码管为例,用S7键进行亮灭控制。
(1)变量定义
bit Led1_LM=0;//0--亮 1--灭
(2)第一个数码管程序修改后程序
P0=tab[Led1];//
hc138(7); //段输出
hc138(0); //锁存
if(!Led1_LM)//判断亮灭标志
{// 0执行数码管亮
P0=0x01; // 0000 0001
hc138(6); //位输出
}
del(1);
P0=0x00; // 0000 0000
hc138(6); //位输出 关断
hc138(0); //锁存 S7键功能
(3)S7键功能程序修改
Led1_LM=!Led1_LM; //亮灭切换
// Led1++; //原功能
// if(Led1==10)Led1=0; //原功能
2、数码管闪烁控制程序设计
第一个数码管以间隔0.2S闪烁为例,用S6键控制闪烁的切换。
(1)定时器2的使用
闪烁的时间间隔需要用定时器实现,竞赛板上单片机芯片内部有3个定时器,T0、T1大家都比较熟悉,留给其它功能模块(如测频率)使用,本例使用定时器T2,与T2相关的特殊功能寄存器如下表所示。
定时器T2中断向量C语言编号是12。定时器T2的初始化函数编写用到上表中的特殊功能寄存器,可以利用STC-ISP下载软件提供的功能模块“定时器计算器”产生,如下图所示。
本例设置选项如下:
系统频率:12MHz。定时长度:50毫秒。选择定时器:定时器2。定时器模式:16位自动重载。定时器时钟:12T。
将产生的C代码复制到主文件中即可。需要注意的是,代码中没有T2中断允许位的设置,需要另外添加。
复制的T2的初始化函数如下:(在主文件开头声明)
void Timer2_Init(void) //50毫秒@12.000MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0xB0; //设置定时初始值
T2H = 0x3C; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
}
主函数开头调用T2的初始化函数,程序如下:
Timer2_Init() ; //50毫秒@12.000MHz
IE2 |=0x04; //设置允许位 ET2为1
EA=1; //设置总允许位
T2的中断服务函数如下:
void inet2p()interrupt 12 //T2中断服务函数 50ms
{
}
(2)定义数码管1闪烁标志和闪烁计数变量
bit Led1_S=0; //0--不闪 1--闪
unsigned char Led1_js=0; //50毫秒计数变量
(3)在T2中断服务函数中编写0.2S间隔闪烁控制程序
void inet2p()interrupt 12 //T2中断服务函数
{
if(Led1_S) //判断闪烁标志
{//0--不闪 1--闪
Led1_js++; //50毫秒计数变量
if(Led1_js==2) //0.2S间隔--亮灭各0.1S
{
Led1_js=0; //计数清0
Led1_LM=!Led1_LM; //亮灭标志切换 实现闪烁
}
}
}
(4)S6键功能
Led1_S=!Led1_S; //闪烁状态切换
if(!Led1_S)Led1_LM=0; //判断闪烁,不闪时点亮数码管
// Led1++; //原功能
// if(Led1==10)Led1=0; //原功能