chap6 MCS-51的定时计数器_第1页
chap6 MCS-51的定时计数器_第2页
chap6 MCS-51的定时计数器_第3页
chap6 MCS-51的定时计数器_第4页
chap6 MCS-51的定时计数器_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第6章MCS-51单片机的

定时/计数器第6章内容:6.1定时/计数器的结构6.2有关的特殊功能寄存器6.3定时器的4种工作模式6.4定时/计数器的应用举例226.1定时/计数器的结构单片机通常具有2~4个定时/计数器内部电路为二进制计数器从单片机引脚输入时钟——计数器,用于累计外部输入的脉冲个数,如果输入时钟周期固定,也可以用于定时从单片机内部振荡器输入时钟——定时器,用于精确地确定某一段时间间隔336.1定时/计数器的结构定时器/计数器的基本概念CPOVF0000

000001010101000100100011010001010110011110001001101010111100110111101111内部时钟外部时钟44MCS-51单片机有2个16位的可编程定时/计数器定时器0(T0)定时器1(T1)它们既可用做定时器、又可用做计数器:用于定时控制、延时、对外部事件计数和检测等场合。6.1定时/计数器的结构55微处理器TH1TL17070P3.5(T1)或内部时钟TH0TL07070P3.4(T0)或内部时钟TMODTCON16位计数器T1T0661、定时工作方式定时工作方式是在计数器的输入端输入周期固定的脉冲信号,根据计数器中累计的脉冲个数可计算出所定时间。8051的定时器是对片内振荡器输出的时钟信号经12分频后的脉冲计数,即每过一个机器周期使定时器(T0或T1)的数值加1,直至加满溢出两种工作方式772、计数工作方式对引脚T0(P3.4)和T1(P3.5)来的外部脉冲信号计数。当输入脉冲信号产生由高电平至低电平的下降沿时,计数器的值加1。为了确保某个电平在变化之前至少被采样一次,要求外部计数脉冲的高电平与低电平保持时间至少为一个完整的机器周期。两种工作方式88 无论定时还是计数工作方式,T0或T1在对内部时钟或对外部事件计数时都不占用CPU时间,只有定时器/计数器计满产生溢出时才可能中断CPU的当前操作。两种工作方式996.2有关的特殊功能寄存器T0的计数寄存器——TH0、TL0;T1的计数寄存器——TH1、TL1;与T0、T1有关的SFR除TH0、TL0、TH1、TL1外,还有2个:TMOD工作模式寄存器:定义T0、T1的工作模式及有关功能TCON控制寄存器:存放T0、T1的启、停、溢出标志和中断标志1010TMOD—工作模式寄存器(89H)1111M1、M0控制的4种模式M1M0模式说明00013位计数器

01116位计数器

102自动装入8位计数器

113T0:分成两个8位计数器T1:置方式3时停止工作

1212例:设T1为定时方式,按模式2工作

设T0为计数方式,按模式1工作

请确定模式寄存器TMOD的值:定义模式寄存器TMOD的指令为:

MOVTMOD,#25HTMOD不能位寻址,只能用字节传送指令001001011313TCON—控制寄存器(88H)T1溢出标志位当T1计满溢出时,硬件自动使TF1置1,并且申请中断。当CPU进入中断服务程序后,TF1由硬件自动清0;在查询方式下用软件清0T1运行控制位当GATE=0时,TR1置1即启动定时器T1当GATE=1,且INT1为高电平时,TR1置1启动定时器T1由软件清0关闭定时器T1146.3定时器的四种工作模式定时器/计数器有4种工作模式,由TMOD控制。工作模式的特点和用法如下:模式0当M1M0=00时,为模式0。此时,16位计数器只用了13位以T1为例,由TH1的8位和TL1的低5位组成一个13位计数器,TL1高三位未用8位×××TH1TL15位1515T1模式0逻辑电路结构计数脉冲输入定时脉冲输入定时计数计数器的输入信号受到3个信号的控制计数器启动/停止选通控制外部中断信号1616GATE=0:或门输出1,与门开放TR1=0,断开,无计数信号输入,停止计数TR1=1,闭合,有计数信号输入,启动计数GATE=1:必须INT1=1,与门才开,TR1才起作用。GATE的作用是控制是否让INT1参与控制。加1计数计满溢出置位TF11717

