单片机 第五章 MCS-51的定时器
- 格式:pdf
- 大小:121.26 KB
- 文档页数:32
MCS-51单片机中定时器的方式0、方式1和方式2具有不同的工作特点。
方式0是一个13位的定时器/计数器,其使用了16位寄存器(TH0和TL0)中的13位,包括TL0的低5位和TH0的8位,而TL0的高3位并未使用。
方式1是一个16位的定时器/计数器,TH0和TL0对应的16位全部参与计数运算。
当TH0和TL0计数满溢出时,硬件会自动将TF0置位并申请中断,同时16位加1计数器会从0开始继续计数。
在定时工作方式下,定时时间t对应的初值为X=216–t×fosc/12。
在计数工作方式下,计数长度最大为216=65536(个外部脉冲)。
方式2的特点是初值只需设置一次,每次溢出后,初值会自动从TH0加载到TL0或从TH1加载到TL1,但计数范围比方式1小。
在方式2中,只有TL0用作8位计数器参与脉冲计数工作,TH0不参与计数,只用来保存初值。
以上信息仅供参考,建议咨询专业计算机技术人员或者查阅专业书籍了解更多详细信息。
第五章MCS-51的定时器/计数器在工业检测、控制中,许多场合都要用到计数或定时功能。
例如,对外部脉冲进行计数、产生精确的定时时间、作串行口的波特率发生器。
MCS-51单片机内有两个可编程的定时器/计数器,以满足这方面的需要。
它们具有两种工作模式(计数器模式和定时器模式)及4种工作方式(方式0、方式1、方式2和方式3),其控制字均在相应的特殊功能寄存器中,通过对它的特殊功能寄存器的编程,用户可方便地选择适当的工作模式和工作方式。
本章介绍定时器/计数器的结构,功能,状态字、控制字的含义以及工作模式和工作方式的选择与编程方法。
5.1 定时器/计数器的结构特殊功能寄存器TMOD用于控制和确定定时器/计数器T0、T1的工作模式和工作方式。
特殊功能寄存器TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。
TMOD、TCON这两个寄存器的内容由软件设置。
系统复位时,两个寄存器的所有位都被清0。
5.1.1 工作方式控制寄存器TMODTMOD用于控制定时器/计数器的工作模式及工作方式,它的字节地址为89H,其格式如下所示:GATE位:门控位。
GATE=1时,T0、T1是否计数受外部引脚输入电平的控制、INT0引脚控制T0运行,INT1引脚控制T1运行。
可用于测量在INT0或INT1引脚出现的正脉冲的宽度;GATE=0,定时器/计数器的运行不受外部输入引脚l的控制。
C/T位:计数器模式和定时器模式的选择位。
C/T=0,为定时器模式。
内部计数器对晶振脉冲12分频后的脉冲计数。
该脉冲的周期等于机器周期。
即对机器周期进行计数。
若选择12M晶振,则计数频率为1MHz,从计数值便可求得计数的时间,所以称为定时器模式;C/T=1,设置为计数器模式,计数器对外部输入引脚T0(P3.4脚)或T1(P3.5脚)的外部脉冲(负跳变)计数,允许最高计数频率为晶振频率的1/24。
M1、M0位:工作方式选择位。
共有4种编码,对应于4种工作方式。
0 0 :方式0,13位定时器/计数器0 1 :方式1,16位定时器/计数器1 0 :方式2,8位自动重装载定时器/计数器1 1 :方式3,仅适用于T0,分成两个8位定时器/计数器5 .1.2 定时器/计数器控制寄存器TCONTCON的字节地址为88H,位地址为88H-8FH,TCON的格式如下:5.2 定时器/计数器的四种工作方式5.2.1 方式05.2.2 方式15.2.3 方式25.2.4 方式35.3 定时器/计数器对输入信号的要求当MCS-51内部的定时器/计数器被选定为定时器工作模式时,计数输入信号是内部时钟脉冲,每个机器周期产生一个脉冲,计数器增1,因此,定时器/计数器的输入脉冲为时钟振荡频率的l/12。
当采用12MHz的晶体时,计数速率为1MHz,输入脉冲的周期为1微秒。
由于定时的精度决定于输入脉冲的周期,因此,当需要高分辨率的定时时,应尽量选用频率较高的晶体(MCS-51最高为12MHz)。
当定时器/计数器用作计数器时,计数脉冲来自外部输入引脚T0或T1 。
当输入信号产生由1至0的跳变时,计数器的值增1。
如在第一个周期中采得的值为1,而在下一个周期中采得的值为0、则在紧跟着的下一个周期期间,计数器加1。
由于确认一次下跳变要花两个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为振荡器频率的1/24,例如选用6MHz频率的晶体,允许输入的脉冲频率为250KHz,如果选用12MHz频率的晶体,则可输入500KHz的外部脉冲。
对于外部输入信号的占空比并没有什么限制,但为了确保某一给定的电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期。
5.4 定时器/计数器编程和应用n1.计数器初值的计算n把计数器计满为零所需要的计数值设定为C,计数初值设定为TC,由此可得到公式:TC=M-Cn式中,M为计数器模值,该值和计数器工作方式有关。
在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。
n 2.定时器初值的计算n 在定时器模式下,计数器由单片机主脉冲经12分频后计数。
因此,定时器定时时间T 的公式:T=(M-TC )T 计数上式也可写成:TC=M-T/ T 计数n 式中,M 为模值,和定时器的工作方式有关;T 计数是单片机振荡周期T CLK 的12倍;TC 为定时器的定时初值。
5.4.1 方式0应用(1ms定时)假设时钟频率采用6MHz,要在P1.0上输出一个周期为2ms的方波,方波的周期用定时器T0来确定,并假定CPU不作其它工作,因而可以来用查询的方式进行控制。
n确定定时常数机器周期=12/晶振频率=12/(6x106)=2us;设:需要初值为X,则(213-X)x2x10-6=1x10-3 213-X=500 X=7692化为16进制X=1E0CH根据13位定时器特性,初值应为TH0=0F0H TL0=0CHMAIN: MOV SP,#60HMOV TMOD,#00HSETB TR0 LOOP: MOV TL0,#0CHMOV TH0,#0F0H LOOP1: JNB TF0,LOOP1CLR TF0CPL P1.0SJMP LOOPEND5.4.2 方式1应用方式1与方式0基本相同,只是方式1改用了16位计数器。
要求定时周期较长时,13位计数器不够用,可改用16位计数器。
假设利用定时器方式1产生一个50Hz的方波,由P1.0输出,采用12MHz时钟,采用中断的方法来实现,即在T0中设置一个时间常数,使其每隔10ms产生一次中断,CPU响应中断后,在中断服务程序中对P1.0取非。
T0中断人口地址为000BH。
初值可由下式算得:(216-X)×10-6=10-2因而,X=55536=0D8EFHORG 0000HLJMP MAINORG 000BHLJMP T0_PROCORG 0100H MAIN: MOV SP,#60HMOV TMOD,#01HMOV TL0,#0EFHMOV TH0,#0D8HSETB TR0SETB ET0SETB EA HERE: AJMP HERET0_PROC:MOV TL0,#0EFHMOV TH0,#0D8HCPL P1.0RETI5.4.3 方式2应用(0.5ms定时)假设时钟频率采用6MHz,要在P1.0上输出一个周期为1ms的方波(1KHz),方波的周期用定时器T0来确定,采用方式2和中断的方法来实现。
n确定定时常数机器周期=12/晶振频率=12/(6x106)=2us;设:需要初值为X,则(28-X)x2x10-6=5x10-428-X=250 X=6ORG 0000HLJMP MAINORG 000BHLJMP T0_PROCORG 0100H MAIN: MOV SP,#60HMOV TMOD,#02HMOV TL0,#06HMOV TH0,#06HSETB TR0SETB ET0SETB EA HERE: AJMP HERET0_PROC:CPL P1.0RETI5.4.4 方式3的应用下面的程序使定时器/计数器0工作在方式3,TL0和TH0作为两个独立的8位定时器/计数器,分别产生200us和300us定时中断,使P1.0和P1.1产生周期为400us和600us的方波(晶体频率为6MHz)。
ORG 0000HLJMP MAINORG 000BHLJMP T0_PROCORG 001BHLJMP T1_PROCORG 0100H MAIN: MOV SP,#60HMOV TMOD,#03HMOV TL0,#9CHMOV TH0,#6AHSETB TR0SETB ET0SETB TR1SETB ET1SETB EA HERE: AJMP HERET0_PROC:MOV TL0,#9CHCPL P1.0RETIT1_PROC:MOV TH0,#6AHCPL P1.1RETI5.4.5 门控制位GATE的功能和使用方法(以T1为例)门控制位GATE使定时器/计数器T1的启动计数受INT1的控制,当GATE为1,TR1为1时,只有INT1引脚输入高电平时,T1才被允许计数,利用GATE的这个功能,可测试引脚(P3.3)上正脉冲的宽度(机器周期数)。
MOV SP,#60HMOV TMOD,#90HMOV TL1,#00HMOV TH1,#00H LOOP:JB P3.3,LOOP LOOP1:JNB P3.3,LOOP1SETB TR1LOOP2:JB P3.3,LOOP2CLR TR1MOV R2,TL1MOV R3,TH15.4.6 定时器溢出同步问题定时器溢出时,自动产生中断请求,但中断响应是有延迟的,这种延迟并非固定不变,而是取决于其它中断服务是否在进行,或取决于正执行的是什么样的指令。
若定时器溢出中断是唯一的中断源,则延迟时间取决于后一个因素,可能在3-8个机器周期内变化,在这种情况下,相邻两次定时中断响应的间隔的变化不大。
在大多数场合可以忽略。
但一些对定时精度要求十分苛刻的场合,则对此误差应进行补偿,这一节介绍的补偿方法,可以使相邻两次中断响应的间隔误差不超过1个机器周期。
这种方法的简单原理是:在定时溢出中断得到响应时,停止定时器计数,读出计数值(它反映了中断响应的延迟时间),根据这个计数算出下一次中断时,需多长时间,据此来重装载和起动定时器。
下面给出的程序在计算每个周期的精确重装值时,还考虑了由停止计数(CLR TR1)到重新起动计数(SETB TR1)之间相隔了7个机器周期。
………..CLR EACLR TR1MOV A,#TL1NUM+7 ADD A,TL1MOV TL1,AMOV A,#TH1NUM ADDC A,TH1MOV TH1,ASETB TR1………………5.4.7 运行中读定时器/计数器在读取运行中的定时器计数器时,需要特别加以注意,否则读取的计数值有可能出错。
原因是不可能在同一时刻同时读取TL和TH的内容。
比如,先读TL,后读TH,由于定时器在不断运行,读TH前,若恰好产生TL溢出向TH进位的情形,则读得的TL值就完全不对了。
同样,先读TH,再读TL也可能出错。
一种解决读错问题的方法是:先读TH,后读TL,再读TH,若两次读得TH相同,则可确定读得的内容是正确的。
若前后两次读得的TH有变化,则再重复上述过程,这次重复读得的内容就应该是正确的。
READTIME:MOV A,TH0MOV R0,TL0CJNE A,TH0,READTIMEMOV R1,ARET。