单片机应用技术 项目二 电子打铃装置 第4讲 单片机的定时器/ 计数器 《单片机应用技术》精品课程组 湖北职业技术学院机电工程系
单片机应用技术 内容提要: 一、定时方法概述 二、定时器/计数器的结构和工作原理 三、定时器/计数器的控制 四、定时器/计数器工作方式 五、定时器/计数器综合应用举例
单片机应用技术 一、定时方法概述 定时方法 硬件延时 由硬件电路实现延时,长时间延时; 软件延时 通过执行循环而获得延时,短时间延时; 硬件延时 由硬件电路实现延时,长时间延时; 软件延时 通过执行循环而获得延时,短时间延时; 可编程定时 通过对系统时钟脉冲的计数而获得延时。
二、定时器/计数器的结构和工作原理 1、结构 2个定时器T0和T1:16位加1计数器,通过编程来设置工作状态 计数溢出置标志位 定时器T1 定时器T0 设置T0工作方式 启动/停止T0工作 2个定时器T0和T1:16位加1计数器,通过编程来设置工作状态 定时器方式寄存器TMOD:设置定时器的工作方式 定时器控制寄存器TCON:启动和停止定时器的计数;计数溢出标志
二、定时/计数器的结构和工作原理 2、工作原理 MCS-51单片机定时/计数器的工作原理: 归根结底是计数器。每接收到一个计数脉冲,加法计数器的值就加一,当计满时发生溢出,并从0开始继续计数。 (1)定时功能(设置TMOD中位C/T=0 ) 对片内机器周期进行计数,即每个机器周期产生一个计数脉冲,计数加1。 (2)计数功能(设置TMOD中位C/T=1) 对片外从T0(P3.4)、T1(P3.5)引脚输入的外部脉冲信号进行计数,下降沿计数加1。
三、定时器/计数器的控制 与定时/计数器有关的控制寄存器有2个 1、定时器控制寄存器TCON(字节地址88H) IT0 IE0 IT1 TR0 TF0 TR1 TF1 位符号 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH 位地址 TR0 (TR1)-- 定时计数器T0 (T1)运行控制位。 该位由软件置1或清0。 TR0 (TR1)=1 启动定时计数 =0 停止定时计数 TCON除字节寻址外,各位还可以位寻址。 例如 启动T0开始计数工作,可运行指令 或者 SETB TR0 MOV TCON , #00010000B
三、定时器/计数器的控制 IT0 IE0 IT1 IE1 TR0 TF0 TR1 TF1 与定时/计数器有关的控制寄存器有2个 1、定时器控制寄存器TCON(字节地址88H) IT0 IE0 IT1 IE1 TR0 TF0 TR1 TF1 位符号 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH 位地址 当T0/T1计数溢出时,该位由硬件自动置“1”。 查询方式下,此位作计数溢出状态位供查询,注意溢出后应以软件方法及时清0; 中断方式下,此位会当T0溢出时,由硬件自动置1,并向CPU申请中断, 当CPU响应中断进入中断服务程序后,它又被硬件自动清0 TF0 (TF1)--计数溢出标志位
三、定时/计数器的控制 2、定时器工作方式寄存器TMOD(89H) 用于2个定时器T0、T1的工作方式设定 , TMOD不能位寻址,只能用字节指令设置定时器工作方式。 M1 M0设置定时工作方式 C/T
三、定时/计数器的控制 C/T =“0”,对片内机器周期进行计数,作定时器用; M1 M0设置定时工作方式 C/T C/T--定时/计数功能选择位。 C/T =“0”,对片内机器周期进行计数,作定时器用; C/T =““1”,对片外从T0(P3.4)、T1(P3.5)引脚输入 的外部脉冲信号进行计数,作计数器用。
三、定时/计数器的控制 GATE=0,允许软件控制位TR0或TR1启动定时器; GATE--门控位。 M1 M0设置定时工作方式 C/T TR0 GATE--门控位。 GATE=0,允许软件控制位TR0或TR1启动定时器; GATE=1,允许外中断引脚INT0(或INT1)为高电电平,且由软件使TR0(或TR1)置1时,才能启动定时器工作。
三、定时/计数器的控制 M1 M0--工作方式选择位 00 方式0 13位计数器 01 方式1 16位计数器 C/T TR0 M1 M0--工作方式选择位 00 方式0 13位计数器 01 方式1 16位计数器 10 方式2 初值自动重装8位计数器 11 方式3 2个8位计数器,仅适用于T0
四、定时器/计数器工作方式 1、工作方式0 当GATE=0时,封锁或门输出恒为1,使外部中断输入引脚INT0信号失效,同时又打开与门,由TR0控制定时器T0的开启和关断。若TR0=1,接通控制开关,启动定时器T0工作,计数器被控制为允许计数。若TR0=0,则断开控制开关,停止计数。 当GATE=1时,与门的输出由INT0的输入电平和TR0位的状态来确定。若TR0=1,则打开与门,外部信号电平通过INT0引脚直接开启或关断定时器T0。 当INT0为高电平时,允许计数,否则停止计数。这种工作方式可用来测量外部信号的脉冲宽度等。 当C/T=0时, 控制开关接通振荡器12分频输出端, T0对机器周期计数。 即定时器工作方式。 当C/T=1 控制开关与引脚T0(P3.4)接通,计数器T0对来自外部引脚T0的输入脉冲计数,当外部信号电平发生由1到0跳变时,计数器加1,这时,T0成为外部事件计数器。 在这种模式下,16位寄存器只用了13位。当TL0的低5位溢出时,向TH0进位。当TH0溢出时,向中断标志位TF0进位。 因此,可通过查询TF0 来判断计数器的计数是否完成(溢出)。需要说明的是:在计数溢出将TF0置1的同时,计数器被自动全部变 0 ,然后从 0 开始继续计数。 M1M0=00 TH0的高8位和TL0的低5位组成一个13位计数器
四、定时器/计数器工作方式 注意:定时计数器的计数范围与初值X的计算 1、定时器的计数规律: T0从某初值X,对脉冲计数到1111111111111B(213D=8192D)溢出 计数个数:213-X 1、定时器的计数规律: 2、最大计数范围:从初值X=0D,计数到1111111111111B(213D) 计数个数为213-0=8192D 3、定时时间: 最大定时值 = (213-0) ×机器周期 定时值 = 计数个数×机器周期 =(213-X)×机器周期 = (213-X)×晶振周期×12
四、定时器/计数器工作方式 例1 如要求计数值为1000,试计算定时计数器T0的初值 分析: 由 213-X=1000 =1C18H=0001 1100 0001 1000B 故 TH0= 1 1100 000=0E0H TL0= 1 1000B = 0001 1000B =18H。 补足8位
单片机应用技术 例2 利用T0方式0在P1.0引脚上输出周期500us的方波。设单片机 晶振频率6MHz。 分析: 要在P1.0输出周期为500us的方波,只要P1.0每隔250us取反一次即可,即定时时间为250us : (1)TMOD寄存器初始化: TMOD.1 TMOD.0 M1M0=00,T0为方式0; TMOD.2 C/T=0 T0为定时状态; TMOD.3 GATE=0 表示计数不受INT0控制; TMOD.4 TMOD.7 因T1不用,可取任意值,这里取为0 。 故TMOD=00H (2)计算250us定时T0的初值: 设T0的计数初值为X,则 X=8067D=1F83H=0001 1111 1000 0011B 故 TH0= 1 1111 100高8位=FCH TL0=0000 0011B低5位=03H
单片机应用技术 MOV TMOD,#00H ;置T0为方式0 MOV TH0,#0FCH ;送计数初值 MOV TL0,#03H (3) 编写程序。采用查询TF0的状态来控制P1.0输出 MOV TMOD,#00H ;置T0为方式0 MOV TH0,#0FCH ;送计数初值 MOV TL0,#03H SETB TR0 ;启动T0 LOOP: JBC TF0, NEXT ;查询定时时间到否? SJMP LOOP NEXT: CLR TF0 ; 对溢出标志位清0 MOV TH0,#0FCH ;重赋计数初值 MOV TL0,#03H CPL P1.0 ;输出取反 SJMP LOOP ; 重复循环 采用查询方式的程序很简单,但在定时器整个计数过程中,CPU要不断查询溢出时标志TF0的状态, 这就占用了CPU工作时间,以致CPU的效率不高。采用定时溢出中断方式,可以提高CPU的效率。
四、定时器/计数器工作方式 2、工作方式1 M1 M0=01 TH0高8位和TL0低8位组成一个16位定时器/计数器 定时器工作于方式1下,其结构与操作几乎与方式0完全相同,差别仅在于计数器的位数不同。
四、定时器/计数器工作方式 注意:定时计数器的计数范围与初值X的计算 例如. 若单片机晶振为6MHZ,则1个机器周期为2us T0从初值X,一直对脉冲计数到1111111111111B(216D)溢出 计数个数:216-X=65536-X 2、最大计数范围:从初值X=0D,计数到1111111111111111B(216D) 计数个数为216-0=65536D 3、定时时间: 定时值 = (216-X) ×机器周期 = (216-X) ×晶振周期×12 最大定时定时值 = (216-0) ×机器周期 例如. 若单片机晶振为6MHZ,则1个机器周期为2us =65536×2us = 131ms 1、定时器的计数规律:
四、定时器/计数器工作方式 例3 用定时器T1产生一个100HZ的方波, 由P1.0输出,设晶振12MHz, 采用查询方式。 解:方波周期 T=1/100Hz=0.01s=10ms 用T1定时5ms 计数初值 X为: X=60536=EC78H 程序如下: MOV TMOD, #10H ; T1方式1,定时方式 SETB TR1 LOOP:MOV TH1, #0ECH ; 置初值 MOV TL1, #78H JNB TF1 ,$ ; 判断溢出 CLR TF1 CPL P1.0 SJMP LOOP
四、定时器/计数器工作方式 3、工作方式2 工作方式2下的定时器(T0、T1):为8位计数器 以T0为例: 8位计数器的TL0 重置初值的缓冲器TH0构成。
单片机应用技术 方式2与方式0、1的区别: 方式0和方式1若用于循环重复定时或计数时,当计数溢出时,要重新对计数器装入初值,而方式2的优点在于它具有初值自动装入的功能,可省去重装计数初值的语句,故定时时间精确,特别适用于作串行口波特率发生器。 做法:在方式2中,16位计数器拆成两个部分,TL0用作位计数器,TH0用来保存计数初值。在程序初始化时,由软件赋予同样的初值,一旦TL0计数溢出,便使TF0置位,将TH0中的初值则由硬件自动装入TL0又继续计数,循环往复不止。 由于定时工作方式时,其定时时间(TH0溢出周期)为: t=(28-TH0初值)×机器周期 用于计数工作方式时,最大计数长度=28-0初值=256。 若单片机晶振为6MHZ,则1个机器周期为2us 最大定时定时值 = (28-0) ×机器周期 =256×2us=512us
单片机应用技术 例4 利用T0方式0在P1.0引脚上输出周期200us的方波。设单片机晶振频率6MHz。 分析:要在P1.0输出周期为200us的方波,只要P1.0每隔100us取反一次即可,即定时时间为100us (1) TMOD.1 TMOD.0 M1M0=10,T0为方式2; TMOD.2 C/T=0 T0为定时状态; TMOD.3 GATE=0 表示计数不受INT0控制; TMOD.4 TMOD.7 因T1不用,可取任意值,这里取0 故TMOD=02H (2)计算250us定时T0的初值: 设T0的计数初值为X,则 X=206D=11001110B=CEH 故 TH1=TL1=CEH
单片机应用技术 (3)程序如下: MOV TMOD,#02H ;T0方式2,定时方式 MOV TH0,#0CEH ;T0计数初值 MOV TL0,#0CEH SETB TR0 ;启动T0 LOOP:JBC TF0,NEXT ;TF0=1转 SJMP LOOP ;否则等待 NEXT:CPL P1.0 ; P1.0取反输出 SJMP LOOP
单片机应用技术 4、工作方式3 模式3只适用于定时器T0,若将T1置为模式3,则T1将停止计数。 TL0使用原T0的各控制位、引脚(C/T,GATE,TR0,TF0和INT0引脚),其功能和操作与模式0和模式1相同,TL0既可以工作在定时器方式,也可以工作在计数器方式。 当T0工作在模式3下,TH0和TL0被分成两个相互独立的8位计数器TL0和TH0如图所示。 TH0只可作简单的8位定时器, 它占用T1的控制位TR1和T1的中断标志位TF1,同时也占用了T1的中断源,由TR1来负责启动和关闭。
单片机应用技术 工作方式3下的定时器T1 在定时器T0已工作在方式3时,T1只能工作在方式0、1、2下。因为它的运行控制位TR1和计数溢出标志位TF1已经被定时器T0借用。其逻辑图简化为左图 在图中,由于TR1、TF1以及T1的中断源已被定时器T0占用,此时T1仅由控制位C/T切换其定时器或计数器工作方式,计数器计数满溢出时,只能将输出送入串行口或用于不需要中断的场合。把T1作为波特率发生器使用时,一般将T1设置为模式2。
五、定时器/计数器综合应举例 例5 P1.0、P1.1经7407驱动LED交替发光并以每秒一次的频率闪烁。硬件连接见下图(采用6MHZ晶振) 分析:闪烁周期为1S,亮、灭各占一半,定时时间需要500mS。使用6MHZ晶振,单片机最长定时时间仅为131mS,所以需要采用软件记数方法扩展定时时间。
单片机应用技术 使用定时/计数器0,定时方式,工作方式1。 设置TMOD控制字: TMOD = 01H 使用6MHZ晶振,机器周期为2μs,设定时时间100mS,定时初值3CB0H。定时器溢出5次为500mS。 程序如下: ORG 0140H LED1: MOV TMOD,#01H ;设置T0工作方式 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 ;循环
单片机应用技术 例6 当GATEX =“1”时,定时/计数器只有INTX为高电平才能进行计数。利用这一点,可以方便的测量脉冲信号的宽度。设被测脉冲接至INT1引脚,将定时/计数器1设置为定时方式,即可进行脉宽测量。要求测量脉宽单位为1μs,选用12MHZ晶振。 分析: 设置TMOD控制字: GATE1 =“1”,定时/计数器T1为定时方式C/T =“0”,选用工作方式1。TMOD = 90H。 定时初值为零,在脉冲下跳沿读出计数器的计数值即为脉冲宽度。
单片机应用技术 程序如下: ORG 0180H MOV TOMD,#90H;设置T1工作方式 CLR A ;定时初值为零 MOV TH1,A MOV TL1,A JB P3.3, $ ;等待P3.3变低电平 SETB TR1 ; P3.3变低,准备启动T1 JNB P3.3,$ ;等待P3.3变高,启动T1 JB P3.3,$ ;T1一直定时计数,等待P3.3再次变低,脉冲结束 CLR TR1 ;停止计数 MOV R2,TH1 ;读出脉冲宽度 MOV R3,TL1 运行上面程序后,只要将R2、R3两单元内容转换成十进制数,即可送显示以读出脉冲宽度。由于工作方式1的最大计数值为65536,所以上面程序所测脉冲宽度不能大于65536μs。
单片机应用技术 计数器0计数初值为0000H。 例7 利用单片机定时/计数器测量脉冲信号频率。 例7 利用单片机定时/计数器测量脉冲信号频率。 分析:频率定义为单位时间1S内的周期数,用定时/计数器测频率,需要用一路定时器产生单位时间,另一路计数器对脉冲计数。若被测量的信号频率较高,而测量精度有限的话,单位时间可以小于1S。单位时间选用10mS,其间计的脉冲数乘以100即为信号频率。 设置工作方式: 设单片机时钟频率 fosc = 12MHz。定时器1定时,工作方式1,产生10mS单位时间;定时/计数器0计数,工作方式1。 TMOD = 00010101B = 15H 计数初值: 定时器1计数值10000,计数初值的十六进制补码为 D8F0H。 计数器0计数初值为0000H。
单片机应用技术 程序 ORG 01C0H FREQ:MOV TMOD,#15H ;设置工作方式 MOV TH0,#0 ;送计数初值 MOV TL0,#0 MOV TH1,#0D8H MOV TL1,#0F0H MOV TCON,#50H ;启动定时/计数器 JNB TF1,$ ;等待单位时间到 MOV TCON,#0 ;停止计数 MOV R2,TH0 ;读出计数值 MOV R3,TL0 …… 将R2,R3中的计数值转换成BCD码,即为频率,单位是0 .1KHz。用此种方式测量的频率上限为500KHz。
单片机应用技术 ??? 思考题: 1、MCS-51单片机内有几个定时计数器?有几种工作方式? 2、简要介绍T0的定时工作方式1 3、定时器编程前要事先确定什么参数? 4、用定时器1产生一个50Hz的方波,由P1.2输出,用程序查询方式,fosc=12MHz。
单片机应用技术 第4题参考答案: 方式1是16位定时/计数器, 其定时时间t为:t=(216-X) ×12/fosc 其计数初值X为:X=216-t×fosc/12 方波周期T=1/50=0.02s=20ms,用T1定10ms, 计数初值X1: X1=216-12×10×10-3/(12×106) =65536-10000=55536=D8F0H 源程序如下: MOV TMOD,#10H ;T1模式1,定时 SETB TR1 ;启动T1 LOOP:MOV TH1,#0D8H ;T1计数初值 MOV TL1,#0F0H JNB TF1,$ ;T1没有溢出等待 CLR TF1 ;产生溢出清标志位 CPL P1.2 ;P1.2取反输出 SJMP LOOP ;循环