定时时间t的计算定时时间t:从初值开始计数到计满溢出的时间。计数初值x:当工作模式和定时时间确定后,由软件预置。对于模式0,计数初值为x,时钟频率为fosc,则定时时间t为:

t=(213-x)×12/fosc(us)

1818模式1模式1与模式0工作原理完全相同,唯一的区别是模式1是把T1设置成16位计数器,由TH1的8位和TL1的8位组成一个16位计数器若工作于模式1,计数初值为x,时钟频率为fosc,则定时时间t为:t=(216-x)×12/fosc(us)1919模式2可自动恢复计数初值的8位加1计数器计数初值寄存器(由软件预置)计满溢出置位TF0每当TL0加满溢出,则硬件自动从TH0中取出计数初值装入TL0若工作于模式2,计数初值为x,时钟频率为fosc,则定时时间t为:

t=(28-x)×12/fosc(us)2020定时/计数器T0工作模式3TL0就象T0原来的模式0或1,只是长度为8位,其它完全一样。模式3使得单片机增加了一个独立的计数器把T0分成由TH0和TL0两个独立的8位计数器但TH0不同,它借用了T1的TF1和TR1。TH0只能作为定时器使用(固定内部计数信号输入),此时TH0控制了T1的中断这时T1只能工作在方式0~2,且不能用中断方式21216.4定时/计数器的应用举例使用定时器/计数器前都要对其初始化,主要是设置4个SFR:TMOD-设置工作方式(定时或计数)、 工作模式等TH1TL1(TH0TL0)-设置计数初值

TCON-启动工作若开放定时器的中断,还要设置:IE、IP-设置定时器中断的开放/禁止、优先级2222定时/计数器初值的计算t=(2n-x)×12/fosc(us)t-定时时间x-计数初值fosc-时钟频率模式0:213=8192模式1:216=65536模式2:28=25623236.4.1初始化程序举例例:设时钟振荡频率fosc=6MHz。T1作定时器,以模式1工作,定时时间为10ms;T0作计数器,以模式2工作,收到一个外部脉冲就溢出中断。故TMOD=16H24246.4.1初始化程序举例确定初值x:T1:定时,模式1,定时10ms,fosc=6MHz t=10ms=(216-x)×12/fosc =(216-x)×2(us)

x=60536=EC78H(TH1=0ECH,TL1=78H)T0:计数,模式2,计数1次

x+1=28

x=28-1=255=FFH TH0=TL0=0FFH25256.4.1初始化程序举例初始化程序如下:

MOVTMOD,#16HMOVTL1,#78HMOVTH1,#0ECHMOVTL0,#0FFHMOVTH0,#0FFHSETBTR1 ;启动T1SETBTR0 ;启动T0MOVIE,#82H;CPU开中断,允许T0中断2626p.99【例6-1】若MSC-51振荡频率为12MHz,要求定时100µs,试计算不同模式时的计数初值。以模式2(8位)为例:

t=(28-x)×12/fosc 100µs=(256-x)×12/12(µs)

x=(256-100)=156=9CH思考:振荡频率为6MHz,x=?27276.4.2模式0的应用【例6-2】:选择T0工作于模式0,用于定时1ms,晶振fosc=6MHz,定时初值x为多少?最大定时时间T为多少?并编程实现1ms定时功能。解:T0设为定时模式0,TMOD寄存器中

GATE=0,C/T=0,M1M0=00;T1没有用到,相关4位可以设置为0000;故TMOD=00H2828【例6-2】(1)计算T0定时1ms的初值x t=(213-x)×12/fosc

1000us=(213-x)×2us X=(213-500)=1111000001100BT0的低5位(TL0):00001100B=0CHT0的高8位(TH0):11110000=F0H2929【例6-2】(2)最大定时时间t t=(213-x)×12/fosc

当13位计数器全为0

(TH0)=00H

(TL0)=00H t=213×2µs=16.384ms3030(3)中断方式下定时1ms的初始化程序

ORG 0000HRESET:AJMP MAIN ;转主程序

ORG 000BH ;T0中断程序入口

AJMP T0ISR ;转中断程序

ORG 0100HMAIN:MOV SP,#60H ;设堆栈指针

