单片机(c语言版)定时器计数器..

上传人:suns****4568 文档编号:93086411 上传时间:2019-07-16 格式:PPT 页数:47 大小:763.50KB
返回 下载 相关 举报
单片机(c语言版)定时器计数器.._第1页
第1页 / 共47页
单片机(c语言版)定时器计数器.._第2页
第2页 / 共47页
单片机(c语言版)定时器计数器.._第3页
第3页 / 共47页
单片机(c语言版)定时器计数器.._第4页
第4页 / 共47页
单片机(c语言版)定时器计数器.._第5页
第5页 / 共47页
点击查看更多>>
资源描述

《单片机(c语言版)定时器计数器..》由会员分享,可在线阅读,更多相关《单片机(c语言版)定时器计数器..(47页珍藏版)》请在金锄头文库上搜索。

1、第6章 AT89S51单片机的 定时器/计数器,1,内容概要:介绍AT89S51单片机片内定时器/计数器的结构与功能,两种工作模式和4种工作方式,以及与其相关的两个特殊功能寄存器TMOD和TCON各位的定义及其编程,最后介绍定时器/计数器的C51编程及应用实例。,6.1 定时器/计数器的结构 定时/计数器的实质是加1计数器(16位),由高8位THX(X=0或1)和低8位TLX两个寄存器组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。,外部脉冲,3,图6-1 AT89S51单片机的定时器/计数器结构框图,6.1.1

2、 工作方式控制寄存器TMOD AT89S51定时器工作方式寄存器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

3、分频后的脉冲进行计数。 C/T*=1,为计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。,5,6.1.2 定时器/计数器控制寄存器TCON TCON字节地址为88H,可位寻址,位地址为88H8FH。 (1)TF1、TF0计数溢出标志位。 当计数器计数溢出时,该位置“1”。使用查询方式时,应注意查询有效后,使用软件及时将该位清“0”。使用中断方式时,中断请求标志位在进入中断服务程序后由硬件自动清“0”。 (2)TR1、TR0计数运行控制位。 TR1位(或TR0位)=1,启动定时器工作。 TR1位(或TR0位)=0,停止定时器工作。 该位可由软件置“

4、1”或清“0”。,6,图6-3 TCON格式,6.2 定时器/计数器的4种工作方式 6.2.1 方式0M1M0=00 方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。,7,图6-4 定时器/计数器方式0逻辑结构框图,C/T*位决定定时器/计数器的两种工作模式 (1)C/T*=0,T1(或T0)为定时器工作模式,把时钟振荡器12分频后的脉冲作为计数信号。 (2)C/T*=1,T1(或T0)为计数器工作模式,计数脉冲为P3.4(或P3.5)引脚上的外部输入脉冲,当引脚上发生负跳变

5、时,计数器加1。,9,GATE位决定定时器的运行控制取决于TRx一个条件,还是取决于TRx和INTX*(x=0,1)引脚状态这两个条件。 (1)GATE=0时,仅由TR0控制与门的开启。与门输出1时,控制开关接通,计数开始; (2)GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。 当TR0=1时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。,定时器模式时有:Nt/Tcy,计数初值计算的公式为:,6.2.2 方式1M1M0=01 方式1的计数位数是16位,由TLX作为低8位

6、、THX作为高8位,组成了16位加1计数器 。,计数个数与计数初值的关系为:,6.2.3 方式2M1M0=10 方式2为自动重装初值的8位计数方式。,工作方式2特别适合于用作较精确的脉冲信号发生器。,计数个数与计数初值的关系为:,工作过程,T0分成两个8位定时/计数器TL0和TH0 ; TL0:既可计数也可定时,是一个8位定时/计数器。占用了T0 所有控制位: C/T,TR0,GATE,TF0和INT0、T0引脚; TH0:只能作为定时器,因为T0已被TL0占用, TH0用 T1的 控制位:TR1、TF1;,6.2.4 方式3M1M0=11,13,T0在方式3时T1的工作模式 T1只能工作在0

7、、1、2方式,作为串行口的波特率发生器使用。因为T1的运行控制位TR1及计数溢出标志位TF1已被定时/计数器T0借用。 当作为波特率发生器使用时,只需要设置好工作方式,便可自动运行。如要停止工作,只需送入一个把T1设置为方式3的方式控制字。因为定时/计数器T1不能在方式3下工作, 因为T1处于方式3时相当于TR1 = 0,停止计数。,14,6.3 对外部输入的计数信号的要求 当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生由1至0的跳变(即负跳变)时,计数器值增1。 由于确认一次负跳变花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统

