多简单的小程序呀:
time1ms:
mov
r6,
#2
time1:
;延时498us
mov
r7,
#248
djnz
r7,
$
;r7的为0时,程序向下运行,否则继续减
;
djnz
r6,
time1
;加上此命令后,每个小周期时间为500us
;运行两周为1ms,再加上最前面的mov
r6那条指令,就是1002ms
ret
此程序实现的是1002ms的定时,当然这当中不算主程序调用此延时程序时现场保护的时间,即压栈和出栈的时间
你可以采用单片机中的定时器/计时器,一般都是8位的,也有16位的,采用中断方式。
8位定时器中断间隔的计算:1/晶振频率x256,比如单片机采用1M频率的晶振,1/1000000x256,那么这个定时器中断2次间的间隔时间为256us(微秒)。
你只要在中断程序中用个寄存器计数,每+1就是256us,1秒约为3906个中断间隔
1RL P1 错误语法
2DJNZ R2,D1 ;这条意思是移位未8 次,转D1吧,应该是转到D1的下一条
AJMP D1 ;这是移位8次后转D1重新开始流水
ORG 0000H
MOV R2 ,#8
D1:
MOV A,#7FH
D10:
RL A
MOV P1,A
ACALL DELAY
DJNZ R2,D10
AJMP D1
DELAY:
MOV R3,#14H
MOV TMOD,#10H
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
LOOP1:
JBC TF1,LOOP2
SJMP LOOP1
LOOP2:
MOV TH1,#3CH
MOV TL1,#0B0H
DJNZ R3,LOOP1
RET
END
DELAY:MOV R7,#250 第一层循环250次
DEL1:MOV R6,#100 第二层循环100次
DEL2:MOV R5,#10 第三层循环10次
DJNZ:R5,$ 如果R5不等于0,则跳转到本行,也就是空转10次
DJNZ:R6,DL2 如果R6不等于0,则跳到DL2行,给R5赋值
DJNZ R7,DL1 如果R7不等于0,则跳到DL1行,给R6赋值
所以总的空转循环次数是25010010=250000次,通过调节R5,R6,R7值来控制延时时间
延时方法很多,用定时/计数比较方便也比较精确。如果用软件延时,则可以用循环(多重、嵌套都行)。根据时间长短确定循环次数,力求精确。时间计算以机器的晶振频率为基准,算出各指令的运行时间(每条指令运行时间乘所循环的次数就是该指令的全部运行时间),所有指令运行时间的和就是延时的时间。
比如:设晶振频率为12MHz 则每机器周期为1us
513us延时程序为
DL513: MOV R7,#0FFH ;1us
DJNZ R7,$;2us 255=510us
RET ;2us
延时时间为1+510+2=513us
延时时间较长则可以用多重循环(以四重循环为例),如:
KKKK0:MOV R2,#XX ;1us
KKKK1:MOV R3,#LL ;1usXX
KKKK2:MOV R4,#NN ;1usXXLL
KKKK3:MOV R5,#MM ;1usXXLLNN
DJNZ R5,$ ;2us XXLLNNMM
DJNZ R4,KKKK3 ;2us XXLLNN
DJNZ R3,KKKK2 ;2us XXLL
DJNZ R2,KKKK1 ;2us XX
RET ;2us
延时时间为1us+1usXX+1usXXLL+1usXXLLNN+2us XXLLNNMM+2us XXLLNN+2us XXLL+2us XX+2us
适当确定四个循环次数XX、LL、NN、MM就能得到准确的延时时间。
以上就是关于求单片机汇编6ms延时程序和1ms延时程序,谢谢!全部的内容,包括:求单片机汇编6ms延时程序和1ms延时程序,谢谢!、单片机汇编语言怎么计算延时程序的、汇编 这个程序哪里出了问题 这是个简单的流水灯程序 延时为一秒等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)