您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > STC89C52定时器使用方法介绍
定时器/计数器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。#includestc.h//加载stc.h头文件unsignedchari=0;//声明变量ivoidmain(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(i7)i=0;//若i7,则i=0}}voidTimer0IRQ(void)interrupt1//中断服务函数{TH0=(65536-50000)/256;//计数寄存器高8位重新载入TL0=(65536-50000)%6;//计数寄存器低8位重新载入84P2=1i++;//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或者更加多的单片机中的编程中得心应手,感觉就是以不变应万变。更多datasheet搜索:
本文标题:STC89C52定时器使用方法介绍
链接地址:https://www.777doc.com/doc-4879849 .html