51单片机定时器的使用和详细讲解 特别是定时器2

合集下载

51单片机及其应用第六课定时器

51单片机及其应用第六课定时器
3、外部中断源有电平触发和边沿触发两种触发方式,这两种 触发方式所产生的中断过程有何不同?怎样设定?
4、定时/计数器工作于定时和计数方式时有何异同点?
5、定时/计数器的4种工作方式各有何特点?
6、要求定时/计数器的运行控制完全由TR1、TR0确定和完全 由、高低电平控制时,其初始化编程应作何处理?
7、当定时/计数器T0用作方式3时,定时/计数器T1可以工作 在何种方式下?如何控制T1的开启和关闭?
GATE:门控位。GATE=0时,只要用软件使TCON中的 TR0或TR1为1,就可以启动定时/计数器工作;GATA=1 时,要用软件使TR0或TR1为1,同时外部中断引脚或也为 高电平时,才能启动定时/计数器工作。即此时定时器的启 动条件,加上了或引脚为高电平这一条件。
为C 计/ T数:模定式时。/计数模式选择位。C/
T1的启动和停止及设置溢出标志。
T1引 脚
T0引 脚
机器周 期脉冲
TH1
TL1
TH0
TL0
内部总线
TF1 TR1 TF0 TR0 GATE C/T M1 M0 GATE C/T M1 M0
TCON
TMOD
外部中断相关位
T1方 式
T0方 式
二、定时/计数器的工作原理
加1计数器输入的计数脉冲有两个来源,一个是由 系统的时钟振荡器输出脉冲经12分频后送来;一个 是T0或T1引脚输入的外部脉冲源。每来一个脉冲计 数器加1,当加到计数器为全1时,再输入一个脉冲 就使计数器回零,且计数器的溢出使TCON中TF0 或TF1置1,向CPU发出中断请求(定时/计数器中 断允许时)。如果定时/计数器工作于定时模式,则 表示定时时间已到;如果工作于计数模式,则表示 计数值已满。

STC89C52单片机定时器2详细整理

STC89C52单片机定时器2详细整理

STC89C52单片机定时器2详细整理51单片机是我自学的第一款单片机,那时正好是过春节,想起那个寒假,外面下着大雪,有时还会传来一两声爆竹的炸响,而我一个人在房间里摆弄单片机开发板,反复调试程序的时光,真是难忘!我自认为这款单片机所有的资源中最不好搞清楚的就是定时器2,尤其是对于那些以前从来没有玩过单片机的新手。

定时器2是新增资源,也是51单片机定时器里面功能最强大的一个定时器。

所以掌握好定时器2还是非常有必要的。

以下是在我完全搞明白它的原理和用法的基础上整理的一篇小文章。

读起来,好像Datasheet一样!请原谅,希望没有辜负你的点击!定时器2是一个16位定时器/计数器,通过设置特殊功能寄存器T2CON中的C/T2位可将其设置为定时器或是计数器;通过设置T2CON中的工作模式选择位可将定时器2设置为三种工作模式,分别为捕获、自动重新装载(递增或是递减计数)和波特率发生器。

知识点一、定时器2的控制寄存器T2CON(可按位寻址)*D7位--TF2:定时器2溢出标志位。

用于请求中断(必须由软件清0)D6位--EXF2:定时器外部标志位。

当外部信号使能时,发生外部负跳变时置位请求中断(必须由软件清0)D5位--RCLK:接受时钟标志位。

默认情况下串行口中模式1和模式3的时钟是由定时器1的溢出率提供,若该位置位,则由定时器2提供。

D4位--TCLK:发送时钟标志位。

原理同上D3位--EXEN2:定时器2的外部使能标志位。

定时器2没有作为串行口时钟时,若将该位置位时,将允许T2EX的负跳变产生捕获或重装D2位--TR2:定时器2启动/停止控制位。

D1位--C/T2:定时器2的定时器/计数器选择位(在reg52头文件中定义为了C_T2,请注意,下面相同)D0位--CP/RL2:捕获/重装标志位。

知识点二定时器2的模式控制寄存器T2MOD(不可按位寻址)该寄存器在单片机的头文件reg2.h中可能没有被定义,自己定义吧!D1位—T2OE:定时器2输出使能位D0位—DCEN:向下计数使能位知识点三:定时器2的三种模式**1、捕获模式*在'CP/RL2=1'&&'TR2=1'时进入捕获模式。

51单片机定时器的使用

51单片机定时器的使用

151单片机定时器/计时器的使用步骤:1、 打开中断允许位:对IE 寄存器进行控制,IE 寄存器各位的信息如下图所示:EA : 为0时关所有中断;为1时开所有中断ET2:为0时关T2中断;为1时开T2中断,只有8032、8052、8752才有此中断 ES : 为0时关串口中断;为1时开串口中断 ET1:为0时关T1中断;为1时开T1中断 EX1:为0时关1时开 ET0:为0时关T0中断;为1时开T0中断 EX0:为0时关1时开2、 选择定时器/计时器的工作方式:定时器TMOD 格式CPU 在每个机器周期内对T0/T1检测一次,但只有在前一次检测为1和后一次检测为0时才会使计数器加1。

因此,计数器不是由外部时钟负边沿触发,而是在两次检测到负跳变存在时才进行计数的。

由于两次检测需要24个时钟脉冲,故T0/T1线上输入的0或1的持续时间不能少于一个机器周期。

通常,T0或T1输入线上的计数脉冲频率总小于100kHz 。

方式0:定时器/计时器按13位加1计数,这13位由TH 中的高8位和TL 中的低5位组成,其中TL 中的高3位弃之不用(与MCS-48兼容)。

13位计数器按加1计数器计数,计满为0时能自动向CPU 发出溢出中断请求,但要它再次计数,CPU 必须在其中断服务程序中为它重装初值。

方式1:16位加1计数器,由TH 和TL 组成,在方式1的工作情况和方式0的相同,只是计数器值是方式0的8倍。

2方式2:计数器被拆成一个8位寄存器TH 和一个8位计数器TL ,CPU 对它们初始化时必须送相同的定时初值。

当计数器启动后,TL 按8位加1计数,当它计满回零时,一方面向CPU 发送溢出中断请求,另一方面从TH 中重新获得初值并启动计数。

