首页 第6章 定时器计数器

第6章 定时器计数器

举报
开通vip

第6章 定时器计数器第6章AT89S51单片机的定时器/计数器**第6章目录6.1定时器/计数器的结构6.1.1工作方式控制寄存器TMOD6.1.2定时器/计数器控制寄存器TCON6.2定时器/计数器的4种工作方式6.2.1方式06.2.2方式16.2.3方式26.2.4方式36.3对外部输入的计数信号的要求6.4定时器/计数器的编程和应用6.4.1方式1的应用6.4.2方式2的应用6.4.3方式3的应用6.4.4门控制位GATEx的应用—测量脉冲宽度6.4.5实时时钟的设计内容概要定时/计数器是单片机系统一个重要的部件,...

第6章 定时器计数器
第6章AT89S51单片机的定时器/计数器**第6章目录6.1定时器/计数器的结构6.1.1工作方式控制寄存器TMOD6.1.2定时器/计数器控制寄存器TCON6.2定时器/计数器的4种工作方式6.2.1方式06.2.2方式16.2.3方式26.2.4方式36.3对外部输入的计数信号的 要求 对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗 6.4定时器/计数器的编程和应用6.4.1方式1的应用6.4.2方式2的应用6.4.3方式3的应用6.4.4门控制位GATEx的应用—测量脉冲宽度6.4.5实时时钟的设计 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 概要定时/计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、脉宽测量、信号发生、信号检测等。此外,定时/计数器还可作为串行通信中波特率发生器。本章介绍定时器/计数器的结构与功能,2种工作模式和4种工作方式,以及相关的2个特殊功能寄存器TMOD和TCON各位的定义及其编程,最后介绍定时器/计数器的编程及应用实例。 51子系列单片机共有两个16位的定时器/计数器,分别用T0和T1表示。这两个定时器都具有定时和计数两种功能。 1.定时功能 计数输入信号是内部时钟脉冲,每个机器周期使计数寄存器(如T0的TH0、TL0)的值增1。每个机器周期等于12个振荡周期,故计数速率为振荡频率的1/12。当采用12MHz晶体时,计数速率为1MHz,即每微秒计数器加1,这样不但可以根据计数器计算出定时时间,也可以反过来按定时时间的要求计算出计数器的预置值。 2.计数功能计数是对外部脉冲进行计数,当输入信号产生有1至0的跳变时,计数寄存器(如T0的TH0、TL0)的值增1。每个机器周期的S5P2期间,对外部输入进行采样。由于确认一次下跳变需要2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为振荡频率的1/24。每一个定时/计数器定时计数时间到时产生溢出,使相应的溢出位置位,溢出可通过查询或中断方式处理。6.1定时器/计数器的结构定时器/计数器结构如图6-1所示,定时器/计数器T0由特殊功能寄存器TH0、TL0构成,定时器/计数器T1由特殊功能寄存器TH1、TL1构成。*具有定时器和计数器2种工作模式,4种工作方式(方式0、方式1、方式2和方式3)。属于加1计数器。TMOD用于选择定时器/计数器工作模式和工作方式。TCON用于控制启动和停止,同时包含了T0、T1的状态。T0、T1不论是工作在定时器模式还是计数器模式,都是对脉冲信号进行计数,只是计数信号的来源不同。6.1.1工作方式控制寄存器TMOD用于选择定时器/计数器的工作模式和工作方式,字节地址为89H,不能位寻址,设置TMOD须用字节操作指令。(1)GATE———门控位。GATE=0,运行只受TCON中运行控制位TR0/TR1的控制。GATE=1,运行同时受TR0/TR1和外中断输入信号的双重控制。只有当INT0/INT1=1且TR0/TR1=1,T0/T1才能运行。 TMOD D7 D6 D5 D4 D3 D2 D1 D0 (89H) GATE C/T M1 M0 GATE C/T M1 M0 ← 定时器1 → ← 定时器0 →*(2)M1、M0——工作方式选择位(3)C/——计数器模式和定时器模式选择位 0:定时工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。1:计数工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。 6.1.2定时器/计数器控制寄存器TCON字节地址为88H,可位寻址,位地址为88H~8FH。格式如图6-3所示。TCON低4位与外中断有关,已在中断中叙述。高4位与定时/计数器T0、T1有关。⑴TF1:定时/计数器T1溢出标志。中断方式中,硬件自动置1和清0⑵TF0:定时/计数器T0溢出标志。同上⑶TR1:定时/计数器T1运行控制位。=1,启动;=0,停止。⑷TR0:定时/计数器T0运行控制位。启停位以软件方法使其置1或清0。 TCON T1中断标志 T1运行标志 T0中断标志 T0运行标志 INT1中断标志 INT1触发方式 INT0中断标志 INT0触发方式 位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H6.2定时器/计数器的4种工作方式6.2.1方式0——13位定时/计数器,最大计数值(满值)为M=213=8192M1、M0=00时,被设置为工作方式0,等效逻辑结构框图如图6-4所示(以定时器/计数器T1为例,TMOD.5、TMOD.4 = 00)。*13位计数器,由TLx(x = 0,1)低5位和THx高8位构成。TLx低5位溢出则向THx进位,THx计数溢出则把TCON中的溢出标志位TFx置“1”。C/T=0时为定时功能,此时对12分频的振荡脉冲做加法计数;当C/T=1时对引脚Tx的输出脉冲做加法计数。不管是定时还是计数,当TL的低5位计数溢出时,向TH进位,而全部13位计数溢出时,则向计数溢出标志位TF0进位。*(1)GATE = 0,若GATE=0,则THx+TLx是否计数取决于TRx的状态。因为这时GATE信号封锁了或门,使引脚信号无效,这时或门输出端的高电平状态却打开了与门。当TRx=1时,则接通模拟开关,使计数器进行加法计数;而当TRx=1时,则断开模拟开关,停止计数。(2)GATE = 1,GATE=1,且TRx=1,则THx+TLx是否计数取决于外引脚信号的状态。因为这时有关电路的或门和与门全部打开,计数脉冲的接通与断开仅由外引脚信号控制。当该信号为高电平时计数器工作;当该信号为低电平时计数器停止工作。这种情况可用于测量该信号的脉冲宽度。方式0:计数初值=213-N如定时/计数器T0的计数值为1000,则初值为7192,转换成二进制数为1110000011000B,则TH0=11100000B=E0H,TL0=00011000B=18H。6.2.2方式1——16位定时/计数器当M1、M0=01时,定时器/计数器工作于方式1,这时定时器/计数器的等效电路逻辑结构如图6-5所示。方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16位计数器,由THx高8位和TLx低8位构成(x = 0,1),方式0则为13位计数器,有关控制状态位的含义与方式0相同。6.2.3方式2——自动恢复初值(初值自动装入)的8位定时器/计数器。方式0和方式1的最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题。这不仅影响定时精度,也给程序设计带来麻烦。方式2就是针对此问题而设置的。当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的等效逻辑结构如图6-6所示(以定时器T1为例,x= 1)。定时器/计数器的方式2为TLx(x = 0,1)作为常数缓冲器,当TLx计数溢出时,在溢出标志TFx置“1”的同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。该方式可省去用户软件中重装初值的指令执行时间,简化定时初值的计算方法,可以相当精确地确定定时时间。6.2.4方式3方式3只适用于T0,T1不能工作在方式3。T1处于方式3时相当于TR1= 0,停止计数(此时T1可用来作为串行口波特率产生器)。1.工作方式3下的T0TMOD的低2位为11时,T0的工作方式被选为方式3,定时器/计数器T0分为两个独立的8位计数器TL0和TH0,TL0使用T0的状态控制位C/、GATE、TR0、TF0,而TH0被固定为一个8位定时器(不能作为外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。2.T0工作在方式3时T1的各种工作方式一般情况下,当T1用作串行口的波特率发生器时,T0才工作在方式3。T0处于工作方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。*(1)T1工作在方式0T1的控制字中M1、M0 = 00时,T1工作在方式0,工作示意图如图6-9所示。*图6-9T0工作在方式3时T1为方式0的工作示意图(2)T1工作在方式1当T1的控制字中M1、M0 = 01时,T1工作在方式1,工作示意图如图6-10所示。*图6-10T0工作在方式3时T1为方式1的工作示意图(3)T1工作在方式2当T1的控制字中M1、M0 = 10时,T1的工作方式为方式2,工作示意图如图6-11所示。*图6-11T0工作在方式3时T1为方式2的工作示意图(4)T1设置在方式3当T0设置在方式3,再把T1也设成方式3,此时T1停止计数。6.3对外部输入的计数信号的要求当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数器的值增1。每个机器周期的S5P2期间,都对外部输入引脚T0或T1进行采样。如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,由于确认一次负跳变要花2个机器周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果选用12MHz频率的晶体,则可输入最高频率为12M/24=500kHz的外部脉冲。对于外部输入信号的占空比并没有什么限制,但为了确保某一给定电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期。故对外部输入信号的要求如图6-12所示,图中,Tcy为机器周期。例T0运行于定时器状态,时钟振荡周期为12MHz,要求定时100µs。求不同工作方式时的定时初值C。解:fosc=12MHzT=1µsX=100µs/1µs=(100)D=64H 方式0(13位方式):C=213-64H=1F9CH 方式1(16位方式):C=216-64H=FF9CH 方式2、3(8位方式):C=28-64H=9CH 注意:工作方式0的初值装入方法: 1F9CH=1111110011100B 可见,TH0=0FCH,TL0=1CHTL0的低5位TH0的8位MOVTH0,#0FCHMOV TL0,#1CHT=12/fosc6.4定时器/计数器的编程和应用 1.根据要求选择方式,确定方式控制字,写入方式控制寄存器TMOD。 2.根据要求计算定时/计数器的计数值,再由计数值求得初值,写入初值寄存器(TL/TH)。 3.根据需要开放定时/计数器中断(后面须编写中断服务程序)。 4.设置定时/计数器控制寄存器TCON的值,启动定时/计数器开始工作。 5.等待定时/计数时间到,定时/计数到则执行中断服务程序;如用查询处理则编写查询程序判断溢出标志,溢出标志等于1,则进行相应处理。 注意是否需要重装定时初值,若需要连续反复使用原定时时间,且未工作在方式2,则应在中断服务程序中重装定时初值。C51定时器程序的编写 【例14-4】在AT89S51的P1口上接有8只LED。下面采用定时器T0的方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮一次。(1)设置TMOD寄存器 定时器T0工作在方式1,应使TMOD寄存器的M1、M0=01;定时器模式,应设置C/=0;对T0的运行控制仅由TR0来控制,应使GATE0=0。定时器T1不使用,各相关位均设为0。所以,TMOD寄存器应初始化为0x01。*(2)计算定时器T0的计数初值 设定时时间5ms(即5000µs),设定时器T0的计数初值为X,假设晶振的频率为11.0592MHz,则定时时间为:定时时间=(216−X)12/晶振频率 则5000=(216 −X)12/11.0592得:X=60928,转换成十六进制后为:0xee00,其中0xee装入TH0,0x00装入TL0。(3)设置IE寄存器 本例由于采用定时器T0中断,因此需将IE寄存器中的EA、ET0位置1。*(4)启动和停止定时器T0 将定时器控制寄存器TCON中的TR0=1,则启动定时器T0;TR0=0,则停止定时器T0定时。 定时器T0方式1中断定时的参考程序: #include<reg51.h> Chari=100; /*给变量i赋初值*/ voidmain() { TMOD=0x01; /*设置定时器T0为方式1*/ TH0=0xee; /*向TH0写入初值的高8位*/* TL0=0x00; /*向TL0写入初值的低8位*/ P1=0x00; /*P1口8只LED点亮*/ EA=1; /*总中断允许*/ ET0=1; /*定时器T0中断允许*/ TR0=1; /*启动定时器T0*/ while(1); /*循环*/ { ; }}*VoidT0_int(void)interrupt1/*定时器T0中断服务程序*/{ TH0=0xee;/*给T0装入16位初值,计数4608后,T0溢出*/ TL0=0x00; i--;/*循环次数减1*/ if(i<=0) { P1=~P1; /*P1口按位取反*/ i=100; /*重新设置循环次数*/ }}*6.4定时器/计数器的编程和应用4种方式,方式0与方式1基本相同,只是计数位数不同。方式0初值计算复杂,一般不用方式0,而用方式1。6.4.1方式1的应用【例6-1】假设系统时钟频率采用6MHz,在P1.0引脚上输出一个周期为2ms的方波,如图6-13所示。*图6-13P1.0引脚上输出周期为2ms的方波(2)初始化程序设计采用定时器中断方式工作。包括定时器初始化和中断系统初始化,主要是对寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。(3)程序设计中断服务子程序除了完成所要求的产生方波的工作之外,还要注意将计数初值重新装入定时器,为下一次产生中断做准备。本例,主程序用一条转至自身的短跳转指令来代替。*【例】系统时钟为6MHz,编写定时器T0产生1s定时的程序。基本思想:采用定时器模式。因定时时间较长,首先确定采用哪一种工作方式。时钟为6MHz的条件下,定时器各种工作方式最长可定时时间:方式0最长可定时16.384ms;方式1最长可定时131.072ms;方式2最长可定时512s。由上可见,可选方式1,每隔100ms中断一次,中断10次为1s。(1)计算计数初值X因为(216 − X)  2  10−6 = 10−1,所以X = 15536 = 3CB0H。因此TH0 = 3CH,TL0 = B0H。(2)10次计数的实现对于中断10次的计数,采用B寄存器作为中断次数计数器。(3)程序设计参考程序如下: ORG 0000H ;程序运行入口RESET:LJMPMAIN ;跳向主程序入口MAIN ORG 000BH ;T0的中断入口 LJMP IT0P ;转T0中断处理子程序IT0P ORG 1000H ;主程序入口MAIN: MOV SP,#60H ;设堆栈指针 MOV B,#0AH ;设循环次数10次 MOV TMOD,#01H ;设置T0工作在方式1定时 MOV TL0,#0B0H ;给T0设初值 MOV TH0,#3CH SETB ET0 ;允许T0中断 SETB EA ;总中断允许 SETB TR0 ;启动T0HERE: SJMP HERE ;原地循环,等待中断*IT0P: MOV TL0,#0B0H ;T0中断子程序,T0重装初值 MOV TH0,#3CH DJNZ B,RTURN ;B中断次数计数,减1非0则 ;中断返回 CLR TR0 ;1s定时时间到,停止T0工作 SETB F0 ;1s定时时间到标志F0置1RTURN:RETI程序说明:不论1s定时时间是否已到,都返回到“SJMPHERE”指令处。“SJMPHERE”指令实际是一段主程序。在这段主程序中再通过对F0标志的判定,可知1s定时是否到,再进行具体处理。如果定时时间较大,这时用一个定时/计数器直接处理不能实现,这时可用: 1、2个定时/计数器共同处理; 2、1个定时/计数器配合软件计数方式处理。如在P1.1输出1S的方波,这时应产生500ms的周期性的定时,定时到则对P1.1取反就可实现。由于定时时间较长,一个定时/计数器不能直接实现,可用定时/计数器T0产生周期性为10ms的定时,然后用一个寄存器R2对10ms计数50次或用定时/计数器T1对10ms计数25次实现。系统时钟为12MHz,定时/计数器T0定时10ms,计数值N为10000,只能选方式1,方式控制字为00000001B(01H),求初值X:X=65536-10000=55536=1101100011110000B则TH0=11011000B=D8H,TL0=11110000B=F0H。每20ms输出1次计25次P�1.1�80C51�1���������������������T0����10ms�T1����25���T1�T0��20ms�1S�����500ms�1S��1���������������������(1)用寄存器R2作计数器软件计数,中断处理方式。汇编程序: ORG0000H LJMPMAIN ORG000BH LJMPINTT0 ORG0100HMAIN:MOVTMOD,#01H MOVTH0,#0D8H MOVTL0,#0F0H MOVR2,#00H SETBEA SETBET0 SETBTR0 SJMP$INTT0:MOVTH0,#0D8H MOVTL0,#0F0H INCR2 CJNER2,#32H,NEXT CPLP1.1 MOVR2,#00HNEXT:RETIENDC语言程序:#include<reg51.h> //包含特殊功能寄存器库sbitP1_1=P1^1;chari;voidmain(){TMOD=0x01;TH0=0xD8;TL0=0xF0;EA=1;ET0=1;i=0;TR0=1;while(1);}voidtime0_int(void)interrupt1 //中断服务程序{TH0=0xD8;TL0=0xF0;i++;if(i==50){P1_1=!P1_1;i=0;}}(2)用定时/计数器T1计数实现:定时/计数器T1工作于计数方式时,计数脉冲通过T1(P3.5)输入,设定时/计数器T0定时时间到对T1(P3.5)取反一次,则T1(P3.5)每20ms产生一个计数脉冲,那么定时500ms只须计数25次。设定时/计数器T1工作于方式2,初值X=256-25=231=11100111B=E7H,TH1=TL1=E7H。定时/计数器T0工作于方式1,定时,则这时方式控制字为01100001B(61H)。定时/计数器T0和T1都采用中断方式工作。汇编程序如下: ORG0000H LJMPMAIN ORG000BH MOVTH0,#0D8H MOVTL0,#0F0H CPLP3.5 RETI ORG001BH CPLP1.1 RETI ORG0100HMAIN:MOVTMOD,#61H MOVTH0,#0D8H MOVTL0,#0F0H MOVTH1,#0E7H MOVTL1,#0E7H SETBEA SETBET0 SETBET1 SETBTR0 SETBTR1 SJMP$ END C语言程序如下:#include<reg51.h> //包含特殊功能寄存器库sbitP1_1=P1^1;sbitP3_5=P3^5;voidmain(){TMOD=0x61;TH0=0xD8;TL0=0xF0;TH1=0xE7;TL1=0xE7;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1);}voidtime0_int(void)interrupt1 //T0中断服务程序{TH0=0xD8;TL0=0xF0;P3_5=!P3_5;}voidtime1_int(void)interrupt3 //T1中断服务程序{P1_1=!P1_1;}6.4.2方式2的应用当某个定时器/计数器不使用时,可扩展一个负跳沿触发的外中断源。在计数工作方式下,如果把计数初值设为满量程FFH,则一旦外部信号从计数器引脚输入一个负跳变信号,计数器加1产生溢出中断。从而可以转去处理该外部中断源的请求。因此我们可以把外部中断源作为边沿触发输入信号,接至定时器的T0(P3.4)或T1(P3.5)引脚上,该定时器的溢出中断标志及中断服务程序作为扩充外部中断源的标志和中断服务程序。【例6-3】扩展一个负跳沿触发的外部中断源,把定时器/计数器T0脚作为外部中断请求输入端,溢出标志TF0作为外中断请求标志。基本思想:设为方式2(自动装入常数方式)计数模式,TH0、TL0初值均为0FFH。当T0脚发生负跳变时,T0计数溢出,TF0置“1”,单片机发出中断请求。初始化程序: ORG 0000H AJMP IINI ;跳到初始化程序 ORG 000BH AJMP IT0P ;跳到外中断处理程序IINI: MOV TMOD,#06H ;设置T0为方式2 MOVTL0,#0FFH ;设T0初值 MOVTH0,#0FFH SETBET0 ;允许T0中断 SETBEA ;总中断允许 SETB TR0 ;启动T0 ……IT0P:外中断处理程序段程序说明:当连接在P3.4(T0脚)的外部中断请求输入脚电平发生负跳变时,TL0加1,产生溢出,TF0置“1”,向单片机发出中断请求,同时TH0的内容0FFH送TL0,即TL0恢复初值0FFH。P3.4脚相当于一个负跳沿触发的外中断请求源输入。对P3.5也可做类似的处理。* 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 :从P1.0输出周期为500µs的方波,只须P1.0每250µs取反一次则可。当系统时钟为12MHz,定时/计数器T0工作于方式2时,最大的定时时间为256µs,满足250µs的定时要求,方式控制字应设定为00000010B(02H)。系统时钟为12MHz,定时250µs,计数值N为250,初值X=256-250=6,则TH0=TL0=06H。*【例】设MCS-51单片机系统时钟频率FCLK为12MHZ,要在P1.0引脚上输出1个周期为500µs的方波,汇编程序: ORG 0000H LJMPMAIN ORG000BH ;T0中断处理程序 CPLP1.0 RETI ORG0100H;主程序MAIN:MOV TMOD,#02H;选择T0的方式2,定时功能 MOVTH0,#06H MOVTL0,#06H SETBEA SETBET0 SETBTR0;启动T0 SJMP$ ENDC语言程序:#include<reg51.h>//包含特殊功能寄存器库sbitP1_0=P1^0;voidmain(){TMOD=0x02;TH0=0x06;TL0=0x06;EA=1;ET0=1;TR0=1;while(1);}voidtime0_int(void)interrupt1 //中断服务程序{P1_0=!P1_0;}(1)采用中断处理方式的程序:(2)采用查询方式处理的程序:C语言程序:#include<reg51.h>//包含特殊功能寄存器库sbitP1_0=P1^0;voidmain(){chari;TMOD=0x02;TH0=0x06;TL0=0x06;TR0=1;for(;;){if(TF0){TF0=0;P1_0=!P1_0;} //查询计数溢出}}汇编程序: ORG0000H LJMPMAIN ORG0100H;主程序MAIN:MOVTMOD,#02H MOVTH0,#06H MOVTL0,#06H SETBTR0LOOP:JBCTF0,NEXT;查询T0计数溢出位 SJMPLOOPNEXT:CPLP1.0 SJMPLOOP SJMP$ END【例6-4】当T0(P3.4)引脚上发生负跳变时,作为P1.0引脚产生方波的启动信号。开始从P1.0脚上输出一个周期为1ms的方波,如图6-14所示(系统时钟6MHz)。基本思想:T0设为方式1计数,初值为FFFFH。当外部计数输入端T0(P3.4)发生一次负跳变时,T0加1且溢出,溢出标志TF0置“1”,向CPU发出中断请求,此时T0相当于一个负跳沿触发的外部中断源。进入T0中断程序后,F0标志置“1”,说明T0引脚上已接收过负跳变信号。T1定义为方式2定时。在T0引脚产生一次负跳变后,启动T1每500s产生一次中断,在中断服务子程序中对P1.0求反,使P1.0产生周期1ms的方波。由于省去重新装初值指令,所以可产生精确的定时时间。图6-14负跳变触发输出一个周期为1ms的方波(2)计算T1的初值设T1的初值为x,则 (28 − x)  2  10−6 = 5  10−4 x = 28 − 250 = 6 = 06H(3)程序设计参考程序: ORG0000H ;程序入口RESET:LJMPMAIN ;跳向主程序MAIN ORG 000BH ;T0的中断入口 LJMPIT0P ;转T0中断服务程序 ORG001BH ;T1的中断入口 LJMPIT1P ;转T1中断服务程序 ORG0100H ;主程序入口MAIN: MOVSP,#60H ;设堆栈指针 ACALLPT0M2 ;调用对T0,T1初始化子程序LOOP: MOVC,F0 ;T0是否产生过中断,若产生 ;过,F0置1 JNC LOOP ;T0未产生中断,C=0,则跳 ;到LOOP,等待T0中断 SETBET1 ;允许T1产生定时中断 SETBTR1 ;启动T1HERE: AJMPHERE*PT0M2:MOVTMOD,#26H ;对T0,T1初始化,T0方式1 ;计数,T1方式2定时 MOVTL0,#0FFH ;T0置初值 MOVTH0,#0FFH SETBET0 ;允许T0中断 MOVTL1,#06H ;T1置初值 MOVTH1,#06H CLR F0 ;把T0已发生中断标志F0清0 SETBEA ;总中断允许 SETBTR0 ;启动T0 RETIT0P: CLR TR0 ;T0中断服务程序,停止T0计数 SETB F0;把T0引脚接收过负脉冲标志F0置1, ;即接收过负跳变 RETIIT1P: CPL P1.0 ;T1中断服务程序,P1.0位取反 RETI程序说明:当单片机复位时,从0000H跳向主程序MAIN处执行程序。其中调用了对T0,T1初始化子程序PT0M2。子程序返回后执行标号LOOP处指令,循环等待T0引脚上负脉冲的到来。由于负脉冲到来的标志位F0的复位初始值为0,所以程序就在标号LOOP处循环等待。当T0(P3.4)脚发生负跳变时,由于T0计数溢出,则跳向T0中断服务子程序。此时停止T0计数,并把T0引脚接收过负脉冲的标志F0置1。当中断返回时,由于F0已被置1,则程序跳出LOOP处的循环等待。此时执行指令来允许T1中断,并启动T1定时,然后执行“AJMPHERE”指令,循环等待,等待T1的500s定时中断到来。当T1的500s定时中断产生时,则进入T1的中断服务子程序IT1P,把P1.0脚电平取反。由于是自动装初值,省去对T1重装初值指令。中断返回后,到“AJMPHERE”处等待T1的500s定时中断。如此重复,即得到图6-14波形。【例6-5】利用定时器T1的方式2计数,每计满100个数,将P1.0取反。本例是方式2计数模式的应用举例。(1)选择工作方式外部信号由T1(P3.5)引脚输入,每发生一次负跳变计数器便加1,每输入100个脉冲,计数器将产生溢出中断,在中断服务程序中将P1.0取反一次。T1工作在方式2的控制字TMOD = 60H。不使用T0时,TMOD低4位任取,但不能使T0为方式3,这里取全0。(2)计算T1的初值 X = 28 − 100 = 156 = 9CHTL1的初值为9CH,重装初值寄存器TH1 = 9CH。*(3)参考程序: ORG 0000H ;程序运行入口 LJMP MAIN ;跳向主程序MAIN ORG 001BH ;T1中断服务程序入口 CPL P1.0 ;P1.0位取反 RETI ORG 0100H ;主程序入口MAIN: MOV TMOD,#60H ;设置T1为方式2计数 MOV TL0,#9CH ;T0置初值 MOV TH0,#9CH SETB TR1 ;启动T1HERE: AJMP HERE END程序说明:由于T1的中断服务子程序只有两条指令,不超过8个字节,所以进入T1中断服务程序入口后,没有选择再跳转。6.4.3方式3的应用方式3下的T0和T1大不相同。T0工作在方式3,TL0和TH0被分成两个独立的8位定时器/计数器。其中,TL0可作为8位的定时器/计数器,而TH0只能作为8位的定时器。此时T1只能工作在方式0、1或2。一般情况下,当T1用作串行口波特率发生器时,T0才设置为方式3。此时,常把定时器T1设置为方式2,用作波特率发生器。【例6-6】假设某AT89S51单片机应用系统的两个外部中断源已被占用,设置T1工作在方式2,用作波特率发生器。现要求增加一个外部中断源,并控制P1.0引脚输出一个5kHz(周期为200s)的方波。设时钟为12MHz。基本思想:设置TL0工作在方式3计数模式,TL0的初值设为0FFH,当检测到T0脚信号出现负跳变时,TL0溢出,同时向CPU申请中断,这里T0脚作为一个负跳沿触发的外部中断请求输入端。在中断处理子程序中,启动TH0,TH0事先被设置为方式3的100s定时,从而控制P1.0输出周期为200s的方波信号,如图6-15所示。 图6-15定时器P1.0输出的方波信号(1)初值X计算TL0的初值设为0FFH。5kHz方波的周期为200s,因此TH0的定时时间为100s。初值X计算:(28 − X)  1  10−6 = 1  10−4 X = 28 − 100 = 156 = 9CH(2)程序设计 ORG 0000HLJMP MAINORG 000BH ;TL0中断入口,TL0使用T0的中断LJMPTL0INT ;跳向TL0中断服务程序,TL0占用T0中断 ORG001BH ;TH0中断入口,T1为方式3时,TH0 ;使用了T1的中断 LJMPTH0INT ;跳向TH0中断服务程序 ORG0100H ;主程序入口MAIN:MOV TMOD,#27H ;T0方式3,T1方式2定时作串 ;行口波特率发生器 MOV TL0,#0FFH ;置TL0初值 MOV TH0,#9CH ;置TH0初值 MOV TL1,#datal ;TL1装入串口波特率常数 MOV TH1,#datah ;TH1装入串口波特率常数 MOV TCON,#55H ;允许T0 MOV IE,#9FH ;设置中断允许,总中断允许, ;TH0、TL0中断允许HERE:AJMPHERE ;循环等待TL0INT:MOVTL0,#0FFH ;TL0中断服务处理子程序,TL0 ;重新装入初值 SETBTR1 ;开始启动TH0定时 RETITH0INT:MOVTH0,#9CH ;TH0中断服务程序,TH0重新 ;装入初值 CPL P1.0 ;P1.0位取反输出 RETI 6.4.4门控制位GATEx的应用—测量脉冲宽度介绍门控制位GATE的具体应用,测量(P3.3)引脚上正脉冲的宽度。【例6-7】门控位GATE1可使T1的启动计数受的控制,当GATE1 = 1,TR1=1时,只有INT1*引脚输入高电平时,T1才被允许计数。可测量引脚(P3.3)上正脉冲的宽度。其方法如图6-16所示。 *图6-16利用GATE位测量正脉冲的宽度参考程序: ORG 0000HRESET:AJMPMAIN ;复位入口转主程序 ORG0100H ;主程序入口MAIN: MOV SP,#60H MOV TMOD,#90H ;向TMOD写控制字,T1为方 ;式1定时,GATE1 = 1 MOV TL1,#00H MOV TH1,#00HLOOP0:JB P3.3,LOOP0 ;等待低 SETBTR1 ;如为低,启动T1LOOP1:JNBP3.3,LOOP1;等待升高LOOP2:JBP3.3,LOOP2;为高,此时计数器计数, ;等待降低 CLRTR1;停止T1计数 MOV A,TL1;T1计数值送A ;将T1计数值送显示器  …… END执行以上程序,使引脚上出现的正脉冲宽度以机器周期数的形式显示在显示器上。*将A中的T1计数值送到显示器显示【例】P1.7驱动LED亮1秒灭1秒地闪烁,设时钟频率为6MHz。T=2µs,X=5×105个T,而最大只能65536个T,不能满足要求,必须借助硬件计数器或软件循环。T0定时初值:(方式1)t=10ms,X=5000D=1388H,C=216-5000=EC78HT1计数初值:(方式2)X=50D,C=28-50=CDH 本题采用硬件方式: T0定时,定时10ms; T1计数T0的定时跳变信号P1.0的负跳变次数,计满50个跳变为1秒。(查询方法)�1�P�1.7�80C51�P�1.0�T�1�20ms�1S�+5V�T�0������T�1�����50���LED�START:MOVTMOD,#61H MOVTL1,#0CDH MOVTH1,#0CDH CLRP1.0 SETBTR1LOOP1:CPLP1.7LOOP2:MOVTL0,#78H MOVTH0,#0ECH SETBTR0LOOP3:JBC TF0,LOOP4 SJMPLOOP3LOOP4:MOVTL0,#78H MOVTH0,#0ECH CPL P1.0 JBC TF1,LOOP1 SJMPLOOP2#include<reg51.h>sbitP1_0=P1^0;sbitP1_7=P1^7;timer0interrupt1using1{ /*T0中断服务程序*/ P1_0=!P1_0; /*10ms定时时间到,P1.0反相*/ TH0=(65536-5000)/256; /*计数初值重装载*/ TL0=(65536-5000)%256;}timer1interrupt3using2{ /*T1中断服务程序入口*/ P1_7=!P1_7; /*1s定时时间到,灯改变状态*/}main(){ P1_7=0; /*置灯初始灭*/ P1_0=1; /*保证第一次反相便开始计数*/ TMOD=0x61; /*定时器0工作在方式1定时,定时器1工作在方式2计数*/ TH0=(65536-5000)/256; /*预置计数初值*/ TL0=(65536-5000)%256; TH1=256-50; TL1=256-50; IP=0x08; /*置优先级寄存器*/ EA=1; /*CPU开中断*/ ET0=1; /*开T0中断*/ ET1=1; /*开T1中断*/ TR0=1; /*启动T0*/ TR1=1; /*启动T1*/ for(;;){ }}【例】由P3.4(T0)引脚输入一个频率小于0.5kHz的低频脉冲信号,要求P3.4每发生一次负跳变时,P1.0输出一个500μs的同步负脉冲,同时P1.1输出一个1ms的同步正脉冲。已知晶振频率为fosc=6MHz。解题分析:按题意画出输出信号的波形如图所示。500μs500μs1ms1msP1.1P3.4P1.0设初态P1.0输出高电平,P1.1输出低电平。设T0以工作方式2计数,计数初值为FFH。当加在引脚T0上的外部脉冲产生由1至0的负跳变时,则使T0计数器加1而产生溢出,进入中断服务程序。在中断服务程序中,T0改变为以工作方式2定时500μs,并且使P1.0输出低电平,P1.1输出高电平。当第一次定时500μs到时,定时器溢出后,使P1.0恢复为高电平,T0继续第二次500μs定时,产生溢出后,使P1.1恢复为低电平。然后T0又恢复对外部脉冲进行计数,如此循环。500μs定时计数初值:(28-X)×2×10-6=500×10-6求解得:X=06H。主程序:  ORG 0000H AJMP MAIN ORG 000BH ;T0中断服务程序入口 AJMP IT0P ORG 0100HMAIN: MOV TMOD,#06H ;设置T0工作方式2,计数 MOV TH0,#0FFH ;设置T0计数初值 MOV TL0,#0FFH SETB EA ;中断总允许 SETB ET0 ;定时器0允许中断 SETB P1.0 ;P1.0初态为高电平 CLR P1.1 ;P1.1初态为低电平 SETB TR0 ;启动定时器0 SJMP $ ;等待中断 T0的中断服务程序: IT0P: CLR TR0 ;关闭定时器0 MOV TMOD,#02H ;设置T0为方式2,定时 MOV TH0,#06H ;设置T0计数初值 MOV TL0,#06H MOV IE,#00H ;禁止中断 CLR P1.0 ;P1.0为低电平 SETB P1.1 ;P1.1为高电平 SETB TR0 ;启动定时器0LOOP1: JBC TF0,LP1 ;第一个500μs到否 SJMP LOOP1 ;未到等待LP1: SETB P1.0 ;到了P1.0变为高电平LOOP2: JBC TF0,LP2 ;第二个500μs到否 SJMP LOOP2LP2: CLR P1.1 ;到了P1.1变为低电平 CLR TR0 ;关闭定时器0 MOV TMOD,#06H ;T0重新设为方式2,计数 MOV TH0,#0FFH ;T0重新赋初值 MOV TL0,#0FFH MOV IE,#82H ;定时器0中断允许 SETB TR0 ;启动定时器0 RETI ;中断返回 END 6.4.5实时时钟的设计介绍使用定时器/计数器实现时钟。1.实现实时时钟的基本思想最小计时单位是秒,如何获得1s的定时时间呢?从前面介绍知,定时器方式1,最大定时时间也只能131ms。可将定时器的定时时间定为100ms,中断方式进行溢出次数的累计,计满10次,即得秒计时。而计数10次可用循环程序的方法实现。初值的计算如例6-2。片内RAM规定3个单元为秒、分、时单元:42H:“秒”单元;41H:“分”单元;40H:“时”单元从秒到分,从分到时是通过软件累加并比较来实现。要求每满1秒,则“秒”单元42H中的内容加1;“秒”单元满60,则“分”单元41H中的内容加1;“分”单元满60,则“时”单元40H中的内容加1;“时”单元满24,则将42H、41H、40H的内容全部清“0”。2.程序设计(1)主程序设计进行定时器T0初始化,并启动T0,然后反复调用显示子程序,等待100ms中断到来。流程如图6-17所示。(2)中断服务程序的设计实现秒、分、时的计时处理。流程如图6-18所示。 图6-17时钟主程序流程 *图6-18中断服务程序流程参考程序: ORG 0000H AJMP MAIN ;上电,跳向主程序 ORG 000BH ;T0的中断入口 AJMP IT0P ORG 1000HMAIN: MOV TMOD,#01H ;设T0为方式1 MOV 20H,#0AH ;装入中断次数 CLR A MOV 40H,A ;“时”单元清“0” MOV 41H,A ;“分”单元清“0” MOV 42H,A ;“秒”单元清“0” SETBET0 ;允许T0申请中断 SETBEA ;总中断允许 MOV TH0,#3CH ;给T0装入计数初值 MOV TL0,#0B0H SETBTR0 ;启动T0HERE:SJMPHERE ;等中断(也可调用显示子程序)IT0P: PUSHPSW ;T0中断子程序入口,保护现场 PUSHAcc MOV TH0,#3CH ;重新装入初值 MOV TL0,#0B0H DJNZ20H,RETURN ;1秒时间未到,返回 MOV 20H,#0AH ;重置中断次数 MOV A,#01H ;“秒”单元增1 ADD A,42H DA A ;“秒”单元十进制调整 MOV 42H,A ;“秒”的BCD码存回“秒”单元 CJNE A,#60H,RETURN ;是否到60秒,未到则返回 MOV 42H,#00H ;计满60秒,“秒”单元清“0” MOV A,#01H ;“分”单元增1 ADD A,41H DA A ;“分”单元十进制调整 MOV 41H,A ;“分”的BCD码存回“分”单元 CJNE A,#60H,RETURN ;是否到60分,未到则返回 MOV 41H,#00H ;计满60分,“分”单元清“0” MOV A,#01H ;“时”单元增1 ADD A,40H DA A ;“时”单元十进制调整 MOV 40H,A CJNE A,#24H,RETURN ;是否到24小时,未 ;到则返回 MOV 40H,#00H ;到24小时,“时”单元清“0”RETURN:POP Acc ;恢复现场 POP PSW RETI ;中断返回 END
本文档为【第6章 定时器计数器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
xxj7584
暂无简介~
格式:ppt
大小:1MB
软件:PowerPoint
页数:0
分类:建造师考试
上传时间:2020-03-20
浏览量:0