我换了STC154K32S4,PWM无输出,也是这个程序:#include< reg52.h>
#include "intrins.h"
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
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;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr P7 = 0xF8;
//PWM模块寄存器定义
sfr P_SW1 = 0xA2; //外设功能切换寄存器1 针脚选择功能寄存器
#define CCP_S0 0x10 //P_SW1.4 选择针脚功能
#define CCP_S1 0x20 //P_SW1.5 选择针脚功能
#define S1_S1 0x80 //P_SW3.6 选择针脚功能
#define S1_S0 0x40 //P_SW3.7 选择针脚功能
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
sfr CCON = 0xD8; //PCA控制寄存器
sbit CCF0 = CCON^0; //PCA模块0中断标志
sbit CCF1 = CCON^1; //PCA模块1中断标志
sbit CR = CCON^6; //PCA定时器运行控制位
sbit CF = CCON^7; //PCA定时器溢出标志
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CL = 0xE9; //PCA定时器低字节
sfr CH = 0xF9; //PCA定时器高字节
sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器
sfr CCAP0L = 0xEA; //PCA模块0捕获寄存器 LOW
sfr CCAP0H = 0xFA; //PCA模块0捕获寄存器 HIGH
sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器
sfr CCAP1L = 0xEB; //PCA模块1捕获寄存器 LOW
sfr CCAP1H = 0xFB; //PCA模块1捕获寄存器 HIGH
sfr CCAPM2 = 0xDC; //PCA模块2模式寄存器
sfr CCAP2L = 0xEC; //PCA模块2捕获寄存器 LOW
sfr CCAP2H = 0xFC; //PCA模块2捕获寄存器 HIGH
sfr PCA_PWM0 = 0xf2; //PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xf3; //PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xf4; //PCA模块2的PWM寄存器
///////////////////////////////////////////////////////////函数列表、、、、、、、、、、、、、、、、、、、、、、、、、、、
void Timer0Init(); //初始化T0
void pwm(); //解析接受到的数据
void Delay(unsigned int n); //软件延时 1.6毫秒左右
///////////////////////////////////////////////////////////定义的一些变量、、、、、、、、、、、、、、、、、、、、、、、、、、、
bit flagTxd = 0; //单字节发送完成标志,用来替代 TXD 中断标志位
sbit s1 = P3^3; //切换继电器
sbit km = P3^2; //功率继电器接触器
sbit pwmdip = P1^1;
sbit k1 = P3^0; //按钮
sbit PCA_LED = P1^2;
unsigned char cntRxd = 0; //接收字节计数器
unsigned char pdata bufRxd[30]; //接收字节缓冲区
unsigned char code bufWxd[8] ={0x01,0x03,0x00,0x48,0x00,0x0A,0x45,0xDB,};//发送的数据 增加了code关键字,此数组写在程序区减少使用内部内存128K
unsigned long pdata cnt = 0; //毫秒计数
//unsigned long pdata sec; //秒计数
//unsigned cha *but;// 发送指针
unsigned int pdata vcc; // 电压
unsigned int pdata vci; // 电流
unsigned int pdata power; // 功率
unsigned long pdata kwh=0; // 电能
unsigned long pdata kwh1; // 初始电能
unsigned char pw; //设定的空占比%
unsigned int value; // 电压
unsigned char cp; //充电桩PWM波形 cp电压采集信号 120
//// 关于LCD 1602 /////////////////LCD的一些定义
sfr P5 = 0xC8;
unsigned char pdata lcd1[16]; //LCD第一行
unsigned char pdata lcd2[16]; //LCD第二行
sbit LCD1602_RS = P5^5; //命令、数据选择 H\L
sbit LCD1602_E = P5^4; //使能
unsigned char pdata ki; //电流显示1表示16A 2表示32A
#define LEDDATA P7 //定义P1口为数据端
#define T100Hz 256
void LcdWriteCom(unsigned char com); /*LCD1602写入8位数据子函数*/
void LcdWriteData(unsigned char dat); /*LCD1602写入8位数据子函数*/
void LcdInit(); /*LCD1602初始化子程序*/
void lcd1602(); //1602显示刷新
void Lcd1602_Delay5ms();
void Lcd1602_Delay1ms();
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;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
P_SW1=P_SW1|S1_S0;
EA = 1; //使能总中断
pwm(); //初始化pwm模块设置
Timer0Init(); //初始化T0
while (1){
}
}
void pwm(){ //PWM程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ACC = P_SW1; //累加器 等于外设寄存器
ACC& = ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2) 读取累加器的值写进外设寄存器
CCON = 0; //初始化PCA控制寄存器
//PCA定时器停止
//清除CF标志
//清除模块中断标志
CL = 0; //复位PCA寄存器
CH = 0;
CMOD = 0x04;
PCA_PWM0 = 0x00; //PCA模块0工作于8位PWM
CCAP0H = CCAP0L =255-255*60/100; //PWM0的占空比为87.5% ((100H-20H)/100H) 255-255*设定空占比 /100
CCAPM0 = 0x42; //00101010 PCA模块0允许比较功能 使用CCP0脚为可调脉冲输出 P1.1
}
void Timer0Init() //T0作为PWM频率基准发生
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD& = 0xF0; //设置定时器模式
TL0 = 0xd5; //设置定时初值 计算方法,65536-晶振/(256*需要频率)
TH0 = 0xFf; //设置定时初值
TR0 = 1; //定时器0开始计时
ET0 =0; // 禁止T0中断
TF0 = 0; //清除TF0标志
// EA =0; 关闭总总中断
CR = 1;
} //PCA定时器开始工作
#include "intrins.h"
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
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;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr P7 = 0xF8;
//PWM模块寄存器定义
sfr P_SW1 = 0xA2; //外设功能切换寄存器1 针脚选择功能寄存器
#define CCP_S0 0x10 //P_SW1.4 选择针脚功能
#define CCP_S1 0x20 //P_SW1.5 选择针脚功能
#define S1_S1 0x80 //P_SW3.6 选择针脚功能
#define S1_S0 0x40 //P_SW3.7 选择针脚功能
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
sfr CCON = 0xD8; //PCA控制寄存器
sbit CCF0 = CCON^0; //PCA模块0中断标志
sbit CCF1 = CCON^1; //PCA模块1中断标志
sbit CR = CCON^6; //PCA定时器运行控制位
sbit CF = CCON^7; //PCA定时器溢出标志
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CL = 0xE9; //PCA定时器低字节
sfr CH = 0xF9; //PCA定时器高字节
sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器
sfr CCAP0L = 0xEA; //PCA模块0捕获寄存器 LOW
sfr CCAP0H = 0xFA; //PCA模块0捕获寄存器 HIGH
sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器
sfr CCAP1L = 0xEB; //PCA模块1捕获寄存器 LOW
sfr CCAP1H = 0xFB; //PCA模块1捕获寄存器 HIGH
sfr CCAPM2 = 0xDC; //PCA模块2模式寄存器
sfr CCAP2L = 0xEC; //PCA模块2捕获寄存器 LOW
sfr CCAP2H = 0xFC; //PCA模块2捕获寄存器 HIGH
sfr PCA_PWM0 = 0xf2; //PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xf3; //PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xf4; //PCA模块2的PWM寄存器
///////////////////////////////////////////////////////////函数列表、、、、、、、、、、、、、、、、、、、、、、、、、、、
void Timer0Init(); //初始化T0
void pwm(); //解析接受到的数据
void Delay(unsigned int n); //软件延时 1.6毫秒左右
///////////////////////////////////////////////////////////定义的一些变量、、、、、、、、、、、、、、、、、、、、、、、、、、、
bit flagTxd = 0; //单字节发送完成标志,用来替代 TXD 中断标志位
sbit s1 = P3^3; //切换继电器
sbit km = P3^2; //功率继电器接触器
sbit pwmdip = P1^1;
sbit k1 = P3^0; //按钮
sbit PCA_LED = P1^2;
unsigned char cntRxd = 0; //接收字节计数器
unsigned char pdata bufRxd[30]; //接收字节缓冲区
unsigned char code bufWxd[8] ={0x01,0x03,0x00,0x48,0x00,0x0A,0x45,0xDB,};//发送的数据 增加了code关键字,此数组写在程序区减少使用内部内存128K
unsigned long pdata cnt = 0; //毫秒计数
//unsigned long pdata sec; //秒计数
//unsigned cha *but;// 发送指针
unsigned int pdata vcc; // 电压
unsigned int pdata vci; // 电流
unsigned int pdata power; // 功率
unsigned long pdata kwh=0; // 电能
unsigned long pdata kwh1; // 初始电能
unsigned char pw; //设定的空占比%
unsigned int value; // 电压
unsigned char cp; //充电桩PWM波形 cp电压采集信号 120
//// 关于LCD 1602 /////////////////LCD的一些定义
sfr P5 = 0xC8;
unsigned char pdata lcd1[16]; //LCD第一行
unsigned char pdata lcd2[16]; //LCD第二行
sbit LCD1602_RS = P5^5; //命令、数据选择 H\L
sbit LCD1602_E = P5^4; //使能
unsigned char pdata ki; //电流显示1表示16A 2表示32A
#define LEDDATA P7 //定义P1口为数据端
#define T100Hz 256
void LcdWriteCom(unsigned char com); /*LCD1602写入8位数据子函数*/
void LcdWriteData(unsigned char dat); /*LCD1602写入8位数据子函数*/
void LcdInit(); /*LCD1602初始化子程序*/
void lcd1602(); //1602显示刷新
void Lcd1602_Delay5ms();
void Lcd1602_Delay1ms();
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;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
P_SW1=P_SW1|S1_S0;
EA = 1; //使能总中断
pwm(); //初始化pwm模块设置
Timer0Init(); //初始化T0
while (1){
}
}
void pwm(){ //PWM程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ACC = P_SW1; //累加器 等于外设寄存器
ACC& = ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2) 读取累加器的值写进外设寄存器
CCON = 0; //初始化PCA控制寄存器
//PCA定时器停止
//清除CF标志
//清除模块中断标志
CL = 0; //复位PCA寄存器
CH = 0;
CMOD = 0x04;
PCA_PWM0 = 0x00; //PCA模块0工作于8位PWM
CCAP0H = CCAP0L =255-255*60/100; //PWM0的占空比为87.5% ((100H-20H)/100H) 255-255*设定空占比 /100
CCAPM0 = 0x42; //00101010 PCA模块0允许比较功能 使用CCP0脚为可调脉冲输出 P1.1
}
void Timer0Init() //T0作为PWM频率基准发生
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD& = 0xF0; //设置定时器模式
TL0 = 0xd5; //设置定时初值 计算方法,65536-晶振/(256*需要频率)
TH0 = 0xFf; //设置定时初值
TR0 = 1; //定时器0开始计时
ET0 =0; // 禁止T0中断
TF0 = 0; //清除TF0标志
// EA =0; 关闭总总中断
CR = 1;
} //PCA定时器开始工作