專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

STC12C5A60S2單片機(jī)產(chǎn)生SPWM主程序C代碼

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年02月12日   【字體:

本程序通過(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顯示程序
}
}
 
關(guān)閉窗口

相關(guān)文章