Presentation is loading. Please wait.

Presentation is loading. Please wait.

单片机应用技术 (C语言版) 第7章 定时器/计数器

Similar presentations


Presentation on theme: "单片机应用技术 (C语言版) 第7章 定时器/计数器"— Presentation transcript:

1 单片机应用技术 (C语言版) 第7章 定时器/计数器
2019/5/21

2 第7章 定时器/计数器 目 录 7.1 定时器/计数器的结构及原理 7.2 定时器/计数器的控制 7.3 定时器/计数器的工作方式
第7章 定时器/计数器 目 录 7.1 定时器/计数器的结构及原理 7.2 定时器/计数器的控制 7.3 定时器/计数器的工作方式 7.4 定时器/计数器应用举例 2019/5/21

3 本章主要讨论MCS-51单片机定时器/计数器的逻辑结构和工作原理。内容主要有定时器T0、T1的逻辑结构,工作方式的选择和应用。 本章为单片机的主要内容,也是第8章串行口的学习的基础。
2019/5/21

4 89c51 有2个可独立控制的16位定时器/计数器: T0、T1
7.1 MCS-51 计数/定时器的原理 实质是计数器,脉冲每次下降沿,计数器加1. 计数脉冲来源于内部的晶振,由于周期极为准确,称定时器。 计数脉冲来源于外部引脚,由于周期一般不准确,称为计数器。 +1计数器 溢出 中断 脉冲 控制 开关 89c51 有2个可独立控制的16位定时器/计数器: T0、T1 计数(定时)周期:机器周期 2019/5/21

5 计数周期的计算: 12MHz晶振:每计一个数的时间为1uS。如:计100个数的时间为100uS。计50000个数的时间为50mS。 11
计数周期的计算: 12MHz晶振:每计一个数的时间为1uS。如:计100个数的时间为100uS。计50000个数的时间为50mS。 MHz晶振:每计一个数的时间为1.085uS。 2019/5/21

6 几个基本概念 1、计数器的容量:容量一般用二进制的位数表示。 2、加1计数器:每来一个脉冲,计数数值加1。 3、计数器溢出:计数器计数达到容量的最大值时,再来一个脉冲,计数值将回到0,重新计数,且相应的标志位置1,称为“溢出”。 4、计数初值:计数器开始计数的值。 2019/5/21

7 MCS-51定时/计数器的结构 2019/5/21

8 两个16位的可编程定时器/计数器:定时器/计数器0、1。 每个定时器有两部分构成:THx和TLx
MCS-51定时/计数器结构说明: 两个16位的可编程定时器/计数器:定时器/计数器0、1。 每个定时器有两部分构成:THx和TLx 特殊功能寄存器TMOD和TCON ,主要对T0和T1进行控制。 引脚P3.4、P3.5,输入计数脉冲。 特殊功能寄存器之间通过内部总线和控制逻辑电路连接起来。 2019/5/21

9 MCS-51定时/计数器的工作原理 定时器/计数器T0、T1 的内部结构简图如下图所示。 C/T=0 中断请求 振荡器 T H x ( 8
) TLx Tx 12 分频 TFx C/T=1 控制 TRx 2019/5/21

10 计数信号由片内振荡电路提供,振荡脉冲12分频送给计数器,每个机器周期计数器值增1。
从上图可以看出: 定时器的实质是一个加1计数器。 C/T =0 ,为定时器方式。 计数信号由片内振荡电路提供,振荡脉冲12分频送给计数器,每个机器周期计数器值增1。 2019/5/21

11 计数信号由Tx引脚(P3.4、P3.5)输入,每输入一有效信号,相应的计数器中的内容进行加1。
C/T =1 ,为计数方式。 计数信号由Tx引脚(P3.4、P3.5)输入,每输入一有效信号,相应的计数器中的内容进行加1。 控制信号TRx=1时,定时器启动。 当定时器由全1加到全0时计满溢出,从0开始继续计数,TFx=1 ,向CPU申请中断。 2019/5/21

