例说51单片机4-学习基本定时器
时间:2025-04-21
时间:2025-04-21
介绍8051定时器,讲解的不错,挺清晰明了
第四章 使用定时器
本章我们将介绍51单片机上的定时器(也叫计数器)的使用,并用定时器来完成精准的延时来控制LED灯的闪烁。 实验平台:Spark51开发板 编程环境:TKStudio V4 + Keil 9.0
简介
先来了解一下51单片机的定时器系统。51单片机内部有两个16位可编程的定时器(计数器),分别是T0和T1。Spark51开发板上配的是52单片机,内部多出一个定时器。这三个定时器即有定时功能,有也计数功功能。它们的工作原理如下,CPU一但设置好开启功能,定时器便在时钟的作用下开始计数,当计数器计满之后(如16位的计数器达到0xffff),再来一个脉冲,计数器就会溢出。此时会有一个标志位会被设置,如果定时器的中断使能了的,此时会产生中断。 下面我们一起来看一下定时器相关的操作寄存器 1 工作方式寄存器(TMOD)地址:89H,不能位寻址
注意:“不能位寻址”的意思是是说这个寄存器无法一位一位操作,只能整个寄存器一起操作。
这个寄存器低4位是控制T0的,高4位是控制T1的,它们的功能描述如下:
pzq@http://www.77cn.com.cn/csh@sparkcn
介绍8051定时器,讲解的不错,挺清晰明了
GATE:当GATE为0时表示定时器由内部的TRx位控制启、停。GATE=时,定时器由TRx和外部引脚/INTx共同控制启、停。
C/T:计数、定时方式选择位,C/T=1时,定时器对外部脉冲计数;C/T=0时,根据机器周期计数(就是外部时钟的1/12) M1、 M0:决定定时器的工作方式
2 控制寄存器(TCON)地址 :0x88H,可以位寻址
这个寄存器仅高4位是和定时器相关的(低4位和中断相关,后面中断的章节会介绍)其功能如下: TR:控制定时器启动、停止
TF:定时器溢出标志。些时若相应的中断使能,会产生中断。中断响应后会自动清零。若未使能中断,需软件清零。
我们本章将主要讲解一下最常用的工作方式1的使用方法。工作方式2我们在讲
pzq@http://www.77cn.com.cn/csh@sparkcn
介绍8051定时器,讲解的不错,挺清晰明了
UART的时候将会看到。别外两种用法大家可以试着自己做一下。
定时器一启动,它就在原来的数据上开始加1计数,假如TH0和TL0的值都为0,那么经过0xFFFF个机器周期后定时器的数值达到最大,再经过一个周期,定时器溢出,置溢出标志位。所以,定时器的定时周期为(655535(0xffff) + 1 – 定时器初值)*机器周期(即12外部时钟的时间)。我们推导一个以1ms为基准的定时器初值公式,设F 为单片的时钟(单位:MHZ),m为定时器初值,n为要定时的周期(单位:ms):
m = 65536 – (F*1E6 / 12 * 1E-3) (1En表示1 *10的n次幂)
硬件连接
本次实验是用定时器方式来控制LED闪烁,所以硬件部分和第三章“流水灯实验”的一样,这里就不再重复说明了。请参考前面的章节或完整原理图。
软件设计
本章实验的代码如下(L4.1) 程序清单L4.1
1 2 3 4 5 6 7 8 9
#define MCU_CLOCK (11.0592)
#define TIMER_N_MS(n) ((u16)(65536 - (MCU_CLOCK * 1E6 * n * 1E-3 / 12)))
sbit LED0 = P0 ^ 0;
void timer0_delay50ms(u8 n) {
u8 i = 0;
for (i = 0; i < n; i++) {
10 TL0 = (u8)(TIMER_N_MS(50));
pzq@http://www.77cn.com.cn/csh@sparkcn
介绍8051定时器,讲解的不错,挺清晰明了
11 TH0 = (u8)(TIMER_N_MS(50) >> 8); 12 TR0 = 1;
13 /* 等待T0溢出 */ 14 while(0 == TF0); 15 TR0 = 0; 16 TF0 = 0; 17 } 18 }
L4.1(1-2) 我们定了了两个宏定义,分别是系统时钟11.0592 MHz和定时器初始化用的初值,我们设定的是以1ms为单位的宏定义。大家可以和上面讲的公式比较一下。这里有一个C语言的知识点,在C语言中nEx表示n* 10的x次幂。 4.1(10) 使用上面定义的宏为TL0赋初值,用强制转换取低8位 4.1(11) 取高8位赋给TH0 4.1(12) 启动定时器0
4.1(13) 等待定时器计数溢出,这里用了常量在前,变量在后的相等比较技巧,这个技巧并不是针对初学者,这是开发中一个非常好的习惯,应当一直保持 4.11(14 - 15) 定时器溢出了,停止定时器
4.11(16) 清除定时器溢出标志(非常重要,可以和后面的中断方式比较一下) 程序清单L4.2
1 2 3 4 5 6 7 8
void main(void) {
u8 i = 0;
//使能独立LED的,即LEDS6输出低电平 LEDEN = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1;
pzq@http://www.77cn.com.cn/csh@sparkcn
介绍8051定时器,讲解的不错,挺清晰明了
9
/*设置T0为方式1,内部TR控制启动,对CPU时钟12分频计数*/ 10 TMOD = 0xF1; 11
while (1) 12 {
13 LED0 = ~LED0; 14 timer0_delay50ms(10); 15 } 16 }
L4.2程序清单中大部我们在前面章节已经见过,不再赘述。
L4.2(13) 每次使用按位取反操作符把LED的状态取反。达到一亮一灭的效果。 L4.2(14) 调用我们前面写好的delay()函数
仿真与下载
我们使用TKStudio的功能先仿真一下,看是否达到我们的要求。完整的工程代码可以在代码包里找到。
在仿真里我们像前面章节一样,还是用到断点的功能来观察延时的结果,进入仿真后,如图所示:
pzq@http://www.77cn.com.cn/csh@sparkcn
介绍8051定时器,讲解的不错,挺清晰明了
我们在控制LED状态发生变化的语句( …… 此处隐藏:1308字,全部文档内容请下载后查看。喜欢就下载吧 ……
下一篇:LTE系统信令流程全集