STC12C5A60S2内部PWM应用
STC12C5A60S2各模块的应用分享大家

STC12C5A60S2各模块的应用分享大家/*****************串口应用******************/ ///////////////////串口一//////////////#include"12c5a60s2.h"#include"uart.h"unsignedcharbuf[3],g;voidinitUart(){EA=1;BRT=0XFD;//独立波特率发生器9600AUXR=0X11;//启动独立波特率发生器,12分频// TMOD=0X20;//用定时器1做波特率发生器//TH1=0XFD;//TL1=0XFD;//TR1=1;REN=1;SM1=1;ES=1;g=0;}voidsendDate(unsigned char date){SBUF=date;while(!TI);TI=0;}void work(){sendDate(buf[0]); sendDate(buf[1]);}voidres()interrupt 4{buf[g++]=SBUF;if(g>;=2){g=0;work();}while(!RI);RI=0;}////////////////////串口二//////////////// #include;#include"uart2.h"#defineS2TI 0X02//不能位寻址#defineS2RI 0X01//不能位寻址unsigned charshuzhi;voidinitUART2(){BRT=0XFD;//定初值9600AUXR=0X11;//使用波特率独立发生器 12分频 9600 //AUXR=0X19;//使用波特率独立发生器 1分频 19200 EA=1;IE2=0X01;//ES2=1;S2CON=0X50;//S2REN=1;S2SM1=1;}voidsenddate(unsigned char date){S2BUF=date;//判断是否是一if(S2CON&S2TI)//清零S2CON&=~S2TI;}void uart2r()interrupt 8{if(S2CON&S2RI)//判断是否是一{S2CON&=~S2RI;//清零shuzhi=S2BUF;senddate(0x40);}}/******************AD转换*************************/#include"12c5a60s2.h"#include"12c5aad.h"#include;//寄存器地址声明,有12c5a60s2 头文件可省略//sfr ADC_CONTR =0XBC;//sfr ADC_RES =0XBD;//sfr ADC_ERSL =0XBE;//sfr P1ASF =0X9D;//宏定义#define ADC_POWER 0X80// ad电源控制位#define ADC_FLAG0x10//ad转换结束标志位#define ADC_START0x08//ad转换开始控制位#define ADC_SPEEDLL 0x00 //540 转换速率#define ADC_SPEEDL 0x20 //360 转换速率#define ADC_SPEEDH 0x40 //180 转换速率#define ADC_SPEEDHH 0x60 //90 转换速率//ad转换延时函数voiddelayad(unsignedint z){unsignedintx,y;for(x=5000;x>;0;x--)for(y=z;y>;0;y--);}//ad初始化函数voidinitad(){P1ASF=0XFF;//设置P1口为ad转换模式ADC_RES=0;//ad转换结果寄存器清零ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //打开ad转换电源,最慢频率delayad(2);//延时待电源稳定提高精确性}unsignedchar getAD(unsigned char ch) //ch通道选择{ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch ; _nop_(); _nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FLAG));//ad转换完成 FALG 为1ADC_CONTR&=~ADC_FLAG;//FALG置置零return ADC_RES;}/********************PCA/PWM*****************/ /////////////////////中断模式/////////////////////#include;#include"pcaint.h"unsigned charmiao;voidinitPCAint(void){CCON=0;CL=0;CH=0;CMOD=0X00;//禁止CF中断CCAPM0=0X11;// (CAPN0 负捕获,CAPP0 正捕获)本模块负捕获CCAPM1=0X21; // 模块一正捕获CR=1;//开计数列阵EA=1;//开总中断}voidpca()interrupt7{if(CCF0==1){CCF0=0;//清零模块中断标志位miao++;}if(CCF1==1){CCF1=0;//清零模块中断标志位miao--;}}//////////////////////////定时器模式////////////////////#include;#include"pcatime.h" unsignedint value;//数组赋值unsigned char ptime;//ptime=0xb402;50ms定时 0x2400 10ms voidinitPCATime(){CCON=0X00;//标志位清零CL=0;//pca L列阵清零CH=0;//PCA H列阵清零CMOD=0X00;//选择时钟模式CCAP1L=value;//先赋值高位CCAP1H=value>;>;8; //赋值CCAPM1=0X49;//允许比较器ECOM1,MAT1、ECCF1置位允许CCF1中断CR=1;//允许列阵EA=1;//开总中断}voidpcatime()interrupt 7//两个PCA模块都是中断7 {unsignedint i;CL=0;//清零不然是溢出时钟,定时无效 CH=0;//清零不然是溢出时钟,定时无效 CCF1=0;CCAP1L=value;CCAP1H=value>;>;8;i++;if(i>;=20){i=0;ptime++;}}///////////////////////PWM模式//////////////////////#include"12c5a60s2.h" #include"12c5apwm.h" voidinitPWM(void ){CCON=0;//关闭PCA计数及标志位清零CL=0;// 清空pca计数低位CH=0;// 清空pca计数高位CMOD=0X08;// 用系统时钟不分频//CCAP0H=CCAP0L=0x01;// 模块0复初值CCAPM0=0X42;//允许模块0比较器工作,脉宽调制模式//CCAP1H=CCAP1L=0X01;//模块1复初值CCAPM1=0X42;//允许模块1比较器工作,脉宽调制模式CR=1;//启动pca计数}void tiaoj(unsignedchar pwmH,unsigned char pwmL){CCAP0H=CCAP0L=pwmH;// 模块0复值CCAP1H=CCAP1L=pwmL;// 模块1复值}/**********************EEPROM******************** *****/#include;#include;#include"eeporm.h"#defineRdeeprom 0x01#defineWreeprom 0x02#defineERSeeprom 0x03#defineWTime0x01 // 0x02 0x03 0x00sfr ISP_DATA=0Xc2;sfr ISP_ADDRH=0Xc3;sfr ISP_ADDRL=0Xc4;sfr ISP_CMD=0Xc5;sfr ISP_TRIG=0Xc6;sfr ISP_CONTR=0Xc7;unsigned char miao,miao2,miao3;bit int0flag;void ISP_Open(void){EA=0;//关中断ISP_CONTR=ISP_CONTR&0X18;//清零ISP_CONTR=ISP_CONTR|WTime;//等待时间ISP_CONTR=ISP_CONTR|0x80;//使能ISP}void ISP_Close(void){ISP_CONTR=ISP_CONTR&0X7F; //停止ISP使能ISP_TRIG=0X00;//命令触发寄存器清零EA=1;//开中断}void ISP_Goon(void){//打开ISPISP_Open();ISP_TRIG=0x5a;//写触发命令ISP_TRIG=0xa5;//写触发命令_nop_();//等待}voidbyte_write(unsigned int add,unsigned char dat) //写某地址数据{ISP_ADDRH=(unsignedchar)(add>;>;8);//地址高位ISP_ADDRL=(unsignedchar)(add&0x00ff);//地址低位ISP_CMD=ISP_CMD&0XF8;//命令模式复位ISP_CMD=ISP_CMD|Wreeprom;//写命令ISP_DATA=dat;//读写寄存器赋值ISP_Goon();//打开、触发ISP_Close();_nop_();//关闭}voidsector(unsigned int add) {ISP_ADDRH=(unsignedchar)(add>;>;8);//地址高位ISP_ADDRL=0x00;//地址低位ISP_CMD=ISP_CMD&0XF8;//命令模式复位ISP_CMD=ISP_CMD|ERSeeprom;//删命令ISP_Goon();//打开、触发ISP_Close();_nop_();}unsignedchar byte_read(unsigned int add) {ISP_ADDRH=(unsignedchar)(add>;>;8);//地址高位ISP_ADDRL=(unsignedchar)(add&0x00ff);//地址低位ISP_CMD=ISP_CMD&0XF8;//命令模式复位ISP_CMD=ISP_CMD|Rdeeprom;//读命令ISP_Goon();//打开、触发ISP_Close();_nop_();return (ISP_DATA);}voidinitc(){IT0=1;EX0=1;EA=1;}voidint0()interrupt 0{if(int0flag==1){EA=0;sector(0x00ff); //0000h-03ffh byte_write(0X00ff,miao3);EA=1;}}///////////////////////////////////////////////// ////////写的一般,不足之处还望包涵,均测试通过,欢迎提好的建议。
单片机STC12C5A60S2简介