方式3:T0和T1工作方式不同,TH0和TL0按两个独立的8位计数器工作,T1只能按不需要中断的方式2工作。

在方式3下的TH0和TL0是有区别的:TL0可以设定为定时器/计时器或计数器模式工作,仍由TR0控制,并采用TF0作为溢出中断标志;TH0只能按定时器/计时器模式工作,它借用TR1和TF1来控制并存放溢出中断标志。

51单片机定时器 66页PPT文档

51单片机定时器 66页PPT文档
(2) 当GATE=1时, “与门”的输出信号K由INTx输入 电平和TRx位的状态一起决定(即此时K=TRx·INTx),
当且仅当TRx=1且INTx=1(高电平)时,计数启动; 否则,计数停止。
返回
27
5.3 定时器的工作方式——方式1
5.3.2 方式1
M1、M0=01,为16位的计数器,除位数外,其他与方式0相同。
缺点: 只有8位计数器,定时时间短、计数范 围小。其定时时间为: (28-初值)×振荡周期×12
若晶振频率为12MHz,则最长的定时时间为 (28-0)×(1/12)×12us=0.256ms
方式2工作过程图 (x=0, 1) 。
30
5.3 定时器的工作方式——方式3
5.3.4 方式3 只适用于定时器/计数器T0。T1不能工作在方式3。 如果将T1置为方式3,则相当于TR1=0,停止计数 (此时T1 可用来作串行口波特率产生器) 。
5.3.1 方式0 5.3.2 方式1 5.3.3 方式2 5.3.4 方式3
5.4 定时器的编程和应用
5
第5章 定时器/计数器及其应用
5.1 定时器的结构及工作原理
6
5.1 定时器的结构及工作原理
8051
内 部 结定 构时 框器 图
组成:两个16位的定时器T0和T1,以及他们的工作方式寄存器 TMOD和控制寄存器TCON等组成。内部通过总线与CPU相连。
当TL1的低5位计数溢出时,向TH1进位。而TH1计 数溢出时,则向中断标志位TF1进位(即硬件将TF1 置1),并请求中断。
可通过查询TF1是否置“1”或考察中断是否发生来判 定定时器T1的操作完成与否。
25
5.3 定时器的工作方式——方式0

51单片机定时器设置及应用

51单片机定时器设置及应用
TMOD=0x00 TH0=(8192-m)/32; TL0=(8192-m)%32;
m:根据实际定时所确定的计数次数
二、方式 1
TMOD =0x01 TH0=(65536-m)/256; TL0=(65536-m)%256;
m:根据实际定时所确定的计数次数
三、方式 2
TMOD=0x02 TH0=256-m; TL0=256-m; m:根据实际定时所确定的计数次数
TMOD=0x02; //设定 T0 的长度和状态:8 位自动重装定时 TH0=256-10; //10us 定时,备份计数器的初值 TL0=256-10; //10us 定时,计数器的初值 EA=1; //系统开放中断 ET0=1; //允许 T0 中断 TR0=1; //启动 T0 for(;;); // 等待中断产生 } void T0_ISR( ) interrupt 1 { P10=~P10; //P1.0 每 10us 取反一次 }
ET0:定时/计数器 T0 中断允许控制位 ET0=1,允许 T0 中断 ET0=0,禁止 T0 中断
51 单片机中断系统结构图
51 单片机定时/计数器 C 语言应用模板 /************ 设置 T0 为 16 位定时器,定时 50ms,系统采用 12MHz 晶振。 ************/ #include <reg52.h> void main( )
TF1、TF0:定时/计数器溢出中断标志位,由系统自动置位或清零,用户不能写入数据。 TF1=1,表示 T1 溢出 TF0=1,表示 T0 溢出
TR1:T1 的启动或停止控制位。 TR1=1,启动 T1;TR1=0,停止 T1;
TR0:T0 的启动或停止控制位 TR0=1,启动 T0;TR0=0,停止 T0;

2-MCS51单片机原理-定时器解析

2-MCS51单片机原理-定时器解析

MOV TL0,#9CH ;T0置初值
MOV TH0,#9CH
SETB TR1 ;启动T1
HERE: AJMP HERE
方式3的应用
T0工作在方式3时,TL0和TH0被分成两个独立的8位
定时器/计数器。其中,TL0可作为8位的定时器/计
数器;而TH0只能作为8位的定时器。
33
当T1用作串行口波特率发生器时,T0才设置为方式3。 此时,常把T1设置为方式2,用作波特率发生器。
31
外部信号由T1(P3.5) 脚输入,每发生一次负跳变计数 器加1,每输入100个脉冲,计数器产生溢出中断, 在中断服务程序中将P1.0取反一次。
T1工作在方式2的控制字为TMOD=60H。不使用T0 时,TMOD的低4位可任取,但不能使T0进入方式 3,这里取全0。
(2)计算T1的初值
X=28-100=156=9CH
18
定时器/计数器的编程和应用 4种工作方式中,方式0与方式1基本相同,由于方式0
是为兼容MCS-48而设,其计数初值计算复杂,在 实际应用中,一般不用方式0,而采用方式1。 方式1应用 例1 假设系统时钟频率采用6MHz,要在P1.0上输出 一个周期为2ms的方波,如图所示。
19
方波的周期用T0来确定,让T0每隔1ms计数溢出1次, 既T0每隔1ms产生一次中断,CPU相应中断后, 在中断服务程序中对P1.0取反。
(2) C/T*——计数器模式和定时器模式选择位 0:定时器模式。 1:计数器模式。
6
(3) GATE——门控位 0:以运行控制位TRX(X=0,1)来启动 定时器/计数器运行。 1: 用 外 中 断 引 脚 ( INT0* 或 INT1* ) 上 的 高电平来启动定时器/计数器运行。

第六章 MCS-51单片机内部定时器

第六章 MCS-51单片机内部定时器

