文章目录
工程结构:
原理图:
main.c
/**
* Interrupt Registers Definition
*/
sfr IE = 0xA8; /* Interrupt Enable Register */
/**
* Interrupt Registers Bits Definition
*/
/** IE */
#define GLOBAL_IE_EA (0x80)
#define T1_IE_ET1 (0x08)
/**
* Timer 1 Registers Definition
*/
sfr TCON = 0x88; /* Timer 0 & Timer 1 Control Register */
sfr TMOD = 0x89; /* Timer 0 & Timer 1 Working Mode */
sfr TL1 = 0x8B; /* Timer 1 Counter Low Register */
sfr TH1 = 0x8D; /* Timer 1 Counter High Register */
sfr AUXR = 0x8E; /* Auxiliary Register */
/**
* Timer 1 Registers Bits Definition
*/
/** TCON */
#define T1_TCON_TF1 (0x80) /* Timer 1 - Overflow Flag */
#define T1_TCON_TR1 (0x40) /* Timer 1 - Run Control */
/** TMOD */
#define T1_TMOD_GATE (0x80) /* Timer 1 - Gate Control */
#define T1_TMOD_CT (0x40) /* Timer 1 - Counter or Timer Selection */
#define T1_TMOD_M1 (0x20) /* Timer 1 - Mode Selection Bit 1 */
#define T1_TMOD_M0 (0x10) /* Timer 1 - Mode Selection Bit 0 */
/** AUXR */
#define T1_AUXR_T1x12 (0x40) /* Timer 1 - Clock Divider Control */
/**
* Port 1 Registers Definition
*/
sfr P1 = 0x90; /* Port 1 Register */
sfr P1M1 = 0x91; /* Port 1 Configuration Register 1 */
sfr P1M0 = 0x92; /* Port 1 Configuration Register 0 */
/**
* Port 1 Registers Bits Definition
*/
#define P12M1 (0x04) /* P1.2 - Mode Selection Bit 1 */
#define P12M0 (0x04) /* P1.2 - Mode Selection Bit 0 */
#define enableInterrupts() IE |= GLOBAL_IE_EA
#define disableInterrupts() IE &= ~GLOBAL_IE_EA
#define INTERNAL_RC_OSCILLATOR_FREQUENCY_11059200HZ (11059200L) /* 11.0592 MHz */
#define INTERNAL_RC_OSCILLATOR_FREQUENCY_12000000HZ (12000000L) /* 12.0000 MHz */
#define SYSTEM_CLOCK (INTERNAL_RC_OSCILLATOR_FREQUENCY_12000000HZ)
sbit LED = P1^2; /* LED Control Bit. 0: On, 1: Off */
/**
* Timer 1 - Mode 0 - 16-Bit Auto Reload
*/
void main() {
unsigned int period = 1000; // 定时器计数周期,溢出频率 = 1 / 定时器计数周期
unsigned char divider = 1; // 时钟分频器
TMOD &= ~(T1_TMOD_M0 | T1_TMOD_M0); // T1 工作模式 0:16 位自动重载模式
TMOD &= ~T1_TMOD_CT; // T1 作为定时器(对内部系统时钟进行计数)
TMOD &= ~T1_TMOD_GATE; // T1 的运行只受 TR1 影响,与 INT1 无关
AUXR |= T1_AUXR_T1x12; // 不分频 T1 的时钟
divider = ((AUXR & T1_AUXR_T1x12) == T1_AUXR_T1x12) ? 1 : 12;
TH1 = (65536 - SYSTEM_CLOCK / divider / period) >> 8;
TL1 = (65536 - SYSTEM_CLOCK / divider / period);
IE |= T1_IE_ET1; // 允许 T1 在计数溢出之后请求中断
TCON |= T1_TCON_TR1; // 允许 T1 开始计数
P1M1 &= ~P12M1;
P1M0 |= P12M0;
enableInterrupts();
while(1) {}
}
void timer1InterruptService() interrupt 3 {
LED = !LED;
}
STC-ISP 的下载选项: