单片机原理与接口技术(定时器、计数器)_第1页
单片机原理与接口技术(定时器、计数器)_第2页
单片机原理与接口技术(定时器、计数器)_第3页
单片机原理与接口技术(定时器、计数器)_第4页
单片机原理与接口技术(定时器、计数器)_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

定时器/计数器Timer/Counter(T/C)电子定时器机械定时器电子计步器机械计数器二、单片机的定时器/计数器时钟电路总线控制CPUROM/EPROM/FLASH4K字节RAM128字节SFR21个定时/计数器2个中断系统、5中断源2优先级串行口全双工1个并行口4个RSTEAALEPSENXTAL2XTAL1P0P1P2P3VCCVSS√√√√√√与MCS-51单片机相关的21个SFR1、与CPU相关的(6个)(√)

ACC、B、DPH、DPL、SP、PSW2、并行I/O口(√)相关SFR寄存器:P0、P1、P2、P33、中断系统(√

)相关SFR寄存器:TCON、IE、IP、SCON4、定时器/计数器相关SFR寄存器:TMOD、TH1、TL1、TH0、TL0、TCON、IE、IP5、串行通信相关SFR寄存器:SCON、PCON、SBUF、IE、IP、TMOD、TCON、TH1、TL1名称定义地址位功能和位地址复位值TCON定时器控制88H8F8E8D8C8B8A89880X00TF1TR1TF0TR0IE1IT1IE0IT0TMOD定时器模式89HGATECTM1M0GATECTM1M10X00TH0定时器0高字节8CH0X00TH1定时器1高字节8DH0X00TL0定时器0低字节8AH0X00TL1定时器低字节8BH0X00IE中断允许控制A8HEA------ESET1EX1ET0EX00X00IP中断优先级控制B8H---------PSPT1PX1PT0PX00X0080C51与T/C相关的SFR有8个◆硬件定时-----就是利用硬件电路来实现用RC电路或逻辑部件定时如555电路,该方式除额外增加硬件资源外,使用起来灵活性也较差;◆软件定时----就是让CPU执行一个程序段,这个程序段本身没有具体的执行目的,但由于执行每条指令都需要时间,则重复执行一个程序段就需要一个固定的时间。该方式简单但却占用了CPU宝贵的时间资源,降低了CPU的利用率。(一般场合较常用)

◆采用单片机定时/计数器定时:为了使用方便,解决上述两种方式的弊端并增加单片机的控制功能,把定时/计数逻辑电路集成在单片机芯片中,称之为定时/计数器。

定时一般有3种方法:1、硬件定时3、采用单片机定时/计数器定时2、软件定时

概述二、定时器/计数器应用定时器/计数器可以用于定时、计数和波特率发生器。

定时器(模式)可用于测量事件之间的时间间隔,如脉冲宽度。

123计数器(模式)可用于测定某个事件发生的次数,如脉冲个数。

定时器(模式)还可以给串行端口提供波特率时钟信号。(下一章节具体讲)?UART?个正脉冲标准80C5116位定时器/计数器016位定时器/计数器1STC89C5216位定时器/计数器016位定时器/计数器116位定时器/计数器2看门狗定时器标准的80C51有2个16位定时器/计数器0和1,STC89C52在此之上增加了16位定时器/计数器2,以及看门狗定时器。本小节讲述请参考数据手册自行学习与定时器/计数器0相同,不讲述请参考数据手册自行学习80C51系列内部有2个16位的定时/计数器T0、T180C52系列内部有3个16位的定时/计数器T0、T1、T2用一个简单的框图构造它的模型:N位计数器构成了电路的核心。

定时、计数两种方式的区别在于计数器的脉冲来源。(1)如何控制定时还是计数?(2)何时控制启动计数?(3)如何控制定时/计数的长短?振荡器TF0启动控制溢出标志中断÷12GATE≥&TR0C/T=1TH0TL0N位

