您好,欢迎访问三七文档
第6章AT89S51单片机的定时器/计数器•什么时候需要定时器?•什么时候需要计数器?•根据你学到的知识,你认为要怎么在单片机里实现定时/计数器?6.1定时器/计数器的结构•AT89S51的定时器/计数器结构如图所示,T0由特殊功能寄存器TH0、TL0构成,T1由特殊功能寄存器TH1、TL1构成。•T0和T1都具有定时器和计数器两种工作模式,4种工作方式(方式0~3)。属于增计数器。•特殊功能寄存器TMOD用于选择T0、T1的工作模式和工作方式。•特殊功能寄存器TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。•T0、T1不论是工作在定时器模式还是计数器模式,实质是对脉冲信号进行计数,只不过计数信号的来源不同。•计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数。•定时器模式是对单片机的系统时钟信号经片内12分频后的内部脉冲信号(机器周期)计数。•计数器的起始计数是从初值开始。6.1.1工作方式控制寄存器TMOD(1)GATE—门控位。GATE=0时,仅由运行控制位TRx(x=0,1)来控制定时器运行。GATE=1时,用外中断引脚INT0*(或INT1*)上的电平与运行控制位TRx共同控制定时器运行。同步•(2)M1、M0—工作方式选择位。•(3)𝑪/𝑻:计数器模式和定时器模式选择位。–𝑪/𝑻=0,为定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。–𝑪/𝑻=1,为计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。6.1.2定时器/计数器控制寄存器TCON这里仅介绍与定时器相关的高4位功能。(1)TF1、TF0—计数溢出标志位。当计数器计数溢出时,该位置“1”。使用查询方式时,此位作为状态位供CPU查询,但应注意查询有效后,应使用软件及时将该位清“0”。使用中断方式时,此位作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。6.1.2定时器/计数器控制寄存器TCON(2)TR1、TR0—计数运行控制位(启停位)。TR1位(或TR0位)=1,启动定时器。TR1位(或TR0位)=0,停止定时器。该位可由软件置“1”或清“0”。6.2定时器/计数器的4种工作方式6.2.1方式0当M1、M0为00时,定时器/计数器被设置为工作方式0。•方式0时,为13位计数器,由TLx(x=0,1)的低5位和THx的高8位构成。TLx低5位溢出则向THx进位,THx计数溢出则把TCON中的溢出标志位TFx置“1”。•𝑪/𝑻位控制的电子开关决定了定时器/计数器的两种工作模式。–𝑪/𝑻=0,T1(或T0)为定时器工作模式,把时钟振荡器12分频后的脉冲作为计数信号。–𝑪/𝑻=1,T1(或T0)为计数器工作模式,计数脉冲为P3.4(或P3.5)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。输入计数脉冲的频率会不会有什么限制?GATE位状态主要用于定时/计数器与外部信号同步(1)GATE=1时,定时/计数器的的启动除受TRx的控制外,还受外部中断请求信号𝑰𝑵𝑻𝒙的控制。只有当TRx=1,且𝑰𝑵𝑻𝒙=𝟏时定时器才能启动。(2)GATE=0时,定时/计数器的的启动只受TRx的控制。•6.2.2方式1•方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16位计数器,由THx高8位和TLx低8位构成(x=0,1),方式0则为13位计数器。•有关控制状态位的含义(GATE、𝑪/𝑻、TFx、TRx)与方式0相同。6.2.3方式2•方式0和方式1的最大特点是计数溢出后,计数器为全0。•因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题。•这不仅影响定时精度,也给程序设计带来麻烦。方式2就是解决此问题而设置的。•当M1、M0为10时,定时器/计数器处于工作方式2•定时器/计数器的方式2为自动恢复初值(初值自动装入)的8位定时器/计数器–TLx(x=0,1)作为常数缓冲器–当TLx计数溢出时,在溢出标志TFx置“1”的同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。图6-7方式2工作过程6.2.4方式3•方式3是为了增加一个附加的8位定时器/计数器而设置的。•方式3只适用于定时器/计数器T0,定时器/计数器T1不能工作在方式3。•T1处于方式3时相当于TR1=0,停止计数(此时T1可用来作为串行口波特率产生器)•1.工作方式3下的T0–当TMOD的低2位为11时,T0的工作方式被选为方式3。–T0分为两个独立的8位计数器TL0和TH0•TL0使用T0的状态控制位𝑪/𝑻、GATE、TR0。•TH0被固定为一个8位定时器(不能作为外部计数模式),并使用T1的状态控制位TR1和TF1,同时占用T1的中断请求源TF1。方式3时,T1的工作方式–一般情况下,只有当T1用作串行口的波特率发生器的时候,T0才工作在方式3、–此时,T1可以定义为方式0、1、2,用作波特率发生器或者不需要中断的场合。6.3对外部输入的计数信号的要求–当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。–当输入信号产生由1至0的跳变(即负跳变)时,计数器值增1。–每个机器周期的S5P2期间,都对外部输入引脚T0或T1进行采样。如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。6.3对外部输入的计数信号的要求–由于确认一次负跳变花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。–对于外部输入信号的占空比并没有什么限制,但为了确保某一给定电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期。6.4定时器/计数器的编程和应用•在4种工作方式中,方式0与方式1基本相同,只是计数器的计数位数不同。•方式0为13位计数器,方式1为16位计数器•由于方式0是为兼容MCS-48而设,且其计数初值计算复杂,所以在实际应用中,一般不用方式0,而采用方式1。•6.4.1P1口外接的8只LED每0.5s闪亮一次。•【例6-1】在AT89S51单片机的P1口上接有8只LED。下面采用定时器T0的方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮一次。–(1)设置TMOD寄存器–(2)计算T0计数初值–(3)设置IE寄存器–(4)启动和停止定时器T0•(1)设置TMOD寄存器–T0工作在方式1–那么TMOD=00000001=0x01•(2)计算T0计数初值–设晶振为12M,方式2最大定时时间为216=65536uS。–怎么实现定时500ms?•两种方法:用一个变量计数或者用两个定时器串联。–计算定时器初始值计算公式–计算定时器初始值–设定时时间5ms(即5000µs),设定时器T0的计数初值为X,假设晶振的频率为11.0592MHz,则定时时间为:•定时时间=(216−X)12/晶振频率•X=60928,转换成16进制后为:0xee00,其中0xee装入TH0,0x00装入TL0。–初始值计算公式•THx=(定时器最大计数值-t*fosc/12)/256;•TL0=(定时器最大计数值-t*fosc/12)%256;•t为定时时长,单位为us•fosc为晶振频率,单位为MHz–(3)设置IE寄存器•采用T0中断,那么应该设置哪两项?•EA=1;ET0=1;–(4)启动和停止定时器T0•TR0主函数流程图中断函数流程图–参考程序(keil演示)–6.4.2计数器的应用•【例6-2】采用定时器T1的方式1的中断计数方式,如图6-13所示,计数输入引脚T1(P3.5)上外接开关K1,作为计数信号输入。按4次K1后,P1口的8只LED闪烁不停。–6.4.2计数器的应用•初始化计数器–设置TMOD–设置计数初值•开中断•启动定时器•编写中断处理函数–方法一:在中断处理函数中闪烁(不建议)–方法二:主函数中闪烁–6.4.5P1.1上产生周期为1s的方波•【例6-5】假设系统时钟为12MHz,编程实现从P1.1引脚上输出一个周期为1s的方波。•基本思想:–要在P1.0上产生周期为1s的方波,定时器应产生500ms的周期性定时,定时到则对P1.0求反。–由于定时时间较长,用定时器不能直接实现,直接定时时间最长的就是方式1,仅为65ms(系统时钟12MHz)多一点。•实现–方法一:用一个全局变量统计定时器溢出次数。当溢出次数*定时器定时时长=500毫秒时,清空全局变量,并将P1.1取反。–6.4.5P1.1上产生周期为1s的方波•方法二:–T0定为10ms定时,每10ms对P1.0求反一次,P1.0输出的脉冲加到定时器T1的计数输入脚P3.5(T1脚),作为计数输入,定时500ms需计数50次。–T1设为方式2计数,T0设为方式1定时。–6.4.5P1.1上产生周期为1s的方波–6.4.5P1.1上产生周期为1s的方波•程序(KeilC+Proteus演示)–6.4.7测量脉冲宽度(门控位GATEx的应用)•[例6-7]门控位GATE1可使T1的启动计数受的控制,当GATE1=1,TR1=1时,只有引脚INT1*输入高电平时,T1才被允许计数。利用GATE1的这一功能,可测量引脚INT1*(P3.3)上正脉冲的宽度(机器周期数),利用门控制位GATE1,测量引脚INT1*上正脉冲的宽度。图6-16利用GATE位测量正脉冲的宽度–6.4.7测量脉冲宽度(门控位GATEx的应用)•初始化计数器•等待INT1=0•TR1=1,等待INT1变为高电平启动计数器–在INT1为高电平期间计数器计数•等待INT1=0,停止计数•读出脉冲宽度•显示脉冲宽度作业:1、课后作业(不交)2、以P107页例6.4.8为基础,使用定时/计数器实现实时时钟,要求实现月、日、时、分、秒,不要求写显示函数。要求提交程序清单、提交.DSN文件,参加电竞的同学提交流程图,流程图以visio绘制。以压缩包的形式交给课代表。3、作业提交时间:本章内容结束后的下一周周一之前。
本文标题:第6章定时计数器.
链接地址:https://www.777doc.com/doc-2111067 .html