单片机STC12C5A60S2简介展开全文1、STC12C5A60S2简介STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;2.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机);3.工作频率范围:0-35MHz,相当于普通8051的0~420MHz;4.用户应用程序空间8K/16K/20K/32K/40K/48K/52K/60K/62K 字节;5.片上集成1280字节RAM;6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120ma;7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM);9.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);10.外部掉电检测电路:在P4.6口有一个低压门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%;11.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内)1用户在下载用户程序时,可选择是使用内部R/C 振荡器还是外部晶体/时钟,常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz,3.3V单片机为:8MHz~12MHz,精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准;12.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器;13.2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟;14.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,PowerDown模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2),CCP1/P1.4(也可通过寄存器设置到P4.3);15.PWM(2路)/PCA(可编程计数器阵列,2路):——也可用来当2路D/A使用——也可用来再实现2个定时器——也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持);16.A/D转换,10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次),通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口;17.STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3);18.工作温度范围:-40-+85℃(工业级)/0-75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口,还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
STC12C5A60S2精简开发板产品使用手册

STC12C5A60S2单片机开发学习板产品使用手册【简要说明】一、尺寸:长83mmX宽79mmX高18mm二、主要芯片:STC12C5A60S2单片机三、工作电压:直流6~15伏四、、特点:1、具有电源指示;2、所有I/O口已引出;3、可以实现与电脑串口通信;4、可以实现双串口通讯;5、具有上电复位和手动复位;6、附带SD卡读写接口;7、支持STC串口下载;8、双串口通讯(注:只能使用COM1下载程序);9、八路LED灯(注:可拔出短路帽,断开LED灯);10、可端子接线供电、可排针引电;11、7805供电,输入电压范围宽,且确保AD参考电压准确(注:因无外部参考电压点)五、提供相关软件、资料、原理图适用场合:单片机学习、电子竞赛、产品开发、毕业设计。
注意啦:本产品提供的所有程序都附带原理图以及说明!【图片标注】【原理图】(放大可以看清楚)【PCB尺寸图】【开发板支持同系列单片机的型号】STC单片机最新型号——STC12C5A60S2STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;2.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机);3.工作频率范围:0 - 35MHz,相当于普通8051的 0~420MHz;4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节;5.片上集成1280字节RAM;6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55Ma;7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM);9. 看门狗;10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);11.外部掉电检测电路:在P4.6口有一个低压门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%;12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟,常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz,3.3V单片机为:8MHz~12MHz,精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准;13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器;14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟;15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块, Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4, T1/P3.5, RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3);16. PWM(2路)/PCA(可编程计数器阵列,2路):——也可用来当2路D/A使用——也可用来再实现2个定时器——也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持);17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口;19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3);20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
STC系列PWM方式控制两相步进电机

