身家过亿的帝都太子妃参加1024盛典,小码农弟弟为他献上定时器一篇
内部定时器/计数器中断
1.定时/计数器的概念
1 、 定时/计数器是单独的硬件功能模块。就是一个容量固定的杯子。每个脉冲就是往杯子里滴一滴水。当杯子里的水满了就溢出,于是向 CPU 申请中断, CPU 跑去执行定时/计数器服务函数。但是定时/计数器则继续定时或者计数。两者各自运行。杯子里预装多少滴水,就叫装初值
2 、 如果用作定时器功能,脉冲信号是来自晶振时钟电路,频率固定,所以能精确定时。
如果用作计数器功能,脉冲信号来自外部引脚的输入,INT/T0(P3.4) 、 INT/T1(P3.5)
2.定时/计数器的模式
STC15 单片机总共有5个定时/计数器硬件和两个 PCA 模块可以做定时器。5个可以同时运行。可以配置多种模式。T0 有模式0、模式1、模式2、模式3。 T1只有模式0、模式1,模式2没有模式 3 .T2\T3\T4.都只有模式0
1. 模式0是16位自动重装。容量是0-65535.
2.模式1是16位手动重装。容量是0-65535.
3.模式2是8位自动重装。自动重装初值,容量0-255
4.模式3不可屏蔽中断的16位自动重装。容量是0-65535
核心图
定时1ms
1.时钟12分频(我们使用传统51的速度)T0x12=0(也就是AUXR &= 0x7f)
进入脉冲就是24/12 = MHz
2.设置成定时模式C/T=0(也就是TMOD &= 0xf0)
3.定时器0启动:TR0=1
4.装初值,直接装入TH0,TL0即可
5.中断ET0,EA闭合
6.定时器0服务函数中P3.2口翻转,也就是LED1亮1ms灭1ms,重装TH0,TL0
void Timer0_Routine() interrupt 1
{
TH0 = 0xf8;
TL0 = 0x30;
LED1 = ~LED1;
}
采集图
所以1s就也好定时了,我们只需要操作中断服务函数即可
void Timer0_Routine() interrupt 1
{
static u16 count = 0;
//重装初值
TH0 = 0xf8;
TL0 = 0x30;//定时1ms
count++;
if(count>=1000)
{
count = 0;
LED1 = ~LED1;
}
}
采集图
|