51单片机定时器2的最短定时时间怎么有限制?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机定时器2的最短定时时间怎么有限制?相关的知识,希望对你有一定的参考价值。

晶振是12MHZ的,12分频,按道理计数器应该是每1微秒自加一次,那么理论上最小定时时长也应该是1微秒,考虑中断等等CPU干别的事要花些时间,我想那么定时定个20微秒也应该不是问题吧。

我写了程序发现定时时长在250微秒(65536UL-250)以上,烧到板子上观察都是准的(我的观察方法是:定时每250微秒中断,中断4000次的时候数码管加一,看数码管是不是每隔一秒加一,结果的确是的)。

但是再想把定时时长改短,不管怎么改短(比如65536UL-200)时长都不会再变短,这不科学啊!

如果中断频率最高只能到4KHz(即最短定时时长只能在250微秒),那么这个性能是没法达到我的要求的,我要用它产生方波信号,驱动开关电源的。急求各位大侠解决方案!

uint Reload_16;
uchar Reload_08H, Reload_08L;
T2CON = 0x04; //start timer2 as a 16 bit timer and reload automaticly

Reload_16 = 65536UL - 250; //就是这个地方,大于250都是准的,改小就不准了!
Reload_08H = Reload_16 /256;
Reload_08L = Reload_16 %256;
TH2 = Reload_08H;
RCAP2H = Reload_08H;
TL2 = Reload_08L;
RCAP2L = Reload_08L;
ET2 = 1; // activate timer2 interrupt
TR2 = 1; // activate timer2
EA = 1;
单片机是STC90C516RD+

51单片机定时器,晶振是12MHZ、12分频,理论上最短定时时间1微秒,
但是,CPU 运行指令 需要时间,只要中断服务程序 的运行时间 不超过定时器 定时时间,
并且 有些余量,则就不成问题,如果没有余量,则中断结束 又进入 中断,
如果 超过定时器 定时时间,则来不及 处理 定时也就不准确了。
用 C 语言编程,有可能 定时时间 过短 会有问题,有不好 计算中断用去多少时间。
如果用 汇编语言 编程,晶振是12MHZ、12分频,只是产生一个方波信号,30KHz 频率没有问题。
当然你要检测 准确性 加入计数程序后 会占用时间,
一般编程时, 在中断 服务程序中 尽量少占用时间,能不在中断服务程序中处理的 事尽量 不在
中断服务程序中 处理。追问

单纯的数码管动态显示又没有software delay.还没干正事呢,只是用数码管检测一下定时器就出问题了

追答

其实 数码管动态显示,也可以用定时器 来完成,如 8 个 数码管,定时 2 - 2.5 mS,
每次定时器中断 扫描显示 一 位数码管,8 次中断 16 - 20 mS 完成 8 个数码管的显示。

参考技术A 1微秒是每条汇编指令需要的时间,定时器中断涉及到了压栈寻址出栈等操作,天知道用了多少条汇编指令,你定个20微妙当然有问题,程序还有别的事情干,比如数码管显示(这玩意儿也很耗时),不能光响应你的中断去了。。。
如果用中断还想有一定的精度的话一般单片机的话10~20k就到顶了。
不过如果你只是想输出高频方波信号的话,我建议你不要用定时器,直接在主程序里面加循环,除去必须的代码后,根据需要的频率增加不同数量的_nop_指令,这个应该能达到更高的频率。
参考技术B 应该是你的中断服务程序有问题,占用时间可能太多,超过定时时间了,因此可能造成不准的情况,贴上你的定时中断程序看看,还有最好在定时程序里赋值时先作如下处理:
TR2=0;
赋值
TR2=1;
参考技术C 如果你要提高定时精度,你可以增加晶振频率如:24MHZ,是不是能够解决你的问题追问

如何提高?百度过,没谁说的清楚,买个快的?

追答

增加晶振频率如:24MHZ,买个快的

参考技术D 这个单片机不是传统的51单片机,时钟比传统51的时钟要快12倍,仔细看芯片资料...追问

要是快的话,定时时长应该可以更短

追答

你说的对

单片机c语言编程问题,功能是用定时器T0使发光管间隔200ms闪烁,定时器T1使数码管循环显示0-59.

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit led1=P1^0;
uchar num,num1,num2,shi,ge;
uchar code tabledula[]=

0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
;

void delayxms(uint xms);
void desplay(uchar shi,uchar ge);

void main()

TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)

desplay(shi,ge);



void delayxms(uint xms)

uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);



void desplay(uchar shi,uchar ge)

dula=1;
P0=tabledula[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayxms(5);

dula=1;
P0=tabledula[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayxms(5);

void T0_time() interrupt 1

TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==4)

num1=0;
led1=~led1;




void T1_time() interrupt 3

TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2==20)

num2=0;
num++;
if(num==60)
num=0;
shi=num/10;
ge=num%10;



如上程序所示,在最后的中断函数void T1_time() interrupt 3
中的"num2=0;"这句如果少了的话,竟然也会实现数码管0-59循环显示,只不过时间不是一秒间隔,而是好几秒,谁能告诉我这是为什么?因为少了这句的话从程序上看应该只会显示0然后1,然后就不变了。

……
num2++;
if(num2==20)

num2=0;//少了这句,num2会持续增长,长到255后,才变成0。
……

num2:0~255,只有在=20时,数字才加一。
那么,就是约12.5秒,数字才加一。
参考技术A 溢出了

然后就从0开始累加 然后你懂得的
参考技术B 有点晕

以上是关于51单片机定时器2的最短定时时间怎么有限制?的主要内容,如果未能解决你的问题,请参考以下文章

毕业回馈-89c51之定时器/计数器(Timer/Count)

我想用C51单片机的定时器0工作方式2输出一个PWM。它的频率要怎么设置???

请问51单片机定时器延时的调用是怎么调用的我有点不明白,谢谢

51单片机定时器问题

51单片机中的定时器中断是怎么用的 ?

请问单片机定时器中断是怎么样的过程啊