蓝桥杯单片机第九届省赛-彩灯控制器

九层妖塔 起于垒土

在这里插入图片描述


改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改


2021.3.30
在这里插入图片描述
 第九届省赛例程在官方蓝皮书上也有,由于模板用的就是官方的,也就没有粘贴一大段代码的必要性了。仅记录刷题过程中的感悟,和对比官方给出的第九届代码后自己写的代码的不足。

源码0积分下载

Notes1:动态LED亮度等级

 基本原理依旧是PWM输出控制LED亮度,👉PWM控制LED基本原理
 基本模板:

uchar Light_Grade;  //亮度等级
uchar PWM_High;     
uchar PWM_Low = 4;

//以下程序放在1ms定时器中,1ms执行一次。
	 if(PWM_Low>0)  
	 {
		PWM_Low--;
	    LED_OFF(L4);//关灯
	 }
	 else if(PWM_High>0)
	 {
	    PWM_High--;
	    LED_ON(L4);//开灯
	 }
	 else  
	 {
	   PWM_High = Light_Grade;
	   PWM_Low  = 4-Light_Grade;
	 }

 在第九届中对LED亮度的调节可以说是动态LED亮度调节
 刚开始写大约知道应该继续套用这个模板,可是这段程序具体的位置,没能记住。并且在PWM高电平时段内点亮的是LED_Disp(uc_led)led显示函数。

//以下程序放在1ms定时器中,1ms执行一次。
  if(PWM_Low>0)
	 {
	   PWM_Low--;
	   LED_Disp(0x00);
	 }
	 else if(PWM_High>0)
	 {
	   PWM_High--;
	   LED_Disp(uc_led);
	 }
	else
	{
	  PWM_High = Light_Grade;
	  PWM_Low  = 4-Light_Grade;
	}

关于亮度等级的具体划分:


Notes2:EEPROM第一次上电读取数据的处理

 在第九届中,需要将 流转间隔 时间保存到AT24C02 EEPROM中,在下次上电时候自动读取。
 可在没有对EEPROM写入任何数据(默认为0)或者写入其他不合理的数据时,读取到的 流转间隔 时间是不合理的(不在400~1200ms范围内或者led乱闪)。
 **官方例程在上电还未进入死循环前,读取EEPROM信息后,先判断读取到的信息是否合理(是否在400~1200ms范围内)。若在则直接赋值给流转间隔时间变量;若不在,则将流转间隔时间变量初始化为400。

 或者将这个操作称为应用前数据合理性的判断

在这里插入图片描述


Notes3:LED流水灯的实现方法

 我使用的是intrins.h头文件里的_crol_,_cror_循环移位函数实现,数据处理上比较简单,但逻辑上稍微复杂些。
 官方例程使用二维数组提前将数据写好,逻辑上简单了太多。
 比如在四个流水状态之间的循环切换:
既保证了循环切换的led初始状态又避免了led暂态导致的微亮。
在这里插入图片描述

Notes4:暂态与稳态

 正确使用暂态与稳态避免led数码管微亮。


Notes5:数码管闪烁的问题再发现

 👉数码管闪烁

 按下按键后,数码管进入闪烁状态,最好是先点亮再熄灭。避免按下按键后短暂时间内看不到变化。

Notes6:通过设置标志位/计数单位让某段程序只执行一次

  
  
  
  
彩 蛋

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#法外狂徒张三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值