单片机原理及应用教程(c语言版)第6章 mcs51单片机的定时器计数器_第1页
单片机原理及应用教程(c语言版)第6章 mcs51单片机的定时器计数器_第2页
单片机原理及应用教程(c语言版)第6章 mcs51单片机的定时器计数器_第3页
单片机原理及应用教程(c语言版)第6章 mcs51单片机的定时器计数器_第4页
单片机原理及应用教程(c语言版)第6章 mcs51单片机的定时器计数器_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机原理及应用教程

(C语言版)

第6章MCS-51单片机定时器/计数器主编:周国运中国水利水电出版社第6章MCS-51单片机定时器/计数器目录6.1单片机定时器/计数器的结构及原理6.2定时器/计数器T0、T16.3定时器/计数器T26.4定时器/计数器应用举例

定时器/计数器应用极其广泛。本章主要讨论MCS-51单片机定时器/计数器T0、T1、T2的逻辑结构、工作原理、使用方法和应用。本章为单片机的主要内容,也是学习第七章串行口的基础。第6章MCS-51单片机的定时器/计数器6.1单片机定时器/计数器

的结构及原理主要内容6.1.1单片机定时器/计数器的结构6.1.2单片机定时器/计数器的工作原理6.1.1单片机定时器/计数器的结构

MCS-51单片机定时器/计数器的原理结构图CPU中断溢出溢出溢出定时器0定时器1定时器2TMODT2CONT2MODTCONTH0TL0TH1TL1TH2TL2RCAP2LRCAP2H模式模式T2(P1.0)T1(P3.5)T2EX(P1.1)T0(P3.4)模式控制控制控制中断重装捕获6.1.1MCS-51单片机定时器/计数器的结构

MCS-51主要由如下构成:三个16位的可编程定时器/计数器:定时器/计数器0、1和2。每个定时器有两部分构成:THx和TLx特殊功能寄存器TMOD和TCON,主要对T0和T1进行控制。特殊功能寄存器T2MOD和T2CON,主要对T2进行控制,RCAP2H、RCAP2L为T2服务。引脚、、,为计数脉冲输入。定时器T0、T1和T2有中断功能,计数器溢出或被触发(T2),向CPU发出中断请求。6.1.2单片机定时器/计数器的工作原理

定时器/计数器T0、T1、T2的内部结构简图如下图所示。C/T=0中断请求振荡器TLx(8位)THx(8位)Txn分频TFxC/T=1控制TRx做定时器做计数器6.1.2MCS-51单片机定时器/计数器的工作原理

从上图可以看出:定时器的实质是一个加1计数器。

C/T=0,为定时器 计数频率:fosc/12

计数信号由片内振荡电路提供,振荡脉冲n分频送给计数器,每个机器周期计数器值增1。

C/T=1,为计数器 计数信号由Tx引脚、和P1.0)输入,每输入一有效信号,相应的计数器中的内容进行加1

计数器的最高计数频率为:fosc/241)每1个输入脉冲的下降沿使计数器计1个数

2)每1个机器周期对引脚采样1次,当上1个机器周期采样为高、本机器周期采样为低为1个下降沿。

6.1.2MCS-51单片机定时器/计数器的工作原理

控制信号TRx=1时,定时器启动。当定时器由全1加到全0时计满溢出,TFx=1,向CPU申请中断;同时,定时器从0开始继续计数。6.2定时器/计数器T0、T1主要内容6.2.1T0、T1的特殊功能寄存器6.2.2T0、T1的工作模式6.2.3T0、T1的使用方法6.2.1T0、T1的特殊功能寄存器1.T0、T1模式寄存器TMOD功能:确定定时器的工作模式。其格式为:TMOD(89H)D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0GATE——外部门控制位。

GATE=1,使用外部控制门,且TRx=1 当()为高时启动定时器,()为T0、T1运行外部控制引脚。6.2.1T0、T1的特殊功能寄存器 GATE=0,禁止外部信号控制定时器/计数器。C/T——定时或计数方式选择位

C/T=0,为定时器;C/T=1,为计数器

计数采样:CPU在每机器周期的S5P2期间,对计数脉冲输入引脚进行采样。

若前一机器周期采样值为1,下一机器周期采样值为0,则计数器增1,即下降沿计数。6.2.1T0、T1的特殊功能寄存器