6.3.1 模式0及应用
在这种模式下,16位寄存器只用了13位。 其中,TL0的高3位未用,TH0占8位。当 TL0的低5位溢出时,向TH0进位。当TH0 溢出时,向中断标志位TF0进位,并申请中 断。 因此,可通过查询TF0 是否置位或考 察中断是否发生来判断定时器/计数器0的 操作完成与否。
(2)计算1ms定时T0的初值:
机器周期为(1/fOSC)×12=[1/(12×106)]×12=1μs, 设T0的 计数初值为X,则 (213-X)×1×10-6=1×10-3ms
X=213-1×10-3/(1×10) -6 =8192-1000=7192D=1110000011000
高8位: E0H 低5位: 18H
fosc=12MHz, 采用查询方式。
解:方波周期 T=1/100Hz=0.01s=10ms 用T1定时5ms 计数初值 X为: X=216-12×5×103/12=60536=EC78H 程序如下:
MOV TMOD, #10H ;T1模式1,定时方式
SETB TR1 LOOP:MOV TH1,#0ECH
例:晶振为12MHZ ,则计数周期为
T=12/(12*106)Hz =1微秒
最短的定时 周期
计数器工作方式:
当定时器/计数器为计数工作方式时,通过
引脚T0和T1对外部信号计数,外部脉冲的下降
沿触发计数
在每个机器周期的
采样过程:
S5P2期间采样引脚
当输入脉冲信号从1到0的负跳变时,计数器就 自动加1。 由于检测一个由1到0的跳变需要两 个机器周期,所以 计数的最高频率为振荡频 率的1/24。为了确保给定电平在变化前至少被 采样一次,外部计数脉冲的高低电平均需保持 一个机器周期以上。(占空比没有限制)

51单片机的定时器_计数器的C51编程

51单片机的定时器_计数器的C51编程

51单片机的定时器_计数器的C51编程相关知识点:1、单片机的定时器/计数器,实质是按一定时间间隔、自动在系统后台进行计数的。

2、当被设定工作在定时器方式时,自动计数的间隔是机器周期(12个晶振振荡周期),即计数频率是晶振振荡频率的1/12;3、当定时器被启动时,系统自动在后台,从初始值开始进行计数,计数到某个终点值时(方式1时是65535),产生溢出中断,自动去运行定时中断服务程序;注意,整个计数、溢出后去执行中断服务程序,都是单片机系统在后台自动完成的,不需要人工干预!4、定时器的定时时间,应该是(终点值-初始值)x机器周期。

对于工作在方式1和12MHz时钟的单片机,最大的计时时间是(65535-0)x1uS=65.535ms。

这个时间也是一般的51单片机定时器能够定时的最大定时时间,如果需要更长的定时时间,则一般可累加多定时几次得到,比如需要1秒的定时时间,则可让系统定时50ms,循环20次定时就可以得到1s的定时时间。

5、定时器定时得到的时间,由于是系统后台自动进行计数得到的,不受主程序中运行其他程序的影响,所以相当精确;6、使用定时器,必须先用TMOD寄存器设定T0/T1的工作方式,一般设定在方式1的情况比较多,所以可以这样设定:TMOD=0x01(仅设T0为方式1,即16位)、TMOD=0x10(仅设T1为方式1,即16位)、TMOD=0x11(设T0和T1为方式1,即都为16位)。

7、使用定时器,必须根据需要的定时时间,装载相应的初始值,而且在中断服务程序中,很多情况下得重新装载初始值,否则系统会从零开始计数而引起定时失败;8、要使用定时器前,还必须打开总中断和相应的定时中断,并启动之:EA=1(开总中断)、ET0=1(开定时器0中断)、TR0=1(启动定时器0)、ET1=1(开定时器1中断)、TR1=1(启动定时器1);9、注意中断服务程序尽可能短小精干,不要让它完成太多任务,尤其尽量避免出现长延时,以提高系统对其他事件的响应灵敏度.//定时器基本例程-1(未使用定时器,一个灯每隔500ms亮灭一次)//这是个特意安排的例程,以便与下面的例程2进行对比#include <reg52.h>sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮while(1){led=!led;delay_ms(500);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------//定时器基本例程-2(使用定时器,一个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮TMOD=0x01; //设定定时器0为工作方式1TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1){delay_ms(8000);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000 TL0=(65536-50000)%256; //num++;if(num==10){num=0;led=!led;}}////定时器基本例程-3//(使用定时器T1,单片机整个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led_port=0xff; //上电初始化,所有led灯不亮TMOD=0x10; //设定定时器1为工作方式1(16位方式)TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num++; //计数if(num==10) //计够10次,时间就是10x50ms=500ms{num=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-4//(同时使用定时器T0和定时器T1,单片机某个口的灯和某个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num_0,num_1;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮led_port=0xff; //上电初始化,该口所有led灯不亮TMOD=0x11; //设定定时器0和定时器1都为工作方式1(16位方式)TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //num_0++; //计数if(num_0==10) //计够10次,时间就是10x50ms=500ms{num_0=0; //清零,以便进行下一次500ms的10次计数led=!led; //led灯亮灭状态翻转}}//-------------------------------------------------void led_all_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num_1++; //计数if(num_1==10) //计够10次,时间就是10x50ms=500ms{num_1=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-5//设定定时器T0工作在方式1的计数应用状态,//单片机T0口(P3.4)接一个按键充当外部脉冲源,//系统对进来的脉冲(每按一次键得一脉冲)进行计数,//计数的结果用接在单片机P0口的8个LED灯表示出来//(大家也可以改成用1602LCD来显示,这样更直观)//广西民大物电学院李映超2010年4月14日#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中//=================================================void main(){TMOD=0x05; //设定定时器0为工作方式1、计数器TH0=0; //清零TL0=250; //TR0=1; //启动定时器0进行计数while(1){led_port=TL0; //将计数结果送去显示(用8个LED灯显示),//这里仅显示16位计数器的低8位}}定时器0仍旧工作在计数器状态,增加定时器1工作在定时状态,得到1s的定时时间,定时时间到后,将定时器0计数得到的脉冲数去显示,则这个脉冲数就是所输入的外部信号的频率,从而构成一个简单而准确的频率计!!不过,这个简单的“频率计”能够计量的信号频率(脉冲数),受单片机中断响应速度的影响,一般只能达到单片机系统时钟晶振的1/24,所以要能够测量更高的频率,必须使用前置分频器,对更高频率的待测输入信号进行预分频!。

51单片机定时器的使用和详细讲解__特别是定时器2 PPT

51单片机定时器的使用和详细讲解__特别是定时器2 PPT

