单片机原理及应用课件:第6章 定时计数器_第1页
单片机原理及应用课件:第6章 定时计数器_第2页
单片机原理及应用课件:第6章 定时计数器_第3页
单片机原理及应用课件:第6章 定时计数器_第4页
单片机原理及应用课件:第6章 定时计数器_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章定时/计数器内容提要定时/计数器及时间的分辨率T0、T1的工作原理T0、T1应用举例定时/计数器T2原理及应用6.1定时/计数器及时间的表达 定时/计数器是单片机中的重要部件。事实上,几乎所有的控制系统都离不开定时/计数。

6.1.1时间的表达方式 时间表达分实时和相对时间两种方式。

实时时间。用阳历年、月、日、时、分、秒这一时间体系单位表示。

每台PC都有一个实时时钟。 相对时间与实时时间的区别仅在于:相对时间的零点是随意定的,不与任何时间体系对应,不能像实时时间那样表示出“时刻”意思,只能表示时间的长短。

在控制系统中相对时间的测量应用更为广泛。

相对时间向实时时间的转换,就是统一计时起点,即“对表”的过程,当然还要套用阳历的计时单位。本章只讨论相对时间的测量问题。

51机内置了二个16位的定时/计数器,分别称为T0、T1(T2只在52机以上才有)。6.1.2标准51定时/计数器结构

图6-1为标准51及其兼容机片内定时/计数器结构图。其中,T2只有52以上机才有。 定时计数器T0、T1由TMOD和TCON管理。T2由T2MOD和T2CON专门管理。

本章节只讨论T0和T1。6.2定时/计数器工作原理及时间分辨率6.2.1T0、T1的工作方式1.定时/计数器的特点 (1)可编程:有多种工作方式。每种工作方式又分定时和计数两种模式。定时/计数器的核心部件是一个加法计数器,对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,称为定时模式,此时计数器每机器周期得到一个计数脉冲,计数值加1,说明分辨率为一个机器周期;当计数脉冲取自单片机I/O引脚的外部信号时,则为计数模式。 51机复位后T0、T1默认为工作方式0、定时。因此,使用定时/计数器前必须初始化其工作方式。 (2)每个定时/计数器都有一个容器(THx和TLx),收集脉冲数。大小为16位二进制范围,即:FFH和FFFFH或256和65536。

定时器能量化的最小时间称为定时分辨率。 从理论上讲,定时/计数的测量上限是没有限制的(下限为分辨率),无论多长的定时或多大的计数,都可通过多次定时或计数累加而实现测量。

(3)每一个输入脉冲(下降沿)自动对T0、T1计数寄存器,作加“1”处理,当计数寄存器溢出(超过寄存器最大值)时,能向CPU发出中断请求,同时自动将计数寄存器清空,从0开始“计数”。 (4)定时/计数器可以从0开始计数,也可以从特定值开始计数,组成不同定时/计数值。定时/计数器又是可读写的寄存器,CPU可随时读出其值,用于测量。 从理论上讲,定时/计数器只有最小定时长度的限制。

2.定时/计数器的工作方式与模式

T0、T1工作方式有关的寄存器为TMOD和TCON。2.工作方式寄存器TMOD(89H,不可位寻址)

51机通过对其各位设置实现定时/计数器工作方式的定义。TMOD各位定义如表6-1所示。各位含义如下

TMOD上、下半字节对称,分别对应T0、T1的工作状态。以T0为例,各位的意义如下: :此位为0,为定时模式,此位为1,为计数模式。

M1、M0:工作方式选择。该2位可组成00、01、10、11四种数字组合,对应为工作方式0、1、2、3。注意:T1没有工作方式3。

GATE——定时/计数器启动方式控制位。

复习:与定时器工作相关的寄存器

控制字寄存器TCON(88H,可位寻址)

TCON与T0、T1的控制有关,各位定义如图5-9所示。各位含义如下:

TF1:定时器1的溢出标志;

TF0:定时器0的溢出标志。CPU响应定时/计数器中断,标志自动清零;若CPU不响应此中断,则此标志需用软件清除。

TR0:定时器0运行控制位,靠软件置位或清除。置位时,定时/计数器0接通工作,TR0=0,定时器0停止工作。

