定时器
# 定时器
# 1、定时器的基本概念
(对于51单片机的定时器看来几篇博客,写的和详细,所以就没再自己详细写,感谢大佬们的分享🌼🌷🌹)
(13条消息) 【51单片机】十分钟学会定时器&中断¹_51单片机定时器_謓泽的博客-CSDN博客 (opens new window)
(13条消息) 【51单片机】配置定时器_定时器里面的t0count是什么_謓泽的博客-CSDN博客 (opens new window)
(六)51单片机基础——定时器_单片机定时器_花园宝宝小点点的博客-CSDN博客 (opens new window)
# 2、初识化定时器函数
- GATE 连接的是非门(即为取反,就是0变为1,1变为0)
- ——INTO连接的是或门(有1为1,全0为0)
- TR0连接的是与门(全1为1,其余为0)
- 步骤
- 先配置TMOD(定时器模式)和TCON(定时器控制寄存器)
- 设置定时初值
- 配置中断寄存器
void Timer0Init(void)
{
//配置定时器模式(TMOD)
TMOD&=0xF0; //把TMOD的低四位清零,高四位保持不变
TMOD|=0x01; //把TMOD的高四位保持不变,最低位置为1
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
//配置定时器控制寄存器(TCON)
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
//配置中断寄存器
ET0=1;
EA=1;
PT0=0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 3、定时器中断处理函数
//基础模板
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++; //T0Count计次,对中断频率进行分频
if(T0Count>=500) //分频500次,500ms
{
T0Count=0;
//if(LEDMode==0) //模式判断
// P2=_crol_(P2,1); //LED输出
//if(LEDMode==1)
// P2=_cror_(P2,1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 中断函数注意要重新赋定时初值
- 我们上面创建的定时函数是1ms溢出一次,即执行一次中断函数,所以要每0.5s进行一次操作,需要有个变量 T0Count 里进行计数
# 4、循环移位函数
#include <INTRINS.H>函数库里有
_cror_(unsigned char,unsigned char); 循环右移函数
_crol_(unsigned char,unsigned char); 循环左移函数
P2=0xFE; //1111 1110 //P2=_crol_(P2,1); //P2= 1111 1101 //即是8位数在首尾循环,不会出现越界问题 P2=_crol_(P2,8); //P2= 1111 1110
1
2
3
4
补充:我们上面使用的是16位定时器,16位定时器的计数比较多,但是每次需要我们自己重新赋初值,而8位的就是将16位分开,一个计数,一个存放初值,每次计数完成后,AR会自动将初值给CNT,不用我们自己代码赋初值,比较快,但是计数范围小
编辑 (opens new window)
上次更新: 2023/09/13, 12:29:52