STC89C52RC定时器
2024-05-04 01:07:05 454
如电路图
定时器分为四个模块
- 时钟源模块
- 计数器模块
- 控制逻辑模块
- 中断模块 (notify)
如果要使用定时器, 需要对模块对应的寄存器做初始化
本次选择定时器0
, 工作模式1
配合芯片手册
初始化TCON和TMOD两个地址
所以
- 时钟源模块
- 控制模块
- 中断模块
M1/M0
两位共同选择模式, 赋值01
代表模式1
- 计数器模块
综上
TMOD
TMOD为不可位寻址 所以进行整体赋值
0000 0001
即
TMOD = 0x01
TCON
TCON可位寻址, 所以可以一个一个赋值
TF0=0
TR0=1
IE0=1
IT0=0
计数器
TH0=0xFC
TL0=0x66
附代码
#include "reg52.h"
#include "lcd1602.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED1 = P2^0;
void time0_init(void) {
//选择为定时器0模式, 工作方式1
TMOD = 0x01;
// 给定时器赋初值, 定时1ms
TH0 = 0xFC;
TL0 = 0x66;
// 打开定时器0中断允许
ET0 = 1;
// 打开总中断
EA = 1;
// 复位
TF0 = 0;
// 最后一步打开定时器
TR0 = 1;
}
void main() {
LCD_Init();
time0_init();
while(1) {
}
}
u16 a = 0;
u16 i = 0;
// 定时器0中断函数
void time0() interrupt 1 {
// 定时器重新赋初值, 定时1ms
TH0 = 0xFC;
TL0 = 0x66;
i++;
if (i == 1000) {
i = 0;
LED1 = !LED1;
a++;
LCD_ShowNum(1, 1, a, 3);
}
}
烧录好程序, 即可看到LCD每隔1s (存在误差)自增, LED也进行亮灭