TR1:是关于定时器1的,含义与TR0类似。

低4位说明如下:

IT0:IT0=0,选择外部中断0为电平触发方式;IT0=1,则选择外部中断为下降沿(后沿)触发方式。IT1是关于外部中断1的,与IT0类似。他们均需用软件置位或清零。

IE0:外部中断0的中断请求标志位。CPU在每个机器周期采样P3.2脚电平。当IT0=0时,若引脚为低电平,则置位IE0。当IT0=1时,若第一个机器周期采样到引脚为高电平,第二个机器周期采样到引脚为低电平时,由硬件置位IE0。IE0置位,意味着外部中断0在向CPU申请中断。当CPU响应中断转向中断服务程序时由硬件将IE0清零。

IE1外部中断1中断请求标志位。含义与IE0相同

6.2.2定时/计数工作原理 (1)工作方式0(13位定时/计数器,M1M0=00H)(少用) 方式0是为与被取代的MCS-48系列兼容而设置的。图6-2为其逻辑结构,当 =0时,计数脉冲来自CPU内部分频器,为定时,标准51计数脉冲频率是时钟信号的12分频;

=1时,计数脉冲来自T0或T1引脚,即处于计数方式。

(2)工作方式1

(16位定时/计数器,M1M0=01H)(常用)

图6-3为定时器/计数器工作于方式1的逻辑结构,除使用了THx和TLx全部16位外,与方式0完全相同。

(3)方式2(M1M0=10)(常用)

图6-4为定时器/计数器工作方式2的逻辑结构。此方式下,TLx作为可自动重装8位计数器,TLx的溢出不仅置位TFx,而且将THx的内容装入TLx。因此,THx的内容决定了定时/计数器的初值,称为重装常数。

(4)方式3(M1M0=11)(少用) 方式3是为了增至3个定时/计数器而设计的。方式3只适用于T0。此方式下,T0被分为两个独立的8位计数器TL0和TH0。TL0使用T0的状态位,而TH0被固定为一个8位定时器(不能用作外部计数),使用T1的状态位和T1的中断源。当T0处于方式3时,T1还可以工作于方式0、1、2,但不能使用中断,所以T1只能使用在不要任何中断的场合,作为串行口的波特率发生器。如错误地将T1设置为方式3,则T1停止工作,效果与将TR1设置为0相同。标准51d=126.3定时/计数器应用举例6.3.1查询方式 编程要点: (1)对TMOD写控制字,确定T0、T1的工作方式及模式。 (2)将初值写入计数寄存器TH0、TL0或TH1、TL1中。 (3)置位TRx,启动定时/计数(重要!见图6-1~图6-5)。 (4)查询TFx,以确定定时或计数是否到达终点。 (5)事件处理,决定下一步程序流程,清除TFx标志,一轮定时或计数完成。 (6)如需重复、连续工作,回到(4)重复定时或计数过程,直到全部工作完成。

【例6-1】应用T0产生1ms定时,并使P1.0输出周期为2ms,占空比为1:1的方波。设晶振频率为6MHz,T0工作于方式0。 解:通过P1.0输出周期为2ms、占空比为1:1的方波,可用定时器定时1ms,每次定时到,对P1.0的状态取反,但不要忘记装入时间常数。如此反复,即可达到目的。

第一步:定时器工作于方式0定时模式。本题与T1无关,所以TMOD的控制字定义为:00000000B;

第二步:装入T0的常数。机器周期为:

设所需初值为x,则 解得:x=7692=1E0CH=11110

0000

1100B

根据13位定时器的特性,TH0放x的高8位,TL0放低5位,我们将x值重排如下:x=1111000001100,即得本任务的时间常数为:TH0=F0H,TL0=0CH。

根据定时/计数器向上计数及计数寄存器容量,方式1时间常数也可按下式计算: (6-1) (6-2)

第三步:编写程序,参考程序清单如下: ORG 0000H AJMP MAIN ORG 0050H MAIN: MOV SP,#60H ACALL PTMTESTTF0: JNB TF0,TESTTF0 CPL P1.0

;P1.0求反,以输出方波

MOV TL0,#0CH;用指令重装时间常数