M1、M0——工作模式选择位。表6-1定时器/计数器的工作模式M1M0工作模式功能00模式013位定时/计数01模式116位定时/计数10模式28位初值自动重装定时/计数11模式3定时器0:TL0可8位定时或计数

TH0为8位定时器。定时器1:无此方式6.2.1T0、T1的特殊功能寄存器 2.T0、T1控制寄存器TCONTCON(88H)D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0TF1、TF0:T1、T0的溢出标志位计数溢出,TFx=1。

中断方式:自动清零;

查询方式:软件清零。6.2.1T0、T1的特殊功能寄存器TR1、TR0:T1、T0启停控制位。置1,启动定时器;清0,关闭定时器。注意:GATE=1,TRx与()的配合控制。IE1、IE0:外部中断1、0请求标志位IT1、IT0:外部中断1、0触发方式选择位6.2.2T0、T1的工作模式 MCS-51的T0、T1共有4种工作模式,前三种模式下两个定时器/计数器工作原理是相同的,只有模式3下两者才有差别。以下主要以T0为例进行介绍,T1类似。

模式0与模式1的区别仅仅是计数器的位数不同,前者是13位,后者是16位,其它完全相同,现在一般都不使用模式0,故不讲。

当设置M1M0=01时,选择模式1,为16位定时器/计数器。

模式1原理结构 模式1原理结构由4部分构成(下页图): 信号源 运行控制 计数器 溢出标志 1.模式16.2.2T0、T1的工作模式6.2.2T0、T1的工作模式图6-6T0模式1原理结构振荡器12分频TL0(8位)TH0TF0+&T0(P3.4)TR0(P3.2)GATEC/T=0C/T=1中断(8位)01

运行控制计数器溢出中断信号源6.2.2T0、T1的工作模式信号源

C/T设为1,为计数器,用引脚脉冲 C/T设为0,为定时器,用内部脉冲运行控制

GATE=1,由外部信号控制运行 此时应该设置TR0=1引脚为高电平,T0运行 GATE=0,由内部控制运行

TR0设置为1,T0运行6.2.2T0、T1的工作模式计数部件由TL0、TH0组成,是一个16位的加法计数器,对送来的脉冲进行计数,计数溢出后输出由低变高,设置溢出标志。溢出标志:TF0。当计数部件溢出后对其置1,向CPU请求中断。模式1定时时间的计算公式如下:定时时间=计数值×机器周期=(216-定时初值)×振荡周期×12最大定时时间(初值为0时)为:

216×振荡周期×12。 2.模式26.2.2T0、T1的工作模式

M1M0=10时,选择模式2,为8位定时器/计数器,且初值自动重装。

模式2原理结构 原理结构如下页图所示,由4部分构成: 信号源 运行控制 计数器 溢出标志

在能够满足计数要求时,尽可能地选择模式2。

图6-7T0(T1)模式2原理结构8位初值自动重装振荡器12分频T0(P3.4)TR0TF0中断GATE+&C/T=0C/T=1TL0(8位)TH0(8位)P3.201

运行控制计数器溢出标志信号源6.2.2T0、T1的工作模式M1M0=11,选择模式3。逻辑结构如图6-8和6-9所示:结构:TL0、TH0分为两个独立的8位计数器

TL0:8位定时器/计数器 使用T0所有的资源和控制位

TH0:8位定时器 使用T1所有的资源(中断向量、中断控制ET1、PT1)和控制位 (TR1、TF1)6.2.2T0、T1的工作模式 3.模式3图6-8模式3下T0的原理结构图振荡器12分频TR1振荡器T0(P3.4)TR0TF1GATE+&C/T=0C/T=1TL0(8位)TH0P3.2中断中断TF012分频(8位)6.2.2T0、T1的工作模式T0模式3时T1的工作模式

T1可以模式0~模式2工作。

T1的结构如图6-9所示由于TF1及中断矢量被TH0占用,所以T1仅用作波特率发生器或其它不用中断的地方。

T1作波特率发生器,其计数溢出直接送至串行口。设置好工作方式,串行口波特率发生器开始自动运行。

