您当前的位置:五五电子网电子知识单片机-工控设备51单片机STC单片机PWM程序设计与应用 正文
STC单片机PWM程序设计与应用

STC单片机PWM程序设计与应用

点击数:7524 次   录入时间:03-04 11:52:58   整理:http://www.55dianzi.com   51单片机
    |||| ||+----PWM1... 脉宽调节模式。当PWMn=1时,使能CEXn脚用作脉宽调节输出。
    |||| |+-----TOG1... 翻转。当TOG1= 1时, PCA计数值与模块的比较/捕获寄存
    |||| |              器的值的匹配将使CEXn脚翻转。(CEX1/P3.5)
    |||| +------MAT1... 匹配。当=1时, PCA计数值与模块的比较/捕获寄存器的值
    ||||                的匹配将置位CCON寄存器的中断标志位CCF1。
    |||+--------CAPN1.. 负捕获。CAPN1= 1时使能下降沿捕获。
    ||+---------CAPP1.. 正捕获。CAPP1= 1时使能上升沿捕获。
    |+----------ECOM1.. 使能比较器。ECOM1= 1时使能比较器功能。
    +-----------CCAPM1^7保留

使用的机种基本模式组合:
ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1         模块功能
    0   0     0     0   0    0      0       无此操作
    X   1     0     0   0    0      X       16位捕获模式,由CEX1的上升沿触发
    X   0     1     0   0    0      X       16位捕获模式,由CEX1的下降沿触发
    X   1     1     0   0    0      X       16位捕获模式,由CEX1的跳变触发
    1   0     0     1   0    0      X       16位软件定时器
    1   0     0     1   1    0      X       16位高速输出
    1   0     0     0   0    1      0       8位PWM
*/

    CCAPM0 = 0x42;      /* PCA 比较/捕获模块寄存器0作为16位软件定时器。使能
                        比较器,PCA计数值与模块的比较/捕获寄存器的值的匹配将
                        置位CCON寄存器的中断标志位CCF0,使能CCF0中断 寄存器
                        位功能同上*/
    CR = 1;             //Start PCA Timer.
    TR0 = 1;            //启动计时  
    i = 0;
    upordn = 1;
}

/* ------------- 定时器0用来定时调节PWM的输出占空比 ------------- */
_interrupt(1) void timers0(void)
{
    TL0 = 0x00;
    TH0 = 0xc0;

    CCAP0H = i>>8;          /* CCAP0L不用赋值,他不参与工作 */
    if(upordn)          /* 逐步加宽PWM、加快脉冲输出    */
    {
        if(++i==65535)      /* 到头 */
        {
            upordn=0;       /* 调头 */
        }
    }
    else                /* 逐步减窄PWM、减慢脉冲输出    */
    {
        if(--i==0)          /* 到头 */
        {
            upordn=1;       /* 调头 */
        }
    }
        
    P1 = ~(i>>8);           /* 高8位输出LED指示,作监视用   */
}

/* ------------ PCA 定时中断,负责清除溢出标志并赋初值 ------------- */
/* 摇晃编程板可以看到P3.5连接的led闪亮频率的缓慢变化,虚线在变长变短 */
_interrupt (6) void PCA_LVD(void)
{
    CH = i>>8;
    CL = i&0xff;
    CF = 0;
    CCF0 = 0;
//  LedPCA ^= 1;            /* 频率要求不高的时候这里可以插入用户代码 */
}

void main(void)
{
    initall();

// 测试tasking c51的在线汇编功能
#pragma asm
    mov r0,#0f0h
  v1:   nop
    nop
    djnz r0,v1
    nop
#pragma endasm
// 编译很顺利通过,不用作任何附加的设定
    while(1){};
}


上一页  [1] [2] 


本文关键字:单片机  程序设计  51单片机单片机-工控设备 - 51单片机