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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

思考
1 2 3 4 我们仿真时看到延时并不是整 500ms,是怎么回事?应该怎么修正? 自己写一个以 10ms 为单位的初始值的宏 试着使用一下定时器的方式 0 试着读这一部分的数据手册,加深对定时器的理解
QQ : pzq@sparkcn.cn/csh@sparkcn
6/7
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn
2/7
Spark 嵌入式工作室 www.sparkcn.co.cc
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 次幂)
GATE:当 GATE 为 0 时表示定时器由内部的 TRx 位控制启、停。GATE=时,定时 器由 TRx 和外部引脚/INTx 共同控制启、停。 C/T:计数、定时方式选择位,C/T=1 时,定时器对外部脉冲计数;C/T=0 时,根据 机器周期计数(就是外部时钟的 1/12) M1、 M0:决定定时器的工作方式 M1 0 M0 0 工作方式 工作方式 0,13 位计数方式,相当于 5 位预分频的 8 位计数方式,非常不常用。 工作方式 1,16 位计数方式,也是最常用的方式 工作方式 2,8 位自动重装方式。T1 的这种方式最 常用于波特率发生器 工作方式 3,此方式下,T0 可做为两个独立的 8 位 定时器,T1 只能做波特率发生器使用
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
csh@sparkcn.cn
QQ 技术交流群:186232047 验证码:spark
因群加入成员很快,如遇群满,请到 www.sparkcn.co.cc 获取最新交流 群号,加入交流 代码包下载地址:www.sparkcn.co.cc 或直接到群里共享下载
QQ : pzq@sparkcn.cn/csh@sparkcn
我们在控制 LED 状态发生变化的语句(59 行)加入一个断点,在 59 行的边上点 一下即可。 注意观察图上 1 位置所指的值, 这个值是从上次运行以来经过的时间。 按两下 F5 后,如图
还是在图中 1 位位置处可以看到,这值是 500ms 多一点(这多出的一点大家想 想是什么回事?)多按几次,发现仍然是这个值,是符合我们的预期的。 下面大家就把程序下载到 spark51 学习板上运行看看结果。效果应该是 LED0 不 停的闪动。
1 2 3 4 5 6 7 8 void main(void) { u8 i = 0;
//使能独立 LED 的,即 LEDS6 输出低电平 LEDEN = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1;
QQ : pzq@sparkcn.cn/csh@sparkcn 4/7
Spark 嵌入式工作室 www.sparkcn.co.cc
7/7
下章预告:
下章我们将为大家带来“中断”概念的介绍, “中断”是单片机中很重要的一个 概念,学好中断对以后学习别的单片机系统也非常重要,都是相通的知识。
作者简介
Spark 嵌入式工作室,成立于 2010 年,致力于嵌入式方面的软、硬件开发和 研究,团队成员都是有经验的开发工程师,擅长使用 51 单片机、STM32。 联系方式 QQ:pzq@sparkcn.cn
QQ : pzq@sparkcn.cn/csh@sparkcn
3/7
Spark 嵌入式工作室 www.sparkcn.co.cc
11 12 13 14 15 16 17 18 } } TH0 = (u8)(TIMER_N_MS(50) >> 8); TR0 = 1; /* 等待 T0 溢出 */ while(0 == TF0); TR0 = 0; TF0 = 0;
仿真与下载
我们使用 TKStudio 的功能先仿真一下, 看是否达到我们的要求。 完整的工程代码 可以在代码包里找到。 在仿真里我们像前面章节一样,还是用到断点的功能来观察延时的结果,进入仿 真后,如图所示:
QQ : pzq@sparkcn.cn/csh@sparkcn
5/7
Spark 嵌入式工作室 www.sparkcn.co.cc
复位值 0
注意: “不能位寻址”的意思是是说这个寄存器无法一位一位操作,只能整个寄 存器一起操作。 这个寄存器低 4 位是控制 T0 的,高 4 位是控制 T1 的,它们的功能描述如下:
QQ : pzq源自文库sparkcn.cn/csh@sparkcn
1/7
Spark 嵌入式工作室 www.sparkcn.co.cc
Spark 嵌入式工作室 www.sparkcn.co.cc
第四章
使用定时器
本章我们将介绍 51 单片机上的定时器(也叫计数器)的使用,并用定时器来完 成精准的延时来控制 LED 灯的闪烁。 实验平台:Spark51 开发板 编程环境:TKStudio V4 + Keil 9.0
简介
先来了解一下 51 单片机的定时器系统。51 单片机内部有两个 16 位可编程 的定时器(计数器) ,分别是 T0 和 T1。Spark51 开发板上配的是 52 单片机,内 部多出一个定时器。这三个定时器即有定时功能,有也计数功功能。它们的工作 原理如下,CPU 一但设置好开启功能,定时器便在时钟的作用下开始计数,当计 数器计满之后(如 16 位的计数器达到 0xffff) ,再来一个脉冲,计数器就会溢出。 此时会有一个标志位会被设置,如果定时器的中断使能了的,此时会产生中断。 下面我们一起来看一下定时器相关的操作寄存器 1 工作方式寄存器(TMOD)地址:89H,不能位寻址 位 符号 7 GATE 6 C /T 0 5 M1 0 4 M0 0 3 GATE 0 2 C/T 0 1 M1 0 0 M0 0
9 10 11 12 13 14 15 16 } } /*设置 T0 为方式 1,内部 TR 控制启动,对 CPU 时钟 12 分频计数*/ TMOD = 0xF1; while (1) { LED0 = ~LED0; timer0_delay50ms(10);
L4.2 程序清单中大部我们在前面章节已经见过,不再赘述。 L4.2(13) 每次使用按位取反操作符把 LED 的状态取反。达到一亮一灭的效果。 L4.2(14) 调用我们前面写好的 delay()函数
0 1
1 0
1
1
2 控制寄存器(TCON)地址 :0x88H,可以位寻址 位 符号 7 TF1 6 TR 0 5 TF0 0 4 TR0 0 3 IE1 0 2 IT1 0 1 IE0 0 0 IT0 0
复位值 0
这个寄存器仅高 4 位是和定时器相关的(低 4 位和中断相关,后面中断的章节会 介绍)其功能如下: TR:控制定时器启动、停止 TF:定时器溢出标志。些时若相应的中断使能,会产生中断。中断响应后会自动 清零。若未使能中断,需软件清零。 我们本章将主要讲解一下最常用的工作方式 1 的使用方法。 工作方式 2 我们在讲
硬件连接
本次实验是用定时器方式来控制 LED 闪烁, 所以硬件部分和第三章 “流水灯实验” 的一样,这里就不再重复说明了。请参考前面的章节或完整原理图。
软件设计
本章实验的代码如下(L4.1) 程序清单 L4.1
1 2 3 4 5 6 7 8 9 10 sbit LED0 = P0 ^ 0; void timer0_delay50ms(u8 n) { u8 i = 0; for (i = 0; i < n; i++) { TL0 = (u8)(TIMER_N_MS(50)); #define MCU_CLOCK (11.0592) #define TIMER_N_MS(n) ((u16)(65536 - (MCU_CLOCK * 1E6 * n * 1E-3 / 12)))
相关文档
最新文档