AT89C51的单片机,晶振是11.0592MHZ的,算延时,要有计算步骤,谢谢

void delay_50us(uint t) //50us延迟函数
{ uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
请大师们高手们快点帮我解决一下,救急啊

    9: void delay_50us(uint t) //50us延迟函数 
    10: { 
    11:           uchar j; 
    12:           for(;t>0;t--) 
    13:           for(j=19;j>0;j--); 
    14: }
C:0x0D45    D3       SETB     C ;1
C:0x0D46    EF       MOV      A,R7 ;1
C:0x0D47    9400     SUBB     A,#0x00 ;2
C:0x0D49    EE       MOV      A,R6 ;1
C:0x0D4A    9400     SUBB     A,#0x00 ;2
C:0x0D4C    400B     JC       C:0D59 ;1
C:0x0D4E    7D13     MOV      R5,#0x13 ;1
C:0x0D50    DDFE     DJNZ     R5,C:0D50 ;19*2=38
C:0x0D52    EF       MOV      A,R7 ;1
C:0x0D53    1F       DEC      R7 ;1
C:0x0D54    70EF     JNZ      delay_50us(C:0D45) ;2
C:0x0D56    1E       DEC      R6 ;1
C:0x0D57    80EC     SJMP     delay_50us(C:0D45) ;2
C:0x0D59    22       RET      ;2
这是KEIL反汇编出来的结果,可见总的机器周期=56
晶振为11.0592M时,t=1,那么实际延时时间=61us追问

如果晶振是12m时 这个结果会是一样的吗

追答

晶振为12M时延时时间为56us

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-01-07
最好是用编译软件(Keil)测量时间,在Keil里设置晶振频率为11.0592
然后进入调试状态,有一个watch的可以看运行了多长时间!!
第2个回答  2014-01-07
你现在写的这个是软延时,有很大误差的,参数还要自己调节核对!

用中断做吧,准一些,可以看下51的T/C部分!追问

用中断做的话还是要计算的哇

追答

是的,要算,不过你可以算的很准!

如果用软延时,你要不断测试参数,才能得到一个近似值,而且当你改变程序优化等级后,此值作

废!另外,如果你想得到比较精确的延时,最好换晶振为12MHz。

还有,如果你一定要计算步骤的话,就只能用中断方式了!

第3个回答  2014-01-07
(1/11.0592M)*12*t*19追问

这个t该怎么确定呢

追答

void delay_50us(uint t)
参数自己定的啊

追问

哦哦 谢谢

相似回答