MOV TH0,#0F0H CLR TF0 ;软件清除T0溢出标志 SJMP TESTTF0 ;将子程序隔开PTM: MOV TMOD,#00H MOV TL0,#0CH MOV TH0,#0F0H SETB TR0 RET END

请注意CLR TF0这条指令的意义。

查询方式下,一定要及时清除查询标志以保证一个事件,处理一次。

本例的C51程序清单如下:#include<Stc12C5A60S2.h>voidtime0int(void) { TL0=0x0c; //T0定时1ms TH0=0xf0;}voidmain(void){ SP=0x5f; TMOD=0x00; //T0工作于方式0定时

time0int(); TR0=1; //启动T0 while(1) { if(TF0) { time0int(); TF0=0; P1_0=~P1_0; //改变P1_0的状态

} }}

查询方式思路直观,但其最大的缺点是在整个查询方式过程中,CPU被占用,系统的实时性低。而在多数应用场合下,CPU的任务是繁重的,在查询阶段,宝贵的时间就浪费了。所以查询方式只适合用于工作速度较慢、任务轻的系统中。

如何才能既使用片内、外资源,又要保证CPU的效率和系统的实时性呢?6.3.2定时/计数器中断编程步骤 与定时/计数器中断编程有关的SFR有TMOD、TCON和IE。编程要点:

(1)确定工作方式及工作模式,即对TMOD寄存器进行赋值;

(2)计算计数初值,并写入TH0、TL0或TH1、TL1中;

(3)在相应的中断向量中加入长跳转指令,编写中断服务程序;

(4)置位ETx允许计数器中断;

(5)置位EA使CPU开中断;

(6)置位TRx,启动计数,等待中断发生。

与查询方式不同的是:中断方式不必访问TCON中的定时/计数器中断请求标志位,代之要在中断向量表中加入长跳转指令,并编写中断服务程序。在CPU响应中断后,中断请求标志位TFx自动由单片机清零。

【例6-2】以中断方式,应用定时器T1产生1ms的定时,并使P1.0输出周期为2ms,占空比为1:1的方波。设晶振频率为6MHz,定时器/计数器工作于方式1。 设所需初值为x,则

解得:x=65036=FE0CH FE0CH即为本任务的时间常数,其中:TH1=0FEH,TL1=0CH。

T1的中断向量是001BH,参考程序为:

根据定时/计数器向上计数及计数寄存器容量,方式1时间常数也可按下式计算: (6-3) (6-4) ORG 0000H AJMP MAIN

ORG 001BH LJMP TIME1INT ORG 0050H MAIN: MOV SP,#60H ACALL PTM SJMP $PTM: MOV TMOD,#10H MOV TL1,#0CH MOV TH1,#0FEH SETB ET1 ;允许T1中断

SETB EA ;开放总中断

SETB TR1 ;启动T1定时

RETTIME1INT: MOV TL1,#0CH ;重装常数

MOV TH1,#0FEH CPL P1.0 ;输出求反

RETI ;中断返回

END本例的C51程序清单如下:#include<Stc12C5A60S2.h>voidtimer1()interrupt3 //T1中断周期1ms{ TL1=0x0c; TH1=0xfe; //重装定时常数

P1_0=~P1_0; //改变P1_0的状态}voidmain(void){ SP=0x5f; //设置堆栈指针

TMOD=0x10; //T1工作于方式1定时

TL1=0x0c; TH1=0xfe; //T1定时1ms

ET1=1; EA=1; TR1=1; //开中断并启动定时

while(1); //等待中断}

【例6-3】用中断方式编写每计数3次产生中断的程序。设T1工作于方式2。 工程实际中,计数器的应用大致分两种。第一种是纯粹的计数,相对容易理解。本题就是如此。计数程序与定时程序不同之处仅在于对TMOD中位的设置上。本例TMOD的控制字就为01100000B,即60H。汇编参考程序如下:

ORG 0000H AJMP MAIN ORG 001BH LJMP TIME1INT ;中断向量中的长跳转

ORG 0030H MAIN: MOV SP,#5FH ACALL PTM SJMP $PTM: MOV TMOD,#60H ;TMOD=01100000B MOV TL1,#0FDH ;计数初值(常数)

