蓝桥杯单片机——数码管亮灭、闪烁控制

目录

一、电路原理分析

二、程序设计

1、数码管亮灭控制程序设计

(1)变量定义

(2)第一个数码管程序修改后程序

(3)S7键功能程序修改

2、数码管闪烁控制程序设计

(1)定时器2的使用

(2)定义数码管1闪烁标志和闪烁计数变量

(3)在T2中断服务函数中编写0.2S间隔闪烁控制程序

(4)S6键功能

    三、程序包链接


一、电路原理分析

数码管亮灭、闪烁控制需要在数码管显示、键盘基础上编写,硬件电路原理分析参考本专栏前面博文,本处略过。

二、程序设计

蓝桥杯竞赛中经常出现数码管的闪烁控制要求,在修改系统工作参数时,作为被修改数据的提示信息,有时还有闪烁时间要求。

数码管的闪烁是由数码管的亮灭交替来实现,程序的设计思路是:首先实现数码管的亮灭控制,然后通过定时器实现亮灭的交替控制。本文以一个数码管闪烁控制为例。

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;   //原功能

    三、程序包链接

https://download.csdn.net/download/weikangcekong/89540921

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值