T1
T0
00:模式0
方式 01:模式1 方式
选择
10:模式2 11:模式3
选择
图8-2 模式寄存器组成
3.控制寄存器(TCON)
TCON高4位用于控制定时器0、1的运行;低4位用于控 制外部中断,与定时器无关。
定时器0、1运行控 制位TR0(TR1): TR0(TR1)=1 启动 TR0(TR1)=0 停止
T0加法计数器的高8位和低8位分别用TH0、TL0表 示
T1加法计数器的高8位和低8位分别用TH1、TL1 表示
高8位和第8为可分别单独使用
当定时器工作时,加法计数器对内部机器周期脉 冲Tcy计数。
Tcy
2.模式寄存器(TMOD)
TMOD用来选择定时器0、1的工作模式,低4位 用于定时器0,高4位用于定时器1,其组成如图 8-2所示。
专用硬件电路定时:可实现精确的定时和计数,但参数 调节不便。
可编程定时器/计数器:不占用CPU时间,能与CPU并行 工作,实现精确的定时和计数,又可以通过编程设置其 工作方式和其它参数,因此使用方便。
定时器的基本工作原理是:利用计数器对固定周 期的脉冲计数,通过寄存器的溢出来触发中断。
具体应用步骤:
51单片机定时器的使用和详细讲解__特别 是定时器2
章节概述 很棒
8.1 概述 8.2 定时器T0和T1的结构 8.3 定时器工作模式 8.4 定时器T2
8.1 概述
定时器是单片机的重要功能模块之一,在检测、 控制领域有广泛应用。
定时器常用作定时时钟,以实现定时检测、定 时响应、定时控制,并且可用于产生ms宽的 脉冲信号,驱动步进电机
加法计数器对机器周期脉冲Tcy计数,每个机器周 期TL0加1。

51定时器介绍

51定时器介绍

51单片机定时、计数器介绍一采用11.0592M 的晶振,每接收一个输入脉冲的时间约为1.085μs。

采用12M 的晶振,每接收一个输入脉冲的时间为1μs。

STC89C52 内有三个定时/ 计数器, 分别为T0、T1 和T2。

其中T0、T1 工作方式一样,T2 的工作方式稍有区别。

TMOD(见表1)、TCON(见表3)与定时器T0、定时器T1 间通过内部总线及逻辑电路连接,TMOD 用于设置定时器的工作方式,TCON 用于控制定时器的启动、停止,标志定时器的溢出和中断情况。

当设置了定时器的工作方式并启动定时器工作后,定时器就按被设定的工作方式独立工作,不再占用CPU 的操作时间,只有在计数器计满溢出时才可能中断CPU 当前的操作。

表1 TMOD寄存器表中各位(从左至右为从高位到低位)含义如下。

TMOD 的低4 位为定时器0 的方式字段,高4位为定时器1 的方式字段,它们的含义完全相同。

M1 和M0 :工作方式控制位,其定义如表2 所示( 其中i=0,1)。

表2 定时器工作方式控制位:功能选择位。

=0 时,设置为定时器工作方式;=1 时,设置为计数器工作方式。

GAte :门控位。

当GATE=0 时,软件控制位TR0 或TR1 置1 即可启动定时器。

TR0 或TR1 置0 即可停止定时器工作;当GATE=1 时,软件控制位TR0 或TR1 需置1,同时还需(P3.2) 或(P3.3) 为高电平方可启动定时器,即允许外部中断启动、定时器。

值得注意的是TMOD 寄存器不能位寻址,只能用字节指令设置高4 位定义定时器1 上的工作方式或低4 位定义定时器0 的工作方式。

而且在复位时,TMOD 所有位均置0。

表3 TCON寄存器表中各位(从左至右为从高位到低位)含义如下。

(1)TFl :定时器1 溢出标志位。

当定时器1 计满数产生溢出时,由硬件自动置TF1=1,向CPU发出定时器1 的中断请求,在中断允许时响应。

51单片机定时与计数的工作原理

51单片机定时与计数的工作原理

51单片机定时与计数的工作原理一、概述51单片机是一种广泛应用于嵌入式系统中的微处理器,具有高性价比、易学易用等特点。

其中,定时与计数功能是其常用的功能之一,通过定时与计数可以实现许多实际应用,如脉冲计数、PWM输出等。

本文将详细介绍51单片机定时与计数的工作原理。

二、定时器和计数器在介绍51单片机的定时与计数功能之前,我们需要先了解两个重要的概念:定时器和计数器。

1. 定时器定时器是一种能够按照设定时间进行计时的电路。

其基本原理是利用振荡电路产生一个稳定的时间基准信号,再通过分频电路将其分频得到所需的时间间隔,并通过计数器进行累加,从而实现精确的时间控制。

2. 计数器计数器是一种能够对输入脉冲进行计数并输出相应结果的电路。

其基本原理是利用触发电路对输入脉冲进行检测,并通过累加器进行累加,从而得到输入脉冲数量。

三、51单片机中的定时与计数功能在51单片机中,有两个独立的16位定时器/计数器,分别为Timer0和Timer1。

它们可以分别用作定时器或计数器,并且可以通过软件配置其工作模式。

1. Timer0Timer0是一个8位定时器/计数器,它的输入时钟源可以来自外部引脚或系统时钟。

在定时模式下,其最大计时时间为2^8×12/11MHz≈29μs,在计数模式下,其最大计数值为2^8=256。

Timer0的工作模式可以通过TCON寄存器的TF0、TR0、TMOD寄存器的M0位和GATE0位进行配置。

其中,TF0表示定时/计数溢出标志,TR0表示定时/计数启动控制位,M0位表示Timer0的工作模式(00表示13位定时/计数、01表示16位定时/计数、10表示8位自动重装载定时、11保留),GATE0表示是否使用外部引脚作为启动控制信号。

2. Timer1Timer1是一个16位定时器/计数器,它的输入时钟源可以来自外部引脚或系统时钟。

在定时模式下,其最大计时时间为2^16×12/11MHz≈5.9ms,在计数模式下,其最大计数值为2^16=65536。

51单片机定时器工作方式

51单片机定时器工作方式

51单片机定时器工作方式
51单片机的定时器有两种工作方式:。

1.定时计数器模式。