+1计数器C/T=0T0(P3.4)内部时钟脉冲(定时)外部输入脉冲(计数)计数初值INT0(P3.2)二、80C51的T/C0工作原理时钟源1111111111111111可以使用软件查询其状态,可以设置当其由0变为1时触发中断016位定时器/计数器溢出标志1再来一个时钟脉冲当定时器的值为0xFFFF时标志位置位定时器清0000000000000000080C51的T/C1工作原理(与T/C0相似)振荡器TF1启动控制溢出标志中断÷12GATE≥&TR1C/T=1TH1TL1N位+1计数器C/T=0T1(P3.5)内部时钟脉冲(定时)外部输入脉冲(计数)计数初值INT1(P3.3)定时器与计数器标准80C51外部T0/T1功能引脚的时钟源定时器/计数器内部时钟源

计数周期未知,甚至不具有周期性

计数周期固定为一个机器周期

当选择外部引脚时钟源,称作计数器

当选择内部时钟源(默认)时,称作定时器1.定时工作方式

★设置为定时工作方式时,定时器计数的脉冲是由8051片内振荡器输出经12分频后产生的。

如:当8051采用12MHz晶体时,每个机器周期为1μs,计数额率为1MHz。★每个机器周期使定时器(T0或T1)的数值+1直至计计数满产生溢出。2.计数工作方式

★设置为计数工作方式时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数。★当输入脉冲信号产生由1至0的下降沿时,计数器的值加1,在每个机器周期的S5P2期间采样T0或T1的输入电平。若前一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的数值装入计数器。

★检测一个1至0的跳变需要2个机器周期,故最高计数频率为振荡频率的1/24。计数器功能“注意事项”在实现“计数器”功能时,计数器在每个机器周期对外部管脚采样一次,现假设计数器0对下降沿计数。1个机器周期机器时钟T0外部引脚情况1:正常检测情况2:漏检T0外部引脚T1时检测到高电平计数管脚的计数高/低脉冲宽度必须至少保持一个机器周期,否则就有可能漏检。!T2T0T1T3T4判断为无下降沿,即漏检T2时检测到低电平判断为下降沿T2时检测到高电平T1时检测到高电平无论是定时还是计数,当软件设定了定时/计数器的工作方式,启动以后,定时/计数器就按规定的方式工作,不占用CPU的操作时间,此时CPU可执行其他程序,到了计满规定的时间或规定的个数(定时/计数器溢出),定时/计数器会给出溢出标志,你可以通过查询或中断方式了解是否溢出。

这种工作的方式如同人带的手表,人在工作或睡觉,而手表依然滴滴答答行走,你可以通过看表或设闹钟方式,到了规定的时间,干你想干的事。1、T0、T1定时/计数器方式控制寄存器(TMOD)三、定时器/计数器的控制寄存器(1)GATE:门控位(门控信号),设定T1、T0运行时是否受、引脚输入电平的控制。

GATE=0,运行只受TCON中运行控制位TR0/TR1的控制。

GATE=1,运行同时受TR0/TR1和外中断输入信号的双重控制。只有当INT0/INT1=1且TR0/TR1=1,T0/T1才能运行。TMOD字节地址89H,不能位操作,设置TMOD须用字节操作指令。振荡器TF0启动控制溢出标志中断÷12GATE≥&TR0C/T=1TH0TL0N位

+1计数器C/T=0T0(P3.4)内部时钟脉冲(定时)外部输入脉冲(计数)计数初值INT0(P3.2)(2)C/T:定时器/计数器选择位

C/T=0,为定时器方式,计数器的输入来自晶体振荡器的脉冲÷12。 C/T=1,为计数器方式,计数器的输入来自P3.4或P3.5的外部脉冲;(3)M1M0工作模式选择位(工作方式选择位)M1M0工作方式备注00方式0

13位计数器,使用了TLX(低5位)和THX(8位)。01方式1

16位计数器,使用了TLX(8位)和THX(8位)。10方式2

8位自动装载计数器,TL溢出时自动装载成TH的值11方式3

T0为2个8位计数器,T1停止工作。LSBMSBTF1TR1TF0TR0IE1IT1IE0IT0

(1)TR0、TR1——计数运行控制位。

TR0位(或TR1位)=

1,启动定时器/计数器工作的必要条件。(2)

TF0、TF1——计数溢出标志位。当计数器计数溢出时,由硬件自动使TFx置“1”。①使用查询方式时,此位作为状态位供CPU查询,但应注意查询有效后,应使用软件及时将该位清“0”。②使用中断方式时,此位作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。2、T0、T1定时/计数器控制寄存器TCONTCON(88H)与外部中断和有关五、定时器/计数器的四种工作方式