TMOD中T1的M1M0=11,T1停止工作,因为T1没有模式3。6.2.2T0、T1的工作模式图6-9T0模式3时T1的原理结构串行口重新装入C/T=0C/T=1C/T=1C/T=0T1(P3.5)T1(P3.5)(a)T1模式1振荡器12分频振荡器12分频串行口TH1(8位)TL1(8位)TL1(8位)TH1(8位)(b)T1模式26.2.2T0、T1的工作模式6.2.3T0、T1的使用方法T0、T1各有两种功能(定时/计数)、4种或3种工作模式,如何选择其功能和工作模式,是使用T0、T1编写程序需要首先解决的问题。1.选择定时和计数概念如果需要对单片机外部输入的脉冲进行计量,则选择计数功能(如统计产品数量、轮子转到周数(每周产生的脉冲数目一定)、液滴的数目等);否则选择定时功能(如定时启动/停止机器运转、定时打开/关闭阀门、产生方波、产生某种频率的声音等)。6.2.3T0、T1的使用方法2.选择工作模式(1)计算计数值N1)计数情况需要计的数N往往是给定的,如计100个数、200个数等。2)定时情况在这种情况下往往给出的是定时的时间t根据定时器每个机器周期计1个数的规律,则计数值N与定时时间t、机器周期TMC、晶振频率fosc的关系如下:t=N×TMC、

∵TMC=12/fosc∴N=t/TMC=t×fosc/12 (公式6-1)6.2.3T0、T1的使用方法(2)确定工作模式如果N>256,则选择模式1;否则选择模式2,或者选择模式3。首选模式2。3.计数初值X的计算计数初值X=最大计数值-

计数值N

(公式6-2)计数初值和工作模式有关,即与计数位数有关:模式1:16位计数,N=65536,(216)模式2:8位计数,N=256,(28)模式3:8位计数,N=256,(28)6.2.3T0、T1的使用方法4.什么情况下选择模式3模式3是在系统既需要波特率发生器,又需要多个定时器/计数器,而且计数值都比较小(N≤256)的情况下使用。这时定时器/计数器T1作为波特率发生器,定时器/计数器T0分为两个8位定时器,或者分成的两个其中一个作8位定时器、另一个8位计数器使用。6.2.3T0、T1的使用方法5.使用T0、T1编程的方法步骤①计算计数值N。②确定工作模式。③计算定时或计数的初值X。④编写初始化程序:设置TMOD,设置TLx和THx,(需要时开T0、T1中断和总中断),设置TRx启动运行。⑤编写T0、T1的应用程序。前3项为编写初始化程序的准备,称之为初始化准备。6.2.3T0、T1的使用方法6.在运行中读取TLx、THx的方法在T0、T1运行情况下,TLx和THx中的值在变化,读的期间有可能进位,读出的数据不正确。正确的读取方法如下:do{ xh=THx;xl=TLx;}while(xh!=THx);程序中的xl、xh为已经定义过的无符号字符型变量。6.2.3T0、T1的使用方法

例6-1对89C52单片机编程,使用定时器/计数器T0以模式1定时,以中断方式实现从引脚产生周期为1000µs的方波。设单片机的振荡频率为12MHz。

分析与计算(1)方波产生原理

将T0设为定时器,计算出合适的初值,定时到了之后对引脚取反即可。(2)选择工作模式

计算计数值N6.2.3T0、T1的使用方法

定时时间t:周期为1000µs的方波要求

t=周期/2=1000/2=500(µs)对应计数值:N=t/机器周期=500/1=500 N=500>256,所以选择模式1。 模式字:

TMOD=00000001B=0x01(3)计算初值X

X=65536–N=65036=0xfe0c方波周期T定时时间t6.2.3T0、T1的使用方法C语言程序:#include<reg52.h> //包含特殊功能寄存器库sbit P1_0=P1^0; //定义位变量voidmain() {TMOD=0x01; //T0用模式1、定时

TL0=0x0c;

TH0=0xfe; //设置定时器的初值

ET0=1; //允许T0中断

EA=1; //允许CPU中断

TR0=1; //启动定时器

while(1); //等待中断} 6.2.3T0、T1的使用方法voidtime0_int(void)interrupt1{ //中断服务程序

TL0=0x0c; TH0=0xfe; //定时器重赋初值 取反,输出方波}

汇编语言程序:

ORG 0000H SJMP MAIN

ORG 000BH ;T0中断入口地址

LJMP INT_T06.2.3T0、T1的使用方法MAIN: ;主程序

MOV SP,#0DFH ;设置堆栈指针

MOV TMOD,#01H

;T0模式1定时

MOV TL0, #0CH ;设置定时初值

MOV TH0, #0FEH SETB ET0

;T0开中断

SETB EA

