本程序通過(guò)模擬仿真,實(shí)際示波器測(cè)試,均表現(xiàn)良好,愿拿出來(lái)分享,若有更好的實(shí)現(xiàn)方法,希望高手多多指教。。。。
/*************spwm產(chǎn)生程序******/ /*單片機(jī)STC12C5A60S2,晶振11.0592M,正弦波50Hz,spwm波形21.6KHz*/ #include <STC12x5A60S2.H> #define uchar unsigned char #define uint unsigned int uchar 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; //前后半周期標(biāo)志 void init_pca(void)//pca計(jì)數(shù)器初始化函數(shù) { CMOD=0x02;//計(jì)數(shù)器0的溢出為PCA計(jì)數(shù)器的時(shí)鐘源,允許pca中斷使能 CCON=0x00; CCAPM0=0x42;//8位PWM輸出,無(wú)中斷 CCAPM1=0x42;//8位PWM輸出,無(wú)中斷 CL=0x00;//清零pca計(jì)數(shù)器 CH=0x00; CCAP0L=pwm[0]; //初始化spwm輸出的占空比 CCAP0H=pwm[0]; CCAP1L=pwm[0]; //初始化spwm輸出的占空比 CCAP1H=pwm[0]; CR=1;//運(yùn)行pca計(jì)數(shù)器 } void init_timer(void)//計(jì)數(shù)器初始化函數(shù) { TMOD= 0x01; //計(jì)數(shù)器0工作在方式模式1 TH0 = 0XF7;//T1的計(jì)數(shù)值為2048,若是11.0592M晶振,則中斷頻率為11.0592M/2048=5.4K TL0 = 0xFF; //T1的計(jì)數(shù)值低位 AUXR=0xC0;//計(jì)數(shù)器均工作在1T模式。計(jì)數(shù)頻率11.0592M ET0 = 1; //開(kāi)中計(jì)數(shù)器0斷 TR0 = 1; //開(kāi)啟計(jì)數(shù)器0 } void int_timer0(void) interrupt 1//計(jì)數(shù)器1中斷函數(shù) { TH0=0xF7; //重裝計(jì)數(shù)值 TL0=0xFF; index++; //查表索引 if(index==54) //半周期轉(zhuǎn)換,每半周期分為60份 { CR=0; //關(guān)PCA計(jì)數(shù) index=0; zf=~zf; //半周期標(biāo)志,zf=0,前半周期,zf=1,后半周期 if(zf) //設(shè)置后半周期 { P13=0; CCAPM0=0X00; //關(guān)閉模塊0 CCAPM1=0X42; //設(shè)置模塊1工作方式 } else //設(shè)置前半周期 { P14=0; CCAPM1=0X00; //關(guān)閉模塊1 CCAPM0=0X42; //設(shè)置模塊0工作方式 } CR=1; //開(kāi)PCA計(jì)數(shù) } if(zf==0) //將下一小格的占空比賦給相應(yīng)值 { CCAP0H=pwm[index]; } else { CCAP1H=pwm[index]; } } void main(void) { P14=0; P13=0; EA=1;//開(kāi)總中斷 init_pca(); init_timer(); while(1)//主循環(huán) {//彩燈程序 和1602顯示程序 } }