MOV TMOD,#00H MOV TL0,#0CH MOV TH0,#0F0H SETB TR0 ;启动定时器T0 SETB ET0 ;T0开中断3131(3)中断方式下定时1ms的初始化程序

SETB EA ;CPU开中断HERE:SJMP HERET0ISR:...... ;中断服务程序32326.4.3模式1的应用【例6-3】设ƒosc=12MHz,T0工作在模式1,编程利用T0在P1.0引脚上输出周期为2秒的方波。分析:周期为2s的方波,应输出1s高电平和1s低电平,即T0工作在定时方式,定时时间1s,每当定时时间到,使P1.0的输出逻辑取反。解:若T0工作在模式1下,最大定时时间Tmax为:

Tmax=216µs=65536µs=65.536ms因此必须采用定时和软件计数相结合的方法:设定时时间为50ms,在主程序中设置一个初值为20的软件计数器(1s=20×50ms)3333【例6-3】当50ms定时到即中断请求,进入中断服务程序,在中断服务程序中,使软件计数器减1,然后判断是否为零。若为零,定时1s时间到,恢复软件计数器初值并改变P1.0引脚电平,然后返回主程序;若不为零,定时1s未到,返回主程序,继续定时。重复上述过程,便可在P1.0引脚上得到周期为2秒的方波3434【例6-3】定时50ms,T0的初始值X:

X=65536–50000=3CB0H(TH0TL0) TMOD=01H实验程序如下:

ORG 0000H SJMP MAIN ORG 000BH SJMP BRT03535【例6-3】MAIN:MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 ;启动定时器T0 SETB ET0 ;T0开中断

SETB EA ;CPU开中断

MOV R0,#20 SJMP $3636【例6-3】BRT0:DJNZ R0,NEXT CPL P1.0 MOV R0,#20NEXT:MOV TH0,#3CH MOV TL0,#0B0H RETI END37376.4.4模式2的应用【例6-4】定时器T1模式2计数,要求计满100次P1.0取反分析:外部计数信号由T1(P3.5)输入,每负跳变一次计数器加1,计满100溢出中断,中断服务程序中将P1.0取反一次。模式2有自动重装初值功能,初始化后不必再置初值。确定TMOD:计数方式、模式2;故TMOD=60H3838【例6-4】计算初值: x=28-100=156=9CH TH1=TL1=9CH程序如下:

ORG 0000H SJMP MAIN ORG 001BH SJMP BRT13939【例6-4】MAIN:MOV TMOD,#60H MOV TH1,#9CH MOV TL1,#9CH SETB TR1 ;启动定时器T1 SETB ET1 ;T1开中断

SETB EA ;CPU开中断

SJMP $4040【例6-4】BRT1: CPL P1.0 ;不需要指令MOV TL1,#9CH RETI END4141【例6-5】由P3.4引脚(T0)输入一低频脉冲信号(其频率<0.5KHz),要求P3.4每发生一次负跳变时,P1.0输出一个500µs的同步负脉冲。已知fosc=6MHz。系统复位后设置P1.0初态为1,T0先设置为计数方式,计数为1(初值为FFH),T0加1就溢出,将TF0置1;程序查询到TF0为1时,使P1.0输出0,并改变T0为定时器方式,定时时间为500µs,T0定时时间到计满溢出后,P1.0恢复1,T0恢复计数方式。P3.4P1.0500us4242全部采用模式2计算初值(模式2)T0计数次数1,则:X=0FFHT0定时500µs,fosc=6MHz,X=28-250=06H程序流程图如下:4343开始设T0计数方式、模式2装T0初值、启动计数TF0=1?是则清0,停止计数yesno设T0定时方式、模式2,P1.0清0装T0初值、启动定时计数TF0=1?是则清0,P1.0置1noyes4444START:LOOP1:PTF01:MOVMOVMOVSETBJBCSJMPCLRMOVMOVMOVCLRSETBTMOD,#06HTH0,#0FFHTL0,#0FFHTR0TF0,PTF01LOOP1TR0TMOD,#02HTH0,#06HTL0,#06HP1.0TR0;设置T0为模式2,计数方式;装入T0计数器初值;启动T0计数;若TF0=1,转定时,并清零TF0;等计数时间到;停止计数;设置T0为模式2,定时方式;T0定时500µs初值;P1.0清0;启动定时500µs4545LOOP2:PTF02:JBCSJMPSETBCLRSJMPENDTF0,PTF02LOOP2P1.0TR0START;若TF0=1,定时到,清零TF0;等待定时时间到;定时到500µs,P1.0置1;停止定时计数;转,T0恢复外部计数46466.4.5综合应用举例【例6-7】使用8031单片机设计一个“航标灯”控制器。要求:“黑夜”,“航标灯”自动启动,亮2s,灭2s,循环闪动“白天”,“航标灯”自动熄灭4747电路设计“黑夜”时光敏三极管截止,INT0为低电平“0”“白天”时光敏三极管导通,INT0为高电平“1”4848软件设计思路方法一: 直接查询引脚INT0(即端口P3.2)如果为低电平(黑夜)定时器2s定时使P1.7取反(航标灯闪动)如果为高电平(白天)停止定时,P1.7=0方法二: 利用INT0的低电平作为中断请求,