前面已经了解,对TMOD寄存器的M1、M0位的设置,可选择四种工作方式,即方式0、方式1、方式2和方式3。M1M0工作方式备注00方式0

13位计数器,使用了TLX低5位和THX8位。01方式1

16位计数器,使用了TLX8位和THX8位。10方式2

8位自动装载计数器,TL溢出时自动装载成TH的值11方式3

T0为2个8位计数器,T1停止工作。P3.4引脚(T0)GATETR0INT0振荡器÷12TH08位TL05位TF0中断KC/T=0C/T=1控制定时/计数器方式0逻辑图111“+1”中断13位计数器TF0“+1”“+1”或门与门1、方式0M1M0=00工作原理定时器(T0或T1)工作于13位定时、计数方式。13位的定时计数器,由TH的8位和TL的低5位组成。(以T0为例T1原理相同)此种方式与是与早期的MCS-48系列兼容,如果不是为了兼容的目的,一般不用方式0。在实际应用中完全可以用方式1代替。

设:N为计数个数、x为计数初值

1、用于计数功能时,计数个数N的计算公式:N=213-x

若初值X=0~8191范围时,计数范围为:1~8192。

2、用于定时功能时,定时时间t的计算公式为:

t=N×TM=(213-x)×TMx=213-t/TMTM=12TOSC=12/fOSC

若晶振频率为12MHz,机器周期=1us,初值X=0~8191范围时,则可定时范围为1~8192us。方式0---相关计算解:首先求出定时器T0初值。

t=N×TM=(213-x)×TM又由于fOSC=6MHz

∴1TM=12TOSC=12/6MHz=2µs

∴2000µs=(213-初值X)2µs

∴初值X=7192=1110000011000B,其中将:高8位11100000B=0xE0 赋给TH0,低5位11000B=00011000B=0x18赋给TL0。

TH0=0E0H,TL0=18H。例1:已知fOSC=6MHz,设定时器T0选择工作方式0,定时时间为

2ms,试确定T0初值(TH0=?TL0=?)。2、方式1M1M0=01工作原理方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加“1”计数器

定时/计数器方式1逻辑图TH0TL0振荡器1/12(8位)(8位)TF0中断启动控制P3.4(T0引脚)TR0GATEP3.2(INT0)C/T=0C/T=116位加1计数器(以T0为例T1原理相同)设:N为计数个数

、x为计数初值

1、用于计数功能时,计数个数N的计算公式:N=216-x

若初值X=0~65535范围时,计数范围为:1~65536。

2、用于定时功能时,定时时间t的计算公式为:

t=N×TM=(216-x)×TMx=216-t/TMTM=12TOSC=12/fOSC

若晶振频率为12MHz,机器周期=1us,初值X=0~65535范围时,则可定时范围为1~65536us。方式1---相关计算3、方式2M1M0=10定时/计数器方式2逻辑图(以T0为例T1原理相同)

方式2为自动重装初值的8位计数方式,由TL0(TL1)做计数器,TH0(TH1)做初值寄存器。工作前TL0、TH0分别预置相同的初值。计数器TL0工作时,每当溢出产生中断的同时,将TH0中的初值自动重装。

T0(P3.5)

GATETR0INT0振荡器1/12TL18位TF0中断KC/T=0C/T=1控制TH08位重装载重装载1“+1”中断TL08位TF0“+1”“+1”这种工作方式可省去用户软件中重装常数的语句,并可产生相当精确的定时时间,特别适合于串行口波特率发生器。设:N为计数个数用表示、x为计数初值

1、用于计数功能时,计数个数N的计算公式:N=28-x

若初值X=0~255范围时,计数范围为:1~256。

2、用于定时功能时,定时时间t的计算公式为:

t=N×TM=(28-x)×TMx=28-t/TMTM=12TOSC=12/fOSC

若晶振频率为12MHz,机器周期=1us,初值X=0~255范围时,则可定时范围为1~256us。方式2---相关计算T0分成2个8位定时器:TL0定时/计数器和TH0定时器

TL0占用T0控制位:C/T,TR0,GATE;

