您的位置 首页 产品

STC89C52定时器使用方法

定时器计数器0和定时器计数器1都可以在方式0、方式1、方式2工作,而方式3只有前者才能工作。1方式0当TMOD中M1、M0都为0

守时器/计数器0 和守时器/计数器1 都可以在方法0、方法1、方法2 作业,而方法3 只需前者才干
作业。
1. 方法 0
当TMOD 中M1、M0 都为0 时,T/C 作业在方法0。
方法0 为13 位的T/C,由TH 供给高8 位,TL 供给低5 位,留意TL 的高3 位是无效的,计数溢出
值为2 的13 次方=8192,发动该计数器需求设置好计数初值。
当C/– T该位为0 时,T/C 为守时器,振动源12 分频的信号作为计数脉冲;当C/– T该位为1 时,T/C
为计数器,对外部脉冲输入端的T0 或T1 引脚进行脉冲计数。
计数脉冲能否加到计数器上,受发动信号的操控。当GATE=0 时,只需TR=1,则T/C 发动;当GATE=1
时,发动信号遭到TR 与INT 的两层操控。
T/C 发动后当即加1 计数,当13 位计数满时,TH 向高位进位。此进位将中止溢出标志TF 置位即
TF=1,发生中止请求,表明守时时间或计数次数抵达。若T/C 开中止(ET=1)且CPU 开中止(EA=1),

则当CPU 主动转向中止服务函数时,TF 主动清零,不需求人工软件清零。
2. 方法 1
当TMOD 中M1、M0 为0、1 时,T/C 作业在方法1。
方法1 与方法0 底子相同,仅有不同的是方法0 是13 位计数方法,方法1 是16 位计数方法,TH 和
TL 都一起供给8 位(方法0 时TL 只供给低5 位,高3 位无效),计数溢出值为2 的16 次方=65536。
3. 方法 2
当TMOD 中M1、M0 为1、0 时,T/C 作业在方法2。
方法2 是8 位的可主动重装载的T/C,满计数值为2 的8 次方=256。在方法0 和方法1 中,当计数
满后,若要进行下一次守时/计数,有必要经过软件向TH 和TL 从头装载预置计数值。方法2 中TH 和TL 被
当作两个8 位计数器。技能过程中,TH 存放8 位初值并坚持不变,由TL 进行8 位计数。计数溢出时,除
发生溢出中止请求外,还主动将TH 中初值重装到TL,即重装载。除此之外,方法2 也同方法0。
4. 方法 3
方法3 只适合于T/C0。当T/C0 作业在方法3 时,TH0 和TL0 成为两个独立的计数器。这时,TL0
可作守时器/计数器,占用T/C0 在TCON 和TMOD 存放器中的操控位和标志位;而TH0 只能作守时器运用,
占用T/C1 的资源TR1 和TF1。在这种情况下,T/C1 仍可用于方法0/1/2,当不可以运用中止方法。
只需将T/C1 用作串行口的波特率方法器时,T/C0 才作业在方法3,以便添加一个守时器。

5. T/C2的作业方法
守时器/计数器2 包括一个16 位重载方法,T/C2 在计数溢出后,主动在瞬间重装载(像8 位主动重
载方法2)。主动重载可由外部引脚T2EX 的负跳变开端,这样外部引脚用于发生和其他硬件计数器的同步
信号。T/C2 可以看作看门狗或守时溢出的守时器。
T/C2 还有捕获方法。把瞬时计数值传到别的的CPU 可读取的存放器对(RCAP2H、RCAP2L)。这样,
在读的过程中,两个字节的计数值无动摇的风险。关于快速改变的计数,比方计数值在读取高字节时是16FF
时,到读取低字节时已变到1700,成果却得到1600。若16FF 瞬间捕获到别的的存放器,则可以在CPU
闲暇的时分取到16 和FF。

#include “stc.h” //加载stc.h 头文件
unsigned char i=0; //声明变量i

void main(void) //主函数,程序是在这里运转的
{

TH0=(65536-50000)/256; //计数存放器高8 位
TL0=(65536-50000)%6; //计数存放器低8 位
TMOD=0x01; //作业方法为16 位守时器
ET0=0x01; //答应T/C0 中止
EA=1; // 悉数中止答应
TR0=1; // 发动T/C0 运转
while(1) // 进入死循环
{
if(i>7)i=0; //若i>7,则i=0
}
}

void Timer0IRQ(void) interrupt 1 //中止服务函数
{
TH0=(65536-50000)/256; //计数存放器高8 位从头载入
TL0=(65536-50000)%6; //计数存放器低8 位从头载入

84
P2=1<LED
i++; //i 自加1
}

剖析:

T/C0 的初始化在main 函数中进行,在while(1)死循环傍边,只需对i 变量检测,对LED 灯进行
操作首要放置在T/C0 的中止服务函数Timer0IRQ,即P2=1<很古怪,main()函数里边底子对单片机的操作什么都没有,只需对变量i 的检测操作,几乎是空载
运作,可是为什么流水灯仍是可以运转呢?那么答案只能有一个,Timer0IRQ()中止服务函数可以脱离主
函数独立运转。
咱们很天然地想到为什么Timer0IRQ()函数独立于main()函数还可以运转,联系到在PC 机的C 语
言的编程是底子不可能的事,由于一切的运转都必选在main()函数体中运转。
只能告知咱们不同的渠道天然有所不同,它们之间的不同必定会有各自的长处,还有例如AVR、ARM
单片机编程同样是“主程序+中止服务函数”组合的架构,更何况是8051 系列单片机编程。当然咱们学会
了8051 系列单片机的编程,天然而然在AVR、ARM 或许更加多的单片机中的编程中称心如意,感觉便是
以不变应万变

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/256627.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们