玩转单片机之智能车小露——LED闪烁实战
用单片机点亮一颗LED非常简单,让一颗LED闪烁也很简单,比如写一段下面这样的程序:
while(1){ // 无限循环
LED1 = 0; // 点亮LED
delay_ms(300); // 延时300ms
LED1 = 1; // 熄灭LED
delay_ms(300); // 延时300ms
}
但是在实用程序中真的会采用这样的方式让LED闪烁吗?
显然不能,空闲时间都用来延时,那单片机除了闪烁LED还能干什么呢?
不用延时,就只能使用定时器和中断控制LED点亮和熄灭。
定时中断里闪烁LED
LED闪烁先点亮200ms然后熄灭800ms/1800ms/4800ms,可以编写在100ms定时函数中调用的回调函数:
//在100ms定时函数中调用
void SystickCallbackLED(void){
static unsigned char i = 0;
if(LEDMode & 0x02){ //所有闪烁模式第2位为1
if(++i > 2) //亮200ms其余时间熄灭
LED = FALSE;
if(i > LEDFlashCycle){
i = 0;
LED = TRUE;
}
}
}
其中LEDFlashCycle代表闪烁总周期(单位100ms),根据不同的需求进行设置。
LED模式及闪烁周期选择
使用LEDSetMode()函数设置LED模式,可选择常亮、熄灭(直接控制LED),或以不同周期闪烁(设置闪烁总周期)。
#define LED_MODE_OFF 0x00
#define LED_MODE_ON 0x01
#define LED_MODE_FLASH1S 0x02
#define LED_MODE_FLASH2S 0x03
#define LED_MODE_FLASH5S 0x06
unsigned char LEDMode;
unsigned char LEDFlashCycle;
void LEDSetMode(uint8 mode){
LEDMode = mode;
switch(mode){
case(LED_MODE_OFF):
LED = FALSE;
break;
case(LED_MODE_ON):
LED = TRUE;
break;
case(LED_MODE_FLASH_1S):
LEDFlashCycle = 10;
break;
case(LED_MODE_FLASH_2S):
LEDFlashCycle = 20;
break;
case(LED_MODE_FLASH_5S):
LEDFlashCycle = 50;
break;
default:
break;
}
}
- 本文采用的单片机为STC32G系列,感兴趣的朋友可以参考测试,或去Gitee上下载例程。
- 下载地址:https://gitee.com/loganxiang/lgxsmartcar ,参考led.h/led.c。

浙公网安备 33010602011771号