;CPU开中断

SETB TR0

;启动T0 SJMP $ ;等待T0中断INT_T0: ;中断服务程序

MOV TL0, #0CH MOV TH0, #0FEH ;重装定时初值

CPL P1.0 ;取反

RETI

;中断返回

END6.2.3T0、T1的使用方法例6-2设单片机的振荡频率为12MHz,用T1编程实现从输出频率为2KHz的方波。1、分析与计算(1)选择工作模式要求输出方波频率为2KHz,则周期为500μs,只需对每250μs取反一次即可,即定时时间t为250μs。

需要计算计数值N计算计数值N:N=t/TMC =t×fosc/12 =250μ×12M/12=250 N=250<256,所以选择模式2。6.2.3T0、T1的使用方法

模式字:

TMOD=00100000B=0x20(2)初值X计算

X=256-N X=6 则 TH1=TL1=6

2、采用中断处理方式的程序方波周期T定时时间t6.2.3T0、T1的使用方法(1)中断方式C语言程序#include <reg52.h>//包含特殊功能寄存器库sbit P1_0=P1^0;void main(){ TMOD=0x20; //设置工作模式

TL1=0x06; TH1=0x06; //为定时器赋初值

ET1=1; //允许定时1中断

EA=1; TR1=1; //启动定时器1 while(1); //等待中断} voidtime0_int(void)interrupt3

{ P1_0=~P1_0;} 6.2.3T0、T1的使用方法(2)中断方式汇编语言程序

ORG 0000H LJMP MAIN

ORG 001BH

;中断处理程序

RETI

ORG 0030H ;主程序

MAIN: MOV SP,#0DFH

MOV TMOD,#20H

MOV TL1,#06H MOV TH1,#06H

SETB ET1

;允许定时器1中断

SETB EA

;允许CPU中断

SETB TR1

;启动定时器1 SJMP $ ;等待中断

END

6.2.3T0、T1的使用方法3、采用查询方式程序(1)查询方式C语言程序#include<reg52.h> sbit P1_0=P1^0;voidmain(){ TMOD=0x02; TL0=0x06; TH0=0x06;TR0=1;

