电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
查看: 2038|回复: 0

3路PWM呼吸灯代码实测可用

[复制链接]
发表于 2017-8-5 11:37:13 | 显示全部楼层 |阅读模式

注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
#include  "SN8P2501B.h"

        #define                key_stop               FP12                                //按键
//*******************************************************
//led
        #define                led_r                   FP00                                //三个灯的IO口
        #define                led_g                   FP25
        #define                led_b                   FP10

        bit         ft_r_wait_2s,ft_g_wait_2s,ft_b_wait_2s;       

    bit         ft_r_2s,ft_g_2s,ft_b_2s;
    bit         ft_isr_on,ft_pwm_20ms,ft_key_20ms;                //中断时间,pwm增加的基准时间
    bit         f_stop,f_key_on,ft_sleep_on;
//.......................................................;
        unsigned int        b_led_g_model,b_led_b_model;                //pwm的模式
        unsigned int        b_led_r_model,b_led_r_tcor;
        unsigned int        b_led_g_tcor,b_led_b_tcor;                        //占空比
       
        unsigned int        t_r_10ms,t_g_10ms,t_b_10ms,t_1ms;
       
        unsigned int        b_pwm_sum,b_key_sum;               
//*******************************************************
//初始化  
        void         sys_init(void)
{
//*******************************************************
//清RAM
        _ClrRAM();       
//*******************************************************
//IO  
        P1UR=0xFF;                                                                                        //P10.0,P1.0,P5.4输出                                                                       
        P1M=0xFB;                                                                                        //p1.2作为按键使用
        P2M=0XFF;
        P0M=0xFF;                                                                                                                                                        
//******************************************************;
//TC0__50US
        TC0M=0xF4;
        TC0R=180;       
        FTC0IRQ=0;
        FTC0IEN=1;
//*******************************************************;
//T0__1MS
        T0M=0xB0;
        T0C=131;       
        FT0IRQ=0;
        FT0IEN=1;
        FGIE=1;       
//*******************************************************;         
//数据初始化       
        b_led_r_model=0;
        b_led_g_model=2;
        b_led_b_model=1;
//.......................................................;
        b_led_r_tcor=0;         
        b_led_g_tcor=255;
        b_led_b_tcor=0;
//.......................................................;
        ft_r_wait_2s=1;
        ft_g_wait_2s=1;
        ft_b_wait_2s=0;
//*******************************************************;         
}

        void         time(void )
{
        if(ft_isr_on==1)
                {
                        ft_isr_on=0;
                        t_1ms++;
                           if(t_1ms==20)                                                                //20ms增加一介
                                {
                                        t_1ms=0;
                                        ft_key_20ms=1;       
//.......................................................;是否暂停,暂停后不需要进下面程序
                                        if(f_stop==1)        {goto time_pro90;}
//.......................................................;2.5s=20MS*127
                                          ft_pwm_20ms=1;                                                //pwm增加的基准时间       
                                        if(ft_r_wait_2s==1)
                                                {
                                                        t_r_10ms++;       
                                                         if(t_r_10ms==127)
                                                                 {
                                                                         t_r_10ms=0;
                                                                        ft_r_2s=1;
                                                                        ft_r_wait_2s=0;
                                                                 }
                                                }       
//.......................................................;
                                        if(ft_g_wait_2s==1)
                                                {       
                                                        t_g_10ms++;       
                                                         if(t_g_10ms==127)
                                                                 {
                                                                         t_g_10ms=0;
                                                                        ft_g_2s=1;
                                                                        ft_g_wait_2s=0;
                                                                 }       
                                                }       
//.......................................................;
                                        if(ft_b_wait_2s==1)
                                                {
                                                        t_b_10ms++;       
                                                         if(t_b_10ms==127)
                                                                 {
                                                                         t_b_10ms=0;
                                                                        ft_b_2s=1;
                                                                        ft_b_wait_2s=0;
                                                                 }
                                                }               
//.......................................................;                                                                                       
                                }                                  
                }
time_pro90:;
}


