
汇编程序的延时可以直接根据指令计算
在12M晶振的条件下,1个机器周期的指令为1微妙
单片机的指令分为单字节、双字节、三字节三种,其机器周期分别为1us、2us、3us [12M晶振]
对上述程序,分三部分计算:
push 06h ;1周期 1us
push 07h ;1周期 1us
MOV R6,#14H ;2周期 2us
;下面做一个整体计算 (2+192+2)14 us
DL1:MOV R7,#19H ;2周期
DL2:DJNZ R7,DL2 ;2周期
DJNZ R6,DL1 ;2周期
pop 07h;1周期 1us
pop 06h;1周期 1us
RET;1周期 1us
然后累加即可得答案
^_^ 希望对你有帮助~
我认为应该是将这个函数用汇编语言表示,计算得出的。
在keil中编译该程序,用反汇编窗口观察
这一个语句等于一下七条语句
C:0x000F EF MOV A,R7
C:0x0010 1F DEC R7
C:0x0011 AC06 MOV R4,0x06
C:0x0013 7001 JNZ C:0016
C:0x0015 1E DEC R6
C:0x0016 4C ORL A,R4
C:0x0017 70F6 JNZ delay(C:000F)
第5条语句在循环时不执行
每循环一次,执行六条汇编语句。
在单片机晶振为12MHz下观察
有的语句执行一条要1us,有的语句执行一条要2us。
所以总时间并不是480us,而是727us
我认为延时480us是按一次循环6条汇编语句,680等于480这样得出的。但就如我上面所说,结果并非如此。
比较精确的延时一般用定时器,定义一个全局变量g_delay_count:
unsigned
char
volatile
g_delay_count;
//延时节拍个数
设置定时中断,比如1ms,在定时中断中执行:
if
(g_delay_count)
g_delay_count--;
延时程序如下:
void
Delay_1ms(unsigned
char
ms)
{
g_delay_count=ms;
while(g_delay_count);
}
调用方法:
Delay_1ms(100);
//
delay
100ms
你调用此程序的时候会给他传递X的值,就是while(x--)里面的X,当while检测到x--不等于0的时候,就执行for(j=0;j<125;j++);也就是在for(j=0;j<125;j++);这执行125次判断不做别的,就是耗时间而已,当执行完for(j=0;j<125;j++);以后又回到while(x--)上检测,当while检测到x--不等于0的时候,又一次执行,知道检测到x--等于0。函数就返回到你调用他的地方。
push cx先把cx推进栈以保存cx原来的值。然后用mov cx,0ffh赋值,loop循环每执行一次cx自减一,到cx为0为止,此时循环共执行0ffh次即255次。再将栈中cx原来的值d出给cx寄存器。
如果CUP主频为40mHz,则时钟周期为1/40=0025微秒。
在808X中,一条LOOP指令如果实现跳转的话需要18个时钟周期,退出时需要5个时钟周期。所以这个延时子程序循环部分的延时(002518255+5)微秒,其他语句的延时基本可以忽略
以上就是关于关于一个单片机汇编语言的延时程序问题全部的内容,包括:关于一个单片机汇编语言的延时程序问题、有关单片机延时程序的计算、单片机延时时间程序怎么编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)