MOV TH1,#0FDH SETB ET1 ;允许T1中断

SETB EA ;开放总中断

SETB TR1 ;启动T1定时

RETTIME1INT: CPL P1.0 ;服务内容:产生方波

RETI ;中断返回

END

计数的第二种应用是在限制时间内的计数,其典型应用就是测量信号的频率。比如V-F转换器,他将模拟电压转换为方波输出,V与F成比例。对模拟量进行采样的方法是,在一定时间内,对方波进行计数,通过计算得出信号的频率,进而推出V的值。

【例6-4】设V-F转换器的输出接至T1引脚P3.5。要测出在0.1S内V-F转换器输出信号的周期数,应如何编程实现其要求?设系统fosc=6MHz。

以C语言为主的教学,可直接讲C程序。

解:在明确任务后,首先要做的工作是规划系统资源。T1必然用于计数,方式1能装的数据最大,这个性能是由硬件决定的。另一个就是定时了,应取T0方式1定时?。设T0的初值为x,则

解得:x=15536=3CB0H 3CB0H即为本任务的时间常数,因此:TH0=3CH,TL0=0B0H。 参考程序清单如下:

TIML EQU 30H TIMH EQU 31H

ORG 0000H AJMP MAIN

ORG 000BH LJMP TIME0INT

ORG 0050H

MAIN: MOV SP,#60H ACALL PTMWAIT: JB TR1,WAIT MOV TIMH,TH1 ; MOV TIML,TL1 ;保存计数值

SJMP $ ;动态停机

PTM: MOV TMOD,#51H MOV TL1,#00H ;计数值清零

MOV TH1,#00H MOV TL0,#0B0H MOV TH0,#3CH SETB ET0 ;允许T0中断

SETB EA ;开放总中断

SETB TR1 ;启动T1定时

SETB TR0 RETTIME0INT: CLR TR1 ;计时到,关闭T1 CLR ET0 ;禁止T0中断

RETI ;中断返回

END

问题:51机对频率上限为?以内的V/F转换器适用? 注意:标准51识别脉冲宽度的极限为12个时钟周期对应的时间长度。即有频率上限的限制。

连续频率测量,需要主程序和中断服务程序的配合。

本例的C51程序清单如下:#include<Stc12C5A60S2.h>voidtimer0()interrupt1 //T1中断周期1ms{ TR0=0; //停止计数

TL0=0xb0; TH0=0x3c; //重装定时常数

TR1=0; //停止计数 }voidmain(void){ SP=0x5f; //设置堆栈指针

TMOD=0x51; //T1方式1计数,T0方式1定时

TL0=0xb0; TH0=0x3c; //T0定时100ms(fosc=6M) TL1=0; TH1=0; //T1计数清零

ET0=1; EA=1; TR0=1; //启动T0定时

TR1=1; //启动T1计数

while(1) { if(TR1==0) //定时结束

{ ; //读计数值并进行处理

TL1=0; TH1=0; //计数值读完后要清零

TR0=1; //启动T0定时、T1计数

TR1=1; //开始新一轮采样

} }}

【例6-5】有条件启动、停止T0、T1的实例。应用T0产生100μs的定时,使P1.0输出周期为200μs,占空比为1:1的方波。要求在产生100个周期方波后,停止方波输出,CPU处于动态停机状态。设fosc=12MHz,T0工作于方式2。

解:通过一个全局变量,建立起主程序和中断服务程序之间的联系,是解决这类问题的要点。 系统fosc=12MHz,则定时器的计数间隔为1μS,则计数初值为

256–100=156=9CH。汇编语言参考程序如下:

ORG 0000H AJMP MAIN

ORG 000BH LJMP IT0P ORG 0050HMAIN: MOV SP,#60H LCALL PTMAGAIN: CLNE R7,#0,AGAIN CLR TR0STOP: SJMP STOPPTM: MOV R7,#200 MOV TMOD,#02H MOV TL0,#9CH MOV TH0,#9CH SETB ET0 SETB EA

SETB TR0 RET IT0P: CPL P1.0 DEC R7 RETI END

请注意DEC R7指令的意思。

