找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5613|回复: 1
收起左侧

STC12单片机两路PWM输出(占空比可调)程序

[复制链接]
ID:224782 发表于 2017-8-4 18:39 | 显示全部楼层 |阅读模式
/****************************************************************************
*
*
*                                                     PWM输出(可调)程序
*
*                                                                Don.2017.7
*
*****************************************************************************/

#include <STC12C5A60S2.h>
#include <intrins.h>

typedef unsigned char uchar8;

sbit PWM0_ADD = P2 ^ 0;
sbit PWM0_CUT = P2 ^ 1;
sbit PWM1_ADD = P2 ^ 2;
sbit PWM1_CUT = P2 ^ 3;


void PWM0_OUT( )
{
        CCON = 0x00;
        //PCA控制器清零
        
        CL = 0;
        CH = 0;
        //16位PAC计数器清零
        
/*
        TMOD = 0x42;
        //定时器0工作在模式2(8位自动重装)
        TL0 = ;
        TH0 = ;
        //写入初值
        //计算: 初值 = (256 - 外部晶振频率 / PCA时钟源频率)H
        //PCA时钟源频率 = 256 * PWM频率
        
        AUXR = 0X80;
        //T0工作在1T模式
        
        TR0 = 1;
        //T0开始工作
                    */
        
        CMOD = 0x08;
        //设置计数器时钟源
        //0x00:系统时钟/12, 0x02:系统时钟/2
        //0x04: 定时器T0溢出脉冲, 0x06: P1.2引脚输入的外部时钟        
        //0x08:系统时钟, 0x0a: 系统时钟/4
        //0x0c: 系统时钟/6, 0x0e: 系统时钟/8
        //PWM波的频率 = CMOD数值(10位)/256
        
        CCAPM0 = 0x42;
        //8位PWM P1.3输出
        //0x42:无中断;0x53:下降沿产生中断;
        //0x63:上升沿产生中断;0x73:跳变沿产生中断
        
        CCAP0L = 0xc0;
        CCAP0H = 0xc0;
        //占空比设置:数值 / 256 * 100%
        //0xc0:占空比为25%,0x80:占空比为50%,0x40:占空比为75%
        
        CR = 1;
}

void PWM1_OUT( )
{
        CCON = 0x00;
        //PCA控制器清零
        
        CL = 0;
        CH = 0;
        //16位PAC计数器清零
        
        CMOD = 0x08;
        //设置计数器时钟源
        //0x00:系统时钟/12, 0x02:系统时钟/2
        //0x04: 定时器T0溢出脉冲, 0x06: P1.2引脚输入的外部时钟        
        //0x08:系统时钟, 0x0a: 系统时钟/4
        //0x0c: 系统时钟/6, 0x0e: 系统时钟/8
        //PWM波的频率 = CMOD数值(10位)/256
        
        CCAPM1 = 0x42;
        //8位PWM P1.3输出
        //0x42:无中断;0x53:下降沿产生中断;
        //0x63:上升沿产生中断;0x73:跳变沿产生中断
        
        CCAP1L = 0xc0;
        CCAP1H = 0xc0;
        //占空比设置:数值 / 256 * 100%
        //0xc0:占空比为25%,0x80:占空比为50%,0x40:占空比为75%
        
        CR = 1;
}

void PWM0_Alter(uchar8 type0, uchar8 change0)
//type = 0减占空比,1增加占空比 change: 0x0c约5%,0x05约2%
{
        if(type0  ==  0)
        {
                    if(CCAP0L < 0xe6)   //<90%
                {
                        CCAP0L += change0;
                    CCAP0H += change0;
                }
        }
        else
        {        
                if(CCAP0L > 0x19)  //>10%
                    {
                        CCAP0L -= change0;
                           CCAP0H -= change0;
                }
        }  
}

void PWM1_Alter(uchar8 type1, uchar8 change1)
//type1 = 0减占空比,1增加占空比 change1: 0x0c约5%,0x05约2%
{
        if(type1  ==  0)
        {
                    if(CCAP1L < 0xe6)   //<90%
                {
                        CCAP1L += change1;
                    CCAP1H += change1;
                }
        }
        else
        {        
                if(CCAP1L > 0x19)  //>10%
                   {
                        CCAP1L -= change1;
                           CCAP1H -= change1;
                }
        }  
}

void PWM_Alter_Drive( )
{
        if(PWM0_ADD == 0)
        {
                _nop_( );_nop_( );_nop_( );_nop_( );               
                //按键消抖
                while(PWM0_ADD == 0);        
                //按键释放才跳出执行下一步
                PWM0_Alter(1, 0x05);
        }
        if(PWM0_CUT == 0)
        {
                _nop_( );_nop_( );_nop_( );_nop_( );
                while(PWM0_CUT == 0);
                PWM0_Alter(0, 0x05);
        }

        if(PWM1_ADD == 0)
        {
                _nop_( );_nop_( );_nop_( );_nop_( );
                //按键消抖
                while(PWM1_ADD == 0);        
                //按键释放才跳出执行下一步
                PWM1_Alter(1, 0x05);
        }
        if(PWM1_CUT == 0)
        {
                _nop_( );_nop_( );_nop_( );_nop_( );
                while(PWM1_CUT == 0);
                PWM1_Alter(0, 0x05);
        }
}

void main( )
{
        P1M0 = 0x00;
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        //配置标准I/O口
        PWM0_OUT( );
        PWM1_OUT( );
        while(1)
        {               
                 PWM_Alter_Drive( );
         }
}

回复

使用道具 举报

ID:224782 发表于 2017-8-4 19:49 | 显示全部楼层
可调占空比
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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