单片机课程设计步进电机控专业班级:姓名:学号:指导教师:目录一.课程设计要求二.课程设计目的三.所用仪器及相关说明1.5 7步进电机23HS66202. DM524 型细分型两相混合式步进电机驱动器3.STC12C5A60S2系列单片机四.调试程序【程序一、二】五.程序功能【程序一、二】六.误差说明七.心得体会八.课设说明一.课程设计要求通过计算机对单片机芯片的编程,将单片机与驱动器相连,从而实现对步进电机的各种方式控制。
二.课程设计目的1.根据所期望的结果编写程序,并在实验仪器上调试和验证。
2.使用步近电机的工作原理与步进电机驱动器。
3.学习控制步进电机转角、速度、方向的实时软件设计三.所用仪器及相关说明1.57步进电机23HS66202.DM524型细分型两相混合式步进电机驱动器,采用直流18~50V 供电,适合驱动电压24V~50V,电流小于 4.0V ,外径42~86毫米的两相混合式步进电机。
此驱动器采用交流伺服驱动器的电流环进行细分控制,电机的转矩波动很小,低速运行很平稳,几乎没有振动和噪音。
高速时力矩也大大高于其它二相驱动器,定位精度高。
广泛适用于雕刻机、数控机床、包装机械等分辩率要求较高的设备上。
电气参数输入电流小于4安培输出电流 1.0A ~4.2A功耗功耗:80W ;内部保险:6A温度工作温度-10~45℃;存放温度-40℃~70℃湿度不能结露,不能有水珠气体禁止有可燃气体和导电灰尘重量200克主要特点1)平均电流控制,两相正弦电流驱动输出(2)直流24~50V 供电3)光电隔离信号输入/输出(4)有过压、欠压、过流、相间短路保护功能5)十五档细分和自动半流功能(6)八档输出相电流设置(7)具有脱机命令输人端子(8)高启动转速(9)高速力矩大(10)电机的扭矩与它的转速有关,而与电机每转的步数无关控制信号接口控制信号定义PLS/CW+:步进脉冲信号输入正端或正向步进脉冲信号输入正端PLS/CW-:步进脉冲信号输入负端或正向步进脉冲信号输入负端DIR/CCW+ :步进方向信号输入正端或反向步进脉冲信号输入正端DIR/CCW- :步进方向信号输入负端或反向步进脉冲信号输入负端ENA+ :脱机使能复位信号输入正端ENA- :脱机使能复位信号输入负端脱机使能信号有效时复位驱动器故障,禁止任何有效的脉冲,驱动器的输出功率元件被关闭,电机无保持扭矩。
单片机STC12C5A60S2模块简介