TH0占用T1控制位:TR1。注意:T1不能使用方式3工作4、方式3逻辑图及工作原理(只有T0有)有兴趣下来花仔细研究!TH0借用了T1的TR1和TF1,因此控制了T1的中断,此时T1可作串行通信的波特率控制发生器(下周介绍)定时/计数器4种方式比较方式计数位数最大定时时间Tmax方式013位Tmax=8192×1μЅ

=8.192ms方式116位Tmax=65536×1μЅ=65.536ms方式2,38位Tmax=256×1μЅ=0.256ms方式计数位数最大计数值方式013位Tmax=213=8192方式116位Tmax=216=65536方式2,38位Tmax=28=256由于:定时时间:t=N×TM,(或N=t/TM)而TM=12TOSC=12*1/fOSC,假设系统时钟fOSC=12MHz,则有下表:

使用定时器/计数器的必须计算计数初值。假设t为定时时间,计数器位数为n,系统时钟频率为fosc,计数初值为x,则它们满足下列关系式:五、定时/计数器应用时的初值计算定时器的方式0时:n=13, 方式1时:n=16

方式2时:n=8, 方式3时:n=8例1:fOSC=12MHZ,试计算定时时间2ms(2000µs)所需的定时器的初值。TH0=?、TL0=?方式0:x=213-2000=6192=1830H=1100000110000BTH0=0XC1; TL0=0X10;(TH0=6192/32;TL0=6192%32;)方式1:x=216-2000=63536=0F830HTH0=0XF8、TL0=0X30 (TH0=63536/256;TL0=63536%256;)方式2、方式3:TMAX=256µs

所以必须将工作方式方式0或方式1:否则就需要进行多次定时最后求和。例2:要求实现8个LED的实现交替闪烁,间隔时间为100ms(设使用的晶振频率为6MHz。)(1)计算计数初值X

∵定时时间t=(2n-x)×TM

又∵

fOSC=6MHz∴TM=12/fOSC=12/6MHz=2µs

本设计选用定时器的工作方式1,∴n=16。

∴(216-x)×2µs=100ms=100000us

∴x=216-50000=65536-50000=15536=0x3CB0TH0=0x3C;TL0=0xB0;或TH0=15536/256;TL0=15536%256;#include<regx51.H>bitflag=0;voidmain(){ TMOD=0x01; //设定T0工作方式(方式1)

TH0=15536/256; //设置T0初始值

TL0=15536%256; TR0=1; //启动定时器0 while(1) {

if(TF0==1) //查询定时器溢出标志位是否为1

{ TF0=0; flag=~flag;

if(falg==0) P0=0X55; else P0=0XAA;

TH0=15536/256; TL0=15536%256;

} }}#include<regx51.h>bitflag=0;voidmain()

{ TMOD=0X01; //设定定时器的相关条件

TH0=15536/256; //准备初始值

TL0=155336%256; ET0=1; //允许定时器0中断

EA=1; //开放总中断

TR0=1;//启动定时器0 while(1); //等待中断请求

}voidTIMER0_ISR()interrupt1//中断服务函数{ TH0=15536/256; //准备初始值

TL0=15536%256; flag=~flag; if(flag==0) P0=0X55;else P0=0XAA;}10ms20ms10ms例2:要求:采用定时器T1的方式1,从P2.0引脚上输出周期为20ms的方波(占空比为50%),已知fOSC=12MHz。周期为20ms的方波要求P2.0上的电平每10ms变更一次。(1)计算计数初值X

∵定时时间t=(2n-x)×TM

又∵

fOSC=12MHz∴TM=12/fOSC=12/12MHz=1µs

本设计选用定时器的工作方式1,∴n=16。

∴(216-x)×1µs=10ms=10000us

∴x=216-10000=65536-10000=55536=0xD8F0TH1=0xD8;TL1=0xF0;TH1=55536/256;TL1=55536%256;#include<regx51.H>voidmain(){ TMOD|=0x10;//设定T1工作方式

TH1=0xD8; //设置T1初始值

TL1=0xF0; TR1=1; //启动定时器1 while(1) { if(TF1==1)//查询定时器0溢出标志位是否为1 {

TF1=0; //清除定时器1溢出标志位

P2_0=~P2_0 //P2.0取反产生方波

TH1=0xD8; //设置T0初始值

TL1=0xF0;

} }}方法一:查询方式实现#include<regx51.h>voidmain() { TMOD|=0X10; //设定定时器的相关条件

TH1=0XD8; //装入初值

