- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2025-06-20 11:29:22
已绑定手机
新手上路
- 积分
- 27
|
单片机型号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); // 主循环
}
|
|