打印

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

[复制链接]
3111|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
clc1011|  楼主 | 2007-11-6 13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xhmcu| | 2007-11-6 13:15 | 只看该作者

错了

自己找本单片机的书看看

使用特权

评论回复
板凳
HWM| | 2007-11-6 13:16 | 只看该作者

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

使用特权

评论回复
地板
clc1011|  楼主 | 2007-11-6 13:31 | 只看该作者

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

使用特权

评论回复
5
clc1011|  楼主 | 2007-11-6 13:32 | 只看该作者

12m晶振,at89c2051单片机

使用特权

评论回复
6
clc1011|  楼主 | 2007-11-6 13:32 | 只看该作者

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

使用特权

评论回复
7
HWM| | 2007-11-6 13:34 | 只看该作者

当然(没中断的话)。

使用特权

评论回复
8
clc1011|  楼主 | 2007-11-6 13:37 | 只看该作者

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

在现在的环境中DJNZ指令是4微秒的吗?我是新手不太懂麻烦好心人帮忙给解释一下谢谢

使用特权

评论回复
9
ldyeah| | 2007-11-6 14:07 | 只看该作者

我认为

如果是12MHZ晶振
则 T=2+(2+2×100+2)×26 US

使用特权

评论回复
10
clc1011|  楼主 | 2007-11-6 14:41 | 只看该作者

谢谢

使用特权

评论回复
11
ayb_ice| | 2007-11-6 15:02 | 只看该作者

最简单的用软件仿真一下

使用特权

评论回复
12
clc1011|  楼主 | 2007-11-6 16:06 | 只看该作者

请教

我在keil中仿真了一下运行栏那边数据显示states 5279
sec 0.00263950
运行一步的时候sec显示是0.00000050
怎么回事啊?一个命令不是1微妙吗?怎么只有0.5微妙啊?

使用特权

评论回复
13
sea666| | 2007-11-6 16:50 | 只看该作者

晶振是设定的多大的?

12M的话就是1US.

使用特权

评论回复
14
5880527| | 2007-11-6 17:03 | 只看该作者

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

使用特权

评论回复
15
clc1011|  楼主 | 2007-11-7 08:29 | 只看该作者

请教

要是1us的话延时程序就是延时5.2ms了吧

使用特权

评论回复
16
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

使用特权

评论回复
17
jerkoh| | 2007-11-7 11:56 | 只看该作者

回楼主

用汇编的话
在主程序执行前加
CALL DELAY
NOP
设置NOP断点
运行到断点就可以看到多少时间啦
这样调整值也很方便!

使用特权

评论回复
18
clc1011|  楼主 | 2007-11-7 15:28 | 只看该作者

继续请教

我用的是12m晶振,at89c2051片子,程序在keil中调试时时间是0.00263950
是不是keil里默认的是24m晶振啊,一步只有0.5us,

使用特权

评论回复
19
qiushui007| | 2007-11-9 08:31 | 只看该作者

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

使用特权

评论回复
20
uranus0903| | 2007-11-12 16:46 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

60

帖子

1

粉丝