您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 电气安装工程 > 单片机(c语言版)定时器计数器
第6章AT89S51单片机的定时器/计数器1内容概要:介绍AT89S51单片机片内定时器/计数器的结构与功能,两种工作模式和4种工作方式,以及与其相关的两个特殊功能寄存器TMOD和TCON各位的定义及其编程,最后介绍定时器/计数器的C51编程及应用实例。6.1定时器/计数器的结构定时/计数器的实质是加1计数器(16位),由高8位THX(X=0或1)和低8位TLX两个寄存器组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。GATEC/TM1M0GATEC/TM1M0TH1TL1TH0TL0T1方式T0方式T1引脚T0引脚机器周期脉冲内部总线TMODTCON外部中断相关位TF1TR1TF0TR0外部脉冲3图6-1AT89S51单片机的定时器/计数器结构框图6.1.1工作方式控制寄存器TMODAT89S51定时器工作方式寄存器TMOD用于选择工作模式和工作方式,字节地址为89H,不能位寻址。8位分为两组,高4位控制T1,低4位控制T0。(1)GATE—门控位GATE=0时,仅由运行控制位TRx(x=0,1)来控制定时器运行GATE=1时,用外中断引脚INT0*(或INT1*)上的电平与运行控制位TRx共同控制定时器运行。4图6-2寄存器TMOD格式(2)M1、M0—工作方式选择位M1、M0的4种编码,对应于4种工作方式的选择。(3)C/T*—计数器模式和定时器模式选择位C/T*=0,为定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。C/T*=1,为计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。56.1.2定时器/计数器控制寄存器TCONTCON字节地址为88H,可位寻址,位地址为88H~8FH。(1)TF1、TF0—计数溢出标志位。当计数器计数溢出时,该位置“1”。使用查询方式时,应注意查询有效后,使用软件及时将该位清“0”。使用中断方式时,中断请求标志位在进入中断服务程序后由硬件自动清“0”。(2)TR1、TR0—计数运行控制位。TR1位(或TR0位)=1,启动定时器工作。TR1位(或TR0位)=0,停止定时器工作。该位可由软件置“1”或清“0”。6图6-3TCON格式6.2定时器/计数器的4种工作方式6.2.1方式0——M1M0=00方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。7TF1TR1TF0TR0GATEC/TM1M0GATEC/TM1M01&≥110T0引脚INT0引脚00机器周期TH0TL08位5位溢出TCONTMODD0D7D7D0申请中断1图6-4定时器/计数器方式0逻辑结构框图C/T*位决定定时器/计数器的两种工作模式(1)C/T*=0,T1(或T0)为定时器工作模式,把时钟振荡器12分频后的脉冲作为计数信号。(2)C/T*=1,T1(或T0)为计数器工作模式,计数脉冲为P3.4(或P3.5)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。9GATE位决定定时器的运行控制取决于TRx一个条件,还是取决于TRx和INTX*(x=0,1)引脚状态这两个条件。(1)GATE=0时,仅由TR0控制与门的开启。与门输出1时,控制开关接通,计数开始;(2)GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。当TR0=1时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。定时器模式时有:N=t/Tcy计数初值计算的公式为:13X=2-N6.2.2方式1——M1M0=01方式1的计数位数是16位,由TLX作为低8位、THX作为高8位,组成了16位加1计数器。TF1TR1TF0TR0GATEC/TM1M0GATEC/TM1M01&≥110T0引脚INT0引脚10机器周期TH0TL08位8位溢出TCONTMODD0D7D7D0申请中断16X=2-N计数个数与计数初值的关系为:8X=2-N6.2.3方式2——M1M0=10方式2为自动重装初值的8位计数方式。工作方式2特别适合于用作较精确的脉冲信号发生器。TF1TR1TF0TR0GATEC/TM1M0GATEC/TM1M01&≥110T0引脚INT0引脚10机器周期TH0TL08位溢出TCONTMODD0D7D7D0申请中断计数个数与计数初值的关系为:工作过程TF1TR1TF0TR0GATEC/TM1M0GATEC/TM1M01&≥110T0引脚INT0引脚11机器周期TH0TL08位溢出TCONTMODD0D7D0申请中断机器周期8位申请中断溢出T0分成两个8位定时/计数器TL0和TH0;TL0:既可计数也可定时,是一个8位定时/计数器。占用了T0所有控制位:C/T,TR0,GATE,TF0和INT0、T0引脚;TH0:只能作为定时器,因为T0已被TL0占用,TH0用T1的控制位:TR1、TF1;6.2.4方式3——M1M0=1113T0在方式3时T1的工作模式T1只能工作在0、1、2方式,作为串行口的波特率发生器使用。因为T1的运行控制位TR1及计数溢出标志位TF1已被定时/计数器T0借用。当作为波特率发生器使用时,只需要设置好工作方式,便可自动运行。如要停止工作,只需送入一个把T1设置为方式3的方式控制字。因为定时/计数器T1不能在方式3下工作,因为T1处于方式3时相当于TR1=0,停止计数。146.3对外部输入的计数信号的要求当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生由1至0的跳变(即负跳变)时,计数器值增1。由于确认一次负跳变花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。图6-12对外部计数输入信号的要求例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。156.3对外部输入的计数信号的要求当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生由1至0的跳变(即负跳变)时,计数器值增1。由于确认一次负跳变花2个机器周期,即24个振荡周期,因此外部输入计数脉冲的最高频率为系统振荡器频率的1/24。图6-12对外部计数输入信号的要求例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。时间常数的计算时间常数:定时器/计数器T0或T1的初始计数值,在T0或T1被启动后,每个机器周期使计数器中的计数值加1,计数器产生溢出后。定时时间:计数器溢出时间,时间常数越大,定时时间就越短;时间常数越小,定时时间就越长。时钟的频率越高,定时时间越短;时钟的频率越低,定时时间越长。设系统时钟的频率为fosc,计数器的初始值为N,定时器工作于方式1,则定时时间:T=(216-N)×12/fosc(1)如果定时器工作于方式2或方式3,定时时间为:T=(28-N)×12/fosc(2)当初始值N=0时,如果fosc=12MHZ,最大定时时间为:方式1为:Tmax=216×12/fosc=65536us=65.536ms方式2、方式3为:Tmax=28×12/fosc=256us根据定时时间T,及公式(1)、(2)分别可以求出初值N为:方式1:N=216-T×fosc/12(3)方式2、方式3:N=28-T×fosc/12(4)如果fosc=12MHZ,以上公式可简化为方式1:N=216-T方式2、方式3:N=28-T例如:系统的时钟频率是12MHz,在方式1下,如果希望定时器/计数器T0的定时时间T为10ms,则初值N=216-T=65536-10000=55536如何将55536给两个8位寄存器TH0、TL0赋值呢?可将十进制数55536转换成四位十六进制数,将高2位送TH0,低2位送TL0。更简单的方法是:对于16位计数器来讲,216等效为0,对于8位计数器,28等效为0,这样公式(3)、(4)可简化为N=-T,直接用下面两条语句就可以完成计数器初值的设置:TH0=-10000/256;//取-N的高8位TL0=-10000%256;//取-N的低8位例如:设系统的时钟频率是12MHz,定时器工作于方式2,定时时间200us。根据前面分析,N=-T=-200,可直接用以下语句实现:TH0=-200;TL0=-200;MCS-51单片机的定时器是可编程的,但在进行定时或计数之前要对程序进行初始化,具体步骤如下:(1)确定工作方式字:对TMOD寄存器正确赋值;(2)确定定时初值:计算初值,直接将初值写入寄存器的TH0、TL0或TH1、TL1;初值计算:设计数器的最大值为M,则置入的初值X为:计数方式:X=M-计数值定时方式:由(M-X)T=定时值,得X=M-定时值/TT为计数周期,是单片机的机器周期。(模式0-M为213,模式1-M为216,模式2和3-M为28)(3)根据需要,对IE置初值,开放定时器中断;(4)启动定时/计数器,对TCON寄存器中的TR0或TR1置位,置位以后,计数器即按规定的工作模式和初值进行计数或开始定时。6.4定时器/计数器的编程和应用6.4.1P1口外接的8只LED每0.5s闪亮一次。【例6-1】在AT89S51单片机的P1口上接有8只LED(电路见图4-7)。下面采用定时器T0的方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮一次。(1)设置TMOD寄存器方式1;计时工作模式;仅由TR0来控制;T1不使用。TMOD寄存器应初始化为0x01=00000001B(2)计算T0计数初值设定时时间5ms(即5000µs),设定时器T0的计数初值为X,假设晶振的频率为11.0592MHz,则定时时间为:定时时间=(216−X)12/晶振频率则5000=(216−X)12/11.0592得:X=60928,转换成16进制后为:0xee00,其中0xee装入TH0,0x00装入TL0。(3)设置IE寄存器本例由于采用定时器T0中断,因此需将IE寄存器中的EA、ET0位置1。(4)启动和停止定时器T0将定时器控制寄存器TCON中的TR0=1,则启动定时器T0;TR0=0,则停止定时器T0定时。21#includereg51.hChari=100;/*给变量i赋初值,定时0.5S,每次定时中断5MS,需要中断100次*/voidmain(){TMOD=0x01;/*设置定时器T0为方式1*/TH0=0xee;/*向TH0写入初值的高8位*/TL0=0x00;/*向TL0写入初值的低8位*/P1=0x00;/*P1口8只LED点亮*/EA=1;/*总中断允许*/ET0=1;/*定时器T0中断允许*/TR0=1;/*启动定时器T0*/while(1);/*无穷循环,等待定时中断*/}22/*以下为定时器T0的中断服务程序*/voidT0_int(void)interrupt1{TH0=0xee;/*给T0装入16位初值,计4608个数后,T0溢出TL0=0x00;i--;/*循环次数减1*/if(i=0){P1=~P1;/*P1口按位取反*/i=100;/*重新设置循环次数*/}}23[案例2]如图所示,P0口接8只发光二极管,编程使发光管轮流点亮,点亮时间为500ms,要求使用定时器T0来控制,设晶振为12MHz。D1D2D3D4D5D6D7D8R1470RR2470RR3470RR4470RR5470RR6470RR7470RR8470RVCCP0.0P0.1P0.2P0.0P0.4P0.5P0.6P0.78051设计思想我们
本文标题:单片机(c语言版)定时器计数器
链接地址:https://www.777doc.com/doc-5538912 .html