STCC5A60S内部PWM应用.doc
PWM.实例一:电路图如上,该程序的功能是利用按键S1对LED的亮度进行调节.程序如下:#include"STC12C5A.h"/注意这个头文件,用reg52是不行的,如果你没有的话,可以去百 / /度文档里搜索"STC12C5A系列单片机头文件",有我共享的头文件.void delay<unsigned int t> unsigned char i; for<t>0;t-> 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; / 占空比控制CCAP0L=0x80; PCA_PWM0=0x00; /控制占空比的第九位为0CCAPM0=0x42; /允许P13作为PWM输出CR=1; /启动PCA计数器while<1>if<P10=0>delay<200>while<P10=0>CCAP0H+=10; /占空比调节CCAP0L+=10;实例二:两个文件main.c#include <REG51.H>#include <intrins.h>#define U8 unsigned char#define U16 unsigned intvoid 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+>/主函数入口/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 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 模式辅助寄存器0sfr PCA_PWM1 = 0xF3; /PCA PWM 模式辅助寄存器1sbit 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输出 占空因数为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%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; 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输出,跳变沿产生中断 default: 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输出,上升沿产生中断 case 3: CCAPM0 = CCAPM1 = 0X73;break; /模块0和1设置为8位PWM输出,跳变沿产生中断 default: break; CR=1; /PCA计数器开始计数void PCA_Intrrpt<void> interrupt 7if<CCF0> CCF0=0;if<CCF1> CCF1=0; /软件清零 if<CF> CF=0; /软件清零 void main<>TMOD|=0x02; /* timer 0 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 <intrins.h>#define U8 unsigned charsfr 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 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 模式辅助寄存器0sfr PCA_PWM1 = 0xF3; /PCA PWM 模式辅助寄存器1sbit 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输出 占空因数为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%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; 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输出,跳变沿产生中断 default: 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输出,上升沿产生中断 case 3: CCAPM0 = CCAPM1 = 0X73;break; /模块0和1设置为8位PWM输出,跳变沿产生中断 default: break; CR=1; /PCA计数器开始计数void PCA_Intrrpt<void> interrupt 7if<CCF0> CCF0=0;if<CCF1> CCF1=0; /软件清零 if<CF> CF=0; /软件清零