新手求助,延时程序如何计算时间

[复制链接]
4970|19
 楼主| clc1011 发表于 2007-11-6 13:10 | 显示全部楼层 |阅读模式
程序为:
   mov r4,#01AH
D2:MOV R3,#064H
D1:DJNZ R3,D1
   DJNZ R4,D2
RET

这个程序延时是20ms吗?怎么计算延时啊?
xhmcu 发表于 2007-11-6 13:15 | 显示全部楼层

错了

自己找本单片机的书看看
HWM 发表于 2007-11-6 13:16 | 显示全部楼层

晶振是多少,用何种MCS-51?建议LZ用Keil仿真一下就知道了。

 楼主| clc1011 发表于 2007-11-6 13:31 | 显示全部楼层

采用12m晶振,用的是at89从

 楼主| clc1011 发表于 2007-11-6 13:32 | 显示全部楼层

12m晶振,at89c2051单片机

 楼主| clc1011 发表于 2007-11-6 13:32 | 显示全部楼层

这个计算是不是要通过指令执行的时间来定啊?

HWM 发表于 2007-11-6 13:34 | 显示全部楼层

当然(没中断的话)。

 楼主| clc1011 发表于 2007-11-6 13:37 | 显示全部楼层

那个程序在现在的环境中怎么计算啊?

在现在的环境中DJNZ指令是4微秒的吗?我是新手不太懂麻烦好心人帮忙给解释一下谢谢
ldyeah 发表于 2007-11-6 14:07 | 显示全部楼层

我认为

如果是12MHZ晶振
则 T=2+(2+2×100+2)×26 US
 楼主| clc1011 发表于 2007-11-6 14:41 | 显示全部楼层
ayb_ice 发表于 2007-11-6 15:02 | 显示全部楼层

最简单的用软件仿真一下

 楼主| clc1011 发表于 2007-11-6 16:06 | 显示全部楼层

请教

我在keil中仿真了一下运行栏那边数据显示states 5279
sec 0.00263950
运行一步的时候sec显示是0.00000050
怎么回事啊?一个命令不是1微妙吗?怎么只有0.5微妙啊?
sea666 发表于 2007-11-6 16:50 | 显示全部楼层

晶振是设定的多大的?

12M的话就是1US.
5880527 发表于 2007-11-6 17:03 | 显示全部楼层

咋老是见到有人这样延时呢,难道我错了

 楼主| clc1011 发表于 2007-11-7 08:29 | 显示全部楼层

请教

要是1us的话延时程序就是延时5.2ms了吧
qiushui007 发表于 2007-11-7 10:53 | 显示全部楼层

MCU延时

1.时钟源选择
    1:外部时钟源,从xtal1输入
    2:看门狗振荡器(400kHz)
    3: 内部RC振荡器(7.3728MHz)
    4:外部晶振xtal1,xtal2 。(最常用11.0592M, 32.768K)此时钟源也可用作实时时钟RTC的时钟源

2.经过DIVM寄存器分频
    DIVM=n
    fcclk=fosc/2*n

3.把cclk转换成机器周期(指令执行时间以机器周期为单位)
    对LPC900系列,(每个机器周期占2个CCLK周期), 若时钟源选内部rc,DIVM=0, 
    则机器周期频率fm=fcclk/2=7.3728/2=3.6864MHz, 每个机器周期所占的时间 =  1/fm 
    
    对PIC16F630, 若时钟源选内部RC, 
    则机器周期的频率fm=fcclk=4MHz, 每个机器周期所占的时间 =  1/fm 

4.算出指令的机器周期数CX, 1/fm * CX = tn(延时时间), 则 CX=fm * tn
    如延时时间tn=10us(us单位和MHz抵消),则 fm*tn=36.864~37

5.根据指令的机器周期数算出寄存器的值
    nop           1        
    djnz rn,ln       2    |    
    mov rn,#xx       1    |>  指令周期数*寄存器初值 = fm*tn(机器周期频率 * 延时时间) !!!!
    inc rn       1    /

总结如下:
;1/机器周期频率 * 机器周期数 = 时间 ====> 机器周期数 = 时间 * 机器周期频率 ====> 指令周期数 * 寄存器初值 = 时间 * 机器周期频率
;LPC系列的延时,       指令周期数 * 寄存器初值 = 3.6864 * 延时时间
;LPC系列的定时模式1,  65536      - 定时器初值 = 3.6864 * 定时时间

;------- 10ms, 此部分在中断向量之间,注意空间 ------------
delay_10:        
        mov r6,#81            ;60
delay_10_1:    
        mov r7,#226            ;238
        djnz r7,$            ;(1+226*2+2)*81+1 = 3.6864*tn, tn=9997us=10ms
        djnz r6,delay_10_1        
        ret
jerkoh 发表于 2007-11-7 11:56 | 显示全部楼层

回楼主

用汇编的话
在主程序执行前加
CALL DELAY
NOP
设置NOP断点
运行到断点就可以看到多少时间啦
这样调整值也很方便!
 楼主| clc1011 发表于 2007-11-7 15:28 | 显示全部楼层

继续请教

我用的是12m晶振,at89c2051片子,程序在keil中调试时时间是0.00263950
是不是keil里默认的是24m晶振啊,一步只有0.5us,
qiushui007 发表于 2007-11-9 08:31 | 显示全部楼层

公式是必须要会的, 否则定时器的时间如何算?

uranus0903 发表于 2007-11-12 16:46 | 显示全部楼层

看课本了,是个单片机课本基本上都有的!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

60

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部