《定时器计数器》课件.ppt
第8讲 定时器/计数器,8.1 定时器/计数器概述8.2 定时器/计数器的构成8.3 定时器/计数器的用法8.4 定时器/计数器的控制8.5 定时器/计数器的应用(1)8.6 定时器/计数器的应用(2),8.1 定时器/计数器概述,定时器/计数器是MCS-51单片机的重要功能模块之一。在检测、控制及智能仪器等应用中,常用定时器作实时时钟来实现定时检测、定时控制。还可用定时器产生毫秒宽的脉冲驱动步进电机。计数器主要用于外部事件的计数。MCS-51单片机内部有两个16位定时/计数器T0和T1,它们既可用作定时器,也可用作计数器,应用哪种,可以通过编程来设定。定时器/计数器在MCS-51单片机中的引脚位置:T0:P3.4,T1:P3.5,返回本节,8.2 定时器/计数器的构成,两个定时器/计数器(T0和T1)。每个定时器/计数器都是由两个8位计数器构成的16位计数器,分别由特殊功能寄存器TH0、TL0和TH1、TL1组成,最大计数值216=65536。寄存器TCON。TCON为控制寄存器,用来控制两个定时器/计数器的启动/停止。寄存器TMOD。TMOD为工作方式控制寄存器,用来设置定时器/计数器的工作方式。,返回本节,定时/计数器结构示意图,8.3 定时器/计数器的用法,返回本节,时钟振荡器,12分频,1MHz,12MHz,定时/计数器T0,中断系统,1、定时器的用法 定时器的功用是用来确定时间。如果要求单片机在一定的时间后产生某种控制,可将定时器/计数器设为定时器。如下图,将定时/计数器T0设为定时器,实际上就是将定时/计数器与外部中断断开,而与内部信号接通,对内部信号进行计数。,时钟振荡器,12分频,1MHz,12MHz,定时/计数器T0,中断系统,T0,单片机定时器用法示意图,P2.1,+5V,8.3 定时器/计数器的用法,返回本节,单片机的时钟振荡器可产生12MHz的时钟脉冲信号,它经过12分频后得到1MHz的脉冲信号,1MHz信号每个脉冲的持续时间为1s。如果定时器T0对1MHz的信号进行计数,当计到65536时,将需要65536s,也即65.536ms。65.536ms后定时器计数达到最大值,会溢出而输出一个中断请求信号去中断系统,中断系统接受中断请求后,执行中断子程序,子程序的运行结果将P2.1端口置“0”,发光二极管发光。,8.3 定时器/计数器的用法,返回本节,任意定时的方法在上例中,定时器只有在65.536ms后计数达到最大值时才会溢出,如果需要不到65.536ms定时器就产生溢出,如1ms,可以对定时器预先进行置数。将定时器初始值置为64536,这样定时器就会从64536开始计数,当计到65536时,定时器定时就为1ms而产生一个溢出信号。,8.3 定时器/计数器的用法,返回本节,2、计数器的用法 计数器的功能是用来计数。在单片机内有一个定时/计数器T0,可以用编程的方法将它设为计数器,当作计数器用时,它有16位,最大计数值216=65536。当脉冲信号输入时,计数器对脉冲进行计数,计数达到最大值65536时,计数器溢出,会输出一个中断请求信号到中断系统,中断系统接受中断请求后,执行中断子程序。任意计数的方法与任意定时的方法类似,也是先进行预先置数,然后才开始计数。,8.4 定时器/计数器的控制,返回本节,1、定时器/计数器控制寄存器TCON寄存器TCON的功能主要是接收各种中断源送来的中断请求信号,同时也对定时器/计数器进行启动/停止控制。寄存器TCON的字节地址是88H,它有8位,每位均可进行位寻址。各位的地址和名称如下:,8.4 定时器/计数器的控制,返回本节,TF0和TF1:分别是定时器/计数器0和1的中断请求标志位。当定时器/计数器工作产生溢出时,会将TF0或TF1位置“1”,表示定时器/计数器有中断请求。TR0和TR1:分别是定时器/计数器0和1的启动/停止位。在编程时,若将TR0或TR1设置为“1”,那么相应的定时器/计数器就开始工作,若设置为“0”,相应的定时器/计数器则会停止工作。IE0、IE1、IT0、IT1:用作中断的控制,在中断将再详细讲述。在单片机复位时,寄存器TCON的各位均为“0”,8.4 定时器/计数器的控制,返回本节,2、工作方式控制寄存器TMOD寄存器TMOD的功能是控制定时器/计数器T0、T1 的工作方式和操作模式。寄存器TMOD的字节地址是89H,高4位用来控制定时器/计数器T1,低4位用来控制定时器/计数器T0,它们对定时器/计数器T1、T0的控制功能一样。在上电(给电路加电源)和复位时,寄存器TMOD中的数据为00H。不可以对它进行位操作。寄存器TMOD各位的名称如下:,8.4 定时器/计数器的控制,返回本节,下面以高4位控制定时器/计数器T1为例来说明各位的具体功能:GATE:门控位,用来控制计数器的启动是否受外部中断请求信号的影响。GATE=1,计数器的启动受芯片引脚(P3.3)的控制,即除了需要将寄存器TCON的TR1位置“1”外,还要使 引脚为高电平;GATE=0,只要寄存器TCON的TR1位置“1”,就可以启动T1开始工作。:定时、计数功能设置位。=0,将定时器/计数器设置为定时器工作方式;=1,将定时器/计数器设置为计数器工作方式。M1、M0位:定时器/计数器工作方式选择位。M1、M0位取不同值得组合,可以将定时器/计数器设置位不同的工作方式。M1、M0位不同取值与定时器/计数器工作方式的关系见下表:,8.4 定时器/计数器的控制,返回本节,8.5 定时器/计数器的应用(1),返回本节,设晶振为12MHz,使用定时/计数器作为延时控制时,要求在两灯P0.0和P0.1之间按1s互相闪烁。,8.5 定时器/计数器的应用(1),返回本节,设晶振为12MHz,使用定时/计数器作为延时控制时,要求在两灯P0.0和P0.1之间按1s互相闪烁。设计步骤:1、系统分析2、硬件设计3、软件设计4、流程图设计5、ASM程序设计6、C程序设计,8.5 定时器/计数器的应用(1),返回本节,8.5 定时器/计数器的应用(1),返回本节,程序设计由于定时器直接延时的最大时间Tmax=65536s=65.536ms,为延时1s,必须采用循环计数方式实现。方法为:定时器设延时50ms(初始值应为:15536s),单片机内部寄存器加1,然后定时器重新延时,当内部寄存器计数达20次时,表示延时1s。使用定时器T0工作在方式1,延时50ms,初始值TMOD为01H,TH0为3CH,TL0为B0H。15536=0011 1100 1011 0000B=3CB0H,8.5 定时器/计数器的应用(1),返回本节,程序流程图,8.5 定时器/计数器的应用(1),返回本节,汇编程序 ORG 0000H LJMP MAIN ORG 0100H MAIN:MOV SP,#60H;初始化堆栈,给定时器0赋初值 MOV TMOD,#01H;使用16位模式方式1 M1=0 M0=1 MOV TH0,#3CH;初始化定时器0的溢出间隔时间为50ms MOV TL0,#B0H;TH为高位,TL为低位 SETB TR0;启用定时器0 SETB P0.0 CLR P0.1 MOV R7,#00H;用R7计数LOOP:JNB TF0,LOOP;TF0不是1,无溢出,继续循环,是1,向下执行 MOV TH0,#3CH;初始化定时器0的溢出时间 MOV TL0,#B0H INC R7 CLR TF0 CJNE R7,#14H,LOOP ACALL LOOP1;20次循环闪烁一次 AJMP LOOPLOOP1:MOV R7,#00H CPL P0.0;让接P0.0的发光二极管按50ms闪烁 CPL P0.1 RET END,8.5 定时器/计数器的应用(1),返回本节,#includereg51.h#define uint unsigned int#define uchar unsigned charsbit P0_0=P00;sbit P0_1=P01;uint t=0;void time0_server_(void)interrupt1 TH0=0 x3C;/定时时间为50ms,12MHz的晶振 TL0=0 xB0;t+;void Init_t0(void)/定时器初始化 TMOD=0X01;/选择方式1 TH0=0 x3C;TL0=0 xB0;EA=1;/开放中断ET0=1;/定时器中断允许TR0=1;/启动TR0,8.5 定时器/计数器的应用(1),返回本节,void main(void)P0_0=1;P0_1=0;Init_t0();while(1)time0_server_(void)interrupt1 if(t=20)t=0;P0_0=P0_0;P0_1=P0_1;,8.5 定时器/计数器的应用(1),返回本节,定时/计数器的应用1的运行结果,8.5 定时器/计数器的应用(2),返回本节,设单片机的晶振频率为12MHz,使用定时器1,在方式0下由P1.0输出周期为1ms的等宽正方波,以查询方式完成。,8.5 定时器/计数器的应用(2),返回本节,设单片机的晶振频率为12MHz,使用定时器1,在方式0下由P1.0输出周期为1ms的等宽正方波,以查询方式完成。,8.5 定时器/计数器的应用(2),返回本节,设单片机的晶振频率为12MHz,使用定时器1,在方式0下由P1.0输出周期为1ms的等宽正方波,以查询方式完成。分析如下:方式0(M1=0,M0=0):13位计数器,T0用TH0(8位)和TL0的低5位,T1用TH1(8位)和TL1的低5位,最大计数值为213=8192要产生1ms的等宽正方波脉冲,只需在P1.0端每隔500s交替输出高、低电平即可实现。使用12MHz的晶振频率,则1个机器周期为1s。定时器起始值应为:位)TH1(前8位)=11110000B=F0H,TL1(后5位)=00001100B=0CH,8.5 定时器/计数器的应用(2),返回本节,开始,定时/计数器初始值设置,启动定时/计数器,计数器是否产生溢出?,定时/计数器重新赋值,P1.0取反产生脉冲,计数器计数,Y,N,程序流程图设计,8.5 定时器/计数器的应用(2),返回本节,汇编源程序ORG 0100HMOV TMOD,#00H;设置T1为工作方式0MOV TH1,#0F0H;设置T1的计数初值XMOV TL1,#0CHMOV IE,#00H;禁止中断SETB TR1;启动T1LP1:JBC TF1,LP2;查询计数是否溢出 AJMP LP1;没有溢出继续 LP2:MOV TH1,#0F0H;溢出,重新设置计数初始值X MOV TL1,#0CHCPL P1.0;输出取反SJMP LP1;重复循环END,8.5 定时器/计数器的应用(2),返回本节,单片机C程序#includesbit P1_0=P10;void main()TMOD=0 x00;TR1=1;for(;)TH1=0 xf0;TL1=0 x0c;do while(TF1=0);P1_0=P1_0;TF1=0;,8.5 定时器/计数器的应用(2),返回本节,