项目场景:
项目写好之后,led与beep也有初始化,烧录到开发板中,发现没有操作的LED灯暗亮、频闪,蜂鸣器有时也会咔咔响,如下视频,拍的不清楚,可以看到我操作的一个LED常亮,其他的灯在项目中并未操作,却会突然闪一下,或者微微亮
【BUG】CT107D开发板LED灯频闪、暗亮(已解决)
问题描述
出这种bug一般是在while(1)里面操作寄存器点灯或者蜂鸣器,出BUG格式如下:
//可能出BUG的格式如下
//这里我就只写主函数了
void main(void)
{
System_Init(); //LED与蜂鸣器初始化
Timer0_Init(); //定时器0初始化
while(1)
{
/*点亮第一个LED*/
P0 = 0xfe; //设置P0口为0xfe,第一个led点亮
P2 = P2 & 0x1f | 0x80; //这里操作寄存器,为LED的寄存器
P2 &= 0x1f; //寄存器高三位清零
/*其他的初始化函数*/
vBTN_Process();
vDS18B20_Process();
}
}
原因分析:
这是因为操作寄存器过快,单片机反应不过来,程序容易跑乱
解决方案:
我的解决方案是用定义一个main_cnt用于延时执行寄存器操作,上面的代码大概修改如下
unsigned char main_cnt = 0;
void main(void)
{
System_Init(); //LED与蜂鸣器初始化
Timer0_Init(); //定时器0初始化
while(1)
{
if(main_cnt >= 10)
{
main_cnt = 0;
/*点亮第一个LED*/
P0 = 0xfe; //设置P0口为0xfe,第一个led点亮
P2 = P2 & 0x1f | 0x80; //这里操作寄存器,为LED的寄存器
P2 &= 0x1f; //寄存器高三位清零
}
/*其他的初始化函数*/
vBTN_Process();
vDS18B20_Process();
}
}
void Timer0_ISR() interrupt 1 //定时器是1ms的
{
main_cnt++;
/*其他函数的计时*/
btn_cnt++;
smg_cnt++;
ds18b20_cnt++;
/*数码管显示函数*/
Smg_Display();
}
这样子关于操作寄存器的代码就10ms执行一次,不会过快操作,BUG就被修复了
我之后也会分享自己的经验,2022年第十三届蓝桥杯全国大赛我在程序规范上吃了亏,会的定时器计数器太少,代码有些冲突,我的建议是蓝桥杯比赛的程序一定要规范,不要怕麻烦,找到一种最适合自己的模板。