DELAY:
MOVR3,#100;2
DLY0:
MOVR2,#249;2*100
DLY1:
DJNZR2,DLY1;249*2*100
MOVR2,#248;2*100
DLY2:
DJNZR2,DLY2;248*2*100
DJNZR3,DLY0;2*100
RET;2
以上假设12M晶振,延时共2+(249*2+2+248*2)*100+2=100004微妙=100.004毫秒
嘿嘿先给你改个错误:在使用6MHz晶振时,1个机器周期为1us,是不对的。
51单片机在使用6MHz晶振时1个机器周期=12/6MHz=2us
可以编写100ms延时子程序调用子程序YS100MS就可以延时100ms
YS100MS:MOVR7,#100
L1:MOVR6,#250
DJNZR6,$;
DJNZR7,L1
RET
延时时间=(R6*2*2us)*R7=(250*2*2us)*100=100000us=100ms
呵呵满意就选满意回答
voidDelay100ms()//@11.0592MHz
{
unsignedchari,j,k;
_nop_();
_nop_();
i=5;
j=52;
k=195;
do
{
do
{
while(--k);
}while(--j);
}while(--i);
}
这是一个100ms的程序,你调用10次就是1s了。
通用办法,可以类推:
1
2
3
4
5
6
7
8
9
10
11
DELAY1s:
MOVR5,#08H;∵1s=1000000us
MOVR6,#0A2H;∴1000000/2=500000
MOVR7,#20H;500000用16进制表示为:07A120
;所以R5=07H+1=08H
;R6=0A1H+1=0A2H
;R7=20H
loop:DJNZR7,$;延时时间≈2*[(R5-1)*256+R6-1]*256+R7
DJNZR6,loop;当R5、R6等于0,相当于256参与运算
DJNZR5,loop;当R5、R6等于0,相当于256参与运算
RET
机器周期=12/6MHz=2μs
定时100ms的计数值=100ms/2μs=50000
设T1工作于方式1(16位计数器)
计数初值=2^16-50000=65536=15536=3CB0H
MOVTMOD,#10H;;T1工作方式1、定时模式
MOVTH1,#3CH;;写入计数初值高8位
MOVTL1,#B0H;;写入计数初值低8位
SETBTR1;;启动T1,开始计时
SETBET1;;允许T中断
SETBEA;;CPU开中断
SJMP$;;等待T1计时溢出中断
通用办法,可以类推:1234567891011DELAY1s:MOVR5,#08H;∵1s=1000000usMOVR6,#0A2H;∴1000000/2=500000MOVR7,#20H;500000用16进制表示为:07A120;所以R5=07H+1=08H;R6=0A1H+1=0A2H;R7=20Hloop:DJNZR7,$;延时时间≈2*[(R5-1)*256+R6-1]*256+R7DJNZR6,loop;当R5、R6等于0,相当于256参与运算DJNZR5,loop;当R5、R6等于0,相当于256参与运算RET。