单片机-at89s52定时器计数器资料

上传人:n**** 文档编号:93085997 上传时间:2019-07-16 格式:PPT 页数:76 大小:792KB
返回 下载 相关 举报
单片机-at89s52定时器计数器资料_第1页
第1页 / 共76页
单片机-at89s52定时器计数器资料_第2页
第2页 / 共76页
单片机-at89s52定时器计数器资料_第3页
第3页 / 共76页
单片机-at89s52定时器计数器资料_第4页
第4页 / 共76页
单片机-at89s52定时器计数器资料_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《单片机-at89s52定时器计数器资料》由会员分享,可在线阅读,更多相关《单片机-at89s52定时器计数器资料(76页珍藏版)》请在金锄头文库上搜索。

1、1,第8章 定时器/计数器,第一节 概述 第二节 模式0、模式1及其应用 第三节 模式2及其应用 第四节 模式3及其应用 第五节 定时器/计数器2,2,第一节 概述,回忆8051结构特点:由单一内部总线连接各功能模块,通过特殊功能寄存器(SFR)集中控制。嵌入式结构,不同型号引脚定义和SFR定义有所不同,因此,从两个方面来认识和掌握某一个功能模块。 相关引脚功能 相关SFR功能,4,两个16位定时计数器,最大计数范围:0000-FFFFH。 相关的SFR:TMOD、TCON、TH0、TL0、TH1、TL1。 相关引脚:T0、T1、INT0、INT1。 4种工作方式。,8051定时器/计数器概况

2、,5,T0、T1相关引脚,T0、T1:计数脉冲输入,定时方式时不用,作I/O INT0、INT1:与定时器运行控制有关,也可以无关,可编程设定,6,T0、T1相关SFR,7,定时器/计数器原理,8,定时功能:对固定频率的机器周期计数, 每个机器周期定时器加1,计数速率=Fosc/12 计数功能:对外部引脚(T0和T1)上的负跳变计数,每产生 一个负跳变,计数器加1,要求高低电平均要大 于1Tm, 计数速率Fosc/24,9,以N位计数器构为核心,要解决以下问题: (1)、何时控制启动、停止计数? (2)、如何控制定时还是计数? (3)、如何控制定时/计数的长短? (4)、如何用查询或中断管理溢

3、出事件?,10,GATE 选通门: GATE=0时, 只要TRx=1,计数器就开始工作; GATE=1时, 只有INTx脚和TRx同时为“1”时,计数器才开始工作.主要用于测量INTx脚上高电平脉冲的宽度. C/T 计数/定时方式选择位: C/T=1时,计数方式. 即计数器的计数脉冲来自T0或T1引脚的外部事件.C/T=0时:定时方式,计数脉冲来自内部振荡频率fosc的12分频.,模式寄存器TMOD (SFR的地址:89H,不可按位寻址),11,M1、M0 模式选择:分别对应四种模式. M1 M0=00, 方式0:13位定时计数器 M1 M0=01, 方式1: 16位定时计数器 M1 M0=1

4、0, 方式2: 自动重装入的8位定时计数器 M1 M0=11, 方式3: T0成为两个独立的8位计数器,12,T=(M-TC)t 其中,T: 定时时间,M: 计数器的模,TC:计数初值,t:计数器计数脉冲的周期(对于定时方式t = fosc/12)。,定时/计数器4种模式比较,13,TF1,TF0 定时器T1,T0的溢出标志:计数器溢出时硬件自动置位, 即TFx=1, 进入中断后再由硬件自动清除; TR1,TR0 计数器T1,T0的控制位:由软件置位(计数器开始工作)或清零(计数器停止工作). IE1,IE0 外部中断INT1,INT0的请求标志:当单片机检测到INTx引脚上有低电平或下降沿时

