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);// 主循环
}
CCP2_3, 是 PWM
#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);
}
成功输出PWM了,感谢大神的帮助!!
本人新手,开始没搞懂PWM,CCAP,PCA区别,还以为都是PWM的不同称呼,现在知道了:
PCA是计时计数模块,
CCAP是这个模块的寄存器,用来控制占空比
PWM是这个模块的一种工作模式 请先别修改程序, 直接下载"01A-STC8G1K08A-8PIN-PCA-3路PWM-C语言"里的"PCA.hex"测试,下载时选择主频24MHz(当然别的任意频率也可以)。
3路PCA都配置成PWM的应用.
本例 PWM0-->P3.2, PWM1-->P3.3, PWM2-->P5.4, 用户可以自行修改切换到其它端口。
页:
[1]