通过中断标志判断白天黑夜(或采用中断方式)4949外部中断INT0工作方式INT0:电平触发,低优先级。“黑夜”时,INT0低电平发中断请求。以中断方式自动进入中断服务程序,启动定时器“白天”时,INT0高电平,用查询方式结束中断处理,停止定时器,返回主程序。5050定时器工作方式选择设T1模式0,时钟频率6MHz,定时10ms(计数5000)

X=3192D=0110001111000B TH1=01100011B=63H TL1=×××11000B=18H采用定时和软件计数相结合:10ms×200次=2s在定时器中断服务程序中,软件计数200(C8H)次后P1.7求反(灯闪烁一次)5151主程序流程图开始设栈底、灭灯设INT0电平触发、低优先级、开中断等待外部中断(天黑)5252开始设T1定时、模式0、装初值、启动定时设T1高优先级、开放T1中断置软件计数初值200等待T1中断转T1中断服务程序查INT0=1(白天)?yesno关T1中断、停止定时计数、灯灭返回INT0服务程序流程图5353ORGAJMPORGAJMPORGAJMPORGMOVCLRCLRCLRSETBSETBSJMP0000HMAIN0003HINT0001BHT1INT0100HSP,#30HP1.7IT0PX0EAEX0HERE;复位入口;转主程序;外部中断0服务程序入口;转外部中断0服务程序;定时器T1服务程序入口;转T1中断服务程序;主程序入口地址;设堆栈指针;灭灯;选择外部中断0电平触发;选择外部中断0低优先级;CPU中断允许;外部中断0中断允许;等待外部中断请求MAIN:HERE:5454INT0:HERE1:ORGMOVMOVMOVSETBSETBSETBMOVJNBCLRCLRCLRRETI0160HTMOD,#00HTL1,#18HTH1,#63HPT1TR1ET1R7,#0C8HP3.2,HERE1ET1TR1P1.7

;外中断0处理程序入口;设T1为定时模式0;T1定时计数初值;T1为高优先级;启动定时器T1;T1中断允许;设软件计数初值200;为0(黑夜)时,等定时中断;为1(白天)时,关T1中断;关定时器T1;熄灯;返回外部中断INT0服务程序5555ORGMOVMOVDJNZMOVCPLRETIEND

0200HTL1,#18HTH1,#63HR7,EXPORTR7,#OC8H P1.7 ;定时器T1中断程序入口;重置T1计数初值;2s时间到,重设初值;输出位求反,控制闪烁;中断返回定时器T0服务程序T1INT:EXPORT:5656p.104【例6-8】某自动化生产线每隔5ms左右生产一件产品。如果两件产品的间隔小于4ms或大于6ms均视为生产线出现异常,立即触发报警。设计相关程序。方法:测量两件产品的实际间隔若时间间隔小于4ms则触发报警。若时间间隔小于6ms,则生产线正常,否则报警5757硬件设计:通过传感器检测到一个产品通过,使INT0为1(不做中断信号,而是GATE=1)启动定时器TR0=1检测到下一个产品到来,使INT0为0,关定时器TR0=0瞬间再使INT0成高电平,开始下一个周期

5858设置定时器一个足够长的定时初值(比如8ms),设T0工作在模式1,时钟频率为6MHz,一个机器周期为2us,定时初值X=T0

温馨提示

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

评论

0/150

提交评论