while(1) { while(!TF0); //查询计数溢出 TF0=0; P1_0=~P1_0;} }6.2.3T0、T1的使用方法

(2)查询方式汇编语言程序MAIN: ;主程序

MOV TMOD,#02H

MOV TL0,#06H MOV TH0,#06H SETB TR0LOOP: JNB TF0,$ ;查询计数溢出

CLR TF0

SJMP LOOP END

6.3定时器/计数器T2主要内容6.3.1T2的特殊功能寄存器6.3.2T2的工作方式定时器/计数器T2的功能结构图CPU中断溢出T2CONT2MODTH2TL2RCAP2LRCAP2HT2(P1.0)T2EX(P1.1)模式控制重装捕获定时器T2概述

1、T2的功能:89C52中的T2是一个16位的、具有自动重装载和捕获功能的定时器/计数器。

2、T2的结构:除TL2、TH2和控制寄存器T2CON及T2MOD之外,还增加了捕获寄存器RCAP2L(低字节)和RCAP2H(高字节)。

3、T2的时钟源:有两个。一个是内部机器周期,另一个是由T2端输入的外部计数脉冲。

4、T2的工作方式:有4种。自动重装、捕获、波特率发生器、可编程时钟输出。

5、T2的专用引脚:增加了两个引脚,T2(P1.0)、T2EX(P1.1),分别称为时钟I/O和外部触发引脚。6.3.1T2的特殊功能寄存器TF2:T2溢出中断标志位

T2溢出时置位,申请中断。软件清零。 波特率发生器方式下(RCLK=1或TCLK=1),T2溢出不对TF2进行置位。T2CON(C8H)D7D6D5D4D3D2D1D0TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL21.

T2控制寄存器T2CON

可位寻址和字节寻址功能:选择T2的工作方式和工作模式。格式如下EXF2:T2外部触发中断标志位当EXEN2=1,且T2EX引脚上有负跳变 触发捕获或重装操作时,EXF2置1,向CPU发出中断请求。需软件清0。RCLK:串行口接收时钟允许位

RCLK=1时,T2溢出信号分频后做串行口工作在模式1和3的接收时钟。

RCLK=0时,T1溢出信号分频信后做串行口接收时钟。T2CON(C8H)D7D6D5D4D3D2D1D0TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL26.3.1T2的特殊功能寄存器6.3.1T2的特殊功能寄存器TCLK:串行口发送时钟允许位

TCLK=1时,T2溢出信号分频后做串行口工作在模式1和3的发送时钟。

TCLK=0时,T1溢出信号分频后做串行口的发送时钟。EXEN2:T2外部触发允许位

EXEN2=1,T2未做串口时钟时,T2EX引脚()的负跳变将触发“捕获”或“重装”。

EXEN2=0,T2EX引脚上的负跳变对T2不起作用。TR2:T2运行控制位

TR2=1,启动T2;TR2=0,T2停止。C/T2:T2的定时或计数方式选择位

C/T2=1,T2为计数器。从T2()引脚输入计数脉冲行(下降沿计数)。

C/T2=0,T2为定时器。用机器周期计数T2CON(C8H)D7D6D5D4D3D2D1D0TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL26.3.1T2的特殊功能寄存器CP/RL2:捕获和重装载方式选择位

CP/RL2=1,且EXEN2=1,T2EX()的负跳变将触发捕获操作。

CP/RL2=0,且EXEN2=1,T2EX的负跳变或T2计满溢出时,触发自动重装操作。

RCLK=1或TCLK=1时,T2做串口的时钟发生器,这时CP/RL2的设置不起作用,并且T2溢出时会自动装载。6.3.1T2的特殊功能寄存器T2OE:T2输出允许位

T2OE=1,可编程时钟输出方式,输出方波信号至T2(P1.0)引脚。DCEN:T2增/减计数控制位

DCEN=l,T2递减计数

DCEN=0,T2递增计数T2MOD(C9H)D7D6D5D4D3D2D1D0—

T2OEDCEN

2.T2模式寄存器T2MOD6.3.1T2的特殊功能寄存器3.计数寄存器TL2、TH24.捕获寄存器RCAP2L、RCAP2H有两个作用:(1)捕获计数器中的值。在捕获方式,引脚触发时,将TL2、TH2中的数装入RCAP2L、RCAP2H中;(2)作为初值装入计数器。在重装计数方式,计数溢出后,将RCAP2L、RCAP2H中的数装入TL2、TH2中6.3.1T2的特殊功能寄存器6.3.2T2的工作方式

定时器T2是一个16位的定时器/计数器,具有四种工作方式:

16位自动重装方式 捕获方式 波特率发生器方式 可编程时钟输出方式表6-2定时器T2的四种工作方式RCLKTCLKC/T2CP/RL2

T2OE工作方式000或100自动重装:16位定时或计数000或110捕获:定时或计数捕获0/10/1001时钟输出(T2EX可作外中断)若RCLK+TCLK>=1,则同时又作波特率发生器至少1个为1000波特率发生器(T2EX可作外中断)6.3.2T2的工作方式一、自动重装方式(定时或计数)

1、递增定时、计数

CP/RL2=0,DCEN=0时,自动重装方式。有两种情况引起重装,结构如下页图所示。

(1)计数溢出重装①

TF2置1,产生溢出中断请求;②将RCAP2L和RCAP2H的数装入TL2和TH2中。

(2)外部触发重装 当EXEN2=1,并且T2EX()有负跳变时

EXF2置1,外部触发中断请求;

②将RCAP2L和RCAP2H的数装入TL2和TH2中RCAPLRCAPHTF2TL2TH2EXF2EXEN2T2(P1.0)T2EX(P1.1)溢出T2中断请求TR2振荡器÷12C/T2=0C/T2=1++

图6-12重装方式原理图6.3.2T2的工作方式

2、外部控制递减、递增定时或计数

CP/RL2=0,DCEN=1,T2由外部引脚T2EX()控制递减、递增定时或计数。

(1)外部控制递增定时、计数 条件:T2EX()引脚为高电平 计满溢出时:

①TF2置1,请求中断; ②将RCAP2L和RCAP2H中的数装入TL2和TH2中。决定于C/T26.3.2T2的工作方式

递增、递减计数重装控制递减计数重装值递增计数重装值控制递增、递减计数重装高:递增计数重装RCAP2LRCAP2HTF2TL2TH2EXF2T2TR2振荡器÷12C/T2=0C/T2=10FFH0FFH中断请求TEX2(P1.1)(P1.0)6.3.2T2的工作方式

(2)外部控制递减定时、计数 条件:T2EX()引脚为低电平 计数溢出时:

①TF2置1,请求中断; ②将0xffff装入TL2和TH2中。

递减计数的溢出:

TL2和TH2与RCAP2L和RCAP2H的值相等6.3.2T2的工作方式二、捕获方式(可定时、计数)

当CP/RL2=l,选择捕获方式。有以下两种情况。T2捕获方式结构如下页图所示。

1、捕获定时、计数

(1)条件与触发捕获 条件:EXEN=1;

触发捕获:T2EX()端的信号有负跳变时 (2)捕获

将TL2和TH2的内容装入RCAP2L和RCAP2H中

(3)EXF2置1,产生触发中断请求6.3.2T2的工作方式

2、一般定时、计数(非捕获时不会自动重装) 设置EXEN=0

计数溢出

TF2置1,产生溢出中断请求

RCAP2LRCAP2HTF2TL2TH2EXF2EXEN2T2T2EX溢出中断请求TR2振荡器÷12C/T2=0C/T2=1+1P1.1P1.06.3.2T2的工作方式三、波特率发生器方式

RCLK=1或TCLK=1时,选择波特率发生器方式。结构如下页图所示。具有两个功能。

1、功能一——为串行口提供时钟波特率=fosc/(32×(65536-(RCAP2H,RCAP2L)))

特点:

1)计数满后自动将RCAP2L、RCAP2H中 的值装入TL2、TH2中;