12 7.2.2 T0、T1的控制寄存器TCON 7.2 定时器/计数器的控制 TF1、TF0:T1、T0的溢出标志位 计数溢出,TFx=1。
7.2 定时器/计数器的控制 T0、T1的控制寄存器TCON TCON (88H) D7 D6 D5 D4 D3 D2 D1 D0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 定时器的控制寄存器 TF1、TF0:T1、T0的溢出标志位 计数溢出,TFx=1。 中断方式:自动清零; 查询方式:软件清零。 2019/5/21

13 TR1、TR0:T1、T0启停控制位。 置1,启动定时器; 清0,关闭定时器。 IE1、IE0:外部中断1、0请求标志位
IT1、IT0:外部中断1、0触发方式选择位 2019/5/21

14 TMOD不能位寻址 7.2.1 T0、T1 工作方式寄存器TMOD 功能:确定定时器的工作方式。 其格式如图所示:
(89H) D7 D6 D5 D4 D3 D2 D1 D0 GATE C/T M1 M0 定时器工作方式寄存器TMOD GATE——外部门控制位。 GATE=0,不使用外部门控制计数器 GATE=1,使用外部控制门。 TRx=1, P3.2(P3.3)=1时,启动定时器。 2019/5/21

15 C/T——定时或计数方式选择位 。 C/T=0时,为定时器 C/T=1时,为计数器
计数器时采样过程:CPU在每机器周期S5P2期间,输入信号进行采样。若前一机器周期采样值为1,下一机器周期采样值为0,则计数器增1,随后的机器周期S3P1期间,新的计数值装入计数器。 2019/5/21

16 补充(P 节) 由于检测一个从1---0的下降沿需要2个机器周期,因此被检测的外部输入脉冲的频率<=1/24×振荡频率。 例如:单片机晶振12MHz,则被检测的外部输入脉冲最高为500Hz。 P134 3(2) 2019/5/21

17 M1、M0——工作方式选择位。 如下表所示: 表7-1 定时器/计数器的工作方式 M1 M0 工作模式 功 能 模式0 13位定时器/计数器
表7-1 定时器/计数器的工作方式 M1 M0 工作模式 功 能 模式0 13位定时器/计数器 1 模式1 16位定时器/计数器 模式2 8位自动重装定时器/计数器 模式3 定时器0:TL0为8位定时器/计数器,TH0为8位定时器。 定时器1:停止使用 2019/5/21

18 注:方式0是为了与早期的MCS-48系列单片机兼容,现在不必使用,采用方式1替代方式0。
2019/5/21

19 7.3 定时器T0、T1的工作方式 2、 M1M0=01时,选择模式1。 T0的结构:16位定时器/计数器。 2019/5/21

20 (一次中断)定时时间=(216-定时初值)×机器周期 (一次中断)最大定时时间:216×机器周期
TL0:存放计数初值的低8位。 TH0: 存放计数初值的高8位; (一次中断)定时时间=(216-定时初值)×机器周期 (一次中断)最大定时时间:216×机器周期 注意:每次计满溢出后,计数器都复位为0,要进行新一轮的计数还需重新赋初值。(即方式1的初值不能保存住,每次都要重新赋初值) 举例方式1 2019/5/21

21 #include <reg51.h> sbit LED=P1^0; unsigned char t; void main() {
TMOD=0x10; //设置定时器1工作在方式1 TH1=( )/256; TL1=( )%256; //设置定时初值 TR1=1; //启动定时器1 2019/5/21

