硬件:STC12C5A60S2
功能:實現PWM波生成。該程序周期為256ms,輸出端口為P1.3。
代碼:
#include "reg51.h" #include "intrins.h" #define FOSC 11059260L #define T1MS (65536-FOSC/12/1000) //定時器產生的脈沖大約為1MS,PWM經過256分頻后的時間是256ms //通過調T1MS的數值,PWM的最大周期時間是16s。 typedef unsigned char BYTE; typedef unsigned int WORD; /*Declare SFR associated with the PCA */ sfr CCON = 0xD8; //PCA control register sbit CCF0 = CCON^0; //PCA module-0 interrupt flag sbit CCF1 = CCON^1; //PCA module-1 interrupt flag sbit CR = CCON^6; //PCA timer run control bit sbit CF = CCON^7; //PCA timer overflow flag sfr CMOD = 0xD9; //PCA mode register sfr CL = 0xE9; //PCA base timer LOW sfr CH = 0xF9; //PCA base timer HIGH sfr CCAPM0 = 0xDA; //PCA module-0 mode register sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH sfr CCAPM1 = 0xDB; //PCA module-1 mode register sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH sfr PCAPWM0 = 0xf2; sfr PCAPWM1 = 0xf3; void Delay_xms(unsigned int z){ unsigned char i, j; unsigned int k; for(k=0;k<z;k++){ // _nop_(); _nop_(); i = 12; j = 84; do{while (--j);} while (--i); } } //定時器0初始化 void Time0Init() { TMOD = 0x01; TL0=T1MS; TH0=T1MS>>8; TR0=1; ET0=1; EA=1; } void PWMInit() { CCON = 0; //Initial PCA control register //PCA timer stop running //Clear CF flag //Clear all module interrupt flag CL = 0; //Reset PCA base timer CH = 0; // CMOD = 0x00; //Set PCA timer clock source as Fosc/2 CMOD = 0x04; //Disable PCA timer overflow interrupt CCAP0H = CCAP0L = 0x80; //PWM0 port output 50% duty cycle square wave CCAPM0 = 0x42; //設備為定時器0溢出脈沖 CCAP1H = CCAP1L = 0xff; //PWM1 port output 0% duty cycle square wave PCAPWM1 = 0x03; CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode //and no PCA interrupt CR = 1; //PCA timer start run } void PWMSet(float a) //輸入a表示占空比 { CCAP0H =CCAP0L =(BYTE)((1-a)*256); } void main() { Time0Init(); PWMInit(); PWMSet(0.1); while(1) { PWMSet(0.5); //占空比為百分之50 Delay_xms(2000); } } //定時器0中斷 void tm0_isr() interrupt 1 using 1 { TL0=T1MS; TH0=T1MS>>8; }