单片机STC12C5A60S2模块简介1、综述系统采用STC12C5A16S2单片机为核心,配合USB转串口芯片CH340T、RS232芯片Max232、四位共阳数码管、LED、按键和蜂鸣器组成最小系统。
单片机内部集成双串口、8路10bitADC和两路八位PWM。
系统由MINI USB供电和提供程序下载接口,使得电路大大简化,通用性增强.2、模块分析2、1电源模块全系统工作在+5V且功耗较低,所以采用USB电源供电即可满足。
电源前级接入500mA自恢复保险丝,提供短路保护,芯片前级对地分别连接100uF 和0。
1uF进行电源滤波。
电源部分引入三脚单联扭子开关将USB转串口芯片CH340T的电源与芯片电源进行隔离,以方便下载程序。
图2.1 电源模块2。
2、USB转串口STC12C5A16S2单片机可以通过串口烧写程序,系统采用CH340T将USB转换为串口信号,以供单片机下载程序,电路如图2.2:图2.2USB转串口模块图中UD+与UD—为计算机USB信号,RxD与TxD信号为CH340T转换后接到单片机的串口信号.2。
3、单片机模块单片机模块由复位电路,晶振电路和蜂鸣器电路组成,然后将多余I/O口外接以供扩展。
图2.3 单片机模块2。
4、RS232模块使用Max232将单片机的第二串口引出,通过DB9接口实现与外界串口通信。
图2。
4 RS232模块2。
5、四位共阳数码管和LED模块单片机P2.0端口用于8个LED选通,P2。
1-P2。
4端口用于数码管位选;P0.0—P0。
7用于数码管段选和8个LED选择。
图2。
5四位共阳数码管图2.6 8位LED模块2.6、按键模块单片机P3。
2-P3.5端口用于扫描按键状态,组成1X4键盘。
图2.7 按键模块3、操作步骤1、安装CH340T芯片驱动;2、将MINI USB电缆连接到开发板,进入计算机设备管理器—端口选项,会出现CH340T,并显示COM X,记住此端口号;3、拨动开关,电源指示灯有高亮和微亮两种状态;4、编写程序文件,编译生成。
STCMCU的软件和硬件PCAPWM输出

