多简单的小程序呀:
TIME1MS:
MOV R6, #2
TIME1:
;延时498uS
MOV R7, #248
DJNZ R7, $ ;R7的为0时,程序向下运行,否则继续减
;
DJNZ R6, TIME1 ;加上此命令后,每个小周期时间为500uS
;运行两周为1MS,再加上最前面的MOV R6那条指令,就是1002MS
RET
此程序实现的是1002MS的定时,当然这当中不算主程序调用此延时程序时现场保护的时间,即压栈和出栈的时间
几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响。
500ms延时子程序程序:(晶振12MHz,一个机器周期1us。)
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
扩展资料
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。
频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。
51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12(1/ 晶振频率)= x μs。常用单片机的晶振为110592MHz,12MHz,24MHz。
其中110592MHz的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
用中断,定时器工作方式1,计数最大数为65536,那么从15536开始计数,达到65536要计50000次,6M的晶振机器周期为2微秒,那么溢出一次耗时为100000微秒,计数溢出10次即为1秒钟
ORG 000BH
AJMP TIME0
ORG 30H
MAIN:
MOV 30H,#00H;先把30H地址的数据清零,用做给溢出计数用
MOV TMOD,#00000001B
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
LOOP:AJMP LOOP
TIME0:PUSH ACC
PUSH PSW
INC 30H;进入中断后就自增
MOV A,30H
CJNE A,#10,T_RET;看计数器的溢出到了10次没,没有就跳到T_RET再继续从15536计数
T_L1:延时1秒到了,写自己的程序吧。
MOV 30H,#00H;记得把溢出计数器再次清零
T_RET:MOV TH0,#3CH
MOV TL0,#0B0H
POP PSW
POP ACC
RETI
END
以上就是关于找一个单片机汇编语言编写的延时1ms的子程序全部的内容,包括:找一个单片机汇编语言编写的延时1ms的子程序、【急求】设计一个延时大约0.5秒的延时子程序(晶振频率12HZ);要求:限用ASM51语言编写程序,、晶振为6Mhz 编写一个1S延时的子程序 用汇编 要方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)