at89c51单片机怎么用汇编语言写“多个延时程序”

at89c51单片机怎么用汇编语言写“多个延时程序”,第1张

单片机汇编语言中要使一个延时程序可以被不同情况下调用而延时不同的时间,可以通过类似于C语言中传递参数的方式来实现,举例如下:

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV P0,#5AH ;P0上的LED灯间隔点亮

MOV R7,#50 ;R7是延时传递参数

LCALL DELAY ;调用延时函数

MOV P0,#0A5H ;P0上LED灯另一半点亮

MOV R7,#100 ;延时时间加长

LCALL DELAY

MOV P0,#00H ;LED等全部点亮

MOV R7,#150 ;延时再次加长

LCALL DELAY

MOV P0,#0FFH ;灯灭

MOV R7,#200 ;延时时间再次加长

LCALL DELAY

SJMP MAIN ;循环

DELAY:

MOV R2,#100

DLY:

MOV R3,#250

DJNZ R3,$

DJNZ R2,DLY

DJNZ R7,DELAY ;R7是调用前赋值的传递参数。

RET

END

1循环延时的方法

DELAY: ;误差 0us

MOV R7,#25H

DL1:

MOV R6,#9AH

DL0:

MOV R5,#02H

DJNZ R5,$

DJNZ R6,DL0

DJNZ R7,DL1

RET

不过这不实用。40MS时间单片机都 在这里循环,不作能它事。

1可以用定时中断的方法:

ORG 0000H

LJMP START

ORG 000BH

LJMP Timer0Interrupt

START:

MOV SP,#60H

LCALL InitTimer0

LOOP:

;add your code here!

LJMP LOOP

InitTimer0:

MOV TMOD,#01H

MOV TH0,#63H

MOV TL0,#0C0H

SETB EA

SETB ET0

SETB TR0

RET

Timer0Interrupt:

PUSH DPH

PUSH DPL

PUSH ACC

MOV TH0,#63H

MOV TL0,#0C0H

;========================

;add your code here!

;========================

POP ACC

POP DPL

POP DPH

RETI

END

单片机编程时延时程序其实就是一些循环指令组成的集合。比如:

DELAY:

    MOV R2,#248    ;本条指令1T执行1次

    DJNZ R2,$      ;本条指令2T执行248次

    NOP            ;本条指令1T执行1次

    RET            ;本条指令2T执行1次

    

所以延时时间为:1+2482+1+2=500T,如果晶振是12M的话,延时500us

你可以采用单片机中的定时器/计时器,一般都是8位的,也有16位的,采用中断方式。

8位定时器中断间隔的计算:1/晶振频率x256,比如单片机采用1M频率的晶振,1/1000000x256,那么这个定时器中断2次间的间隔时间为256us(微秒)。

你只要在中断程序中用个寄存器计数,每+1就是256us,1秒约为3906个中断间隔

在Keil里仿真的话,在配置里把晶振调成12MHz,然后在调用delay函数的地方设置一个断点,开始调试程序,运行到断点处,注意程序左边有一个记录当前寄存器和一些状态的窗口,其中,里面有一个是专门记录当前运行了多少时间的变量,记下当前时间T1,然后按F10(不进入子函数)调试,再记录当前时间T2,则延时=T2-T1。多试几个A,差不多调到1s就够了。我一般都这么调。

你要想明白其中原理,想自己算的话,你就看看delay的汇编代码段自己算吧。

以上就是关于at89c51单片机怎么用汇编语言写“多个延时程序”全部的内容,包括:at89c51单片机怎么用汇编语言写“多个延时程序”、单片机中,怎么用汇编语言编写程序实现延迟40ms、单片机汇编程序怎么计算延时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10214214.html

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

发表评论

登录后才能评论

评论列表(0条)

保存