STCMCU的软件和硬件PCAPWM输出软件⽅式输出PWMPWM⽤于输出强度的控制, 例如灯的亮度, 轮⼦速度等, STC89/90系列没有硬件PWM, 需要使⽤代码模拟使⽤纯循环的⽅式实现PWM⾮中断的实现(SDCC环境编译)#include <8052.h>#define Led10 P0_7typedef unsigned int u16;int atime = 64;// 仅作为延时, pms取值区间为 0 - 64void delay(u16 pms) {u16 x, y;for (x=pms; x>0; x--) {for (y=11; y>0; y--);}}// 这⾥控制占空⽐, i取值区间为 0 - 64,// i越⼤脉冲宽度越低, 因为输出是低位点亮, 所以i越⼤LED越亮void ledfade(u16 i) {Led10 = 0;delay(i);Led10 = 1;delay(atime-i);}int main(void) {u16 a, b;// 每个循环, ⼩灯while(1) {// a增⼤, 脉冲宽度降, 亮度增for (a=0; a<atime; a++) {for (b=0; b < (atime - a)/4; b++) {ledfade(a);}}// a减⼩, 脉冲宽度增, 亮度降for (a=atime; a>0; a--) {for (b=0; b < (atime - a)/4; b++) {ledfade(a);}}}}使⽤中断的⽅式因为需要PWM输出的场景, ⼀般都不会仅仅有PWM输出, 所以通常会做到定时器中断中, 由中断来实现将1和0的时间宽度设置为定时器, 直接做到定时器中断⾥⾯这个代码中1. pwm_flag代表了输出的0和1, 每次定时器中断时进⾏切换, 并设置下⼀次中断的时间宽度2. 缺点: ⽤TR0做开关, 但是这种停⽌⽅式, 停⽌后输出可能还是1/* Global variables and definition */#define PWMPIN P1_0unsigned char pwm_width;bit pwm_flag = 0;void pwm_setup(){TMOD = 0; // Timer mode 0, 13bitpwm_width = 160;EA = 1;ET0 = 1;TR0 = 1;}/* Timer 0 Interrupt service routine */void timer0() interrupt 1{if (!pwm_flag) { /* Start of High level */pwm_flag = 1; /* Set flag */PWMPIN = 1; /* Set PWM o/p pin */TH0 = pwm_width; /* Load timer */TF0 = 0; /* Clear interrupt flag */} else { /* Start of Low level */pwm_flag = 0; /* Clear flag */PWMPIN = 0; /* Clear PWM o/p pin */TH0 = 255 - pwm_width; /* Load timer */TF0 = 0; /* Clear Interrupt flag */}}void pwm_stop(){TR0 = 0; /* Disable timer to disable PWM */}使⽤定时器模式2和中断实现的PWM输出使⽤定时器⼯作模式2定时器通过对变量tt做计数, 与scale做⽐较, 确定是否翻转电压这⾥scale分10个等级, scale=1时占⽐1/10个PWM周期(250us * 10 = 2.5ms), 在主循环⾥改变scale因为是低电平点亮LED, 所以tt<=scale的时间LED是暗的, scale增⼤时亮度变⼩, 这个可以根据⾃⼰电路的情况调整这样存在的问题是修改scale的值时, 可能正好在tt计数范围的中间, 导致输出出现⽑刺, 可以通过增加⼀个中间变量来解决, 在tt计数时⽐较的是这个中间变量, 在周期结束时再⽤新值更新这个中间变量#include<reg51.h>sbit P10 = P1^0;sbit P11 = P1^1;unsigned int scale; //占空⽐控制变量void main(void) {unsigned int n; //延时循环变量TMOD = 0x02; //定时器0,⼯作模式2, 8位定时, TL0溢出时⾃动重载TH0中的值TH0 = 0x06; //定时, 250us⼀个中断 (12M晶振, 12分频后1MHz, 单次1us)TL0 = 0x06; //初始值TR0 = 1; //启动定时器0ET0 = 1; //启动定时器0中断EA = 1; //开启总中断while(1) {for(n = 0; n < 50000; n++); //延时50msscale++; //占空⽐控制, ⾃增if(scale == 10) scale = 0; //使占空⽐从0-10循环变化}}timer0() interrupt 1 {static unsigned int tt; //tt⽤来保存当前时间在⼀个时钟周期的位置tt++; //每中断⼀次,即每经过250us,tt的值⾃加1if (tt == 10) { //中断10次定时2.5mstt = 0; //使tt=0,开始新的周期,达到循环的效果P10 = 0; //点亮LED}if (tt <= scale) { //如果占空⽐与中断次数相同时,此时输出⾼电平P10 = 1; //熄灭LED灯}}使⽤定时器模式2和中断实现的多路PWM输出实现多路PWM输出的思路1. 使⽤⼀个基础定时器, 定时器时间不能太⼤, 例如设置为100us, 可以⽤定时器模式2, 这样初始值能⾃动重置2. 设定⼀个PWM周期, 这个周期就是定时器间隔的整数倍, 例如10倍定时器周期, 就是1000us = 1ms3. 对于每个PWM通道设置⼀个计数, 计数在达到PWM周期时置零, 这是实现PWM周期的基础设置⼀个初始输出, ⾼电平或低电平设置⼀个输出宽度, 计数达到这个宽度值时翻转. 这个宽度决定了输出翻转的时间, ⽤于控制占空⽐4. 因为每个指令的执⾏时间需要1-2个CPU周期, 所以当通道数增加后, 误差会增⼤代码例⼦: 这⾥⽤8个位指定4个轮⼦的PWM输出, 每个轮⼦两位是为了控制轮⼦的正反向#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;// Wheel 0sbit P1_0 = P1^0;sbit P1_1 = P1^1;// Wheel 1sbit P1_2 = P1^2;sbit P1_3 = P1^3;// Wheel 2sbit P1_4 = P1^4;sbit P1_5 = P1^5;// Wheel 3sbit P1_6 = P1^6;sbit P1_7 = P1^7;/*Duty Cycle = Toogle_P1_x / PWM_Period;*/u8 PWM_Period = 128; // PWM Period = N * Timer delay(100us), between 10 - 254 u8 Toggle_W0 = 0; // Toggle of Wheel 0u8 Dir_W0 = 0; // Direction, 0:P1_0=0,P1_1=PWM, 1:P1_1=0,P1_0=PWMu8 Toggle_W1 = 0; // Toggle of Wheel 1u8 Dir_W1 = 0; // Direction, 0:P1_2=0,P1_3=PWM, 1:P1_3=0,P1_2=PWMu8 Count_W0, Count_W1;void Time0_Init(void){TMOD = 0x02; // Mode 2, 8-bit and auto-reloadTH0 = 0x9C; // 0x9c = 156, timer of 100us (12MHz OSC)TL0 = 0x9C;ET0 = 1;EA = 1;TR0 = 1;EX0 = 1; EX1 = 1; // Enable external interrupt 0 and 1IT0 = 1; IT1 = 1; // Toggle = jump}void main(){Time0_Init();while(1);}void Timer0_IT() interrupt 1{// W0if(Count_W0 == Toggle_W0) {if (Dir_W0 == 0) { // P1_1=PWMP1_1 = 0;} else { // P1_0=PWMP1_0 = 0;}}if(Count_W0 == PWM_Period - 1) {Count_W0 = 0;if (Dir_W0 == 0) {P1_0 = 0;P1_1 = 1;} else {P1_0 = 1;P1_1 = 0;}} else {Count_W0++;}// W1if(Count_W1 == Toggle_W1) {if (Dir_W1 == 0) { // P1_3=PWMP1_3 = 0;} else { // P1_2=PWMP1_2 = 0;}}if(Count_W1 == PWM_Period - 1) {Count_W1 = 0;if (Dir_W1 == 0) {P1_2 = 0;P1_3 = 1;} else {P1_2 = 1;P1_3 = 0;}} else {Count_W1++;}}// W0 dir0->maxvoid W0_dir0(void){if (Dir_W0 == 0) {Toggle_W0++;if(Toggle_W0 > PWM_Period) { Toggle_W0 = PWM_Period; }} else {Toggle_W0--;if(Toggle_W0 == 0) {Dir_W0 = 0;}}}// W0 dir1->maxvoid W0_dir1(void){if (Dir_W0 == 0) {Toggle_W0--;if(Toggle_W0 == 0) {Dir_W0 = 1;}} else {Toggle_W0++;if(Toggle_W0 > PWM_Period) { Toggle_W0 = PWM_Period; }}}// W1 dir0->maxvoid W1_dir0(void){if (Dir_W1 == 0) {Toggle_W1++;if(Toggle_W1 > PWM_Period) { Toggle_W1 = PWM_Period; }} else {Toggle_W1--;if(Toggle_W1 == 0) {Dir_W1 = 0;}}}// W1 dir1->maxvoid W1_dir1(void){if (Dir_W1 == 0) {Toggle_W1--;if(Toggle_W1 == 0) {Dir_W1 = 1;}} else {Toggle_W1++;if(Toggle_W1 > PWM_Period) { Toggle_W1 = PWM_Period; }}}void IT0_INT() interrupt 0{W1_dir0();}void IT1_INT() interrupt 2{W1_dir1();}硬件PWM51系列单⽚机的增强型版本, 有些带PCA(Programmable Counter Array 可编程计数序列)模块, 可以通过PCA实现PWM的输出.PCA介绍PCA其实就是⼀个增强型的计数器, 这个计数器中的⼀些元素是可以在代码中设置的, 例如可以设置的计数脉冲源, 可以来⾃于系统时钟, 系统时钟可以是不分频, 2分频, 4分频, 6分频, 8分频等; 来⾃计数器; 来⾃外部输⼊的时钟可以设置计数的触发条件, 上升沿还是下降沿, 或者都计数. 最后这个计数⽅式, 可以⽤来计算脉宽可以设置16位的⽐较值不占⽤CPU资源, 这点很重要, 可以使输出更加精确和稳定因为上⼀点, 有些型号可以做到在CPU处于IDLE状态时继续计数(输出)可以⽤PCA实现PWM输出功能STC12C5A60S2系列PCA实现的PWM参考STC12C5A60S2的⼿册有两路输出, 默认PWM0:P1.3, PWM1:P1.4, 可以换到P4⼝: PWM0:P4.2, PWM1:P4.3这个在AUXR1⾥⾯控制两路共⽤PCA定时器, 定时器的频率由CMOD控制因为PWM输出是8位的, 所以定时器的频率/256就是PWM频率两路输出的占空⽐是独⽴变化的, 与当前的[EPCnL, CCAPnL]的值有关前者的值在 PCA_PWM0 PCA_PWM1 ⾥控制后者的值在 CCAP0L,CCAP0H 和 CCAP1L,CCAP1H ⾥控制先输出低, 当CL的值⼤于等于[EPCnL, CCAPnL]时, 输出为⾼当CL由FF变为00时, 输出变低, 同时⾃动将[EPCnH, CCAPnH]的值装载到[EPCnL, CCAPnL], 实现⽆⼲扰更新PWM占空⽐下⾯的代码中, CCAP1H 控制的就是装载值, CCAP1L 控制的是⽐较值, PCA_PWM1 控制的是EPCnH 和 EPCnL如果 EPCnL = 0, 那么正常输出如果 EPCnL = 1, 那么会⼀直输出低电平#include <STC12C5A60S2.H>void main() {CCON = 0; // Initial PCA control register// PCA timer stop running// Clear CF flag// Clear all module interrupt flagCL = 0; // Reset PCA base timerCH = 0;CMOD = 0x02; // Set PCA timer clock source as Fosc/2// Disable PCA timer overflow interruptCCAP0H = CCAP0L = 0x80; // PWM0 port output 50% duty cycle suquare waveCCAPM0 = 0x42; // PCA module-0 as 8-bit PWM, no PAC interruptCCAP1H = CCAP1L = 0xFF; // PWM1port output 0% duty cycle square wavePCA_PWM1 = 0x03; // PWM will keep low levelCCAPM1 = 0x42; // PCA module-0 as 8-bit PWM, no PAC interruptCR = 1; // PCA timer start runwhile(1);}对PCA_PWM1的说明;PCA_PWMn: 7 6 5 4 3 2 1 0; EBSn_1 EBSn_0 - - - - EPCnH EPCnL;B5-B2: 保留;B1(EPCnH): 在PWM模式下,与CCAPnH组成9位数。
基于单片机的PWM直流电机调速系统设计
基于单片机的 PWM直流电机调速系统设计摘要:本文以单片机STC12C5A60S2为核心,结合L298N专用驱动集成电路,通过产生的PWM波控制电机的转速,采用霍尔传感器检测电机转速并通过液晶显示电机实时转速。
最后采用 Keil和 Proteus对整个系统进行设计、编程以及仿真。
关键词:单片机;PWM调速;液晶显示;霍尔传感器;直流电机。
1.引言目前常用的电动机主要有交流电动机和直流电动机,直流电动机因为具有良好的调速性能,以及良好的起、制动性能而被广泛应用在电力拖动系统中。
而调速性能是指电动机在一定的负载条件下,可以根据实际需要,对电动机的转速进行人为的调节。
直流电动机可以在重负载的情况下,实现无级调速,并且调速范围较宽。
直流电动机转速公式:注:为转速、为电枢电压、为电枢电流、为电枢回路总电阻、为励磁磁通、为由电机结构决定的电动势常数。
通过上式可以看出,电动机转速的调节方法主要有以下三种:改变电枢供电电压;改变励磁磁通;调节电枢回路电阻。
以上三种调速方式,以调节电枢供电电压的方式是最好的,它可以实现宽范围的无极平滑调速。
2.PWM调节上面提到对于直流电动机的调速最好的方式是改变供电电压的方式,改变供电电压可以采用V-M调速系统和直流脉宽调速系统,而直流脉宽调速系统相对V-M调速系统具有开关频率高,电流容易连续,谐波少,电机损耗及发热都较小。
PWM调速的原理就是通过把恒定的直流电压调制成高度一定,宽度可变的脉冲电压序列,进而改变平均输出电压从而达到调节转速的目的,实质就是通过控制功率管如电力MOSFET,IGBT等的开关时间进而改变加在电机上的电压占空比就可以改变电机的平均电压。
功率管输入电压以及电机电枢电压的关系如下。
假设加在电动机两端的电压为,通过控制功率管的通断使得输出电压变成了一系列脉冲电压,其平均值计算公式为:,其中为占空比,通过改变占空比就可以改变的值,进而改变电动机转速。
3.调速系统硬件设计本设计采用单片机STC12C5A60S2产生的PWM脉冲波调节输出电压的大小,系统原理框图如图1所示。
基于单片机的恒流开关电源-新
毕业论文(设计)中文题目: 基于单片机的恒流开关电源英文题目:MCU-based switching power supply design姓名学号专业班级指导教师提交日期摘要本开关电源设计采用STC12C5A60S2单片机发生47KHZ的PWM脉冲信号,经过IR2104控制MOS,从而控制整个BUCK(降压式变换)电路。
单片机内部自带的10位ADC能通过电压电流检测电流实时反馈电流和电压数值,并由此调整输出的PWM的占空比,形成电流电压闭环控制系统.按键能设置输出电流从0。
2A到2A,以0.01A递增,输出最大10V,液晶能显示实时输出电流与电压。
根据测试,满载的供电效率为88%。
按键设置的输出电流的误差小于0。
01A。
关键词:开关电源,BUCK,STC单片机,IR2104,恒流源MCU-based switching power supply designAbstractThe switching power supply design uses STC12C5A60S2 microcontroller PWM pulse signal 47KHZ happen, after MOS driver IC IR2104 control the whole BUCK circuit。
MCU comes with 10 internal ADC voltage detection current by real—time feedback current and voltage values, and thereby adjust the output PWM duty cycle, forming a voltage closed-loop control system。
Button can set the output voltage from 0V to 10V limit of,1V steps,the LCD can display real—time output voltage and current。
基于STC单片机无刷直流电机控制系统的设计
基于STC单片机无刷直流电机控制系统的设计本文将介绍基于STC单片机的无刷直流电机控制系统的设计。
无刷直流电机具有高效率、低噪音、长寿命等优点,在工业自动化、家用电器等领域得到广泛应用。
本设计采用了STC12C5A60S2单片机,通过PWM控制器实现了对无刷直流电机的速度和转向控制。
一、硬件设计1.主控芯片:STC12C5A60S2单片机STC12C5A60S2是一款高性能8位单片机,具有强大的计算能力和丰富的外设资源。
它具有多个定时器/计数器、多路ADC、UART等功能模块,适合于各种应用场合。
在本设计中,该芯片作为主控芯片,负责实现对无刷直流电机的速度和转向控制。
2.驱动模块:L298NL298N是一款双全桥驱动芯片,可实现对直流电机或步进电机的驱动。
它具有较高的输出功率和较低的内部电阻,适合于需要大功率输出的应用场合。
在本设计中,L298N作为无刷直流电机驱动模块,负责将主控芯片输出的PWM信号转化为电机驱动信号。
3.无刷直流电机无刷直流电机具有高效率、低噪音、长寿命等优点,在各种应用场合得到广泛应用。
在本设计中,选择了一款12V、2000rpm的无刷直流电机,作为实验对象。
4.其他元件除上述元件外,还需要使用一些电容、电阻、二极管等元件,以及连接线、面包板等辅助材料。
二、软件设计1.系统框图本设计采用了STC12C5A60S2单片机,通过PWM控制器实现了对无刷直流电机的速度和转向控制。
系统框图如下所示:2.程序流程(1) 初始化各个模块:包括IO口初始化、定时器/计数器初始化等。
(2) 设置PWM占空比:通过改变PWM占空比来实现对电机的速度控制。
(3) 改变输出口状态:根据需要改变输出口状态,实现正反转控制。
(4) 延时:为了保证电机能够正常工作,需要进行适当的延时操作。
(5) 循环执行上述步骤:不断地改变PWM占空比和输出口状态,以实现对电机的控制。
三、实验结果本设计的实验结果表明,采用STC单片机控制无刷直流电机,可以实现精确的速度和转向控制。
STC12C5A60S2中文资料选型表
STC12C5A60S2系列1T单片机简介STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统80512.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V- 2.2V(3V单片机)3.工作频率范围:0 - 35MHz,相当于普通8051的0~420MHz4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节......6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口) 可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可到达20mA,但整个芯片最大不要超过55mA7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)9. 看门狗10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)11.外部掉电检测电路:在P4.6口有一个低压门槛比拟器5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz 3.3V单片机为:8MHz~12MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2, INT1/P3.3, T0/P3.4, T1/P3.5, RxD/P3.0, CCP0/P1.3(也可通过存放器设置到P4.2 ), CCP1/P1.4 (也可通过存放器设置到P4.3)16. PWM(2路)/PCA(可编程计数器阵列,2路) ---也可用来当2路D/A使用---也可用来再实现2个定时器---也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过存放器设置到P4.2),TxD2/P1.3(可通过存放器设置到P4.3)20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【PWM】 . 实例一:
电路图如上,该程序的功能是利用按键S1对LED的亮度进行调节。 程序如下: #include"12C5A"//注意这个头文件,用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; } } } 实例二:两个文件 #include <> #include <> #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对应CEX0/PCA0/PWM0(STC12C5A60S2系列) sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器 //模块1对应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); } } 12C5A #include <> #define U8 unsigned char
sfr CCON = 0xD8; //PCA控制寄存器 sfr CMOD = 0xD9; //PCA模式寄存器 sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器 //模块0对应CEX0/PCA0/PWM0(STC12C5A60S2系列) sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器 //模块1对应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;