收藏 分销(赏)

STC12C5A60S2内部PWM应用.doc

上传人:快乐****生活 文档编号:3560884 上传时间:2024-07-09 格式:DOC 页数:12 大小:930KB 下载积分:8 金币
下载 相关 举报
STC12C5A60S2内部PWM应用.doc_第1页
第1页 / 共12页
STC12C5A60S2内部PWM应用.doc_第2页
第2页 / 共12页


点击查看更多>>
资源描述
【PWM】 . 实例一: 电路图如上,该程序的功能是利用按键S1对LED的亮度进行调节。 程序如下: #include"STC12C5A.h"//注意这个头文件,用reg52是不行的,如果你没有的话,可以去百 // //度文档里搜索“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; // 占空比控制 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 <REG51.H> #include <intrins.h> #define U8 unsigned 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++); } } ////////////////////主函数入口//////////////////////////// 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 模式辅助寄存器0 sfr PCA_PWM1 = 0xF3; //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输出 占空因数为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 7 { if(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 char 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 模式辅助寄存器0 sfr PCA_PWM1 = 0xF3; //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输出 占空因数为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 7 { if(CCF0) CCF0=0; if(CCF1) CCF1=0; //软件清零 if(CF) CF=0; //软件清零 }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服