實測可行,stc12,13,14輸出。
所有資料51hei提供下載:
swpm輸出.docx
(12.19 KB, 下載次數: 35)
2017-8-9 11:27 上傳
點擊文件名下載附件
spwm輸出代碼 下載積分: 黑幣 -5
單片機源程序如下:
- #include<STC12C5A60S2.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; //前后半周期標志
- 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[50]; //初始化spwm輸出的占空比!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- CCAP0H=pwm[0];
- CCAP1L=pwm[0]; //初始化spwm輸出的占空比
- CCAP1H=pwm[0];
- CR=1;//運行pca計數器
- }
- void init_timer(void)//計數器初始化函數
- {
- TMOD= 0x01; //計數器0工作在方式模式1
- TH0 = 0XF7;//T1的計數值為2048,若是11.0592M晶振,則中斷頻率為11.0592M/2048=5.4K
- TL0 = 0xFF; //T1的計數值低位
- AUXR=0xC0;//計數器均工作在1T模式。計數頻率11.0592M
- ET0 = 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; //關閉模塊0
- CCAPM1=0X42; //設置模塊1工作方式
- }
- else //設置前半周期
- {
- P14=0;
- CCAPM1=0X00; //關閉模塊1
- CCAPM0=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顯示程序
- }
- }
復制代碼
|