单片机at89s52定时器计数器

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

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

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

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

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

4、: 16位定时计数器 nM1 M0=10, 方式2: 自动重装入的8位定时计数器 nM1 M0=11, 方式3: T0成为两个独立的8位计数器 11 T=(M-TC)t 其中,T: 定时时间,M: 计数器的模,TC: 计数初值,t:计数器计数脉冲的周期(对于定时方式t = fosc/12)。 定时/计数器4种模式比较 12 nTF1,TF0 定时器T1,T0的溢出标志:计数器溢出时硬件自动 置位, 即TFx=1, 进入中断后再由硬件自动清除; nTR1,TR0 计数器T1,T0的控制位:由软件置位(计数器开始 工作)或清零(计数器停止工作). nIE1,IE0 外部中断INT1,INT0的请求

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

6、 16-Bit Counter (Timer 0 shown) 16 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运行 我们把这种控制定时器运行的方法叫硬触发,较少用,可 以用来测量正脉冲的宽度。 定时器/计数器运行控制方法 17 n根据要求给方式寄存器TMOD送一

7、个方式控制字, 以设定定时器的工作方式;(要考虑定时/计数范围, 重装方式) n根据需要给C/T送初值以确定需要的定时时间或计 数次数;(可选,缺省为0000) n根据需要给中断允许寄存器IE送中断控制字,以开 放相应的中断和设定中断优先级;(可选) n给TCON送命令字以启动或禁止C/T的运行。 定时器/计数器的初始化方法 18 n计数器初值: n设计数模值为M,计数初值设定为TC,计数器 计满为零所需的计数值为C,则:TC=M-C ( M=213,216,28) n定时器初值: nT=(M-TC)Tm , T为需要定时时间 初值TC=M-T/Tm n当定时或计数范围大于某一模式下的计数范围

8、时, 要用软件对溢出计数,以增加定时或计数的范围。 初值的计算 19 例: Fosc=12MHz,试计算定时时间2ms 所需的定时器的初值. n方式2、方式3 TMAX=0.256ms,所以必须将工作方式 设在方式0或方式1 n方式0:TC=213-2ms/1us=6192=1830H TL0=10H,TH0=0C1H 注意1830H到TH0、TL0的重新表达,主要是由 于TL0已经不是每256进1, 而是每32进1 n方式1:TC=216-2ms/1us =63536=0F830H TL0=30H,TH0=0F8H 20 n采用查询方式:程序一直检测TF0(或TF1),若TF0 1(或TF1

9、=1),说明定时时间到或计满数,从而 开始相应处理,如: while(TF0=0); / while(!TF0); TF0=0; /清除标志位 / 开始处理溢出事件 n采用中断方式:程序初始化时,设置定时器溢出中断 允许后,内部硬件自动检测到TF01(或TF1=1)时, 自动响应中断,进入中断服务程序。 CPU控制C/T的方式 21 例1:在P1.7引脚上输出50Hz的 方波,已知Fosc=12MHz。 22 解决定时器/计数器应用问题的一般流程 确定定时/计数对象 C/T初始化 工作模式 计算初值 中断或查询 启动C/T运行 编程实现 23 1、确定定时对象: 20ms 或 10ms ? 应

10、当为10ms,便于产生方波:每隔10ms引脚电平取反 。 2、Fosc=12MHz, 1Tm=1us, 产生10ms定时, 应选择 模式0、1、2、3 ? 应选择模式1,16位定时器,最大范围65.536ms。 分析: 50Hz的方波,周期为1/50=20ms 24 3、计算初值 TC=65536-10ms/1us=55536=0D8F0H 分析: 50Hz的方波,周期为1/50=20ms 25 编程实现(查询方式) #include /要用到SFR sbit SQW=P17;/*定义输出方波引脚*/ main() TMOD=0x01; /* T0 模式1, 定时, GATE=0 */ TR0

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

12、值 */ TL0=0xF0; ET0=1; EA=1; /* 允许T0中断 */ TR0=1;/* 启动 T0 运行 */ while(1); /* 无限循环作为main的结束 */ 27 编程实现(中断方式) void out_sqw(void) interrupt 1/*中断服务程序*/ /* TF0 标志被自动清除 */ SQW = ! SQW; /* 引脚每隔10ms电平取反,产生50Hz方波 */ TH0=0xD8; TL0=0xF0; /* 重赋初值 */ 28 例2 :在P1.0引脚上输出周期1秒,占空比 为20%的方波,已知Fosc=12MHz。 29 1、确定定时对象: 1s

13、、200ms 或 800ms ? 应当小于定时器的最大定时时间,对于模式1,最长为 65.536ms,为了便于计算,取50ms作为定时对象,再 用一个字节对溢出计数。 50ms * 4 = 200 ms 50ms * 16 = 800 ms 分析: 占空比20%的方波,周期为1s 30 2、Fosc=12MHz, 1Tm=1us, 产生50ms定时, 应选择 模式0、1、2、3 ? 应选择模式1,16位定时器,最大范围65.536ms。在所 有工作模式中,模式1的定时/计数范围是最大的。 分析: 占空比20%的方波,周期为1s 31 3、计算初值 TC=65536-50ms/1us=15536

14、=3CB0H 分析: 占空比20%的方波,周期为1s 32 编程实现(查询方式) #include /要用到SFR sbit 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定时

15、初值 */ TR1=1;/* 启动 T1 运行 */ 33 编程实现(查询方式) for(; ;)/* 无限循环作为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=0x

16、3C; TL1=0xB0; /* 每次要重新赋50ms 定时的初值*/ while( - overflow_counter); /end of for(; ;) /end of main 34 编程实现(中断方式) #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; /* 输出低电平 */ wh

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

当前位置:首页 > 中学教育 > 职业教育

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