5、, IEx=1,申请中断. IT1,IT0 外中断触发类型控制:ITx=1时,外中断信号的下降沿触发IEx标志,ITx=0时,外中断信号的低电平触发IEx标志.,控制寄存器TCON (SFR地址:88H),(LSB),(MSB),14,第一节 概述 第二节 模式0、模式1及其应用 第三节 模式2及其应用 第四节 模式3及其应用 第五节 定时器/计数器2,15,Timer/Counter 0/1 Mode 0: 13-Bit Counter (Timer 1 shown),16,Timer/Counter 0/1 Mode 1: 16-Bit Counter (Timer 0 shown),17

6、,1、设置GATE=0,则GATE=1, 因此Y=TR0,这样: TR0=1; 启动定时器T0运行 TR0=0; 停止定时器T0运行 我们把这种控制定时器运行的方法叫软触发,最常用。 2、设置GATE=1,则GATE=0, 因此Y=TR0*INT0电平, 进一步令TR0=1, 则Y=INT0电平, 这样: INT0为高电平,启动定时器T0运行 INT0为低电平,停止定时器T0运行 我们把这种控制定时器运行的方法叫硬触发,较少用,可以用来测量正脉冲的宽度。,定时器/计数器运行控制方法,18,根据要求给方式寄存器TMOD送一个方式控制字,以设定定时器的工作方式;(要考虑定时/计数范围,重装方式)

7、根据需要给C/T送初值以确定需要的定时时间或计数次数;(可选,缺省为0000) 根据需要给中断允许寄存器IE送中断控制字,以开放相应的中断和设定中断优先级;(可选) 给TCON送命令字以启动或禁止C/T的运行。,定时器/计数器的初始化方法,19,计数器初值: 设计数模值为M,计数初值设定为TC,计数器计满为零所需的计数值为C,则:TC=M-C (M=213,216,28) 定时器初值: T=(M-TC)Tm , T为需要定时时间 初值TC=M-T/Tm 当定时或计数范围大于某一模式下的计数范围时,要用软件对溢出计数,以增加定时或计数的范围。,初值的计算,20,例: Fosc=12MHz,试计算

8、定时时间2ms所需的定时器的初值.,方式2、方式3 TMAX=0.256ms,所以必须将工作方式设在方式0或方式1 方式0:TC=213-2ms/1us=6192=1830H TL0=10H,TH0=0C1H 注意1830H到TH0、TL0的重新表达,主要是由 于TL0已经不是每256进1, 而是每32进1 方式1:TC=216-2ms/1us =63536=0F830H TL0=30H,TH0=0F8H,21,采用查询方式:程序一直检测TF0(或TF1),若TF01(或TF1=1),说明定时时间到或计满数,从而开始相应处理,如: while(TF0=0); / while(!TF0); TF

9、0=0; /清除标志位 / 开始处理溢出事件 采用中断方式:程序初始化时,设置定时器溢出中断允许后,内部硬件自动检测到TF01(或TF1=1)时,自动响应中断,进入中断服务程序。,CPU控制C/T的方式,22,例1:在P1.7引脚上输出50Hz的方波,已知Fosc=12MHz。,23,解决定时器/计数器应用问题的一般流程,确定定时/计数对象 C/T初始化 工作模式 计算初值 中断或查询 启动C/T运行 编程实现,24,1、确定定时对象: 20ms 或 10ms ? 应当为10ms,便于产生方波:每隔10ms引脚电平取反。 2、Fosc=12MHz, 1Tm=1us, 产生10ms定时, 应选择

10、模式0、1、2、3 ? 应选择模式1,16位定时器,最大范围65.536ms。,分析: 50Hz的方波,周期为1/50=20ms,25,3、计算初值 TC=65536-10ms/1us=55536=0D8F0H,分析: 50Hz的方波,周期为1/50=20ms,26,编程实现(查询方式),#include /要用到SFR sbit SQW=P17; /*定义输出方波引脚*/ main() TMOD=0x01; /* T0 模式1, 定时, GATE=0 */ TR0=1; /* 启动 T0 运行 */ while(1) /* 无限循环作为main的结束 */ TH0=0xD8; TL0=0xF

