【单片机】[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 定时标志
}

猜你喜欢

转载自blog.csdn.net/z21109/article/details/51016636