1、 【PWM】 . 实例一: 电路图如上,该程序的功能是利用按键S1对LED的亮度进行调节。 程序如下: #include"STC12C5A.h"//注意这个头文件,用reg52是不行的,如果你没有的话,可以去百 // //度
2、文档里搜索“STC12C5A系列单片机头文件”,有我共享的头文件。 void delay(unsigned int cnt) { unsigned char i; for(;cnt>0;cnt--) for(i=0;i<250;i++); } void main() { CCON=0; //PCA初始化 CL=0; //PCA的16位计数器低八位 CH=0; //PCA的16位计数器高八位 CMOD=0x00; //选择 系统时钟/12 为计数脉冲,则PWM的频率f=sysclk/256/12; CCAP0H=0x80; // 占空
3、比控制
CCAP0L=0x80;
PCA_PWM0=0x00; //控制占空比的第九位为0
CCAPM0=0x42; //允许P13作为PWM输出
CR=1; //启动PCA计数器
while(1)
{
if(P10==0)
{
delay(200);
while(P10==0);
CCAP0H+=10; //占空比调节
CCAP0L+=10;
}
}
}
实例二:两个文件
main.c
#include
4、 char #define U16 unsigned int void DelayMs(U8 ms); void PWM_clock(U8 clock); void PWM_start(U8 module,U8 mode); ////////////////////// 延时子程序///////////////////////////// void DelayMs(U8 ms) //在11.0592M晶振下,stc10f系列(单周期指令)的ms级延时 { U16 i; while(ms--) { for(i = 0; i < 850; i++);
5、 } } ////////////////////主函数入口//////////////////////////// sfr CCON = 0xD8; //PCA控制寄存器 sfr CMOD = 0xD9; //PCA模式寄存器 sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器 //模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列) sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器 //模块1对应P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列) sfr
6、CL = 0xE9; //PCA 定时寄存器 低位 sfr CH = 0xF9; //PCA 定时寄存器 高位 sfr CCAP0L = 0xEA; //PCA模块0的 捕获寄存器 低位 sfr CCAP0H = 0xFA; //PCA模块0的 捕获寄存器 高位 sfr CCAP1L = 0xEB; //PCA模块1的 捕获寄存器 低位 sfr CCAP1H = 0xFB; //PCA模块1的 捕获寄存器 高位 sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0 sfr PCA_PWM1 = 0xF3
7、 //PCA PWM 模式辅助寄存器1 sbit CF = 0xDF; //PCA计数溢出标志位 sbit CR = 0xDE; //PCA计数器 运行控制位 sbit CCF1 = 0xD9; //PCA模块1中断标志 sbit CCF0 = 0xD8; //PCA模块0中断标志 //* CCAPOH = CCAPOL = 0XC0; //模块0输出 占空因数为25% //* CCAPOH = CCAPOL = 0X80; //模块0输出 占空因数为50% //* CCAPOH = CCAPOL = 0X40; //模块0输出 占空
8、因数为75% void PWM_clock(U8 clock); void PWM_start(U8 module,U8 mode); void PWM_clock(U8 clock) { CMOD |= (clock<<1); CL = 0x00; CH = 0x00; } void PWM_start(U8 module,U8 mode) { CCAP0L = 0XC0; CCAP0H = 0XC0; //模块0初始输出 占空因数为25% CCAP1L = 0XC0; CCAP1H = 0XC0; //模块1初始输出 占空因数为25%
9、 if(module==0) { switch(mode) { case 0: CCAPM0 = 0X42;break; //模块0设置为8位PWM输出,无中断 case 1: CCAPM0 = 0X53;break; //模块0设置为8位PWM输出,下降沿产生中断 case 2: CCAPM0 = 0X63;break; //模块0设置为8位PWM输出,上升沿产生中断 case 3: CCAPM0 = 0X73;break; //模块0设置为8位PWM 输出,跳变沿产生中断 default: break;
10、} } else if(module==1) { switch(mode) { case 0: CCAPM1 = 0X42;break; //模块1设置为8位PWM输出,无中断 case 1: CCAPM1 = 0X53;break; //模块1设置为8位PWM输出,下降沿产生中断 case 2: CCAPM1 = 0X63;break; //模块1设置为8位PWM输出,上升沿产生中断 case 3: CCAPM1 = 0X73;break; //模块1设置为8位PWM输出,跳变沿产生中断 def
11、ault: break; } } else if(module==2) { switch(mode) { case 0: CCAPM0 = CCAPM1 = 0X42;break; //模块0和1设置为8位PWM输出,无中断 case 1: CCAPM0 = CCAPM1 = 0X53;break; //模块0和1设置为8位PWM输出,下降沿产生中断 case 2: CCAPM0 = CCAPM1 = 0X63;break; //模块0和1设置为8位PWM输出,上升沿产
12、生中断 case 3: CCAPM0 = CCAPM1 = 0X73;break; //模块0和1设置为8位PWM输出,跳变沿产生中断 default: break; } } CR=1; //PCA计数器开始计数 } void PCA_Intrrpt(void) interrupt 7 { if(CCF0) CCF0=0; if(CCF1) CCF1=0; //软件清零 if(CF) CF=0; //软件清零 } void main() { TMOD|=0x02; /* timer 0
13、 mode 2: 8-Bit reload */
TH0=0xff;
TR0=1;
PWM_clock(2); // PCA/PWM时钟源为 定时器0的溢出
PWM_start(0,0); // 模块0,设置为PWM输出,无中断,初始占空因素为25%
while(1)
{
DelayMs(250);
}
}
PwmDrive_12C5A.c
#include
14、D = 0xD9; //PCA模式寄存器 sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器 //模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列) sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器 //模块1对应P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列) sfr CL = 0xE9; //PCA 定时寄存器 低位 sfr CH = 0xF9; //PCA 定时寄存器 高位 sfr CCAP0L = 0xEA; //PCA模块0的 捕获寄存器
15、 低位 sfr CCAP0H = 0xFA; //PCA模块0的 捕获寄存器 高位 sfr CCAP1L = 0xEB; //PCA模块1的 捕获寄存器 低位 sfr CCAP1H = 0xFB; //PCA模块1的 捕获寄存器 高位 sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0 sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1 sbit CF = 0xDF; //PCA计数溢出标志位 sbit CR = 0xDE; //PCA计数器 运行控制位 sbit CCF1 = 0
16、xD9; //PCA模块1中断标志 sbit CCF0 = 0xD8; //PCA模块0中断标志 //* CCAPOH = CCAPOL = 0XC0; //模块0输出 占空因数为25% //* CCAPOH = CCAPOL = 0X80; //模块0输出 占空因数为50% //* CCAPOH = CCAPOL = 0X40; //模块0输出 占空因数为75% void PWM_clock(U8 clock); void PWM_start(U8 module,U8 mode); void PWM_clock(U8 clock) { CMOD
17、 |= (clock<<1); CL = 0x00; CH = 0x00; } void PWM_start(U8 module,U8 mode) { CCAP0L = 0XC0; CCAP0H = 0XC0; //模块0初始输出 占空因数为25% CCAP1L = 0XC0; CCAP1H = 0XC0; //模块1初始输出 占空因数为25% if(module==0) { switch(mode) { case 0: CCAPM0 = 0X42;break; //模块0设置为8位PWM输出,无中断 cas
18、e 1: CCAPM0 = 0X53;break; //模块0设置为8位PWM输出,下降沿产生中断 case 2: CCAPM0 = 0X63;break; //模块0设置为8位PWM输出,上升沿产生中断 case 3: CCAPM0 = 0X73;break; //模块0设置为8位PWM输出,跳变沿产生中断 default: break; } } else if(module==1) { switch(mode) { case 0: CCAPM1 = 0X42;break; //模块1设置为8位
19、PWM输出,无中断 case 1: CCAPM1 = 0X53;break; //模块1设置为8位PWM输出,下降沿产生中断 case 2: CCAPM1 = 0X63;break; //模块1设置为8位PWM输出,上升沿产生中断 case 3: CCAPM1 = 0X73;break; //模块1设置为8位PWM输出,跳变沿产生中断 default: break; } } else if(module==2) { switch(mode) { case 0: CC
20、APM0 = CCAPM1 = 0X42;break; //模块0和1设置为8位PWM输出,无中断 case 1: CCAPM0 = CCAPM1 = 0X53;break; //模块0和1设置为8位PWM输出,下降沿产生中断 case 2: CCAPM0 = CCAPM1 = 0X63;break; //模块0和1设置为8位PWM输出,上升沿产生中断 case 3: CCAPM0 = CCAPM1 = 0X73;break; //模块0和1设置为8位PWM输出,跳变沿产生中断 default: break; } } CR=1; //PCA计数器开始计数 } void PCA_Intrrpt(void) interrupt 7 { if(CCF0) CCF0=0; if(CCF1) CCF1=0; //软件清零 if(CF) CF=0; //软件清零 }






