《7单片机嵌入式系统原理及应用(贾好来)单片机的定时器和计数器.ppt》由会员分享,可在线阅读,更多相关《7单片机嵌入式系统原理及应用(贾好来)单片机的定时器和计数器.ppt(76页珍藏版)》请在优知文库上搜索。
1、127.1 定时器/计数器的结构7.2 8051的定时器/计数器T0和T1的控制7.3 AT89S52的定时器/计数器T27.4 定时监视器(Watchdog Timer)7.5 单片机定时器应用实例37.1 定时器/计数器的结构及工作原理 1. 定时/计数器的结构 在 8051单片机中,定时器/计数器就是一个固定长度的二进制计数器,当对输入脉冲信号的数量进行计数时,我们称其为计数器,当对单片机的系统时钟或其它标准时钟进行计数时,由于这类时钟信号本身就表示时间,计数值对应着时间值,所以从这个角度上将其称为定时器。如图7-3所示。 图7-3 定时器/计数器T1模式0逻辑结构图41. 定时器的组成
2、 在8051单片机中,内部定时器都是可编程控制的定时器/计数器,至少由两部分组成:脉冲计数电路和控制字寄存器及译码控制电路。在复杂一些的定时器中,还有预置数寄存器、多路开关等。2.定时/计数器的工作原理 可编程控制的计数器都是在程序写入控制字后按照控制逻辑的控制进行计数,所以在计数器开始工作前,必须要对定时器进行初始化设置。一般定时器初始化设置的主要内容有定时器的工作方式、计数的初值、中断的设置等。56 所有设置数据在专用寄存器中保存,通过译码控制逻辑实现对计数器的控制。如果不改变计数器的工作方式,可以一次设置多次使用,当要改变工作方式等设置时,要对需改变的内容重新设置。 当初始化设置完成后,
3、可以直接启动计数器开始计数定时,也可以先暂停计数,在需要时设置启动计数命令,开始计数 。3.定时器的溢出与重置 一般定时器在预置计数初值后计数,到计数器计满溢出后利用溢出标志信号实现查询或中断处理。定时器的定时长短就在计数初值上,计数初值越小,定时时间越长,计数初值越大,定时时间越短。 计数初值是通过程序预置的,溢出后计数器的值为0,需要重新置入。不同的计数器重置初值的方法不同,有自动重置的,也有只能在程序中重置的。由于计数器都是重复周期使用的,无论那种计数器,都要必须保证能可靠地实现初值重置。77.2 8051的定时器/计数器T0和T1的控制每个定时器的控制包含以下3部分: 可预置计数器TH
4、x和TLx构成可编程控制的计数器部分; 一个字节寄存器TMOD用于对两个定时器/计数器工作模式的编程控制; 工作控制及状态表示位寄存器TCON。89 8051单片机内部有两个定时器/计数器,分别为定时器0(T0)和定时器1(T1),其低位计数器分别被称为TL0(字节地址:8AH)和TL1(字节地址:8BH),高位计数器分别是TH0(字节地址:8CH)和TH1(字节地址:8DH),TL0和TH0组成T0,TL1和TH1组成T1。 两个计数器都是加法计数器,在预置数值的基础上进行加“1”操作,加到溢出时产生中断信号。当用作定时器时,是在内部对CPU的时钟脉冲计数;当用作计数器时,是对由相应输入引脚
5、输入的脉冲信号计数。7.2.1定时器/计数器T0和T1的专用寄存器 定时器初值预置实例 MOV TH0,#0F0H MOV TL0,#0CH MOV TL1,#9CH MOV TH1,#9CH注意,不存在指令 MOV T0,#9C9CH类似的指令!10112.工作方式控制寄存器TMOD TMOD的字节地址为89H,用于控制和选择定时/计数器的工作方式,高4位控制T1,低4位控制T0,注意不能采用位寻址方式。格式如下:图7-1 定时器T0和T1的工作模式控制寄存器TMOD TMOD中的GATE位是门控制位,若GATE = 0,定时器/计数器由TCON寄存器中的控制位 TRx 直接控制,TRx 位
6、为“1”时允许计数,TRx位为“0”时停止计数。 若GATE = 1,定时器/计数器由TCON寄存器中的控制位TRx和外部中断输入引脚 双重控制,当TRx位与 输入电平都为“1”时才允许计数,其它情况时都停止计数。 TMOD中的 位为定时/计数控制位,该位为“0”时,为定时器工作,对CPU时钟经12分频后形成的脉冲计数(对标准时钟计数就是计时);该位为“1”时,为计数器工作,对由外部引脚(T0、T1)输入的脉冲计数。12INTxINTxT/C TMOD寄存器中的M0、M1为工作模式设置位,可以设定定时器以四种工作模式中的一种模式工作,如表7-1所示。13143.控制寄存器TCON TCON的字
7、节地址是88H,用于控制定时/计数器的起停,定时/计数器的溢出标志。图7-2 控制寄存器TCONTF1 T1计数溢出标志位。当计数器 T1 计数计满溢出时,由硬件置1,申请中断。进入中断服务程序后由硬件自动清零。TR1 T1计数运行控制位。由软件置 1 或清 0。为1时允许计数器T1计数,为 0 时禁止计数器 T1 计数。TF0 T0计数溢出标志位。当计数器T0计数计满溢出时,由硬件置1,申请中断。进入中断服务程序后由硬件自动清零。TR0 T0计数运行控制位。由软件置1或清0,为1时允许计数器T0计数,为0时禁止计数器 T0 计数。15IE0外部中断0( )请求标志位。当CPU采样到INT0引
8、脚出现中断请求后,此位由硬件置1。在中断响应完成后转向中断服务程序时,再由硬件自动清0。这样,就可以接收下一次外中断源的请求。IE1外部中断1( )请求标志位,功能同上。IT0外中断0请求信号方式控制位。当IT0=1时下降沿信号有效;IT0=0时,低电平信号有效。IT1外中断1请求信号方式控制位。当IT1=1时下降沿信号有效;IT1=0时,低电平信号有效。160INT1INT17 7.2.2 定时器/计数器的工作方式 1. 工作方式0 13位定时/计数器当TMOD中的M1M0为00时,定时/计数器工作在方式0。此时的定时/计数器为13位,高8位由THx提供,低5位由 TLx提供。低5位计数溢出
9、后向高位进位计数,高8位计数器计满后置位溢出标志位(TCON中的TFx)。此种方式下计数器的最大计数次数为213=8192 。18方式0 0的计数值和定时时间: 作为计数器用,计数值: C=2C=213 13 - - 计数初值 = 8192 - = 8192 - 计数初值 作为定时器用,定时时间: t=(2t=(21313- -计数初值) ) * * 机器周期= =(8192-8192-计数初值)* *(12/12/foscosc) 19 2. 工作方式116位定时/计数器当TMOD中的M1M0为01时,定时/计数器工作在方式1。此时的定时/计数器为16位。高8位由THx提供,低8位由TLx提
10、供。低8位计数溢出后向高位进位计数,高8位计数器计满后置位溢出标志位(TCON中的TFx)。此种方式下计数器的最大计数次数为216=65536。 20方式0 0的计数值和定时时间: 作为计数器用,计数值: C=216-计数初值=65536-计数初值 作为定时器用,定时时间: t=(216-计数初值)*机器周期=(65536-计数初值)*(12/fosc)213. 工作方式2-自动重装初值的8位定时/计数器 当TMOD中的M1M0为10时,定时/计数器工作在方式2。此时的定时/计数器为8位自动重装初值的定时/计数器。使用TLx的8位作为计数器,THx的8位作为预置常数的寄存器。当低8为计数溢出时
11、置位溢出标志位,同时将高8位数据装入低8位计数器,继续计数。此种方式下计数器的最大计数次数为28=256。22 作为计数器用,计数值: C=28-计数初值=256-计数初值 作为定时器用,定时时间: t=(28-计数初值)*机器周期=(256-计数初值)*(12/fosc)234. 工作方式3-两个8位定时器/计数器 当TMOD中的M1M0为11时,定时/计数器工作在方式3。方式3只适用于T0,TL0的使用方法与方式0,方式1,方式2相同。方式3下的TH0,只可以用作简单的内部定时器。借用原定时器T1的控制位和溢出标志位TR1和TF1,同时占用了T1的中断源。TH0的启动和关闭仅受TR1的控制
12、:TR1=1,启动定时;TR1=0,停止定时。 24 当T0工作于方式3时,T1一般用作串行口波特率发生器。当设置好工作方式后,定时器T1自动开始运行;若要停止操作,只需要送入一个设置定时器1为方式3的方式控制字。通常把定时器T1设置成方式2作波特率发生器比较方便。图7-3 定时器/计数器T1模式0逻辑结构图25 图7-4 定时器/计数器T1模式1逻辑结构图26 图7-5 定时器/计数器T1模式2逻辑结构图27a)TL0作8位定时器28b)TH0作8位定时器图7-6 定时器/计数器 T0 模式3逻辑结构图图 7-7 T0工作在模式3时T1为模式0的工作示意图29图 7-8 T0工作在模式3时T
13、1为模式1的工作示意图图 7-9 T0工作在模式3时T1为模式2的工作示意图3031例7.1 8051单片机定时器作定时和计数时,其计数脉冲分别由谁提供?答:8051单片机定时器作定时,其计数脉冲由内部时钟提供;8051单片机定时器作计数时,其计数脉冲由外部脉冲提供。 32例7.2 用定时器0,方式2计数,要求每计满100次,将P1.0 端取反。 分析:TMOD=00000110B 计数初值:TH0=TL0=28-100=156=9CH 程序如下: ORG1000H START:MOVTMOD,#06H MOV TL0,#9CH MOV TH0,#9CH SETB TR0 LOOP:JBC T
14、F0,DONE ; 判计满100次否?若计; 满则清零TF0且转DONE SJMP LOOP DONE:CPL P1.0 SJMP LOOP33例7.3 已知单片机晶振频率为12MHz,要求使用T0定时0.5ms,使单片机P1.0引脚上连续输出周期为1ms的方波。分析:首先算出机器周期=12/(12MHz)=1us,所以0.5ms需要T0计数M次M=0.5ms/1us=500 2565008192,所以选择方式0 初值N=213-500=7692=1E0CH因为选用方式0,低8位TL0只使用低5位,其余的均计入高8位TH0的初值。 TL0=0CH, TH0=0F0H 34程序如下: ORG00
15、00HRESET: AJMPSTART ORG000BH AJMPT0INT ORG0100HSTART: MOVSP,#60H MOVTH0,#0F0H MOVTL0,#0CH SETBTR0 SETBET0 SETB EAMAIN: AJMPMAINT0INT: CPL P1.0 MOV TL0,#0CH MOV TH0,#0F0H RETI35 例7.3可以在P1.0脚上产生约500Hz的方波,但是定时精度不高。原因有两个:一个是中断服务子程序执行时间未计入在内;二是从中断申请到CPU响应这个中断所经历的时间未计入T0 定时,这个时间肯定是不确定的值,在允许T0中断嵌套时定时精度更差。
16、对定时精度要求十分精确的场合,可以对上述两项误差进行补偿。下述补偿方法。补偿方法的原理是:在中断服务子程序执行过程中关掉总中断,防止其它中断嵌套影响定时精度;用CLR TR0 指令停止 T0 计数,此时 T0 的计数值恰好反映了从T0溢出申请中断直到CPU响应中断这一段时间长短。把这个误差值按高8位和低5位分别加到T0的预置初值上去,这就补偿了CPU响应中断申请之前的定时误差;在中断服务子程序的关 T0 指令到启动 T0 指令之间还有14个机器周期的时间,也应该每次加在T0的预置初值上去。36例7.3 程序中的中断服务子程序应该改成,实现精确定时 T0INT: CLR EA;关中断 CLR TR0;停止T0 计数 MOV A,#0F0H;取高8位计算的初值 ADD A,TH0;加修正值 ADD TH0, A;修正后送TH0 MOV A,#0CH;取低5位计算的初值 ADD A, #0EH;加14个机器周期 ADD A,TL0;加修正值 JNB ACC. 5, LOW5_CARRY;判断低5位有进位否? INC TH0 ANL A, #00011111B LOW5_CARRY: MOV