11、0; /* 每次要重新赋10ms 定时的初值*/ while (! TF0); TF0=0; /* 查询等10ms时间到,并清除标志 */ SQW = ! SQW ; /* 引脚每隔10ms电平取反,产生50Hz方波*/ ,27,编程实现(中断方式),#include /* 要用到SFR */ sbit SQW=P17; /*定义输出方波引脚*/ main() /*主程序*/ TMOD=0x01; /* T0 模式1, 定时, GATE=0 */ TH0=0xD8; /* 赋初值 */ TL0=0xF0; ET0=1; EA=1; /* 允许T0中断 */ TR0=1; /* 启动 T0 运行

12、 */ while(1); /* 无限循环作为main的结束 */ ,28,编程实现(中断方式),void out_sqw(void) interrupt 1 /*中断服务程序*/ /* TF0 标志被自动清除 */ SQW = ! SQW; /* 引脚每隔10ms电平取反,产生50Hz方波 */ TH0=0xD8; TL0=0xF0; /* 重赋初值 */ ,29,例2 :在P1.0引脚上输出周期1秒,占空比为20%的方波,已知Fosc=12MHz。,30,1、确定定时对象: 1s、200ms 或 800ms ? 应当小于定时器的最大定时时间,对于模式1,最长为65.536ms,为了便于计算

13、,取50ms作为定时对象,再用一个字节对溢出计数。 50ms * 4 = 200 ms 50ms * 16 = 800 ms,分析: 占空比20%的方波,周期为1s,31,2、Fosc=12MHz, 1Tm=1us, 产生50ms定时, 应选择模式0、1、2、3 ? 应选择模式1,16位定时器,最大范围65.536ms。在所有工作模式中,模式1的定时/计数范围是最大的。,分析: 占空比20%的方波,周期为1s,32,3、计算初值 TC=65536-50ms/1us=15536=3CB0H,分析: 占空比20%的方波,周期为1s,33,编程实现(查询方式),#include /要用到SFR sb

14、it SQW=P10; /*定义输出方波引脚*/ bit will_be_high=0; /*定义一个标志位,0:将要输出低电平, 1:将要输出高电平*/ unsigned char overflow_counter=16; /*由800ms低电平开始,减到0,时间到,改200ms定时, overflow_counter=4 */ main() TMOD=0x10; /* T1 模式1, 定时, GATE=0 */ TH1=0x3C; TL1=0xB0; /* 赋50ms定时初值 */ TR1=1; /* 启动 T1 运行 */,34,编程实现(查询方式),for(; ;) /* 无限循环作为

15、main的结束 */ /* 如果要输出高电平,则输出高电平,4*50ms,下一次将为低电平;否则输出低电平,16*50ms,下一次将为高电平 */ if (will_be _high) overflow_counter=4; SQW=1; will_be _high=0; else overflow_counter=16; SQW=0; will_be _high=1; do while (! TF1); TF1=0; /* 查询等50ms时间到,并清除标志 */ TH1=0x3C; TL1=0xB0; /* 每次要重新赋50ms 定时的初值*/ while( - overflow_count

16、er); /end of for(; ;) /end of main,35,编程实现(中断方式),#include /要用到SFR sbit SQW=P10; /*定义输出方波引脚*/ bit is_high=0; /当前状态 unsigned char overflow_counter=16; /*由800ms低电平开始,减到0,时间到,改200ms定时, overflow_counter=4 */ main() TMOD=0x10; /* T1 模式1, 定时, GATE=0 */ TH1=0x3C; TL1=0xB0; /* 赋50ms定时初值 */ ET1=1; EA=1; /* 允许T1中断 */ TR1=1; /* 启动 T1 运行 */ SQW=0; /* 输出低电平 */ while(1); /* 无限循环

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号