关于一个单片机汇编语言的延时程序问题

关于一个单片机汇编语言的延时程序问题,第1张

汇编程序的延时可以直接根据指令计算

在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)微秒,其他语句的延时基本可以忽略

以上就是关于关于一个单片机汇编语言的延时程序问题全部的内容,包括:关于一个单片机汇编语言的延时程序问题、有关单片机延时程序的计算、单片机延时时间程序怎么编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10071970.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存