玩轉(zhuǎn)單片機(jī)之智能車小露——LED閃爍實(shí)戰(zhàn)
用單片機(jī)點(diǎn)亮一顆LED非常簡單,讓一顆LED閃爍也很簡單,比如寫一段下面這樣的程序:
while(1){ // 無限循環(huán)
LED1 = 0; // 點(diǎn)亮LED
delay_ms(300); // 延時(shí)300ms
LED1 = 1; // 熄滅LED
delay_ms(300); // 延時(shí)300ms
}
但是在實(shí)用程序中真的會(huì)采用這樣的方式讓LED閃爍嗎?
顯然不能,空閑時(shí)間都用來延時(shí),那單片機(jī)除了閃爍LED還能干什么呢?
不用延時(shí),就只能使用定時(shí)器和中斷控制LED點(diǎn)亮和熄滅。
定時(shí)中斷里閃爍LED
LED閃爍先點(diǎn)亮200ms然后熄滅800ms/1800ms/4800ms,可以編寫在100ms定時(shí)函數(shù)中調(diào)用的回調(diào)函數(shù):
//在100ms定時(shí)函數(shù)中調(diào)用
void SystickCallbackLED(void){
static unsigned char i = 0;
if(LEDMode & 0x02){ //所有閃爍模式第2位為1
if(++i > 2) //亮200ms其余時(shí)間熄滅
LED = FALSE;
if(i > LEDFlashCycle){
i = 0;
LED = TRUE;
}
}
}
其中LEDFlashCycle代表閃爍總周期(單位100ms),根據(jù)不同的需求進(jìn)行設(shè)置。
LED模式及閃爍周期選擇
使用LEDSetMode()函數(shù)設(shè)置LED模式,可選擇常亮、熄滅(直接控制LED),或以不同周期閃爍(設(shè)置閃爍總周期)。
#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;
}
}
- 本文采用的單片機(jī)為STC32G系列,感興趣的朋友可以參考測試,或去Gitee上下載例程。
- 下載地址:https://gitee.com/loganxiang/lgxsmartcar ,參考led.h/led.c。

浙公網(wǎng)安備 33010602011771號