22 重新赋初值 EA=1; ET1=1;//允许定时器1中断 while(1); } void timer1( ) interrupt 3 {
TH1=( )/256; TL1=( )%256; t++; if(t==20) { LED=~LED; t=0; 编号 n 所代表的中断源 外部中断0 1 定时/计数器0 2 外部中断1 3 定时/计数器1 4 串口 重新赋初值 2019/5/21

23 方式1要进行新一轮计数,还需重新设置计数初值,不仅导致编程麻烦,而且影响定时时间精度。
有没有一种方式可以避免方式1的缺陷?? 2019/5/21

24 3、 M1M0 =10时,选择模式2。(8位自动重装定时器/计数器)
振荡器 12 分频 T P 3 . 4 TR TF 中断 GATE + C / = 1 TL 8 TH 2 2019/5/21

25 T0的结构: TL0:8位的定时器/计数器; TH0:8位预置寄存器,用于保存初值。 工作过程:当TL0计满溢出时,TF0置1,向CPU发出中断请求;同时引起重装操作(TH0的计数初值送到TL0),进行新一轮计数。 2019/5/21

26 注:(1)方式2具有自动重装初值的功能,但是由于是8位计数器,最大计数值为256,所以一次中断的最大定时时间为28×机器周期。 (一次中断)定时时间: (28-定时初值)×机器周期 (2)在模式2能够满足计数或定时要求时,尽可能使用模式2。 方式2举例 2019/5/21

27 #include <reg51.h> sbit P1_0=P1^0; void main( ) {
方式2: #include <reg51.h> sbit P1_0=P1^0; void main( ) { TMOD=0x02; //选择工作模式 TL0=0x06; TH0=0x06; //为定时器赋初值 EA=1; ET0=1; //允许定时0中断 TR0=1; //启动定时器0 while(1); //等待中断 } void time0( ) interrupt 1 P1_0=~P1_0; 方式2具有自动重装初值功能 不用重新赋初值 2019/5/21

28 4、定时器/计数器工作方式的选择方法 (1)首先确定计数值N (2)确定工作方式 原则是尽可能地选择模式2 2019/5/21

29 7.5 定时器/计数器C51编程 一、定时器的初始化步骤 2、设置定时器的计数初值。 设置THx和TLx。
1、确定工作方式,设置TMOD。 2、设置定时器的计数初值。 设置THx和TLx。 3、中断设置:设置IE(EA,ETx)。 4、启动定时器。设置TCON(TRx) 可以使用位操作指令。 2019/5/21

30 方式1:(一次中断)定时时间: (216-定时初值)×机器周期 方式2:(一次中断)定时时间: (28-定时初值)×机器周期
方式1:(一次中断)定时时间: (216-定时初值)×机器周期 方式2:(一次中断)定时时间: (28-定时初值)×机器周期 所以要确定定时初值 2019/5/21

31 二、 定时/计数器初值的计算 计数初值:C= 2n -N n:8/16 定时初值:C= 2n - t/T T:机器周期=12/晶振频率 如:晶振为12MHz时, T=1us 举例:单片机晶振12MHz,定时50ms,采用定时器0方式1,试计算初值,并装入TH0,TL0中。 2019/5/21

32 方法1: 初值: C=65536-50000=15536 =3CB0H ∴ TH0=3CH, TL0=B0H
2019/5/21

33 方法2 初值: TH0=(65536-N)/256; TL0=(65536-N)%256; N=t/T(计数个数)。 若采用的晶振为11
方法2 初值: TH0=(65536-N)/256; TL0=(65536-N)%256; N=t/T(计数个数)。 若采用的晶振为 MHz, T=1.09s,则定时50ms时,N=45872 2019/5/21

34 三、 定时器的应用举例 例1 单片机系统晶振频率为12MHz,利用定时器T0的方式2使P1.0口输出周期为0.2ms的方波信号。
三、 定时器的应用举例 例1 单片机系统晶振频率为12MHz,利用定时器T0的方式2使P1.0口输出周期为0.2ms的方波信号。 分析:每隔0.1ms改变一次P1.0的输出状态,即形成方波。 1、初值计算: 在方式2下:C= =156=9CH 2019/5/21

35 2、C语言程序: void main ( ) { TMOD=0x02; //T0工作在方式2 TL0=0x9c; //装入计数(重装)初值
#include <reg51.h> sbit p1_0=P1^0; //进行位定义 void main ( ) { TMOD=0x02; //T0工作在方式2 TL0=0x9c; //装入计数(重装)初值 TH0=0x9c; EA=1; //允许定时器1中断 ET0=1; //开中断 TR0=1 ; //启动定时器1 while(1); } 2019/5/21

36 IE (A8H) D7 D6 D5 D4 D3 D2 D1 D0 EA — ES ET1 EX1 ET0 EX0
中断允许寄存器 2019/5/21

37 void time0 ( ) interrupt 1 { p1_0=~p1_0; //取反,产生方波 } 编号 n 所代表的中断源
外部中断0 1 定时/计数器0 2 外部中断1 3 定时/计数器1 4 串口 2019/5/21

38 例2 设单片机晶振频率为12MHz,用定时器/计数器0编程实现从P1.0输出周期为500μs的方波。
分析: 定时时间: 方波周期为500μs,定时250μs。 方式选择: 定时器0可以选择方式1和2。方式2最大的定时时间为256μs,满足250μs的定时要求,选择方式2。 2019/5/21

39 (1)初值计算 C= /1 C=6;则TH0=TL0=6 (2)程序: A:采用中断处理方式的程序 : 2019/5/21

40 #include <reg51.h> sbit P1_0=P1^0; void main( )
{ TMOD=0x02; //选择工作模式 TL0=0x06; TH0=0x06; //为定时器赋初值 EA=1; ET0=1; //允许定时0中断 TR0=1; //启动定时器0 while(1); //等待中断 } void time0( ) interrupt 1 { P1_0=~P1_0; 2019/5/21

41 while (1) While(!TF0); B:采用查询方式处理的程序: # include <reg51.h>
sbit P1_0=P1^0; void main() { TMOD=0x02; TL0=0x06; TH0=0x06; TR0=1; while (1) { if(TF0==1) //查询计数溢出 TF0=0; P1_0=~P1_0; } While(!TF0); 2019/5/21

42 例3 利用定时器精确定时1s控制LED以秒为单位闪烁。已知fosc=12MHz。
分析:定时器/计数器在定时方式下,各个方式最大定时时间分别为: 方式1=65536×12/fosc=65.536ms 方式2=256×12/fosc=0.256ms 2019/5/21

43 定时时间为50ms,当50ms的定时时间到,中断一次,用变量记住中断次数,连续中断20次,正好1S,调用亮灯函数;
选择方式1。 定时时间为50ms,当50ms的定时时间到,中断一次,用变量记住中断次数,连续中断20次,正好1S,调用亮灯函数; 再连续定时20次,调用灭灯函数。循环工作,即达到1s闪烁1次的效果。 2019/5/21

44 #include <reg52.h> sbit LED=P2^0; unsigned char t; void main() {
2、程序设计: C语言程序: #include <reg52.h> sbit LED=P2^0; unsigned char t; void main() { LED=0; //定义灯的初始状态为灭 TMOD=0x10; //设置定时器1工作在方式1 TH1 =( )/256; TL1=( )%256; //设置定时初值 TR1=1; //启动定时器1 2019/5/21

45 中断服务程序中不要写过多处理语句 EA=1; ET1=1; //允许定时器1中断 while(1); }
void timer1() interrupt 3 { TH1 =( )/256; TL1=( )%256; t++; if(t==20) { LED=~LED; t=0; 编号 n 所代表的中断源 外部中断0 1 定时/计数器0 2 外部中断1 3 定时/计数器1 4 串口 中断服务程序中不要写过多处理语句 2019/5/21

46 四、 计数器的应用举例 每按一次按键,计数器加1,用液晶显示出来

47 void main( ) { uint x; TMOD=0x06; TL0=0; TH0=0; TR0=1; LcdInt( );
delay(5); while(1) x=TH0*256+TL0; write_zs(5,x); } 2019/5/21

48 本章首先总体简单介绍了MCS-51单片机定时器/计数器的结构、工作原理和相关的寄存器。
本章小结 本章首先总体简单介绍了MCS-51单片机定时器/计数器的结构、工作原理和相关的寄存器。 然后重点研究了MCS-51单片机定时器/计数器T0、T1的不同工作方式的结构和工作原理。 最后应用实例,讨论了各个定时器/计数器不同工作方式的应用。 2019/5/21

49 本章小结(续) MCS-51单片机定时器/计数器是单片机中非常重要、应用非常多的部件,单片机是否用得灵活、是否能够充分发挥单片机的功能与作用,与定时器/计数器是否掌握应用得好关系密切。 2019/5/21


Download ppt "单片机应用技术 (C语言版) 第7章 定时器/计数器"

Similar presentations


Ads by Google