应广单片机8位PWM呼吸灯代码

//********************************************************************************//
//        功能名称:    TM2/TM3产生PWM渐变
//        功能编号:    020104
//        适应芯片:    只有TM2的芯片:
//                    PMC系列:PMC234
//                    PMS系列:PMS234   PMS150C   PMS150G   PMS152   PMS15A
//                    TM2和TM3都有的芯片:
//                    PFC系列:PFC151   PFC154   PFC232   PFC161
//                    PFS系列:PFS154   PFS172   PFS173   PFS122   PFS123
//                    PMC系列:PMC131   PMC232
//                    PMS系列:PMS130   PMS131   PMS232   PMS164   PMS154C   PMS171B   PMS132B   PMS133   PMS134
//--------------------------------------------------------------------------------//
//程序说明:
//    设置TM2或PB3从PB2脚产生3906.25Hz的频率
//    初始关闭TM2或TM3做到0%的占空比,
//    然后打开TM2或TM3开始调节占空比至100%
//    再调节占空比至最低,关掉TM2或TM3做到0%,然后重复做到渐变
//    通过增加TM2B或TM3B的值使占空比不断增加
//    通过减少TM2B或TM3B的值使占空比不断减少
//注意事项:
//    1.案例为PMS154C,其他芯片时钟源和输出IO脚可能存在不同,其他原理都相同
//********************************************************************************//
#include    "extern.h"

void    TM2_Init(void)//设置频率
{
//    $ TM2C SYSCLK,PB2,PWM;        //选择时钟源,输出脚,PWM模式,是否反极性输出(写Inverse为启用,不写则为停用)
                                //根据要求时钟可选择SYSCLK, EOSC, IHRC, ILRC等,输出脚可以选择Disable(不选择), PB2, PB4, PA3
                                //注:时钟源与输出脚位的选择请参考对应芯片的datasheet,个别芯片有些不同
    $ TM2S 8bit,/1,/1;            //选择分辨率,预分频,分频
                                //分辨率可选择8bit,6bit,预分频可选择/1, /4, /16, /64,分频可选择/1 ~ /32(对应TM2S[4:0]的00000 ~ 11111)
    TM2B = 0;                    //1/256的亮度

        //    PWM模式的频率和占空比计算
            //频率=时钟源/(分辨率*预分频*分频)=1M / (2^8 * 1 * 1) = 3906.25Hz
            //占空比=(TM2B+1)/分辨率*100%=(0 + 1) / 2^8 *100% = 1/256*100% = 0.38%

    $ TM2C Stop;                //关闭PWM,即0%的亮度
}
//除脚位不同,其他原理和TM2一样
void    TM3_Init(void)
{
//    $ TM3C SYSCLK,PB5,PWM;        //输出脚可选择Disable(不选择),PB5, PB6, PB7
                                //注:时钟源与输出脚位的选择请参考对应芯片的datasheet,个别芯片有些不同
    $ TM3S 8bit,/1,/1;
    TM3B = 0;                    //1/256的亮度
    $ TM3C Stop;                //关闭PWM,0%的亮度
}
bit        Add_Sign;
byte    PWM_Num;
void    PWM_Grad(void)
{
    if(Add_Sign)//PWM递增
    {
        $ TM2C SYSCLK,PB2,PWM;//打开PWM
    //    $ TM3C SYSCLK,PB5,PWM;
        PWM_Num++;//每次增加1/256
        TM2B = PWM_Num;
    //    TM3B = PWM_Num;
        if(PWM_Num == 255)//如果亮度100%,开始递减
        {
            Add_Sign = 0;
        }
        .delay 10000;//延时10ms,控制渐变时长
    }
    else//PWM递减
    {
        PWM_Num--;
        TM2B = PWM_Num;
    //    TM3B = PWM_Num;
        if(PWM_Num == 0)//亮度1/256,不是全灭
        {
            $ TM2C Stop;//关闭PWM来实现0%亮度
        //    $ TM3C Stop;
            Add_Sign = 1;
        }
        .delay 10000;
    }
}

void    FPPA0 (void)
{
    .ADJUST_IC    SYSCLK=IHRC/16, IHRC=16MHz, VDD=5V;

    PWM_Num = 0;
    Add_Sign = 1;
    TM2_Init();
//    TM3_Init();
    while (1)
    {
        PWM_Grad();
    }
}


void    Interrupt (void)
{
    pushaf;

    if (Intrq.T16)
    {    //    T16 Trig
        //    User can add code
        Intrq.T16    =    0;
        //...
    }

    popaf;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值