2)不产生溢出中断。6.3.2T2的工作方式

波特率=fosc/(32×(65536-(RCAP2H,RCAP2L)))T2EX可以做外部中断源串口时钟方式原理图RCAP2HTL2TH2T2溢出TR2÷2C/T2=1C/T2=0串口时钟振荡器RCAP2LEXEN2T2EX外部信号EXF2中断申请÷16=波特率6.3.2T2的工作方式

2、功能二——外部中断源

条件:

EXEN2=1;

中断请求输入引脚:

触发方式:下降沿

中断请求标志:

EXF2,出现下降沿,EXF2置1。6.3.2T2的工作方式

定时器/计数器T2作为波特率发生器使用时的编程方法:…RCAP2H=0x30; //设置波特率RCAP2L=0x38; TCLK=1; //选择定时器2的溢出脉冲 //作为串口发送波特率发生器

注意:在波特率发生器工作方式下,在T2计数过程中不能再读/写TH2和TL2的内容。6.3.2T2的工作方式四、可编程时钟输出方式 当T2OE=1,且C/T2=0时,T2工作于时钟输出方式。结构如下页图所示。具有两个功能。

1、功能一——时钟输出

1)输出引脚:P1.0 2)输出方波频率:f=fosc/(4×(65536-(RCAP2H,RCAP2L)))∴

(RCAP2H,RCAP2L)=65536-fosc/f/4

3)特点:①自动重装初值计数满后,将RCAP2L和RCAP2H的值自动装入TL2和TH2; ②不产生溢出中断。6.3.2T2的工作方式四、可编程时钟输出方式 当T2OE=1,且C/T2=0时,T2工作于时钟输出方式。结构如下页图所示。具有两个功能。

2、功能二——外部中断源

条件:

EXEN2=1; 中断请求输入引脚:

触发方式:下降沿

中断请求标志:

EXF2,出现下降沿,EXF2置1。6.3.2T2的工作方式

图6-15T2时钟输出方式下的原理图EXF2EXEN2T2中断T2EXP1.16.3.2T2的工作方式

例6-3对单片机编程,使用T2时钟输出方式,从输出周期为1ms的方波。设单片机的振荡频率为12MHz。

(1)分析与计算T2的时钟输出方式可直接输出方波。输出方波周期为1ms,则频率fout为1KHz。根据公式6-6可知,计数初值 x=65536-fosc/(4×fout) =62536。6.3.2T2的工作方式(2)C语言程序清单#include<reg52.h>voidmain(){ C_T2=0; //设置T2作定时器使用

CP_RL2=0; //设置T2初值自动重装

T2MOD=0x02; //设置T2输出时钟

TL2=62536%256; //为T2赋初值

TH2=62536/256; RCAP2L=62536%256; //重装寄存器赋初值

