求一个51单片机延时1秒的程序,用汇编!!

我是初学者,不太会!求一个51单片机延时1秒的程序,用汇编!用软件的方法

DEL1S:MOV R7,#10
D1: MOV R6,#200
D2: MOV R5,#250
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET

说明:1、如果不使用R5、R6、R7可以用别的单元替换,比如换成30H、31H、32H等等
2、这个程序是12M时钟,如果时钟不同,要修改数值。如6M时钟,要把MOV R7,#10 修改成:MOV R7,#5
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-09
时钟频率为12MHz的一秒延时汇编代码(8051):机器周期T=(1/12M)*12=1us
因为一个机器周期=6个接拍、1个节拍=2个时钟周期,这是机器周期的定义。
ORG 1000H
MOV R5, #4
L3: MOV R6, #250 ;1T
L2: MOV R7, #200 ;1T
L1: NOP ;1T
NOP ;1T
NOP ;1T
DJNZ R7, L1 ;(1+1+1+2)*200T=1ms
DJNZ R6, L2 ;{1+2+(1+1+1+2)*200}*250T=250750us
DJNZ R5, L3 ;(3+250750)*4=1003012us=1.003012s
RET
END
仅供参考,期中R7可以设成256,误差会小点,这为了好算就设成200。
第2个回答  2010-06-09
如果用6M晶振的话,一个机器周期为2*10(-6)s
那么1s=2*500000
2*500000=250*200*10

DELAY: mov r5,#10 ;延时子程序
D1: mov r1,#200
D2: mov r2,#250
djnz r2,$
djnz r1,d2
djnz r5,r1
ret

51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算...
for(j=7;j;j++) \/\/ 一个循环约为1mS ;} } } 看编译后的汇编:C:0x0805 7D01 MOV R5,#0x06;j=1,1时钟 C:0x0807 0D INC R5;j++,1时钟 C:0x0808 ED MOV A,R5;A=R5,1时钟 C:0x0809 70FC JNZ C:0807;A=0?,2时钟 循环共249次...

51单片机中,写个延时函数,延时1ms,该怎么写,为什么?
void delay(unsigned char i) \/\/延时程序{ unsigned char i,k;for(j=i;j>0;j--) for(k=125;k>0;k--);}

单片机51软件延时1s 晶振6M的编程
DEL1S: MOV R1,#10 DEL1: MOV R2,#100 DEL2: MOV R3,#250 DEL3: DJNZ R3,DEL3 ;2*2*250*100*10=1000000us DJNZ R2,DEL2 DJNZ R1,DEL1 RET 没有做具体计算,要准确的定时1s的话可以稍微改动一下R1R2R3的值。6M晶振则机器周期为2us,一条指令执行为2个机器周期,由此得出其延时时...

延时1秒 单片机 汇编语言
用定时器T0来完成 那么我令T0的溢出时间为200us 那么T0的初值为56 1(s)=200*250*2(us)下面是程序 ORG 0000H LJMP MAIN ORG 000BH LJMP CTC0 ORG 100H MIAN:MOV SP,#5FH MOV R7,#250;软件计数第一级 MOV R6,#2;软件计数第二级 MOV TL0,#56;送初值 MOV TH0,#56;ANL TOMD,#...

51单片机 用c语言 调用-nop- 编一个 延时一秒 程序
如果你换个编译器,比如从keil转到wave,又不能确定时间是否一致;其实你到网上看看,对于时间要求很严格的地方,延时程序基本都是汇编写的,大不了是C和汇编嵌套,或者用定时器;如果你说的是大概一秒的话,那么你百度一下就是一大堆;我做个一个表,即使用定时器,藐视很准确,其实走上一天可能就差...

51单片机使用汇编语言循环延迟时间怎么算?
时间精确的延时程序要用汇编语言来编写。计算延迟时间要查询每一条程序的执行周期数,然后加起来就是了。在12m晶振的系统中,每个机器周期是1微秒借用一下:举例来说明吧:delay: mov r0,#10 ;1(周期)delay1: mov r1,#100 ;1 djnz r1,$ ;2 djnz r0,delay1 ;2 ret ;2周期数=1+((1+(2*100)+2)*10...

一个51单片机软件延时问题
程序延时本来就是一个大概的数。这个也不是很准的。中间的for循环120次大约是962周期,加上每次循环前后的“准备工作”,再加上函数调用\/返回的时间,接近1Ms.实没为993个周期。如果把for循环次数改为121,则参数1的延时为1001个机器周期。

AT89C51单片机,如何实现延迟一秒
定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 \/\/ 1ms延时(12.0MHz){ TR0=0;ET0=0;TH0=0xfc;TL0=0x18;if(delayTimes1!=0) delayTimes1--;TR0=1;ET0=1;} 调用程序大致为:if(delay_flag==0){ delay_flag=1;delayTime...

51单片机,用定时器中断,在P1口实现1S移动一次的流水灯,用汇编语言编写...
timetemp: DS 1 LED: DS 1 CSEG AT 00H ORG 0000H LJMP START ORG 000BH LJMP Timer0Interrupt START:MOV SP,#60H MOV timetemp,#20 MOV P1,#0FFH;LED低电平点亮 LCALL InitTimer0 MOV LED,#0FEH LOOP:MOV P1,LED ;add your code here!LJMP LOOP InitTimer0:MOV TMO...

51单片机延时函数的问题。晶振是12MHz..需要延时1秒
很明显 远远超过了1个最小指令.9秒的的误差算少的了...所以说,假如你要做1s的延迟, 最好使用内部时钟中断来做,直接在程序内部delay延时的话,占用系统资源还算不准...具体解释下上图, 为了拿这5分还真不容易...首先, 进入函数就需要5个汇编指令, 这些指令主要是入栈,备份指针的操作, 不同的...

相似回答