1. 程式人生 > >【微控制器】[LED]:LED 不用頻率閃爍的程式

【微控制器】[LED]:LED 不用頻率閃爍的程式

main.c 程式原始碼:

// =========================== main.c ======================

#include "reg51.h"

#define LED_ON  20
#define LED_OFF 0
#define F_1HZ   1
#define F_2HZ   2
#define F_3HZ   3
#define F_4HZ   4
#define F_5HZ   5
#define F_6HZ   6
#define F_7HZ   7
#define F_8HZ   8
#define F_9HZ   9
#define
F_10HZ 10
sbit LED1 = P2.0; // 定義LED IO口 unsigned char g_u8_LedFrequence; // 按鍵值 unsigned char g_flag_10ms_led; // 10ms 計時標誌 //LED 以不同頻率閃爍 //LED 亮的時間是:100ms //LED 滅的時間是:相應週期 - 100ms //LED 頻率的範圍:0-10 hz void LED1_Flash(unsigned char flash_frequence) { static byte count, flash_period; //根據頻率選擇週期
switch(flash_frequence) { case F_1HZ : flash_period = 100; break; //1 hz case F_2HZ : flash_period = 50; break; //2 hz case F_3HZ : flash_period = 34; break; //3 hz case F_4HZ : flash_period = 25; break; //4 hz case F_5HZ : flash_period = 20
; break; //5 hz case F_6HZ : flash_period = 17; break; //6 hz case F_7HZ : flash_period = 14; break; //7 hz case F_8HZ : flash_period = 12; break; //8 hz case F_9HZ : flash_period = 11; break; //9 hz case F_10HZ : flash_period = 10; break; //10 hz case LED_ON: count = 0; break; //led on case LED_OFF: count = 9; break; //led off } //根據週期閃爍 if(g_flag_10ms_led) //此標誌在中斷服務程式中,每10ms置一一次。 { g_flag_10ms_led = 0; //清零 led的10ms計數標誌, count++; //計數器 if(count==1) LED1 = 1; //點亮LED LED亮的時間:1-10 else if(count == 10) LED1 = 0; //熄滅LED LED滅的時間:10-flash_period else if(count >= flash_period) count = 0; //清零計數 } } void LED1_Flash(unsigned char flash_frequence); // 宣告LED flash函式 void T0_Init_10ms(void) // timer0,初始化函式 ,定時時間為 10ms { TMOD |= 0x01; TH0 = (65535 - 10000)/256; TL0 = (65535 - 10000)%256; ET0 = 1; TR0 = 1; EA = 1; } // ================================================ 主函式 =================================================== void main(void) { P1.0 = 1; // P1.0 拉高 T0_Init_10ms(); // 定時器0,初始化,定時10ms g_u8_LedFrequence = F_3HZ; // 設定LED閃爍的頻率值,3hz while(1) { LED1_Flash(g_u8_LedFrequence); // LED閃爍 } } // timer0 中斷服務程式 void IRQ_T0(void) interrupt 1 { g_flag_10ms_led = 1; // 置位 10ms 定時標誌 }