RCAP2H=62536/256; TR2=1; //启动T2 while(1); //CPU保持运行状态T2在工作}6.3.2T2的工作方式(3)汇编语言程序清单T2MOD EQU0C9H ;定义T2模式寄存器TL2 EQU0CCH ;定义T2计数低8位寄存器TH2 EQU0CDHRCAP2LEQU0CAH ;定义重装低8位寄存器RCAP2HEQU0CBHCP_RL2 BIT0C8H ;定义T2捕获/重装控制位C_T2BIT0C9H ;定义T2计数/定时控制位TR2BIT0CAH ;定义T2运行控制位6.3.2T2的工作方式MAIN:CLRC_T2 ;设置T2作定时器CLRCP_RL2 ;设置T2初值自动重装MOVT2MOD,#02H ;设置T2输出时钟MOVTL2,#48H ;为定时器赋初值MOVTH2,#0F4HMOVRCAP2L,#48H ;重装寄存器赋初值MOVRCAP2H,#0F4HSETBTR2 ;启动T2SJMP$ ;CPU保持运行状态T2在工作6.3.2T2的工作方式6.4定时器/计数器应用举例6.4定时器应用举例例6-4用89C52单片机设计一程序,测量脉冲信号的宽度。设单片机晶振频率为12MHz。分析:如图6-16所示,设置GATE0位为1,在引脚为低电平时设置TR0=1,当GATE信号为高时自动启动计数,当GATE信号变低时自动结束计数,这时设置TR0=0,读取计数值便可计算出脉冲宽度,单位为µs,机器周期为1µs。6.4定时器应用举例C语言程序清单:#include<reg52.h>sbitP3_2=P3^2;unsignedint_test(){ TMOD=0x09; //T0以模式1定时,用外部门

TL0=0; TH0=0; //设置初值为0 while(P3_2); //引脚为高等待变低

TR0=1; //开T0内控开关由外部门控制

while(!P3_2); //检测脉冲是否来到

while(P3_2); //检测脉冲是否结束

TR0=0; //脉冲已结束,T0内控开关

return(TH0*256+TL0); //返回计数值}6.4定时器应用举例汇编语言程序清单:TEST:MOVTMOD,#09H;置T0模式1定时用外部门MOVTL0,#00H ;设置初值为0MOVTH0,#00HJBP3.2,$ ;引脚为高等待测量下一个正脉冲SETBTR0 ;开T0内控开关,由外部控制行JNB P3.2,$ ;检测脉冲是否来到JB P3.2,$ ;检测脉冲是否结束CLRTR0 ;脉冲已结束,关内控开关MOVR7,TL0 ;计数器TL0的值送R7MOVR6,TH0 ;计数器TH0的值送R6RET6.4定时器应用举例例6-5设某单片机系统使用定时器较多,T1作串行口的波特率发生器,T2作时钟信号输出产生多种较复杂的报警声;另外需要对产品包装进行计数,每计120件使阴极接在引脚的LED亮2s,并且发出报警声音响2s。试编写程序,实现对产品的计数和声光报警,不用考虑串行通信和声音的具体产生程序。设单片机的晶振频率fosc=6MHz。6.4定时器应用举例分析:(1)关于定时器及工作模式的选择T1、T2都已经被使用,仅剩下T0,还需要计数和定时,可以考虑把T0设置为模式3,TL0计数,TH0定时。由于计数仅120,虽然要求定时2s,但可以用多次中断能够满足要求。6.4定时器应用举例(2)关于声光报警的实现当TL0计数120后产生中断,在中断服务程序中开声、光,开TH0运行开始计时。设置TR2=1便有声音信号输出,对输出0便使LED点亮。设置TH0计数250,由于机器周期为2µs,则定时2s需要中断的次数为

2000000/(250×2)=4000TH0中断4000次后,设置TR2=0便关闭声音信号输出,对输出1便使LED熄灭。TL0的计数初值为256-120=136;TH0的定时初值为256-250=6。6.4定时器应用举例C语言程序清单:#include<reg52.h>unsignedintnum=0; //定义TH0中断次数变量sbitP3_7=P3^7; //定义控制LED发光引脚voidmain() //主函数{ …… TMOD=0x27; //T0模式3计数,T1模式2定时

TL0=136; //设置TL0初值,计数

TH0=6; //设置TH0初值,定时 ET0=1; //开T0中断

ET1=1; //开T1中断

EA=1; //开总中断

TR0=1; //启动T0计数

while(1); //停留于此,保存程序运行状态}6.4定时器应用举例voidTL0_int(void)interrupt1{ //TL0(T0)中断服务程序 TL0=136; //定时器重赋初值

