网站排名提升软件,用织梦做外文网站,wordpress百万级,临沧网站建设c3sales1.定时器介绍
51单片机通常有两个定时器#xff1a;定时器 0/1#xff0c;好一点的可能有定时器3。
在介绍定时器之前我们先科普下几个知识#xff1a; 1#xff0c;CPU 时序的有关知识 ①振荡周期#xff1a;为单片机提供定时信号的振荡源的周期#xff08;晶振周期或…1.定时器介绍
51单片机通常有两个定时器定时器 0/1好一点的可能有定时器3。
在介绍定时器之前我们先科普下几个知识 1CPU 时序的有关知识 ①振荡周期为单片机提供定时信号的振荡源的周期晶振周期或外加振荡 周期。 ②状态周期2 个振荡周期为 1 个状态周期用 S 表示。振荡周期又称 S 周 期或时钟周期。 ③机器周期1 个机器周期含 6 个状态周期12 个振荡周期。 ④指令周期完成 1 条指令所占用的全部时间它以机器周期为单位。 例如外接晶振为 12MHz 时51 单片机相关周期的具体值为 振荡周期1/12us; 状态周期1/6us;2个振荡周期 机器周期1us;12个振荡周期 指令周期1~4us; 2学习定时器前需要明白的几点 ①51 单片机有两组定时器/计数器因为既可以定时又可以计数故称之 为定时器/计数器。 ②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的不需要 CPU 的参与。 ③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。 有了定时器/计数器之后可以增加单片机的效率一些简单的重复加 1 的 工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实 现精确定时作用。我们之前写的延时函数都给大概的时间是不精确的。但是定时器是精确的。 2. 单片机定时器原理 定时/计数器的实质是加 1 计数器16 位由高 8 位和低 8 位两 个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1也就是每来一 个脉冲计数器就自动加 1当加到计数器为全 1 时再输入一个脉冲就使计数 器回零且计数器的溢出使相应的中断标志位置 1向 CPU 发出中断请求定时 /计数器中断允许时。如果定时/计数器工作于定时模式则表示定时时间已到 如果工作于计数模式则表示计数值已满。可见由溢出时计数器的值减去计数 初值才是加 1 计数器的计数值。 上图中的 T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚。51 单片机定时/ 计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式寄存 器确定工作方式和功能TCON 是控制寄存器控制 T0、 T1 的启动和停止及 设置溢出标志 1工作方式寄存器 TMOD 工作方式寄存器 TMOD 用于设置定时/计数器的工作方式低四位用于 T0高 四位用于 T1。其格式如下 》GATE 是门控位, GATE0 时用于控制定时器的启动是否受外部中断源信号 的影响。只要用软件使 TCON 中的 TR0 或 TR1 为 1就可以启动定时/计数器工作 GATA1 时要用软件使 TR0 或 TR1 为 1同时外部中断引脚 INT0/1 也为高电平 时才能启动定时/计数器工作。即此时定时器的启动条件加上了 INT0/1 引脚 为高电平这一条件。 》 C/T :定时/计数模式选择位。C/T 0 为定时模式;C/T 1 为计数模式。 M1M0工作方式设置位。定时/计数器有四种工作方式。 2控制寄存器 TCON TCON 的低 4 位用于控制外部中断,已在前面介绍。TCON 的高 4 位用于控制定 时/计数器的启动和中断申请。其格式如下 》TF1TCON.7T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1 为 1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时CPU 可随时查询 TF1 的 状态。所以TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0同硬 件置 1 或清 0 的效果一样 》TR1TCON.6T1 运行控制位。TR1 置 1 时T1 开始工作TR1 置 0 时 T1 停止工作。TR1 由软件置 1 或清 0。所以用软件可控制定时/计数器的启动 与停止。 》TF0TCON.5T0 溢出中断请求标志位其功能与 TF1 类同。 》TR0TCON.4T0 运行控制位其功能与 TR1 类同。 3.定时/计数器的工作方式 1方式 0 方式 0 为 13 位计数由 TL0 的低 5 位高 3 位未用和 TH0 的 8 位组成。 TL0 的低 5 位溢出时向 TH0 进位TH0 溢出时置位 TCON 中的 TF0 标志向 CPU 发出中断请求。其结构图如下所示 门控位 GATE 具有特殊的作用。当 GATE0 时经反相后使或门输出为 1此时仅由 TR0 控制与门的开启与门输出 1 时控制开关接通计数开始当 GATE1时由外中断引脚信号控制或门的输出此时控制与门的开启由外中断引脚信号 和 TR0 共同控制。当 TR01 时外中断引脚信号引脚的高电平启动计数外中断 引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽 度。计数模式时计数脉冲是 T0 引脚上的外部脉冲。计数初值与计数个数的关 系为X213-N。其中 213表示 2 的 13 次方。 2方式 1 方式 1 的计数位数是 16 位由 TL0 作为低 8 位TH0 作为高 8 位组成了 16 位加 1 计数器。其结构图如下所示 计数初值与计数个数的关系为X216-N。
3方式 2串口通信
方式 2 为自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作较 精确的脉冲信号发生器。其结构图如下所示 4方式 3 方式 3 只适用于定时/计数器 T0 定时器 T1 处于方式 3 时相当于 TR10 停止计数。工作方式 3 将 T0 分成为两个独立的 8 位计数器 TL0 和 TH0。其 结构如下所示 这几种工作方式中应用较多的是方式 1 和方式 2。定时器中通常使用定时器 方式 1串口通信中通常使用方式 2。 4.定时器配置 在使用定时器时应该如何配置使其工作其步骤如下各步骤顺序可任 意 ①对 TMOD 赋值以确定 T0 和 T1 的工作方式如果使用定时器 0 即对 T0 配 置如果使用定时器 1 即对 T1 配置。 ②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。 ③如果使用中断则对 EA 赋值开放定时器中断。TCON ④使 TR0 或 TR1 置位启动定时/计数器定时或计数。(与GATE一起使用的 上述中有一个定时/计数器初值的计算下面我们来看下如何计算定时/计数 器初值。 前面我们介绍过机器周期的概念它是 CPU 完成一个基本操作所需要的时间。 其计算公式是机器周期1/单片机的时钟频率。51 单片机内部时钟频率是外部 时钟的 12 分频也就是说当外部晶振的频率输入到单片机里面的时候要进行 12 分频。比如说你用的是 12MHZ 晶振那么单片机内部的时钟频率就是 12/12MHZ 当你使用 12MHZ 的外部晶振的时候机器周期1/1M1us。如果我们想定时 1ms 的初值是多少呢1ms/1us1000。也就是要计数 1000 个初值65535-10001 因为实际上计数器计数到 666362 的 16 次方才溢出所以后面要加 1 64536FC18H所以初值即为 THx0XFCTLx0X18。 知道了如何计算定时/计数器初值那么想定时多长时间都可以计算出当 然由于定时计数器位数有限我们不可能直接通过初值定时很长时间如果要实 现很长时间的定时比如定时 1 秒钟。可以通过初值设置定时 1ms每当定时 1ms 结束后又重新赋初值并且设定一个全局变量累计定时 1ms 的次数当累计到 1000 次表示已经定时 1 秒了。需要其他定时时间类似操作这样我们就可以 使用定时器来实现精确延时来替代之前的 delay 函数。 这里以定时器 0 为例介绍配置定时器工作方式 1、设定 1ms 初值开启定时 器计数功能以及总中断如下 void Timer0Init()
{
TMOD|0X01;//选择为定时器 0 模式工作方式 1仅用 TR0 打开启动。
TH00XFC; //给定时器赋初值定时 1ms
TL00X18;
ET01;//打开定时器 0 中断允许
EA1;//打开总中断
TR01;//打开定时器
} 对于定时器 1 的使用方法是一样的只是将上述的 0 变为 1 即可具体可参 考我们定时器 1 实验例程。 5.实例 1.通过定时器 0 中断控制 D1 指示灯间隔 1 秒闪烁。 代码如下 #include REGX51.H
typedef unsigned char u8;
typedef unsigned int u16;sbit LED1P2^0;void Timer0Init()
{TMOD|0X01;//选择为定时器 0 模式工作方式 1仅用 TR0 打开启动。TH00XFC; //给定时器赋初值定时 1msTL00X18;ET01;//打开定时器 0 中断允许EA1;//打开总中断TR01;//打开定时器
}void main()
{Timer0Init();while(1){}}void Timer0() interrupt 1
{{static u16 i;TH00XFC; //给定时器赋初值定时 1msTL00X18;i;if(i1000){i0;LED1~LED1;}}
} 2.按键控制LED流水灯模式 #include REGX51.H#include INTRINS.H
typedef unsigned char u8;
typedef unsigned int u16;u8 LEDMode;//延时子函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
}void Timer0Init()
{TMOD|0X01;//选择为定时器 0 模式工作方式 1仅用 TR0 打开启动。TH00XFC; //给定时器赋初值定时 1msTL00X18;ET01;//打开定时器 0 中断允许EA1;//打开总中断TR01;//打开定时器
}void main()
{P20xfe;Timer0Init();while(1){if(P3_10){Delay(20);while(P3_10);Delay(20);LEDMode;if(LEDMode2)LEDMode0;}}}
void Timer0() interrupt 1
{ static u16 i;TH00XFC; //给定时器赋初值定时 1msTL00X18;i;if(i500){i0;if(LEDMode0){P2_crol_(P2,1);}if(LEDMode1){P2_cror_(P2,1);}}
}