找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 18701931930
打印 上一主题 下一主题
收起左侧

关于STC8G单片机的PCA_10PWM输出注意事项

  [复制链接]
41#
ID:1136941 发表于 2025-6-18 16:49 | 只看该作者
18701931930 发表于 2025-6-17 08:50
你写了寄存器数据也不会改变。

请教大佬,我用10位PWM的呼吸灯程序验证,不能正常是怎么回事?
回复

使用道具 举报

42#
ID:1136941 发表于 2025-6-21 16:35 | 只看该作者
参照16楼的,如下写呼吸灯正常了。
//设置脉冲宽度
void PWM0_Set_Duty(u16 Duty)   //P3.2
{
        PCA_PWM0&= ~(3<<4);        //清零重装值高2位
        PCA_PWM0 = (Duty>>4)&0x30|0xc0; //设置新的重装值高2位
        CCAP0H   = Duty;           //重装值低8位
}

//设置脉冲宽度
void PWM1_Set_Duty(u16 Duty)   //P3.3
{
        PCA_PWM1&= ~(3<<4);        //清零重装值高2位
        PCA_PWM1 = (Duty>>4)&0x30|0xc0; //设置新的重装值高2位
        CCAP1H   = Duty;           //重装值低8位
}
回复

使用道具 举报

43#
ID:958423 发表于 2025-7-2 15:59 | 只看该作者
别处看到了一个文章,里面说PCA_PWM寄存器必须整字节写入,不能位操作。我试了一下整字节是可以不停止pwm输出的情况下写入的。
回复

使用道具 举报

44#
ID:1146155 发表于 2026-1-30 12:23 | 只看该作者
#include "reg51.h"
#include "intrins.h"

sfr     CCON    =   0xd8;
sbit    CF      =   CCON^7;
sbit    CR      =   CCON^6;
sbit    CCF2    =   CCON^2;
sbit    CCF1    =   CCON^1;
sbit    CCF0    =   CCON^0;
sfr     CMOD    =   0xd9;
sfr     CL      =   0xe9;
sfr     CH      =   0xf9;
sfr     CCAPM0  =   0xda;
sfr     CCAP0L  =   0xea;
sfr     CCAP0H  =   0xfa;
sfr     PCA_PWM0 =  0xf2;
sfr     CCAPM1  =   0xdb;
sfr     CCAP1L  =   0xeb;
sfr     CCAP1H  =   0xfb;
sfr     PCA_PWM1 =  0xf3;
sfr     CCAPM2  =   0xdc;
sfr     CCAP2L  =   0xec;
sfr     CCAP2H  =   0xfc;
sfr     PCA_PWM2 =  0xf4;

sfr     P0M1    =   0x93;
sfr     P0M0    =   0x94;
sfr     P1M1    =   0x91;
sfr     P1M0    =   0x92;
sfr     P2M1    =   0x95;
sfr     P2M0    =   0x96;
sfr     P3M1    =   0xb1;
sfr     P3M0    =   0xb2;
sfr     P4M1    =   0xb3;
sfr     P4M0    =   0xb4;
sfr     P5M1    =   0xc9;
sfr     P5M0    =   0xca;

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    CCON = 0x00;
    CMOD = 0x08;                                //PCA时钟为系统时钟
    CL = 0x00;
    CH = 0x00;
//--6位PWM--
    CCAPM0 = 0x42;                              //PCA模块0为PWM工作模式
    PCA_PWM0 = 0x80;                            //PCA模块0输出6位PWM
    CCAP0L = 0x20;                              //PWM占空比为50%[(40H-20H)/40H]
    CCAP0H = 0x20;
//--7位PWM--
    CCAPM1 = 0x42;                              //PCA模块1为PWM工作模式
    PCA_PWM1 = 0x40;                            //PCA模块1输出7位PWM
    CCAP1L = 0x20;                              //PWM占空比为75%[(80H-20H)/80H]
    CCAP1H = 0x20;
//--8位PWM--
//  CCAPM2 = 0x42;                              //PCA模块2为PWM工作模式
//  PCA_PWM2 = 0x00;                            //PCA模块2输出8位PWM
//  CCAP2L = 0x20;                              //PWM占空比为87.5%[(100H-20H)/100H]
//  CCAP2H = 0x20;
//--10位PWM--
    CCAPM2 = 0x42;                              //PCA模块2为PWM工作模式
    PCA_PWM2 = 0xc0;                            //PCA模块2输出10位PWM
    CCAP2L = 0x20;                              //PWM占空比为96.875%[(400H-20H)/400H]
    CCAP2H = 0x20;
    CR = 1;                                     //启动PCA计时器

    while (1);
}
这个例程是三个IO同时输出吗 能只让一个IO输出吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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