8、振荡器频率的1/24。,图6-12 对外部计数输入信号的要求,例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。,15,6.3 对外部输入的计数信号的要求 当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生由1至0的跳变(即负跳变)时,计数器值增1。 由于确认一次负跳变花2个机器周期,即24个振荡周期,因此外部输入计数脉冲的最高频率为系统振荡器频率的1/24。,图6-12 对外部计数输入信号的要求,例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果

9、选用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

10、=12MHZ,最大定时时间为: 方式1为: Tmax=21612/fosc=65536us=65.536ms 方式2、方式3为:Tmax=2812/fosc=256us,根据定时时间T,及公式(1)、(2)分别可以求出初值N为: 方式1: N=216-Tfosc/12 (3) 方式2、方式3 :N=28-Tfosc/12 (4) 如果fosc=12MHZ,以上公式可简化为 方式1: N=216-T 方式2、方式3 :N=28-T,例如:系统的时钟频率是12MHz,在方式1下,如果希望定时器/计数器T0的定时时间T为10ms,则初值N =216-T=65536-10000=55536,如何将55

11、536给两个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单片机的定时

12、器是可编程的,但在进行定时或计数之前要对程序进行初始化,具体步骤如下: (1)确定工作方式字:对TMOD寄存器正确赋值; (2)确定定时初值:计算初值,直接将初值写入寄存器的TH0、TL0或TH1、TL1; 初值计算:设计数器的最大值为M,则置入的初值X为: 计数方式:X=M-计数值 定时方式:由(M-X)T=定时值,得X=M-定时值/T T为计数周期,是单片机的机器周期。 (模式0-M为213,模式1-M为216,模式2和3-M为28) (3)根据需要,对IE置初值,开放定时器中断; (4)启动定时/计数器,对TCON寄存器中的TR0或TR1置位,置位以后,计数器即按规定的工作模式和初值进行

13、计数或开始定时。,6.4 定时器/计数器的编程和应用,6.4.1 P1口外接的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=0000 0001B,(2)计算T0计数初值 设定时时间5ms(即5000s),设定时器T0的计数初值为X,假设晶振的频率为11.0592MHz,则定时时间为: 定时时间=(216X)12/晶振频率 则 500

14、0=(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,#include Char i=100;/*给变量i赋初值,定时0.5S,每次定时中断5MS,需要中断100次*/ void main( ) TMOD=0x01; /*设置定时器T0为方式1*/ TH0=0xee; /*向TH0写入

15、初值的高8位*/ TL0=0x00; /*向TL0写入初值的低8位*/ P1=0x00; /*P1口8只LED点亮*/ EA=1; /*总中断允许*/ ET0=1; /*定时器T0中断允许*/ TR0=1; /*启动定时器T0*/ while(1) ; /*无穷循环,等待定时中断*/ ,22,/*以下为定时器T0的中断服务程序*/ void T0_int(void) interrupt 1 TH0=0xee; /*给T0装入16位初值,计4608个数后,T0溢出 TL0=0x00; i-; /*循环次数减1*/ if(i=0) P1=P1; /*P1口按位取反*/ i=100; /*重新设置循

16、环次数*/ ,23,案例2 如图所示,P0口接8只发光二极管,编程使发光管轮流点亮,点亮时间为500ms,要求使用定时器T0来控制,设晶振为12MHz。,设计思想 我们可将P0口的初值设置为0xFE,对应于发光管D1亮,每隔500ms将P0的值循环左移一位,这一周期性的定时作业用T0来完成。,当时钟频率为12MHZ时,在定时器的4种工作方式中,方式1的最大溢出时间最长,但即使在方式1,最大的溢出时间也只有65.536ms,所以我们不能在每次中断时都执行上述移位操作。可以这样处理:将定时器T0的溢出时间设定为50ms,累计满10次中断正好500ms,才允许程序执行1次移位动作。,主函数 uchar count=0; /50ms定时中断次数计数器 void main(void) led=0xfe; TMOD=0x01; /T0工作于方式1 TH0=-50

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号