1、1,第七章 单片机定时/计数器 原理和应用,2,定时/计数器的应用 1计数功能: 生产线上产品计数。每个产品通过得到一个脉冲信号,计数器记录脉冲个数,当计数值与设定值相等,启动包装机器。 检测转速。电机转动一圈发出一个脉冲,计数器记录一秒时间内脉冲个数,显示转速。,2定时功能: 用于实时控制,定时采样、定时启动等。当前时间与设定时间值相等,执行规定操作。,3,定时/计数的方法,实现定时功能,比较方便的办法是利用单片机内部的定时/计数器。也可以采用下面三种方法:,软件定时:软件定时不占用硬件资源,但占用了CPU时间,降低了CPU的利用率。 时基电路定时:例如采用555电路,外接必要的元器件(电阻
2、和电容),即可构成硬件定时电路。但在硬件连接好以后,定时值与定时范围不能由软件进行控制和修改,即不可编程。 可编程芯片定时:这种定时芯片的定时值及定时范围很容易用软件来确定和修改,此种芯片定时功能强,使用灵活。在单片机的定时/计数器不够用时,可以考虑进行扩展。,4,7.1 定时/计数器的结构和工作原理,一、定时/计数器的结构 定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。,5,单片机工作的时间概念,振荡周期: 也称时钟周期, 是指为单片机提供时
3、钟脉冲信号的振荡源的周期。 机器周期: 一个机器周期包含 6 个状态周期S1S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。 定时概念 定时源、初始值、计数方向。 容量、溢出。,6,二、定时/计数器的工作原理,加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求。如果定时/计数器工作于定时模式,则表示设定时间到;如果工作于计数模式,则表示计数值已
4、满。可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。,7,设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期T就是定时时间t ,t = NT。,设置为计数器模式时,外部脉冲由T0或T1引脚输入到计数器。在每个机器周期的S5P2期间采样T0、T1引脚电平。当某周期采样到高电平输入,而下一周期又采样到低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。当晶振频率为12MHz时,最高计数
5、频率不超过1/2MHz,即计数脉冲的周期要大于2 s。,8,7.2 定时/计数器的控制,80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。 一、工作方式寄存器TMOD工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。每位意义,9,GATE:门控位。GATE0时,用软件启动定时/计数器工作(使TCON中的TR0或TR1为1);GATA1时,由软件和硬件联合启动定时/计数器工作(外部中断引脚为高电平)。可据此测量脉宽。: 定时/计数模式选择位。为0时选择定时模式;为1时选择计数模式。 M1M
6、0:工作方式设置位。定时/计数器有四种工作方式。,10,T1停止,也可工作,具体见后,11,二、控制寄存器TCONTCON的低4位用于控制外部中断。TCON的高4位用于控制定时/计数器的启动和中断申请。,TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。 TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。还需考虑GATE的功能。 TF0(TCON.5):T0溢出中断请求标志位,
7、其功能与TF1类同。 TR0(TCON.4):T0运行控制位,其功能与TR1类同。,12,三、计数寄存器TH、TL,定时/计数器的寄存器,高字节TH,低字节TL。计数的初始值保存其中。,13,7.3 定时/计数器的工作方式 一、方式0(已不使用)方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。,14,二、方式1(常用) 方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 。计数个数与计数初值的关系为:,定时器的初值还可以采用计数个数直接取补
8、法获得。如:MOV TH0,#high(5000)TH0=(5000) 8;,15,三、方式2 方式2为自动重装初值的8位计数方式。,工作方式2特别适合精确的时间控制,信号发生器;串口通信。,计数个数与计数初值的关系为:,16,四、方式3(T0对T1有影响) 方式3只适用于定时/计数器T0,T1处于方式3时相当于TR1=0,停止计数;但仍可选其它方式工作/串口。,T0在方式3时分为两个独立的8位计数器TL0和TH0,TL0正常工作,TH0只能定时,借用TR1和TF1。,17,五、80C52具有定时器/计数器T2,T2的控制寄存器为T2CON和T2MOD,18,7.4 定时/计数器用于外部中断扩
9、展 利用计数器方式,计数初值设定为满程,将待扩展的外部中断源接到外部计数引脚。当该引脚输入一个下降沿信号时,计数器便加1,并产生溢出中断。,外部信号,加1计数溢出中断,19,例,利用T0扩展一个外部中断源。设置T0为方式2工作,TH0、TL0的初值均为0FFH,允许中断。其初始化程序如下:TMOD=0x06 ; 0000 0110置T0为计数器方式2TL0=0x0FF ; 计数初值为满程TH0=0x0FFTR0=1 ;启动T0工作ET0=1 ;允许T0中断 EA =1 ;CPU开中断,20,7.5 定时/计数器应用 初始化程序需完成如下准备: 1 确定T0和T1的工作方式,对TMOD赋值。 2
10、 计算初值,并将其写入TH0、TL0或TH1、TL1。 X=2n-N=2n-t/T=2n-tf 3 使TR0或TR1置位,启动定时/计数器定时或计数。 中断方式时,则对IE赋值,开放中断。 注意:T0和T1对号入座。,21,应用,结合I/O口产生脉冲波形; 测量外接信号的频率和(正)脉宽; 延时; 串行通信等。,22,单片机定时/计数器 的应用实例,23,基础知识 初始化步骤: 1 确定T0和T1的工作方式,对TMOD赋值。 2 计算初值,并写入TH0、TL0或TH1、TL1。 X=2n-N=2n-t/T=2n-tf 简便方法:取补数:MOV TH0,#high(5000)TH0=(5000)
11、 8; 3 使TR0或TR1置位,启动定时/计数器工作。 中断方式时,需对IE赋值,开放中断。并有中断服务程序。,24,应用举例,结合I/O口产生方波,结合D/A产生任意脉冲波形;测量外接信号的频率和正脉宽;延时;串行通信等。一. 产生方波,可采用中断和查询方式(清除TF )。重点选择定时方式1和2(包括软件扩展)。提示:忽略方式0的例子。,25,产生方波信号实例,例,从P1.0管脚上输出脉冲波形,高电平持续时间为5ms,低电平持续时间为12ms(设单片机的时钟晶体为12MHz)。 算法:循环结构,先定时5ms,P1.0脚输出高电平;5ms定时到后,从P1.0脚上输出低电平,再定时12ms,1
12、2ms定时到后,又回到5ms的定时循环工作。查询方式必须清除标志。 初值:N5=5000/1=5000,N12=12000/1=12000。,26,查询源程序,ORG 0000HCALL T0init ;调用T0初始化子函数 LOOP: SETB P1.0 ;输出高电平MOV TH0 , #high(-5000) ;T0送定时5ms初值MOV TL0 , #low(-5000)JNB TF0 ,$ ;等5ms的定时到CLR TF0 ;时间到清TF0标志位CLR P1.0 ;将P1.0置为低电平MOV TH0 , #high(-12000) ;送定时12ms初值MOV TL0 , #low(-1
13、2000)JNB TF0 ,$ ;等待12ms的定时到CLR TF0 ;时间到清TF0标志位AJMP LOOP T0init: MOV TMOD , #01H ;T0 方式1 定时SETB TR0 ;启动T0工作RETEND,开始,送高电平,定时5ms,时间到,清标志,送低电平,定时12ms,Y,N,时间到,清标志,Y,N,定时初始化,27,C51查询源程序,#include void T0init (void) P1_0=1; TMOD=0x01; / T0 方式1 定时TH0=0xec; /给定时器T0送5ms初值TL0=0x78; TR0=1; /启动T0工作 void main (vo
14、id) T0init(); /调用T0初始化子函数while(1)while(TF0=0); /等5ms的定时到TF0=0; P1_0=0; TR0=0;TH0=0xd1; TL0=0x20; TR0=1;while(TF0=0); /等12ms的定时到TF0=0; P1_0=1; TR0=0;TH0=0xec; TL0=0x78; TR0=1; ,28,中断源程序,ORG 0000HAJMP MAINORG 001BHAJMP T1PRG MAIN: MOV R0,#1 ;R0=0定时5ms R0=1定时12ms T1init: SETB P1.0 ;P1.0位置高MOV TMOD , #1
15、0H ;T1 方式1 定时MOV TH1 , #0ECH ;给定时器T1送5ms初值MOV TL1 , #78HSETB ET1 ;允许T1中断SETB EA ;开中断SETB TR1 ;启动T1工作SJMP $ ;等待中断 T1PRG:CJNE R0,#0,LP1SETB P1.0 ;R=0将P1.0置高MOV TH1, #0ECH ;T1送定时5ms初值MOV TL1 , #78HMOV R0,#1 ;下一次中断定时12msAJMP LP2 LP1: CLR P1.0 ;R=1将P1.0置为低电平MOV TH1 , #0D1H ;T1送定时12ms初值MOV TL1 , #20HMOV R
16、0,#0 ;下一次中断定时5ms LP2: RETIEND,修改定时值,中断开始,返回,主开始,5ms定时,保存定时值,等待,送高电平,定时5ms,N,Y,送高电平,定时5ms,29,C51中断源程序,#include bit i=0; /位变量i=0定时5ms i=1定时12ms void main (void) TMOD=0x10; / T1 方式1 定时TH1=0xec; /给定时器T1送5ms初值TL1=0x78; P1_0=1;ET1=1; /允许T1中断EA=1; /开中断TR1=1; /启动T1工作while(1); /等待定时中断 void T1PRG(void) interr
17、upt 3 i=i; /位变量取反if (i) P1_0=0; /产生12ms低电平TH1=0xd1; /i=1送定时12ms的初值TL1=0x20; else P1_0=1; /产生5ms高电平TH1=0xec; / i=0送定时5ms的初值TL1=0x78; ,30,二. 测量频率(速率),例,外部信号接到T1(P3.5)管脚,测量其速率,结果保存在30H和31H单元(低高字节)。已知:单片机系统时钟为6MHz,被测信号速率在500-65536/分钟范围内。 分析:T0用于定时,产生120ms,测量T1的计数结果,扩大500倍得到每分钟的转速。循环结构。 初值:N120=120ms/2us
18、=60000(教材P166的-6000错误),31,源程序,ORG 0000HMOV TMOD , #51H ;T0 模式1定时,T1模式1计数 start:MOV TL0 , #low(-60000) ;送定时120ms的初值MOV TH0 , #high(-60000)MOV TH1,#0 ;T1的计数器清0MOV TL1,#0SETB TR0 ;启动T0定时SETB TR1 ;启动T1计数JNB TF0 ,$ ;等待T0 120ms的定时到CLR TF0 ;清除TF0标志位CLR TR0 ;停止T0定时CLR TR1 ;停止T1计数MOV 30H,TL1 ;将低8位放入30H中MOV 3
19、1H,TH1 ;将高8位放入31H中AJMP startEND,开始,设置定时和计数方式,时间到,清标志,停止计数,Y,N,T1计数清0,T0定时120ms,启动定时,计数,保存计数结果,32,C51源程序,#include void init (void) TMOD=0x51; /T0 方式1定时,T1 模式1计数TL0=-60000; TH0=(-60000) 8;TL1=0; TH1=0; TR0=1; TR1=1; void main (void) unsigned char x, y;init(); /调用初始化子函数while(1) while(TF0=0); /等待T0 120m
20、s的定时到TF0=0; /清除TF0标志位TR0=0; /停止T0定时TR1=0; /停止T1计数x=TH1; /将高8位放入x中y=TL1; /将低8位放入y中TL0=-60000;TH0=(-60000) 8;TL1=0; /T1的计数器清0TH1=0;TR0=1; /启动T0工作TR1=1; /启动T1工作 ,33,三. 测量正脉冲宽度,例,脉冲信号接在单片机的INT0(P3.2)引脚,测其正脉冲宽度,结果以机器周期数的形式存放在单片机RAM中的30H(低8位)和31H(高8位)两个单元中。单片机系统时钟为12MHz。 分析:被测信号作为T0的门控信号,T0设置为定时器,初值为0。在IN
21、T0为低时取结果并准备下次测量。,取数准备 计数 取数准备,34,源程序,ORG 0000HMOV TMOD, #09h ;T0方式1定时 GATE=1MOV TH0 , #0 ;给定时器T0送初值MOV TL0 , #0JB P3.2 ,$ ;将检测到的第一个高电平放弃 Loop: SETB TR0 ;启动T0工作JNB P3.2 , $ ;等待下一个高电平来JB P3.2 ,$ ;等待高电平结束CLR TR0 ;停止T0计数MOV 30H,TL0 ;将计数值的低8位放入30H中MOV 31H,TH0 ;计数值的高8位放入31H中MOV TH0 , #0 ;给定时器T0送初值MOV TL0
22、, #0AJMP LOOPEND,开始,设置门控定时方式,定时清0,等待低电平,定时清0,启动定时,保存定时结果,等待高,低电平,停止定时,35,C51源程序,#include void main (void) TMOD=0x09; /T0模式1内部时钟GATE1TH0 =0; /给定时器T0送初值TL0=0;while(P3_2 =1); /将检测到的第一个高电平放弃while(1) TR0=1; /启动T0工作while(P3_2 =0); /等待下一个高电平来while(P3_2 =1); /等待高电平结束TR0=0; /高电平结束,立即停止T0计数y=TL0; /将计数值的低8位放入y
23、中x=TH0; /将计数值的高8位放入x中TH0=0; /给定时器T0送初值TL0=0; ,36,四. 长时间精确定时方法,例,在P3.1管脚输出100ms周期的脉冲信号。单片机系统时钟为12MHz。 分析:选择方式2,机器周期为1us,一个定时器的最长定时时间为256us。可用硬件定时250us结合软件计数200次的方法扩展设定时间为50ms。,37,源程序,ORG 0000HMOV TMOD, #02h ;T0方式2定时MOV TH0 , #-250 ;给定时器T0送初值MOV TL0 , #-250SETB TR0 ;启动T0工作SETB P3.1 Loop: MOV R7, #200
24、L5: JNB TF0 , $ ;等待定时到CLR TF0 ;清标志DJNZ R7, L5 ;重新定时CPL P3.1 ;输出电平变换AJMP LoopEND,开始,设置定时方式,设置定时次数,送高电平,启动定时,电平变换,等待,等定时数,定时250us,38,获得两个不同的精确长时间,例,基本条件同前例,要求脉冲信号的高电平宽度为600us,低电平为1ms。 分析:选择方式2,结合软件计数,定时设为200us。1如果用查询方式则分别计数3次和5次; 2如用中断方式,可以设置标记,中断后交替计数3次和5次; 3中断方式连续计数:计数到3时改为低电平,到8时回到高电平,从0开始计数。,39,源程
25、序,ORG 0000HJMP MAINORG 0BHJMP T0SV MAIN: CALL INITSETB P3.1MOV R7, #0JMP $ INIT: MOV TMOD, #02HMOV TH0 , #-200MOV TL0 , #-200SETB TR0MOV IE, #82HRET T0SV: INC R7CJNE R7, #3, C8CLR P3.1JMP OVR C8: CJNE R7, #8, OVRSETB P3.1MOV R7, #0 OVR: RETIEND,加1计数,中断开始,返回,主开始,3次,计数清0,等待,送低电平,N,Y,中断、定时初始化,8次,送高电平, 清0,N,Y,40,复习与作业,应用、编程 1、6(不用T2)、7、10。,