找回密码
 立即注册
查看: 62|回复: 5

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-06-20 11:29:22
已绑定手机

3

主题

3

回帖

27

积分

新手上路

积分
27
发表于 2025-6-20 11:29:22 | 显示全部楼层 |阅读模式
单片机型号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 int  volatile 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 int  volatile 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 int  volatile xdata *)0xFFB0)

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

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

#define PWM20T2     (*(unsigned int  volatile 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);  // 主循环

}

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-06-28 08:54:08

740

主题

1万

回帖

1万

积分

管理员

积分
17147
发表于 2025-6-20 11:38:04 | 显示全部楼层

CCP2_3, 是 PWM
截图202506201137587391.jpg
截图202506201136298062.jpg

截图202506201135372953.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-06-28 08:54:08

740

主题

1万

回帖

1万

积分

管理员

积分
17147
发表于 2025-6-20 11:40:08 | 显示全部楼层
截图202506201139528783.jpg


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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-06-28 08:54:08

740

主题

1万

回帖

1万

积分

管理员

积分
17147
发表于 2025-6-20 11:42:22 | 显示全部楼层
截图202506201142177876.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-06-20 11:29:22
已绑定手机

3

主题

3

回帖

27

积分

新手上路

积分
27
发表于 2025-6-20 14:01:50 | 显示全部楼层
成功输出PWM了,感谢大神的帮助!!

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12930
发表于 7 天前 | 显示全部楼层
请先别修改程序, 直接下载"01A-STC8G1K08A-8PIN-PCA-3路PWM-C语言"里的"PCA.hex"测试,下载时选择主频24MHz(当然别的任意频率也可以)。
3路PCA都配置成PWM的应用.

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


01A-STC8G1K08A-8PIN-PCA-3路PWM-C语言.rar (36.54 KB, 下载次数: 1)



回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-28 22:45 , Processed in 0.250264 second(s), 74 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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