微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC12C5A60S2单片机产生SPWM主程序C代码

STC12C5A60S2单片机产生SPWM主程序C代码

时间:08-06 来源:互联网 点击:

本程序通过模拟仿真,实际示波器测试,均表现良好,愿拿出来分享,若有更好的实现方法,希望高手多多指教。。。。

/*************spwm产生程序******//*单片机STC12C5A60S2,晶振11.0592M,正弦波50Hz,spwm波形21.6KHz*/#include STC12x5A60S2.H>#define uchar unsigned char#define uint unsigned intuchar code pwm[54]={255,240,226,211,196,182,168,154,141,128,115,103,91
,80,69,59,50,42,34,27,20,15,10,6,3,1,0,0,1,3,6,10,15,20,27,34,42,50,59,69,80,91,103,115,128,141,154,168,
182,196,211,226,240,255}; // 反正弦变化int index=0;sbit P13=P1^3;        //PCA模块0输出sbit P14=P1^4;        //PCA模块1输出bit zf=0;           //前后半周期标志void init_pca(void)//pca计数器初始化函数{CMOD=0x02;//计数器0的溢出为PCA计数器的时钟源,允许pca中断使能CCON=0x00;CCAPM0=0x42;//8位PWM输出,无中断CCAPM1=0x42;//8位PWM输出,无中断CL=0x00;//清零pca计数器CH=0x00;CCAP0L=pwm[0];    //初始化spwm输出的占空比CCAP0H=pwm[0];CCAP1L=pwm[0];    //初始化spwm输出的占空比CCAP1H=pwm[0];CR=1;//运行pca计数器}void init_timer(void)//计数器初始化函数{TMOD= 0x01; //计数器0工作在方式模式1TH0 = 0XF7;//T1的计数值为2048,若是11.0592M晶振,则中断频率为11.0592M/2048=5.4KTL0 = 0xFF;    //T1的计数值低位AUXR=0xC0;//计数器均工作在1T模式。计数频率11.0592MET0 = 1; //开中计数器0断TR0 = 1; //开启计数器0}void int_timer0(void) interrupt 1//计数器1中断函数{TH0=0xF7; //重装计数值TL0=0xFF;index++; //查表索引if(index==54) //半周期转换,每半周期分为60份{CR=0;    //关PCA计数index=0;zf=~zf;  //半周期标志,zf=0,前半周期,zf=1,后半周期  if(zf)   //设置后半周期{P13=0;                    CCAPM0=0X00;   //关闭模块0CCAPM1=0X42;   //设置模块1工作方式}else               //设置前半周期{P14=0; CCAPM1=0X00;   //关闭模块1CCAPM0=0X42;   //设置模块0工作方式}CR=1;           //开PCA计数                } if(zf==0)          //将下一小格的占空比赋给相应值{CCAP0H=pwm[index];}else {CCAP1H=pwm[index];}}void main(void){P14=0;P13=0;EA=1;//开总中断init_pca();init_timer();while(1)//主循环{//彩灯程序  和1602显示程序}}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top