kuucuu 发表于 2025-6-20 11:29:22

P5.5 能不能实现PWM输出?

单片机型号STC 8G1K08A,ISP软件里面没有STC 8G系列例程,只好借用AI 8G例程--“输出任意周期和任意占空比的波形”,

把例程的PWM0模块,修改为PWM2模块,

配置PWM2输出到P5.5 */

    P_SW1 = (P_SW1 | (1 << 5)) & ~(1 << 4);// BIT5=1, BIT4=0



运行下面的程序,无论怎么修改PWM20T1,PWM20T2的值,P5.5的LED亮度没有变化。



请问P5.5 能不能实现PWM输出?

我目的是想:修改占空比的变量值,实现P5.5的LED亮度有变化。







#include "reg51.h"

#include "intrins.h"



/* 寄存器定义 */

sfr P_SW1    = 0xA2;// 外设功能切换寄存器1

sfr P_SW2    = 0xBA;// 扩展寄存器访问控制



sfr PWMSET   = 0xF1;// PWM模块使能寄存器

sfr PWMCFG01 = 0xF6;// PWM0/1配置寄存器

sfr PWMCFG23 = 0xF7;// PWM2/3配置寄存器

sfr PWMCFG45 = 0xFE;// PWM4/5配置寄存器



/* PWM2寄存器定义 (xdata区域) */

#define PWM2C       (*(unsigned intvolatile xdata *)0xFFA0)

#define PWM2CH      (*(unsigned char volatile xdata *)0xFFA0)

#define PWM2CL      (*(unsigned char volatile xdata *)0xFFA1)

#define PWM2CKS   (*(unsigned char volatile xdata *)0xFFA2)

#define PWM2TADC    (*(unsigned intvolatile xdata *)0xFFA0)

#define PWM2TADCH   (*(unsigned char volatile xdata *)0xFFA3)

#define PWM2TADCL   (*(unsigned char volatile xdata *)0xFFA4)

#define PWM2IF      (*(unsigned char volatile xdata *)0xFFA5)

#define PWM2FDCR    (*(unsigned char volatile xdata *)0xFFA6)

#define PWM20T1   (*(unsigned intvolatile xdata *)0xFFB0)

#define PWM20T1H    (*(unsigned char volatile xdata *)0xFFB0)

#define PWM20T1L    (*(unsigned char volatile xdata *)0xFFB1)

#define PWM20T2   (*(unsigned intvolatile xdata *)0xFFB2)

#define PWM20T2H    (*(unsigned char volatile xdata *)0xFFB2)

#define PWM20T2L    (*(unsigned char volatile xdata *)0xFFB3)

#define PWM20CR   (*(unsigned char volatile xdata *)0xFFB4)

#define PWM20HLD    (*(unsigned char volatile xdata *)0xFFB5)



/* IO模式配置寄存器 */

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()

{

    /* 初始化所有IO口为准双向模式 */

    P0M0 = 0x00; P0M1 = 0x00;

    P1M0 = 0x00; P1M1 = 0x00;

    P2M0 = 0x00; P2M1 = 0x00;

    P3M0 = 0x00; P3M1 = 0x00;

    P4M0 = 0x00; P4M1 = 0x00;



    /* 设置P5.5为推挽输出 (PWM2输出引脚) */

    P5M1 = 0x00;// P5.5输入模式设为高阻(00)

    P5M0 = 0x20;// 0010 0000: P5.5设为推挽输出



        /* 使能PWM2模块 */

    PWMSET = 0x04;// 0000 0100: 使能PWM2模块




    /* 配置PWM2参数 (需要访问xdata区域) */

    P_SW2 = 0x80;   // 允许访问扩展寄存器

          /* 配置PWM2输出到P5.5 */

    P_SW1 = (P_SW1 | (1 << 5)) & ~(1 << 4);// BIT5=1, BIT4=0



    PWM2CKS = 0x00;// PWM时钟源 = 系统时钟

    PWM2C = 0x1000;// PWM周期 = 0x1000个时钟

    PWM20T1 = 0x0100; // T1点(低电平起始) = 0x0100

    PWM20T2 = 0x0500; // T2点(高电平起始) = 0x0500

    PWM20CR = 0x80;   // 使能PWM2通道0输出

    P_SW2 = 0x00;    // 禁止访问扩展寄存器



    /* 启动PWM2模块 */

    PWMCFG23 = 0x01;// 0000 0001: 启动PWM2



    while (1);// 主循环

}

神农鼎 发表于 2025-6-20 11:38:04


CCP2_3, 是 PWM




神农鼎 发表于 2025-6-20 11:40:08




#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);
}


神农鼎 发表于 2025-6-20 11:42:22


kuucuu 发表于 2025-6-20 14:01:50

成功输出PWM了,感谢大神的帮助!!

本人新手,开始没搞懂PWM,CCAP,PCA区别,还以为都是PWM的不同称呼,现在知道了:
PCA是计时计数模块,
CCAP是这个模块的寄存器,用来控制占空比
PWM是这个模块的一种工作模式

梁工 发表于 2025-6-21 10:54:27

请先别修改程序, 直接下载"01A-STC8G1K08A-8PIN-PCA-3路PWM-C语言"里的"PCA.hex"测试,下载时选择主频24MHz(当然别的任意频率也可以)。
3路PCA都配置成PWM的应用.

本例 PWM0-->P3.2, PWM1-->P3.3, PWM2-->P5.4, 用户可以自行修改切换到其它端口。






页: [1]
查看完整版本: P5.5 能不能实现PWM输出?