当前位置:文档之家› 第六章 定时计数器

第六章 定时计数器

第六章定时/计数器及应用第一节定时/计数器1.定时/计数器工作原理在实际应用中,常用定时器实现定时检测、定时控制。

计数器主要用于事件的计数。

许多物理量的测量经过外部电路设计都可将其转换为定时或计数功能。

51单片机内部集成了两个16位可编程的定时/计数器T0和T1(为描述方便,后面将以下标x来代表T0和T1的相关参数),他们具有定时和计数两种工作方式。

定时/计数器T x由特殊功能寄存器TH x、TL x及相关控制寄存器构成。

定时器/计数器本质上就是16位加法计数器,由TH x、TL x存各自的计数值。

计数工作方式下,加法计数器对芯片引脚T0(P3.4)、T1(P3.5)上输入的脉冲计数;定时工作方式下,加法计数器对内部机器周期脉冲进行计数,定时时间为:计数值×机器周期。

计数初值由用户编程设定,设置的初值不同,计数值或定时时间就不同。

因为加法计数器计数满后将回零溢出并申请中断,且在二进制数的补码表示形式中,-1的形式为全1,加1后也将回0溢出,所以计数初值可以用负数的补码来表示。

2.控制寄存器定时器/计数器两种工作方式是由用户对定时器工作方式控制寄存器TMOD编程设定的,定时器/计数器的启动、停止及溢出等情况是由定时器控制寄存器控制的。

工作方式控制寄存器TMOD其中,低4位控制T0,高4位控制T1,各位的作用为:M1M0:工作模式选择位。

定时器的工作模式由M1M0设定。

M1M0工作模式功能0 0 模式0 13位定时器/计数器0 1 模式1 16位定时器/计数器1 0 模式2 自动重装初值的8位定时器/计数器1 1 模式3 T0分为两个8位定时器/计数器;T1停止(1)C/T :工作方式选择位C/T = 1工作在计数方式,计数脉冲来自于外部脉冲输入端(P3.4,P3.5引脚);C/T = 0工作在定时方式,计数脉冲来自于内部机器周期。

(2)GATE:门控位GA TE = 0 时,定时器由TCON中的TR x(x =0,1)位进行控制,置1定时器/计数器启动,该位清0定时器/计数器停止;GA TE = 1时,外部中断引脚( INT0 或INT1 )上的高电平与TR x 共同控制。

(如:TR x 置1且相应外部中断引脚为高电平,定时器/计数器启动)。

定时器控制寄存器TCON0TF 0:定时/计数器0中断请求标志TR 1:定时/计数器1运行控制位TF 1:定时/计数器1中断请求标志3.定时器/计数器的工作模式工作模式的选择由TMOD 中的M 1M 0的值来决定,定时器/计数器T 0有4种工作模式(模式0、1、2、3),T1有3种工作模式(模式0、1、2),前3种工作模式,T 0和T 1除了所使用的寄存器、控制位和标志位不同外,其他的操作完全相同。

(1)工作模式0当M 1M 0为00时,定时器/计数器工作于模式0。

模式0为13位计数模式,最大计数值为213(8192),TH x 提供高8位,TL x 提供低5位。

程序初始化时,向TH x 和TL x 装入计数初值,启动计数后,开始加1计数,TL x 的低5位溢出后,向TH x 的最低位进位,TH x 溢出后将置位TCON 中的TF x,以申请中断。

由于此时TH x 、TL x 均回0,若需要继续计数,用户应在程序中再次装入计数初值。

由于模式0的进位特点,在装入计数初值时,13位二进制的高8位装入TH x 中,低5位装入TL x 中(TL x 的高3位无效,可补0)。

例:T0的计数初值为1000,TH 0、TL 0中的代码应该是什么?分析:由于补码的特点与定时/计数器回0溢出以申请中断的原理相同,故计数初值用-1000的补码(即1111,1100,0001,1000)来表示;由于模式0的特点,TH 0中装入E0H ,TL 0中装入18H 。

(2)工作模式1当M 1M 0为01时,定时器/计数器工作于模式1。

模式1为16位计数模式,最大计数值为216(65536),TH x 提供高8位,TL x 提供低8位。

其他情况和模式0相似。

(3)工作模式2当M 1M 0为10时,定时/计数器工作于模式2。

模式2为自动重装初值的8位计数器,TL x 作为工作计数器,TH x 作为初值寄存器。

程序初始化过程中,TH x 、TL x 装入相同的计数初值,启动计数器后,TL x 开始计数,TL x 溢出时,硬件置位TF x ,向CPU 发出中断请求,同时TH x 中的计数初值自动送入TL x 中,TL x 从初值开始从新计数,直到计数器被停止。

由于该方式省去了软件重装计数初值,所以该方式适合用于定时或计数较精确的情况。

(4)工作模式3当M1M0为11时,定时/计数器工作于模式3。

模式3仅适用于T0,此方式下,TH0和TL0成为两个独立的8位计数器。

TL0可以当作定时/计数器使用,占用T0在TMOD和TCON中的控制位和标志位;TH0只能用作定时器,占用T1的TR1和TF1。

此时T1仍可用于模式0,1,2,但不能使用中断方式。

在单片机串行通信中,一般将T1作为串行口波特率发生器,工作在模式2,此时将T0设置为模式3,可以额外增加一个8位的定时器。

4.对计数器输入信号的要求定时/计数器作计数器使用时,外部脉冲由T0(P3.4)或T1(P3.5)输入,在每个机器周期的S5P2期间采样一次该引脚电平,若前一次检测为“1”,后一次检测为“0”,则加法计数器加一。