单片机定时器通过定时计数器模式实现定时功能,定时器会计数,当
计数到预设值时,定时器就会触发中断或者标志位,从而实现定时功能。

单片机的定时器可以通过外部晶振或者内部时钟源提供时钟信号进行计数,计数值可以根据不同的定时需求进行设置,比如毫秒级,微秒级等精度的
定时。

2.脉冲捕获模式。

单片机定时器通过脉冲捕获模式实现测量外部事件的时间,脉冲捕获
模式可以捕获外部脉冲的高低电平信号,并将捕获到的数值存入定时器计
数器中,从而实现对脉冲的测量功能。

脉冲捕获模式主要应用于测量高速
事件的脉冲信号,比如汽车发动机的转速测量,超声波传感器的距离测量等。

51单片机定时器设置

51单片机定时器设置

51单片机定时器设置入门(STC89C52RC)STC单片机定时器设置STC单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。

要点有以下几个:1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。

理解是最好的记忆方法。

好的教材一定会给出所有英文缩写的原形。

2. 尽量用形像的方法记忆比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。

其格式为:其中低四位定义定时器/计数器C/T0,高四位定义定时器/计数器C/T1,各位的说明:GA TE——门控制。

GA TE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。

当INT0引脚为高电平时TR0置位,启动定时器T0;当INT1引脚为高电平时TR1置位,启动定时器T1。

GA TE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。

C/T——功能选择位C/T=0时为定时功能,C/T=1时为计数功能。

置位时选择计数功能,清零时选择定时功能。

M0、M1——方式选择功能由于有2位,因此有4种工作方式:M1M0 工作方式计数器模式TMOD(设置定时器模式)0 0 方式0 13位计数器TMOD=0x000 1 方式1 16位计数器TMOD=0x011 0 方式2 自动重装8位计数器TMOD=0x021 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器TMOD=0x03单片机定时器0设置为工作方式1为TMOD=0x01这里我们一定要知道,TMOD的T是TIMER/COUNTER的意思,MOD是MODE的意思。

至于每位上的功能,你只要记住图表,并知道每个英文缩写的原型就可以了。

单片机定时器的使用

单片机定时器的使用

单片机定时器的使用一、单片机定时器的基本原理定时器通常由一个时钟源提供脉冲信号来计数,这个时钟源可以是外部时钟源、内部时钟源或者其他外设提供的时钟源。

定时器以一个指定的时钟周期开始计数,并在达到预设的计数值时产生一个中断信号或触发一个相关事件。

二、单片机定时器的使用方法1.定时器的预分频设置在使用单片机的定时器之前,我们需要根据具体的应用需求设置定时器的预分频值。

预分频值的设置将影响定时器的计数速度。

常用的预分频值有1、2、4、8和16等,这意味着在一个计数周期内,定时器模块将接收几个时钟脉冲。

通过设置不同的预分频值,我们可以调整定时器的计数速度,从而实现不同的时间精度。

2.定时器计数值的设定在设置定时器的计数值之前,我们需要确定定时器的计数频率和所需的定时时间。

计数频率是由定时器的时钟源和预分频值决定的,而所需的定时时间是根据具体应用而确定的。

定时器计数值的设定通常是通过写入特定的寄存器来实现的。

根据单片机型号的不同,定时器计数值的位数可能有所不同。

一般来说,定时器的计数值越大,可以计时的时间就越长。

3.中断的使能与处理在使用定时器进行定时操作时,通常会设置一个中断服务程序,在定时器达到预设的计数值时触发中断。

中断服务程序中可以添加一些需要在定时器到达指定时间时执行的代码。

为了使中断能够正常工作,我们需要合理地设置中断向量、ISR(Interrupt Service Routine)等。

同时,我们也需要在程序的其他部分进行相关的中断控制设置,如打开或关闭中断、配置中断优先级等。

三、单片机定时器的常见应用案例1.时钟显示器时钟显示器是单片机定时器的一个常见应用案例,通过使用定时器和LED数码管等外设,可以实现一个精确计时的时钟显示器。

定时器以一定的频率计数,并在计数到一定值时触发中断,中断服务程序中可以更新数码管的显示值。

2.交通信号灯交通信号灯是城市道路交通管理中常用的设备,定时器可以用于控制交通信号灯的时序。

MCS-51单片机计数器定时器详解

MCS-51单片机计数器定时器详解

MCS-51单片机计数器定时器详解80C51单片机内部设有两个16位的可编程定时器/计数器。

可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。

在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。

:从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。

其访问地址依次为8AH-8DH。

每个寄存器均可单独访问。

这些寄存器是用于存放定时或计数初值的。

此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。

这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。

TMOD主要是用于选定定时器的工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。

当定时器工作在计数方式时,外部事件通过引脚T0(P3.4)和T1(P3.5)输入。

定时计数器的原理:16位的定时器/计数器实质上就是一个加1计数器,其控制电路受软件控制、切换。

当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。

显然,定时器的定时时间与系统的振荡频率有关。

因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。

如果晶振为12MHz,则计数周期为:T=1/(12×106)Hz×1/12=1μs这是最短的定时周期。

若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长度(如8位、13位、16位等)。

当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。

计数器在每个机器周期的S5P2期间采样引脚输入电平。

若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。

51单片机的定时器_计数器的C51编程

51单片机的定时器_计数器的C51编程

51单片机的定时器_计数器的C51编程相关知识点:1、单片机的定时器/计数器,实质是按一定时间间隔、自动在系统后台进行计数的。

2、当被设定工作在定时器方式时,自动计数的间隔是机器周期(12个晶振振荡周期),即计数频率是晶振振荡频率的1/12;3、当定时器被启动时,系统自动在后台,从初始值开始进行计数,计数到某个终点值时(方式1时是65535),产生溢出中断,自动去运行定时中断服务程序;注意,整个计数、溢出后去执行中断服务程序,都是单片机系统在后台自动完成的,不需要人工干预!4、定时器的定时时间,应该是(终点值-初始值)x机器周期。

对于工作在方式1和12MHz时钟的单片机,最大的计时时间是(65535-0)x1uS=65.535ms。

这个时间也是一般的51单片机定时器能够定时的最大定时时间,如果需要更长的定时时间,则一般可累加多定时几次得到,比如需要1秒的定时时间,则可让系统定时50ms,循环20次定时就可以得到1s的定时时间。

