玩转单片机之智能车小露——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;
    }
}
posted @ 2025-10-23 21:42  芥子的世界  阅读(8)  评论(0)    收藏  举报