新的计数值将在此后一个机器周期的S3P1期间装入TH x和TL x中,所以所采样的外部脉冲的“0”和“1”的持续时间都不能少于一个机器周期。

由于需要两个机器周期才能识别高电平到低电平的跳变,所以外部计数脉冲的周期应大于2倍机器周期。

如使用12MHZ 时钟,机器周期为1us,外部计数频率不能超过500KHZ。

对外部脉冲的占空比无特殊要求。

第二节定时/计数器应用编程单片机内部的2个定时/计数器是可编程器件,可以通过程序设定其功能。

其应用编程主要包括下述几个步骤:(1)根据定时要求或计数要求计算计数初值。

(2)根据要求确定工作模式,并将控制字写入TMOD。

(3)将计数初值写入TH x和TL x。

(4)若使用中断方式,开放中断(5)启动定时/计数器,即将TR x置位。

前4条在系统初始化程序部分完成,应根据具体的应用要求,在系统服务程序中利用TR x控制定时/计数器的启停。

例4-2利用定时计数器1定时,采用查询方式,在P1.1引脚输出1000HZ方波。

设T1为工作方式2,设置为定时状态,定时时间为方波周期的1/2即0.5mS,查询0.5mS 时间到,将P1.1的状态取反(假设晶振为6MHZ)。

先设置TMOD控制字:定时器/计数器1为定时器工作方式,C/T(TMOD.6) = “0”;非门控方式,GATE(TMOD.7)= “0”;采用工作方式2,M1(TMOD.5)=“1”,MO(TMOD.4)=“0”,定时器/计数器0没有使用,相应的D7~D4为随意态“X”,若取“X”为 0,则(TMOD)= 20H。

再计算0.5mS定时的T1初始值:由fosc = 6MHZ得Tc = 2μs,工作方式2时有T =(256 - X)Tc =(256 - X)* 2μs=500μS得 TH1 = TL1 = 06H。

程序如下:ORG 0100HSQU: MOV TMOD,#20H ;设置定时器/计数器工作方式MOV TH1,#06H ;设置定时初始值MOV TL1,#06HSETB TR1 ;启动定时器/计数器1LOOP: JBC TF1,$ ;定时时间不到循环等待CPL P1.1 ;P1.1状态取反SJMP LOOP例4-3 P1.0、P1.1经7407驱动LED交替发光并以每秒一次的频率闪烁。

硬件连接见图4-6。

(采用6MHZ 晶振)闪烁周期为1S,亮、灭各占一半,定时时间需要500mS。

使用6MHZ 晶振,单片机最长定时时间仅为131mS,所以需要采用软件记数方法扩展定时时间。

使用定时/计数器0,定时方式,工作方式1。

8051设置TMOD 控制字: TMOD = 01H 图4-6 驱动LED 电路图使用6MHZ 晶振,机器周期为2μs ,设定时时间100mS ,定时初值: 100 mS/2μs =50000,其十六进制补码:3CB0H 。

定时器溢出5次为500mS 。

软件流程见图4-7。

程序如下:ORG 0140H LED1: MOV TMOD,#01H ;设置定时器工作方式SETB P1.0 ;输出初始状态CLR P1.1 SETB TR0 ;启动定时器LOOP0: MOV R2,#05H ;送软件计数初值LOOP1: MOV TL0,#0B0H ;送定时常数MOV TH0,#3CH JBC TF0,$ ;循环等待定时时间到 DJNZ R2,LOOP1 ;软件计数–1≠0循环 XRL P1,#03H ;P1.0、P1.1求反 SJMP LOOP0 ;循环例4-4 当GATE X =“1”时,定时/计数器只有INT X 为高电平才能进行计数。

利用这一点,可以方便的测量脉冲信号的宽度。

设被测脉冲接至INT1引脚,将定时/计数器1设置为定时方式,即可进行脉宽测量。

要求测量脉宽单位为1μs ,选用12MHZ 晶振。

设置TMOD 控制字:GATE1 =“1”,定时/计数器1为定时方式C/T =“0”,选用工作方式1。

TMOD = 90H 。

定时初值为零,在脉冲下跳沿读出计数器的计数值即为脉冲宽度。

程序如下:ORG 0180HPULSEW : MOV TOMD ,#90H ;设置定时/计数 器工作方式CLR A ;定时初值为零MOV TH1,AMOV TL1,AJB P3.3,$ ;在低电平时启动定时,保证测量整个脉冲宽度。

SETB TR1 ;启动定时器JNB P3.3,$ ;等待脉冲到来JB P3.3,$ ;等待脉冲结束CLR TR1 ;停止计数MOV R2,TH1 ;读出脉冲宽度MOV R3,TL1……运行上面程序后,只要将R2、R3两单元内容转换成十进制数,即可送显示以读出脉冲图4-7 驱动LED 程序流程图宽度。

由于工作方式1的最大计数值为65536,所以上面程序所测脉冲宽度不能大于65536μs。

例4-5 利用单片机定时/计数器测量脉冲信号频率。

频率定义为单位时间1S内的周期数,用定时/计数器测频率,需要用一路定时器产生单位时间,另一路计数器对脉冲计数。

若被测量的信号频率较高,而测量精度有限的话,单位时间可以小于1S。

单位时间选用10mS,其间计的脉冲数乘以100即为信号频率。

设置工作方式:设单片机系统时钟频率fosc = 12MHz。

定时/计数器1定时,工作方式1,产生10mS 单位时间;定时/计数器0计数,工作方式1。

相关主题