注意我切换了IO口的,// P_SW1 = 0x10; //ECI_2/P2.2, CCP0_2/P2.3, CCP1_2/P2.4, CCP2_2/P2.5,CCP3_2/P2.6, 看看参手册 按着按键就可以,
#include "reg51.h"
#include "intrins.h"
sfr P_SW1 = 0xa2;
sfr CCON = 0xd8;
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF3 = CCON^3;
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 CCAPM3 = 0xdd;
sfr CCAP3L = 0xed;
sfr CCAP3H = 0xfd;
sfr PCA_PWM3 = 0xf5;
unsigned char aa;
unsigned int aaa;
void main()
{
P_SW1 = 0x10; //ECI_2/P2.2, CCP0_2/P2.3, CCP1_2/P2.4, CCP2_2/P2.5,CCP3_2/P2.6
CCON = 0x00;
// CMOD=0x08; //sysclk
// CMOD=0x02; //sysclk/2
// CMOD=0x0a; //sysclk/4
// CMOD=0x0c; //sysclk/6
// CMOD=0x0e; //sysclk/8
CMOD=0x00; //sysclk/12
// CMOD=0x04; //定时器T0溢出作为时钟源 可以做出频率可变
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA模块0为PWM工作模式
// PCA_PWM0 = 0xc0; //PCA模块0输出10位PWM
// PCA_PWM0 = 0xc0; //PCA模块0输出10位PWM
// PCA_PWM0 = 0xD4; //PCA模块0输出10位PWM
// PCA_PWM0 = 0xE8; //PCA模块0输出10位PWM
// PCA_PWM0 = 0xFC; //PCA模块0输出10位PWM
CCAP0L = 0x20; //PWM占空比为96.875%[(400H-20H)/400H]
CCAP0H = 0x20;
CR = 1; //启动PCA计时器
TMOD|=0X00;//选择为定时器0模式,工作方式1,。
TL0 = 0x4C; //设置定时初值
TH0 = 0xFF; //设置定时初值
ET0=1;//打开定时器0中断允许
TR0=1;//打开定时器 //2毫秒@12.000MHz
EA=1;//打开总中断
while (1)
{
}
}
void time1() interrupt 1 //20毫秒@24.000MHz
{ //uint a1;
TL0 = 0xC0; //设置定时初值
TH0 = 0x63; //设置定时初值
aa++;
if(aa>5){aa=0;aaa++;}
if(aaa<256) PCA_PWM0 = 0xc0; //PCA模块0输出10位PWM
if(aaa>256&&aaa<512)PCA_PWM0 = 0xd4; //PCA模块0输出10位PWM
if(aaa>512&&aaa<768)PCA_PWM0 = 0xe8; //PCA模块0输出10位PWM
if(aaa>768) PCA_PWM0 = 0xfc; //PCA模块0输出10位PWM
CCAP0L = aaa;
CCAP0H = aaa;
if(aaa>1023)aaa=0;
}
这个可以0-1023,不过波形不太稳定,一会快一会慢,不是很明显 |