P3_7=0; //开LED

TR1=1; //启动定时器TH0

TR2=1; //启动T2产生声音信号}voidTH0_int(void)interrupt3{ //TH0(T1)中断服务程序 TH0=6; //定时器重赋初值

num++; //中断次数加1 If(num>3999) { P3_7=1; //关LED

TR1=0; //关闭TH0

TR2=0; //关声音

num=0; //中断次数设置为0}}6.4定时器应用举例例6-6对89C52单片机的定时器T0编程,设计一产生时分秒的时钟。设晶振频率为12MHz。分析:设置T0为定时功能,定时10ms产生中断,中断100次为1秒,秒加1,有了秒时间后,按照时钟的时分秒规律,对保存时分秒的变量进行相应的累加,便产生了时分秒时间。电路设计:本例用6位数码管显示出时间,其电路和模拟运行如图6-17所示。图中的排电阻RESPACK8为数码管各段的驱动限流电阻,可以设200Ω左右,数码管的各位在实际中也需要驱动,如使用74LS245,在Proteus中模拟可以省略。6.4定时器应用举例数码管显示在第9章才讲,在这里并不要求掌握,可以先了解一下,主要是便于在Proteus中模拟运行。选择工作模式、计算初值:根据定时器/计数器使用的方法步骤,初始化准备如下:这里定时时间t为10ms=10000µs计算计数值N:N=t/TMC=t×fosc/12=10000µ×12M/12=10000选择模式1,因为N>256计算初值X:X=216-N=65536-10000=555366.4定时器应用举例6.4定时器应用举例C语言程序清单如下#include<reg52.h>#definecodportP0 //显示段码输出口#definesitport P2 //显示位码输出口unsignedcharcodeledcode[]=/*显示0~9的代码*/{0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f};unsignedchardatahou,min,sec,num;//时分秒中断数unsignedchardatadisbuf[]={0,0,0,0,0,0};6.4定时器应用举例voiddisplay() //显示函数{ unsignedintj; //j用于循环

unsignedchari,scan; //scan为扫描码

scan=0x01; for(i=0;i<6;i++) { codport=0; //先清屏,显示错乱

codport=ledcode[disbuf[i]]; //输出显示数的段码

sitport=~scan; //输出位码

scan=(scan<<1); //指向下一个数位

for(j=0;j<500;j++); //延时} }

voidtime0()interrupt1 //定时器0中断函数{ TL0=55536%256; //给T0赋初值

TH0=55536/256; num=num+1; //百分之一秒加1 if(num>99) {num=0; sec++; //秒加1 if(sec>59) { sec=0;min++; //分加1 if(min>59) {min=0; hou++; //时加1 if(hou>23) hou=0; } } //把时间变量分离成要显示的各位 disbuf[0]=hou/10; disbuf[1]=hou%10; disbuf[2]=min/10; disbuf[3]=min%10; disbuf[4]=sec/10; disbuf[5]=sec%10;} }6.4定时器应用举例voidmain() //主函数{ TMOD=0x01; //设置T0以模式1定时

TL0=55536%256; //设置T0定时10ms初值

TH0=55536/256; ET0=1; //开T0中断

EA=1; //开总中断

TR0=1; //定时器0开运行 hou=9; min=25; //时间初始化

sec=30; num=0;

while(1) //循环,并随时处理中断

display(); //调用数码管进行扫描显示}6.4定时器应用举例例6-7某89C52单片机应用系统的晶振频率为12MHz,通过编程实现以下和频率计的功能:(1)从T1输入脉冲计数,实现计数器功能;(2)用T0定时1s,计算脉冲信号的频率,实现频率计的功能。通过接在引脚的按钮选择计数器和频率计功能。6.4定时器应用举例分析:用T0定时10ms,中断100次为1s。对计数功能,每中断一次读一次T1的计数值,计数值不累加,计数溢出后再从0开始计,则最大数是65535。对频率计功能,则1s读一次T1计数值,其值就是频率,理论上最大频率值是500000。其值都在数码管上显示出来。在Proteus画的电路图如图6-18所示,所截的图为计数器功能,最高位C表示计数。6.4定时器应用举例6.4定时器应用举例C语言程序清单#include<reg52.h>#definecodportP0 //显示段码输出口#definesitportP2 //显示位码输出口unsignedcharcodeledcode[]=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论