51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算过程以及详细说明,

51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算过程以及详细说明,因为我需要真正搞懂它,谢谢!)

如果单纯延时,可以用实验的办法,在keilc51里面仿真
void Delay1S(char n)
{
char i,j;
n=n*4;
for(;n;n--)
{
for(i=6;i;i++)
{
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次,一个循环共需4个时钟周期,加上第一个赋值语句1周期。
共997uS,加上外层循环,一次约1mS,
如果要精确的延时建议采用中断:
#include "reg51.h"
//timer init
void initTimer(void)
{
TMOD=0x2;
TH0=0x6;
TL0=0x6;
}
int T250uS;
char T_mark;
//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
//add your code here.
T250uS++;
T_mark=0;
}
void Delay1S(char n)
{
for(;n;n--)
for(T250uS=0;T250uS<4000;)
{
T_mark=1;
while(T_mark);
}
}
//the main fun
void main(void)
{
initTimer();
TR0=1;
ET0=1;
EA=1;
while(1)
{
Delay1S(1);
}
}追问

DELAY:MOV R7,#10 DL3:MOV R6,#200 DL2:MOV R5,#250 DL1:DJNZ R5,DL1 DJNZ R6,DL2 DJNZ R7,DL3 RET 那用这个程序帮我说明可以吗?尽量能让我明白,多谢啦!(你那个程序我暂时还看不懂)

追答

DELAY:
MOV R7,#10;执行一次0.1S,共执行10次,需1S
DL3:MOV R6,#200;执行一次需500uS,共执行200次,需10万uS,0.1S
DL2:MOV R5,#250;执行一次需2uS,从R5=250到R5=0,共执行250次,500uS
DL1:DJNZ R5 DL1;执行一次需2uS
DJNZ R6, DL2
DJNZ R7,DL3
RET
就是三层循环的嵌套,就像一个组有10个人,一个班有5个组,一个年级有8个班。问,这个年级共有多少人?
现在是总共有100万uS, DJNZ R5 DL1;执行一次需2uS。需要执行总共50万次。一个字节最大能表示的数字是255(FF),所以分成2000个250次。2000也大于255,就将2000分成了10个200。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-23
DELAY1S:
MOV R2,#10 ;1
DELAY1:
MOV R3,#200 ;1*10
DELAY2:
MOV R4,#249 ;1*199*20
DJNZ R4,$ ;2*249*199*10
DJNZ R3,DELAY2 ;2*199*10
DJNZ R2,DELAY1 ;2*10
MOV R2,#250 ;1
DJNZ R2,$ ;2*250
MOV R2,#243 ;1
DJNZ R2,$ ;2*243
RET ;2
以上注释值之和就是延时总时间:T=1000001US约1S
第2个回答  2022-10-02

延时程序,真不是设计出来的。

只能先写一个,测试一下,修改一下。

反复多次,使得误差最小。

特别是 C 语言程序,更具有不确定性。

第3个回答  2014-02-22
51单片机用汇编语言设计1S延时子程序
这个需要程序的,你有了解过吗追问

DELAY:MOV R7,#10 DL3:MOV R6,#200 DL2:MOV R5,#250 DL1:DJNZ R5,DL1 DJNZ R6,DL2 DJNZ R7,DL3 RET 那用这个程序帮我说明可以吗?尽量能让我明白,多谢啦!

相似回答