/* --- STC12C5AxxSeries MCU PCA module as 16-bit Timer Demo --------*/ #include "reg51.h" #include "intrins.h" #define FOSC 11059200L #define T100Hz (FOSC / 12 / 100) 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 registers sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH sfr PCAPWM0 = 0xf2; sfr PCAPWM1 = 0xf3; sbit PCA_LED = P1^0; //PCA test LED BYTE cnt; WORD value; void PCA_isr() interrupt 7 using 1 { CCF0 = 0; //Clear interrupt flag CCAP0L = value; CCAP0H = value >> 8; //Update compare value value += T100Hz; if (cnt-- == 0) { cnt = 100; //Count 100 times PCA_LED = !PCA_LED; //Flash once per second } } void main() { 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/12 //Disable PCA timer overflow interrupt value = T100Hz; CCAP0L = value; CCAP0H = value >> 8; //Initial PCA module-0 value += T100Hz; CCAPM0 = 0x49; //PCA module-0 work in 16-bit timer mode and enable PCA interrupt CR = 1; //PCA timer start run EA = 1; cnt = 0; while (1); }