认识单片机的定时器计数器
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void main(void) { TMOD=0x01;
TH0=-25000/256; TL0=-25000%256; TR0=1; ET0=1; EA=1; while(1); } void timer0(void) interrupt 1 { TH0=-25000/256;
TL0=-25000%256; P10=~P10; }
根据定时时间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=6553610000=55536
任务一、认识单片机的定时器/计数器
一、定时器/计数器及其应用 在单片机应用系统中,定时或计数是必不可少的。例如: 测量一个脉冲信号的频率、周期,或者统计一段时间里 电机转动了多少圈等。常用的定时方法有:
1、软件定时 软件定时是依靠执行一段程序来实现的,这段程序本身 没有具体的意义,通过选择恰当的指令及循环次数实现 所需的定时,由于执行每条指令都需一定的时间,执行 这段程序所需总的时间就是定时时间。 软件定时的特点是无需硬件电路,但定时期间CPU被占 用,增加了CPU的开销,因此定时时间不宜过长,而且 定时期间如果发生中断,定时时间就会出现误差。
led=_crol_(led,1); 满10次变量led左移1位送P0口
P0=led;
}
}
[案例3] 用定时器的计数方式实现外部中断。如图 所示,P0口控制8只发光管轮流点亮,发光管点 亮时间为500ms,单脉冲电路控制发光管的移动 方向,按下单脉冲按钮,发光管左移,再按下发 光管右移 。
5 6
4 2
由于重新赋值是硬件自动进行的,所以避免了重新赋值 的时间不一,所以方式2可以用于精确定时。
4、方式3
T1经常用于串行口的波特率发生器,为了让系 统中保持两个计数器,可以让T0工作在方式3, 这时T0被分成两个8位计数器,分别位于TH0和 TL0中,其中TL0使用T0的中断、启动控制资源, 而TH0则借用T1的中断、启动控制资源,而且 TH0只能工作在定时方式下,不能工作在计数 方式下。
(一)定时器/计数器概述
在51系列单片机中有两个16位的加法计数器, 分别叫做T0和T1。在计数脉冲的作用下,其计数 值不断加1,在此过程中,计数器可能产生溢出, 产生溢出后,可以向CPU发出中断请求。
如果计数脉冲来自系统时钟,称之为“定 时器”,每个机器周期计数器加1;
如果计数脉冲来自外部电路,称之为“计 数器”
//CPU开中断
while (1);
}
void time0(void) interrupt 1 { TH0=-50000/256;
定时器T0中断服务程序 重新装入时间常数
TL0=-50000%256;
每中断一次,计数器加1
count++; if(count==10)
10次中断为0.5秒
{ count=0;
2、定时方式寄存器TMOD
当GATE=0时, 只要TR0=1,与 门的输出就为1, 计数开始。
如果GATE为1, 只有TR0=1,并 且/INT0=1时, 才允许计数。
定时方式/计数 方式的选择控制 位。为0,选定 时方式,计数脉
冲来自系统时钟 的12分频;为 1, 选计数方式,计
数脉冲来自外部 电路
D8
R8 470R
设计思想:
当定时器/计数器工作于计数方式2时,如果将计数器 的初值设置为全1,只要在计数输入端(T0或T1)送入 一个计数脉冲,就可使计数器产生溢出中断。
如果将外部中断请求作为计数脉冲输入,就可利用计 数中断的名义去完成外部中断服务。
当应用中外部中断请求较多时,而单片机内部的定时定时器的计数输入端T1扩展为 外部中断请求输入,来控制发光管的移动方向。
uchar count=0;
//50ms定时中断次数计数器
void main(void)
{ led=0xfe;
TMOD=0x01;
//T0工作于方式1
TH0=-50000/256; //定时时间为50ms
TL0=-50000%256;
ET0=1;
//允许T0中断
TR0=1;
//启动T0定时
EA=1;
TH0=-10000/256; //取-N的高8位
TL0=-10000%256; //取-N的低8位 例如:设系统的时钟频率是12MHz,定时器工作于方式2,定 时时间200us。
根据前面分析,N=-T=-200,可直接用以下语句实现:
TH0=-200;
TL0=-200;
任务二、定时器应用
[案例1] 设时钟频率fosc=12MHz,用定时器T0在 P1.0脚产生频率为20Hz的方波。 设计思想:在使用定时器/计数器时,首先应根据要 求对工作方式进行初始化,然后计算出初始值。初始 化的步骤通常是:
如何将55536给两个8位寄存器TH0、TL0赋值呢?可将十进 制数55536转换成四位十六进制数,将高2位送TH0,低2位送 TL0。
更简单的方法是:对于16位计数器来讲, 216等效为0,对于 8位计数器,28等效为0,这样公式(3)、(4) 可简化为 N=-T,直接用下面两条语句就可以完成计数器初值的设置:
具体方法:
1、初始化定时器/计数器T1计数工作方式2,即每 次溢出中断后能自动装入计数初值。
2、计数器TH1、TL1的初值预置为0FFH。
3、程序中设置一个位变量,每当计数器T1产生溢 出中断时求反,发光管左移还是右移取决于该 变量是0还是1 。
void main(void)
{ DIR=0; led=0xfe; TMOD=0x61; TH0=-50000/256; TL0=-50000%256; TH1=0xff; TL1=0xff; ET0=1; ET1=1; TR0=1; TR1=1; EA=1; while (1); }
选择定时/ 计数器的工
作方式,
M1M0= 00,方式0 01,方式1 10,方式2 11,方式3
C/T=0,选择定时方式
定时器溢出 时,TF0置1
C/T=1,选择计数方式
GATE=0时,由TR0控制计数器启停 GATE=1时,由TR0和INT0一同控制启停
TR0=1时, 启动定时器
三、T0、T1的工作方式
8051
P0.4 P0.5 P0.6 P0.7
D1
R1 4 7 0 R VCC
D2
R2 470R
D3
R3 470R
D4
R4 470R
D5
R5 470R
D6
R6 470R
D7
R7 470R
D8
R8 470R
设计思想
我们可将P0口的初值设置为0xFE,对应于发光 管D1亮,每隔500ms将P0的值循环左移一位, 这一周期性的定时作业用T0来完成。
当时钟频率为12MHZ时,在定时器的4种工作方式 中,方式1的最大溢出时间最长,但即使在方式1, 最大的溢出时间也只有65.536ms,所以我们不能在 每次中断时都执行上述移位操作。可以这样处理: 将定时器T0的溢出时间设定为50ms,累计满10次 中断正好500ms,才允许程序执行1次移位动作。
主函数
2、硬件定时 硬件定时通常由小规模集成电路555外加电阻、电容构 成,电路简单,不占CPU资源,但定时时间的调节不够 灵活方便。
3、可编程定时器定时
这种定时方法是通过对系统时钟脉冲的计数来实现的。 通过程序来设置计数初值,改变计数初值也就改变了定 时时间,使用起来非常灵活。由于定时器可以与CPU并 行工作,因此不影响CPU的效率,且定时时间精确。
(1)向TMOD寄存器写入工作方式控制字。 (2)将计数器的初值写入TH0、TL0/TH1、TL1。 (3)启动定时器/计数器:将TR0/TR1置1。 (4)如果采用中断方式,还应将ET0/ET1、EA置1。
本题中,方波的频率为20HZ,对应的周期为 50ms,如果将定时时间设置为25ms,每隔 25ms将P1.0脚取反即可产生如图3-3所示的方波。 因为定时时间为25ms,如果采用方式2或方式3, 其定时的最大时间不超过256us,因此选方式1比 较恰当,根据前面的分析,计数器初值N=25000。本例题是定时而非计数,且无需/INT0脚 参与启停ˉ控制,故C/T=0,GATE为0,这样 TMOD取0x01。
一旦计数 器产生溢 出,TF0 变为1 , 向CPU发 出中断请 求
二、定时器/计数器的控制寄存器 1、定时器控制寄存器TCON
TF0/TF1:定时 器/计数器T1和 T0的溢出中断标 志。为1,表示定 时器/计数器的计 数值已由全1变为 全0,正向CPU发 中断请求。
TR0/TR1:定 时器/计数器T0 和T1的启停控 制位:为0时, 定时器/计数器 停止工作;为1 时,启动定时 器/计数器工作。
(四)时间常数的计算
如果单片机需要进行周期性的工作,就应该让 定时器/计数器T0或T1工作在定时方式,并且给 T0或T1赋以一个初始计数值,在T0或T1被启动后, 每个机器周期使计数器中的计数值加1,计数器产 生溢出后,将再次给计数器赋值(该值被称为时 间常数)。
显然计数器溢出时间(又称定时时间)与时间 常数直接相关:时间常数越大,定时时间就越短; 时间常数越小,定时时间就越长。同时系统时钟 的频率也直接影响定时时间的长短,时钟的频率 越高,定时时间越短;时钟的频率越低,定时时 间越长。
3 1
P0.0
74LS00
PL T1
P0.1
U1B
U1A
P0.2 P0.0
8051
P0.4
R12 4 .7 K
P LU SE
R11 4.7K
VCC
P0.5 P0.6 P0.7
D1
R1 470R VCC
D2
R2 470R
D3
R3 470R
D4
R4 470R
D5
R5 470R
D6
R6 470R
D7
R7 470R
设系统时钟的频率为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
T0工作于定时方式1 定时时间为25ms 启动定时器T0 允许定时器T0中断 单片机开中断
定时器T0中断服务程序 重新装入时间常数
P1.0求反
[案例2] 如图所示,P0口接8只发光二极管,编程 使发光管轮流点亮,点亮时间为500ms,要求使 用定时器T0来控制,设晶振为12MHz。
P0.0 P0.1 P0.2 P0.0
1、方式0
方式0的计数器由13位构成,其中高8位在TH 中,低5位在TL中。当计数器产生溢出时,TF位 被置1,向CPU发出中断请求。在方式0下,计 数器产生溢出时,不能进行初始计数值的自动 重装(有关自动重装的问题参见方式2),所以 方式0不能用于精确定时。
方式0的所有功能都可以用方式1代替,方式0 的存在,是因为兼容早期的MCS-48单片机的原 因,所以一般不使用方式0。
T0为定时方式0,T1为计数方式2 定时时间为50ms T1的初值为0xff
允许T0、T1中断 启动T0定时 启动T1计数 CPU开中断
void time0(void) interrupt 1 { TH0=-50000/256;
2、方式1
方式1与方式0工作形态基本相同,只是方式1 的计数器由16位构成,其中高8位在TH中,低8 位在TL中,当计数器产生溢出时,TF位被置1, 向CPU发出中断请求。在方式1下,计数器产生 溢出时,也不能进行初始计数值的自动重装,所 以方式1也不能用于精确定时。
3、方式2
方式2是可以自动重装的工作方式:初始化时一般将8 位计数初值同时放入TH、TL中,其中,TH存放的是初 值的备份,TL用来计数,当8位计数器TL产生溢出时, 除了可以向CPU发中断请求外,单片机的硬件部分还立 即把TH中的备份送入TL中。