5、定时器定时得到的时间,由于是系统后台自动进行计数得到的,不受主程序中运行其他程序的影响,所以相当精确;6、使用定时器,必须先用TMOD寄存器设定T0/T1的工作方式,一般设定在方式1的情况比较多,所以可以这样设定:TMOD=0x01(仅设T0为方式1,即16位)、TMOD=0x10(仅设T1为方式1,即16位)、TMOD=0x11(设T0和T1为方式1,即都为16位)。

7、使用定时器,必须根据需要的定时时间,装载相应的初始值,而且在中断服务程序中,很多情况下得重新装载初始值,否则系统会从零开始计数而引起定时失败;8、要使用定时器前,还必须打开总中断和相应的定时中断,并启动之:EA=1(开总中断)、ET0=1(开定时器0中断)、TR0=1(启动定时器0)、ET1=1(开定时器1中断)、TR1=1(启动定时器1);9、注意中断服务程序尽可能短小精干,不要让它完成太多任务,尤其尽量避免出现长延时,以提高系统对其他事件的响应灵敏度.//定时器基本例程-1(未使用定时器,一个灯每隔500ms亮灭一次)//这是个特意安排的例程,以便与下面的例程2进行对比#include <reg52.h>sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮while(1){led=!led;delay_ms(500);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------//定时器基本例程-2(使用定时器,一个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮TMOD=0x01; //设定定时器0为工作方式1TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1){delay_ms(8000);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000 TL0=(65536-50000)%256; //num++;if(num==10){num=0;led=!led;}}////定时器基本例程-3//(使用定时器T1,单片机整个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led_port=0xff; //上电初始化,所有led灯不亮TMOD=0x10; //设定定时器1为工作方式1(16位方式)TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num++; //计数if(num==10) //计够10次,时间就是10x50ms=500ms{num=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-4//(同时使用定时器T0和定时器T1,单片机某个口的灯和某个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num_0,num_1;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮led_port=0xff; //上电初始化,该口所有led灯不亮TMOD=0x11; //设定定时器0和定时器1都为工作方式1(16位方式)TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //num_0++; //计数if(num_0==10) //计够10次,时间就是10x50ms=500ms{num_0=0; //清零,以便进行下一次500ms的10次计数led=!led; //led灯亮灭状态翻转}}//-------------------------------------------------void led_all_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num_1++; //计数if(num_1==10) //计够10次,时间就是10x50ms=500ms{num_1=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-5//设定定时器T0工作在方式1的计数应用状态,//单片机T0口(P3.4)接一个按键充当外部脉冲源,//系统对进来的脉冲(每按一次键得一脉冲)进行计数,//计数的结果用接在单片机P0口的8个LED灯表示出来//(大家也可以改成用1602LCD来显示,这样更直观)//广西民大物电学院李映超2010年4月14日#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中//=================================================void main(){TMOD=0x05; //设定定时器0为工作方式1、计数器TH0=0; //清零TL0=250; //TR0=1; //启动定时器0进行计数while(1){led_port=TL0; //将计数结果送去显示(用8个LED灯显示),//这里仅显示16位计数器的低8位}}定时器0仍旧工作在计数器状态,增加定时器1工作在定时状态,得到1s的定时时间,定时时间到后,将定时器0计数得到的脉冲数去显示,则这个脉冲数就是所输入的外部信号的频率,从而构成一个简单而准确的频率计!!不过,这个简单的“频率计”能够计量的信号频率(脉冲数),受单片机中断响应速度的影响,一般只能达到单片机系统时钟晶振的1/24,所以要能够测量更高的频率,必须使用前置分频器,对更高频率的待测输入信号进行预分频!。

51单片机定时器详细全解.上

51单片机定时器详细全解.上

51单片机定时器详细全解.上看了很多几本单片机的书,对51定时器的认识又有了一些新的变化。

开局一张图(一个简单的单片机程序),其实文章也是来解释这个代码的写法。

在此,后面也会对STC官方的库,做详细的解读和使用我们使用串口,设置它的寄存器一共4种模式,八位的可变2位,4个状态B6位为0的时候,B7用于帧错误检测,当检测到一个无效的停止位的时候,UART设置它,软件清0.这个方式0,是使用一个专用的SBUF发送的TI标志位发送完以后,自动的变1,相对于有了一个中断。

然后中断系统处理,处理完以后就要把状态变回去。

RI也是,一发一收接收的一个函数这里是注意的编程要点这里要开启UART的中断,先开启大中断,接着开启串口的中断REN是收发功能的开关1,2,3都是异步通信,0是移位寄存器接下来配置定时器只有两个寄存器,灵活使用要TCON是这样的TR1,相对于是使能位关于定时器不得不说,而且最近看了几本相对古老的书,真的很清晰,现在的书比喻一堆也不知道想说什么。

对51来说,其实是只有4种方式:1、51单片机计数器的脉冲输入脚。

主要的脉冲输入脚有Px,y,也指对应T0的P3.4和对应T1的P3.5,主要用来检测片外来的脉冲。

而引脚18和19则对应着晶振的输入脉冲,脉冲的频率和周期为:F = f/12 = 11.0592M/12 = 0.9216MHZ T = 1/F = 1.085us2、定时器有两种工作模式,分别为计数模式和定时模式。

对Px,y 的输入脉冲进行计数为计数模式。

定时模式,则是对MCU的主时钟经过12分频后计数。

因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。

所谓的定时器就是恒定的数数。

3、51计数器的计数值存放于特殊功能寄存器中。

T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)其实就是容器,存放脉冲数的这是我们单片机的4种定时器模式4、TLx与THx之间的搭配关系以下的进制,就是向前进位的意思。

单片机定时器及中断的使用(含原创完整精讲例程)

单片机定时器及中断的使用(含原创完整精讲例程)

单片机定时器及中断的使用(含原创完整精讲例程)STC89C52定时器/计数器的使用一、寄存器 1. 数据寄存器TLx[1]8AH8BH不可位寻址复位清0 8位寄存器保存计数值的低8位。

THx8CH8DH不可位寻址复位清08位寄存器保存计数值的高8位。

工作原理计数时从TL开始加1计数计满后想TH进位直至TH溢出置TF标志然后申请中断CPU进行中断处理。

