例说51单片机4-学习基本定时器

时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……

例说51单片机4-学习基本定时器.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219