在条件启停中断的应用时,初学者常犯的错误有以下两条: (1)从中断服务程序向主程序跳转。如【例5-5】的100个周期方波用如下汇编程序实现:

MOV R6,#0C8H ;200次STOP: SJMP STOPIT0P: CPL P1.0 MOV TL0,#18H MOV TH1,#0FCH DJNZ R6,STOP RETI

(2)使用无效的控制方法。以【例5-5】为例,有这样的汇编主程序

MOV R6,#0C8H ;200次STOP0: DJNZ R6,STOP0 STOP: SJMP STOP ;接下是中断服务程序

其实,条件控制是帮助程序员调试中断的有效方法。本题中,如程序正确,将在示波器上出现看到一串方波(在哪个脚?),之后程序停在STOP上;若程序有BUG,在示波器上是看不到方波的,程序也停不到STOP:上。因此,从程序的运行效果上就可判断程序有无错误。 正确的编程方法应该是主程序和子程序或中断服务程序相呼应,仔细阅读例题,深刻理解“呼应”方法,对单片机应用水平的提高效果显著。C51参考程序如下:

#include<reg52a.h>#defineucharunsignedcharuchardataintcount=200;//100个周期,要进入中断200次voidtimer0()interrupt1 //T0中断周期100μs{ P1_0=~P1_0; intcount-=1;}void main(void){ TMOD=0x02; TL0=0x9c; TH0=0x9c; //T0工作于方式2定时

ET0=1; EA=1; TR0=1; //开中断并启动定时

while(intcount!=0); //等待过程结束

TR0=0; ET0=0; while(1); //100个周期后,程序停于此句}

【例6-6】定时器方式2应用。假设fose=12MHz,把T0作为外部中断请求输入线,T0第一次跳变,在P1.0引脚输出周期为200μs占空比为1:1的方波,T0第二次跳变则停止输出方波,依次类推。

解根据题意,本题需要两个定时器同时工作。产生方波已不成问题,可由定时器T1承担,由于定时时间在8位二进制初值内,T1可工作于方式2定时,免去重装定时常数的工作,为此T1的初值M为:256–100=156=9CH。 T0作为外部中断请求输入线用,意思是在T0的管脚上加一触发信号,该信号有效时可触发T0中断。因而T0只有工作于计数方式,才能响应外部的计数脉冲,设T0工作于方式2计数,计数初值应设为FF,这样才满足外部中断请求输入线一次跳变,改变一次方波输出状态的要求。 怎样才能有效地控制方波的启、停呢?,关键在于控制T1的中断,当T1不能中断时,方波自然不能产生。 参考程序如下(以C语言为主的教学,可直接讲C程序。)汇编语言参考程序如下:

ORG 0000H AJMP MAIN

ORG 000BH LJMP IT0P

ORG 001BH LJMP IT1P ORG 0050HMAIN: MOV SP,#60H LCALL PTMSTOP: SJMP STOPPTM: MOV TMOD,#26H MOV TL0,#0FFH MOV TH0,#0FFH MOV TL1,#9CH MOV TH1,#9CH SETB ET0 SETB ET1 SETB EA

SETB TR0 RET IT0P: CPL TR1

/*核心指令,见解释*/ RETIIT1P: CPL P1.0 RETI END

请注意CPL TR1 指令的用法。除了控制TR1外还有什么手段?

【例6-7】门控位GATE的应用。利用定时/计数器T1门控信号GATE功能,反复测量引脚上正脉冲信号的宽度(单位为机器周期)。

(以C语言为主的教学,可直接讲C程序。) 参考图5-11,当GATE位为1时,计数脉冲开关状态由位TR1和(即P3.3)引脚通过与门控制。51的这一结构是专门为准确测量脉冲宽度设置的。实现测量的思路是: (1)定时器寄存器清0,做好计时准备,此时须禁止 中断。

(2)在 管脚为低电平时,令TR1=1,将“与”门解锁,同时允许中断。 (3)在 中断服务程序中,首先要停止定时器T1工作,然后再读取TH1和TL1内容,进行处理(显示、决策等)。 (4)重复上述过程,进行正脉冲宽度连续测量。 程序采用查询与中断结合方式。参考程序如下: ORG 0000H AJMP MAI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论