2. 模式选择寄存器TMOD89H不可位寻址复位清0高4位用于控制定时器1低4位用于控制定时器0GATE—门控制位=0TC[2]的启停仅由寄存器TCON中的TRx控制=1TC的启停由外部中断引脚的电平状态和TCON中的TRx共同控制。

C/T—模式选择位=0定时器对内部机器周期[3]计数=1计数器对外部输入计数由Tx[4]引脚输入注意计数模式下从采样到计数值更新需要2个机器周期共24个时钟周期因此时钟频率为f MHz时最高计数频率为1/2f MHz。

M1M0—工作方式选择位=00方式013位TH全用TL低5位=01方式116位TH TL全用=10方式28 位自动重装载定时器当溢出时将 TH 存放的值自动重装入 TL=11方式3仅适用于T0。

定时器 0 此时作为双 8 位TC。

TL0作为一个 8 位TC通过标准定时器 0 的控制位控制。

TH0 仅作为一个 8 位定时器由定时器 1 的控制位控制。

T1停止计数。

注意在方式2中计数溢出后CPU会自动将THx中的值装入TLx。

因此在定时器启动前在THx和TLx中装入的初值必须是相同的以保证计数的准确性。

3. 控制寄存器TCON88H可位寻址复位清0位符号TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0位地址8FH 8EH 8DH 8CH 8BH 8AH 89H 88H高位在前。

后4位用于外部中断。

TFx—Tx溢出标志位Tx计数溢出时硬件置1并申请中断。

进入中断服务子程序后硬件自动清零。

如果不使用定时器中断而采用软件查询的方法则需要软件清零。

51单片机定时器的使用和详细讲解 特别是定时器2

51单片机定时器的使用和详细讲解 特别是定时器2