TL1=0XF0; ET1=1; //允许定时器1中断

EA=1; //开放总中断

TR1=1;//启动定时器1 while(1); //等待中断信号申请

}voidTimer1_ISR()interrupt3//定时器1中断服务函数{

TH0=0XD8; //重新赋值,保证下次定时的时间任然为10ms TL0=0XF0;

P2_0=~P2_0;//信号取反}方法二:中断方式实现【解题思路】

周期为10ms的方波要求P2.0上的电平每5ms变更一次,但在方式2,T0的最大定时为256us,因此不能直接实现,可用T0产生250us定时,再用软件计数20次,实现5ms定时。5ms10ms5ms例3:要求:采用定时器T0的方式2,从P2.0上输出一个周期性周期为10ms方波(占空比为50%),已知晶振12MHz。(1)计算计数初值X

∵定时时间t=(2n-x)×TM

又∵

fOSC=12MHz

∴TM=12/fOSC=12/12MHz=1µs

本设计选用定时器的工作方式2,∴n=8。

∴(28-x)×1µs=250us

∴x=28-250=256-250=6=06HTH0=0x06;TL0=0x06;#include<regx51.H>unsignedcharcount=0;voidmain(){ TMOD|=0x02; //设定T0工作方式

TH0=0x06;//设置T0初始值

TL0=0x06; TR0=1; //启动定时器0

while(1) { if(TF0==1) //查询定时器溢出标志位是否为1 {

TF0=0; count++;

if(count==20) { count=0; P2_0=~P2_0 //P2.0取反产生方波

}

} }}方法一:查询方式实现#include<regx51.h>voidmain(){ TMOD=0X02; TH0=0X06; TL0=0X06; ET0=1; //开放外部中断0 EA=1; //开放总中断

TR0=1;

while(1);//等待中断申请,即等待TF0=1}voidTimer0_ISR()

interrupt1

{

count++;

if(count==20) { count=0; P2_0=~P2_0 }}方法二:中断方式实现例4:设fosc=6MHz,利用单片机的T/C实现从P2.0端口引脚输出1000个脉冲,脉冲周期为2ms。

P2.0T1(P3.5)AT89S51分析:由于fOSC=6MHz

∴TM=12/fOSC=12/6MHz=2µs

本设计选取T0定时;T1计数。

设T0采用中断方式产生周期为2ms方波,T1对该方波计数,当输出至第1000个脉冲时,使TF1置1。在主程序中用查询方法,检测到TF1变1时,关掉T0,停止输出方波。1ms2ms1msT0、T1参数的确定:

(1)选用T0方式1实现定时:脉宽为脉冲周期的一半为1ms。 ∵(216-初值X)×TM=定时时间 ∴(65536-初值X)×2µs=1000us

∴初值X=65536-500=0xFE0C TH0=0xFE;TL0=0x0C;

(2)选用T1方式1实现计数:N=1000; ∵N=216-初值X

则X=65536-1000=64536=0xFC18 TH1=0xFC;TL1=0x18;例4:设fosc=6MHz,利用单片机的T/C实现从P2.0端口引脚输出1000个脉冲,脉冲周期为2ms。#include<regx51.h>voidmain(){ TMOD=0X51;

//设定T0,T1工作方式

TH0=0xFE;//赋定时初值

TL0=0x0C; TH1=0xFC;//赋计数初值

TL1=0x18;

ET0=1; EA=1; TR0=1; TR1=1;

while(TF1==0);//查询1000个脉冲计够没有?

EA=0; //关闭总中断

TR0=0;//关闭定时器0 TR1=0;//关闭定时器1 while(1);}//中断产生周期为2MS的方波信号voidT0_ser()interrupt1using1{

TH0=0xFE; TL0=0x0C;

P2_0=~P2_0 }1ms2ms1ms例5、脉冲参数测量——GATE功能的使用。89S51P3.2P3.31被测信号21a3T0计数T1计数

试编程测量下图所示,脉冲高电平(计数)长度值存于X中,脉冲低电平长度存于Y中。电路连接如下图所示。大家试想为什么要加非门?振荡器TF0启动控制溢出标志中断÷12GATE≥&TR0C/T=1TH0TL0N位

+1计数器C/T=0T0(

温馨提示

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

评论

0/150

提交评论