void         pwm_count(void)                                                                               
        {
//.......................................................;19ms进一次程序       
                if(ft_pwm_20ms==1)
                {                               
                        ft_pwm_20ms=0;
//*******************************************************
//R                       
pwm_r_10:;
                        if(b_led_r_model==0)                                                //选择模式,如果是模式0的话那在这里停2s
                                {
                                        if(ft_r_2s==1)
                                                {
                                                        ft_r_2s=0;
                                                        b_led_r_model=1;
                                                }
                                        goto pwm_g_20;
                                }               
//.......................................................;       
                        if(b_led_r_model==2)
                                {
                                        if(ft_r_2s==1)
                                                {
                                                        ft_r_2s=0;
                                                        b_led_r_model=3;
                                                }
                                        goto pwm_g_20;
                                }                               
//.......................................................;       
                        if(b_led_r_model==1)
                                {
                                        b_led_r_tcor++;                                                //19ms增加一介(这个数据必须小于20ms,否则会有停顿的感觉)
                                        if(b_led_r_tcor==255)
                                                {
                                                        b_led_r_model=2;
                                                        ft_r_wait_2s=1;                                //等待2s的标志位
                                                }
                                        goto pwm_g_20;
                                }
//.......................................................;                                                                               
                        if(b_led_r_model==3)
                                {
                                        b_led_r_tcor--;
                                        if(b_led_r_tcor==0)
                                                {
                                                        b_led_r_model=0;
                                                        ft_r_wait_2s=1;
                                                }
                                }                       
//*******************************************************
//G               
pwm_g_20:;       
                        if(b_led_g_model==0)
                                {
                                        if(ft_g_2s==1)
                                                {
                                                        ft_g_2s=0;
                                                        b_led_g_model=1;
                                                }
                                        goto pwm_b_30;
                                }               
//.......................................................;       
                        if(b_led_g_model==2)
                                {
                                        if(ft_g_2s==1)
                                                {
                                                        ft_g_2s=0;
                                                        b_led_g_model=3;
                                                }
                                        goto pwm_b_30;
                                }
//.......................................................;       
                        if(b_led_g_model==1)
                                {
                                        b_led_g_tcor++;                                 
                                        if(b_led_g_tcor==255)
                                                {
                                                        b_led_g_model=2;
                                                        ft_g_wait_2s=1;
                                                }
                                        goto pwm_b_30;
                                }
//.......................................................;                                                                               
                        if(b_led_g_model==3)
                                {
                                        b_led_g_tcor--;
                                        if(b_led_g_tcor==0)
                                                {
                                                        b_led_g_model=0;
                                                        ft_g_wait_2s=1;
                                                }
                                }                       
//*******************************************************
//B                        
pwm_b_30:;       
                        if(b_led_b_model==0)
                                {
                                        if(ft_b_2s==1)
                                                {
                                                        ft_b_2s=0;
                                                        b_led_b_model=1;
                                                }
                                        goto pwm_pro90;
                                }               
//.......................................................;       
                        if(b_led_b_model==2)
                                {
                                        if(ft_b_2s==1)
                                                {
                                                        ft_b_2s=0;
                                                        b_led_b_model=3;
                                                        goto pwm_pro90;
                                                }
                                        goto pwm_pro90;
                                }               
//.......................................................;       
                        if(b_led_b_model==1)
                                {
                                        b_led_b_tcor++;                                         
                                        if(b_led_b_tcor==255)
                                                {
                                                        b_led_b_model=2;
                                                        ft_b_wait_2s=1;
                                                }
                                        goto pwm_pro90;
                                }
//.......................................................;                                                                               
                        if(b_led_b_model==3)
                                {
                                        b_led_b_tcor--;
                                        if(b_led_b_tcor==0)
                                                {
                                                        b_led_b_model=0;
                                                        ft_b_wait_2s=1;
                                                }
                                }       
/////////////////////////////////////////////////////////;
                }
pwm_pro90:;
        }




void key(void)
                {
////////////////////////////////////////////////////////////////////////////////////;按键10ms扫描一次                               
                        if(ft_key_20ms==1)                                                         
                                {
                                        ft_key_20ms=0;
////////////////////////////////////////////////////////////////////////////////////;赋数                                                                                                       
                                        if(key_stop==1)                                                                                                        //按键按下key_stop=0
                                                {                                                                                                                       
                                                        f_key_on=0;                                                                                                //如果按键弹起那把按下按下标志位清掉
                                                        b_key_sum=0;                                                                                        //消抖寄存器也清掉
                                                        goto key_pro90;
                                                }
////////////////////////////////////////////////////////////////////////////////////;判断按键是否还未弹起
                                                if(f_key_on==1)        {goto key_pro90;}
////////////////////////////////////////////////////////////////////////////////////;消抖120ms(由于这个按键是常闭按键,所以消抖时间比较长)                                                                                                                       
                                                 b_key_sum++;
                                                if(b_key_sum==6)
                                                        {
                                                                f_key_on=1;                                                                                        //按键按下标志位
                                                                f_stop=!f_stop;                                                                                //暂停工作标志位
                                                        }
////////////////////////////////////////////////////////////////////////////////////;跳出
                                }
key_pro90:;
                }



        void         ROM_save(void )
{





}




void         led(void)                                                                               
                {
//*******************************************************;用占空比的数据和周期数据比较,大于输出高电平,反之输出低电平
//R                       
                        if(b_led_r_tcor>b_pwm_sum){led_r=1;}
                          else{led_r=0;}
//*******************************************************
//G
                        if(b_led_g_tcor>b_pwm_sum){led_g=1;}
                        else{led_g=0;}
//*******************************************************
//B       
                        if(b_led_b_tcor>b_pwm_sum){led_b=1;}
                        else{led_b=0;}
/////////////////////////////////////////////////////////;
                }

        __interrupt isr(void)
                {       
                        if(FTC0IRQ==1)
                                {
                                         FTC0IRQ=0;
                                        b_pwm_sum++;                                                //灯的周期        50us*256=12.8ms=78.125hz(只有大于50hz才能够保证灯不会看到闪烁的现象)
                                }       
//*******************************************************
//中断1ms
                        if(FT0IRQ==1)
                                {
                                         FT0IRQ=0;
                                        T0C=131;                                                        //t0中断重新赋初值
                                        ft_isr_on=1;                                                //中断标志位,用于计数
                                }
                }


void         sleep(void )
                {
                        if(ft_sleep_on==1)
                                {
                                        ft_sleep_on=0;
                                        FCPUM0=1;
                                }
                }
////////////主函数/////////////////////////////
   void      main(void)
{
   STKP=0X7F;
   PFLAG=0;
   OSCM=0;
   sys_init();


   while(1)
        {
                  WDTR=0x5A;           //清狗
                          time();
                           pwm_count();
                    led();
            key();
                        ROM_save();
                sleep();
                 }
}
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2024-11-28 16:09 , Processed in 0.061353 second(s), 4 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

快速回复 返回顶部 返回列表