定时器初始化程序 MOV TL0, #0X00 MOV TH0,#0X06 MOV TMOD,#0X00 SETB ET0 SETB TR0
定时器中断服务程序 PUSH …. …… CPL P0_0 …… POP …
18
2.工作模式1
T0M(T1M)=01时定时器设定为工作模式1,此时 定时器0(定时器1)被设置为16位定时器。此时 TH0、TL0都是8位加法计数器。其他与工作方式0 相同。
14
定时器的定时时间
T (8192- X) Tcy
计数初始值X
X 2n - 定时时间 Tcy
(此处n 13)
最大定时能力:
Tmax 8192Tcy
15
模式0的结构图如图8-4所示。13计位数加器法
门控位
GATE=0 定时器不受
控于外部信号;仅打 图8-4 方式0结构图
//初值
TL1=0xA0;
IEN0=0x08; //允许T1中断
IP|=0x08;
IPH|=0x08;
//TF1中断为高级中断
TR1=1
EA=1;
// 总开中断
while(1);
//死循环, 查询等待TF1置位,产生方波
}
28
程序清单如下(中断服务程序片段):
{
TF1=0;
TH1=0x15;
TL1=0xA0;
定时器0、1溢出标志
TF0(TF1):
图8-3 控制寄存器组成 溢出时该位由硬件自
动置1,响应中断后,
由硬件自动清0
10
4.中断使能寄存器(IEN0)
IEN0中的ET0(ET1)位控制定时器0、1是否产生中断 请求信号。为0时不产生中断请求信号,为1时允许产 生中断请求信号。其结构如图8-4所示。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
28
程序清单如下(中断服务程序片段):
{
TF1=0;
TH1=0x15; TL1=0xA0; //重填初值
If (count!=0)
count--; else {count=10;P1_0=!P1_0;} }
29
8.4 定时器T2 8.4.1 概述 定时器2 是一个16 位通用计数器,其具有 两种操作模式:16 位自动重载模式和16 位 捕获模式。 如果预分频功能被禁止,定时器2工作时, 16 位通用加法计数器以12分频的周期脉冲 计数,每个周期16位通用加法计数器加1或 减1。
定时器的讲解和使用 有对定时器2的详细讲解
第八章 定时器
1
章节概述 很棒


8.1 8.2 8.3 8.4
概述 定时器T0和T1的结构 定时器工作模式 定时器T2
2
8.1 概述



定时器是单片机的重要功能模块之一,在检测、 控制领域有广泛应用。 定时器常用作定时时钟,以实现定时检测、定 时响应、定时控制,并且可用于产生ms宽的 脉冲信号,驱动步进电机 定时和计数功能最终都是通过计数实现的,若 计数的事件源是周期固定的脉冲,则可以实现 定时功能,否则只能实现计数功能。因此可以 将定时和计数功能由一个部件实现。

14

定时器的定时时间
T (8192 - X) Tcy

计数初始值X
定时时间 X 2 Tcy
n
(此处n 13)

最大定时能力:
Tmax 8192 Tcy
15
模式0的结构图如图8-4所示。
13位加法 计数器
门控位
GATE=0 定时器不受 控于外部信号;仅打 开与门,是定时器仅 有TR位控制; GATE=1 定时器受控 于外部信号,此时要 求TR=1;
30

定时器2由T2MOD寄存器、T2CON存器、功能 存器TH2、TL2、RC2H、RC2L等电路构成。


TH2、TL2构成16位通用计数器。 RC2H、RC2L作为16位寄存器,在自动重载模式 中RC2H、RC2L作为16位通用计数器的16位初值 寄存器 在捕捉模式中,当引脚T2EX上出现下降沿跳变 时,把TH2、TL2的当前值捕捉到RC2H、RC2L中 去。
17
定时时间 计数初值 2 Tcy
n
0.6 *10 6 X 213 8192 8000 192 0 xC0 75
高8位TH 0 00000110 0 x06 低5位TL 0 00000000 0 x00

T0从192开始计数,直到 超过8192即溢出,置 TF0=1,产生中断信号




TL0为8位加法计数器, TH0为存放该8位加法计数器初值的寄存器。 TH0、TL0的初值都由程序预置。

在工作模式2中,定时器的定时时间由下式确定: T (256 - X) Tcy
只有T0可工 作于此模式
21
模式2的结构图如图8-6所示。
8位加法 计数器
图8-6 方式2结构图
初值寄 存器

T (65536 - X) Tcy

计数初始值
定时时间 计数初值 2 Tcy
n
(此处n 16)
19
模式1的结构图如图8-5所示。
16位加法 计数器
图8-5 方式1结构图
20
3.工作模式2 当T0M(T1M)=10时定时器设定为工作模式2,此 时定时器0(定时器1)被设置为可自动重载的8 位定时器。

Tcy
8

2.模式寄存器(TMOD) TMOD用来选择定时器0、1的工作模式,低4位 用于定时器0,高4位用于定时器1,其组成如图 8-2所示。
T1 T0
00:模式0
方式 选择 01:模式1 10:模式2 11:模式3 方式 选择
9
图8-2 模式寄存器组成

3.控制寄存器(TCON)

TCON高4位用于控制定时器0、1的运行;低4位用于控 制外部中断,与定时器无关。


让P1.0每45ms取反一次即可实现。定时器的单次定时时间 不可能达到45ms,如果设定16位的工作模式1,最大定时时 间也才为4.9152ms。 可让定时器多次定时产生4.5ms的定时时间,如让T1工作在 方式1,单次定时时间为4.5ms,那么T1中断10次就是45ms 的时间。
25


(1)确定定时常数
31


8.4.2 定时器T2控制寄存器
1.模式寄存器T2MOD 寄存器T2MOD 用来选择定时器2 的工作模式。其 组成如图8-8所示。
32
启动边沿 选择位
捕获模式/重载模式 的边沿选择位
预分频使能位
外部启动 使能位
计数器 递增/递 减使能位
图8-8 T2MOD各位功能
33
2.控制寄存器T2CON 寄存器T2CON 控制定时器2 的工作模式,其各位功 能如图8-9所示。
定时器初始化程序 MOV TL0, #0X00 MOV TH0,#0X06 MOV TMOD,#0X00 SETB ET0 SETB TR0

定时器中断服务程序 PUSH …. …… CPL P0_0 …… POP …
18
2.工作模式1 T0M(T1M)=01时定时器设定为工作模式1,此时 定时器0(定时器1)被设置为16位定时器。此时 TH0、TL0都是8位加法计数器。其他与工作方式0 相同。 定时器的定时时间
22


4.工作模式3 当T0M(T1M)=11时定时器设定为工作模式3,只有定 时器0可以工作在工作模式3下。如把定时器1设置为工 作模式3,则定时器1停止工作。 TL0、TH0成为两个独立的8位加法计数器。它的工作情 况与模式0、模式1类似,差别在于定时范围为:
T (256 - X) Tcy
外,还要注意将时间常数重新送入T1中,为下一次
产生中断作准备。
27
程序清单如下(主程序):
#include <c8051f020.h> sbit P1_0 = P1^0; int count=10; //10次T1中断为45ms void main( void ) { 注:寄存器 所在页的选 TMOD=0x10; //T1方式1 择没有列出 P1_0=0; TH1=0x15; //初值 TL1=0xA0; IEN0=0x08; //允许T1中断 IP|=0x08; IPH|=0x08; //TF1中断为高级中断 TR1=1 EA=1; // 总开中断 while(1); //死循环, 查询等待TF1置位,产生程序 包括T1初始化和中断系统初始化,主要是对IP、IE、 TCON、TMOD的相应位进行正确的设置,并将时间常
数送入T1。一般将初始化操作放在主程序中完成,
当程序规模较大时,应编写单独的初始化程序,以 利于程序的模块化设计。

(3)中断服务程序 中断服务程序除了完成要求的方波产生这一工作之
图8-4 方式0结构图
16
例题:生成周期为1.2 ms的等宽正方波。机器晶
振26.67MHz。使用T0以方式0工作,由P0.0输出
1.2 ms


机器周期:37.5ns。计数周期Tcy是机器脉冲 的2分频,因此Tcy=75ns; 定时时间0.6ms 。 以0.6 ms为周期在P1.0端交替输出高低电平。
6
8.2 定时器T0和T1的结构
定时器T0和T1的结构如图8-1所示。
核心寄存 器——16位 加法计数器
定时器模 式寄存器
图8-1 定时器T0和T1结构图
7
1.16位加法计数器
16位加法计数器是定时器的核心,图8-1中用寄存 器TH0、TL0及TH1、TL1表示。 T0加法计数器的高8位和低8位分别用TH0、TL0表 示 T1加法计数器的高8位和低8位分别用TH1、TL1 表示 高8位和第8为可分别单独使用 当定时器工作时,加法计数器对内部机器周期脉 冲Tcy计数。
3

实现定时和计数的方法一般有:软件定时、专用 硬件电路和可编程定时器/计数器三种方法。

软件定时:执行一个循环程序进行时间延迟。定时准确,不
需要外加硬件电路,但增加CPU开销。

专用硬件电路定时:可实现精确的定时和计数,但参数
调节不便。

可编程定时器/计数器:不占用CPU时间,能与CPU并行工
作,实现精确的定时和计数,又可以通过编程设置其工
图8-3 中断使能寄存器组成
定时器0中 断使能位 定时器0中 断使能位
11
8.3 定时器工作模式


定时器0 和定时器1 完全兼容,均可设定为四 种不同的工作模式,如表8-1 所示。寄存器 TMOD 的位域TxM选择定时器的工作模式。 两个定时器在模式0、1 和2 时独立工作;在 模式3 时具有特定功能。

上溢/下溢标志位
外部事件标志位 展示T2EX引脚状态
捕获/重载模式选择位 0:重载;1:捕获
外部使能控制位 1:使能T2EX引脚控制; 0:禁止 T2EX引脚控制;
启动/停止控制位
图8-9 T2CON各位功能
34
8.4.3 定时器T2工作模式
1.自动重载模式 控制寄存器T2CON 中的 CP / R L 2 置“0” 时,定时 器2被选择为自动重载模式。 该模式下,定时器2计数至溢出时,将寄存器RC2H、 RC2L中的16 位初始值重新装入定时器的TH2、TL2 寄存器中,开始新一轮计数循环。 并置位寄存器T2CON 的TF2 位表示计数溢出,从 而向CPU 发送中断请求信号。 溢出标志TF2 必须由程序清零。根据控制寄存器 T2MOD 中DCEN 控制位的设置,自动重载模式可进 一步分为两种类型。
相关文档
最新文档