一个定时器实现IO模拟pwm,呼吸灯效果

以定时器1为例

    uchar time1_10ms = 0;
    uchar time1_100ms = 0;
    bit IS_10ms = 0;
    bit IS_100ms = 0;
    uchar PWM_time = 0;//亮度级数
    uchar pwm_time_flag = 0;//计时1s标志位
    uchar duty_cycle = 0;//可调占空比

 

定时器中断函数

//-----------------------------------------------------------------//
//函数名称: void Timer1_ISR() interrupt 3
//函数功能: 定时器1中断子函数
//-----------------------------------------------------------------//
void Timer1_ISR() interrupt 3                                           / /100us进入一次中断
{    
    T1_INT_FLAG_CLR;//清除Timer1中断标志
    TH1 = TH1_Reload;   
    TL1 = TL1_Reload; 
  
    //增计数到1s后,减;
    //初值的定义,1s增,1s减,此为呼吸灯效果
    time1_10ms++;
    if(time1_10ms >= 100)                                              //计数至10ms
    {
        time1_10ms= 0;
        IS_10ms = 1;
        time1_100ms++;
        if(time1_100ms == 10)                                         //计数至100ms
        {
            time1_100ms = 0;
            IS_100ms = 1;
            if(led_data && power_flag)
            {
                LED_Scan();    
            }
        }
        if(pwm_LED && power_flag)//如果接收到某个呼吸灯使能指令
        {
            switch(pwm_time_flag)
            {
                case 0:
                    PWM_time++;
                    if(PWM_time >= 100)//1s计数时间到
                    {
                        pwm_time_flag = 1;
                    }
                    break;
                case 1:
                    PWM_time--;
                    if(PWM_time < 1)//1s计数时间到
                    {
                        pwm_time_flag = 0;
                    }
                    break;
            }
        }
    }
    //100us判断一次占空比
    if(pwm_LED && power_flag)
    {
        duty_cycle++;
        if(duty_cycle >= 100)
        {
            duty_cycle = 0;
        }
        if(PWM_time == 0)
        {
            if((pwm_LED & 0x01) && (!(led_data & 0x01)))
                LED_POWER_GREEN_OFF;
            if((pwm_LED & 0x02) && (!(led_data & 0x02)))
                LED_POWER_RED_OFF;
            if((pwm_LED & 0x04) && (!(led_data & 0x04)))
                LED_PHONE_OFF;
            if((pwm_LED & 0x08) && (!(led_data & 0x08)))
                LED_MODE_WHITE_OFF;
            if((pwm_LED & 0x10) && (!(led_data & 0x10)))
                LED_MODE_BLUE_OFF;
            if((pwm_LED & 0x20) && (!(led_data & 0x20)))
                LED_MUTE_OFF;
            if((pwm_LED & 0x40) && (!(led_data & 0x40)))
                LED_RECORD_OFF;
        }
        else
        {
            if(duty_cycle < PWM_time)
            {
                if((pwm_LED & 0x01) && (!(led_data & 0x01)))
                    LED_POWER_GREEN_ON;
                if((pwm_LED & 0x02) && (!(led_data & 0x02)))
                    LED_POWER_RED_ON;
                if((pwm_LED & 0x04) && (!(led_data & 0x04)))
                    LED_PHONE_ON;
                if((pwm_LED & 0x08) && (!(led_data & 0x08)))
                    LED_MODE_WHITE_ON;
                if((pwm_LED & 0x10) && (!(led_data & 0x10)))
                    LED_MODE_BLUE_ON;
                if((pwm_LED & 0x20) && (!(led_data & 0x20)))
                    LED_MUTE_ON;
                if((pwm_LED & 0x40) && (!(led_data & 0x40)))
                    LED_RECORD_ON;
            }
            else
            {
                if((pwm_LED & 0x01) && (!(led_data & 0x01)))
                    LED_POWER_GREEN_OFF;
                if((pwm_LED & 0x02) && (!(led_data & 0x02)))
                    LED_POWER_RED_OFF;
                if((pwm_LED & 0x04) && (!(led_data & 0x04)))
                    LED_PHONE_OFF;
                if((pwm_LED & 0x08) && (!(led_data & 0x08)))
                    LED_MODE_WHITE_OFF;
                if((pwm_LED & 0x10) && (!(led_data & 0x10)))
                    LED_MODE_BLUE_OFF;
                if((pwm_LED & 0x20) && (!(led_data & 0x20)))
                    LED_MUTE_OFF;
                if((pwm_LED & 0x40) && (!(led_data & 0x40)))
                    LED_RECORD_OFF;
            }
        }    
    }

你可能感兴趣的:(一个定时器实现IO模拟pwm,呼吸灯效果)