void delay(void) //误差 0us
{
unsigned char a,b;
for(b=129;b>0;b--)
for(a=45;a>0;a--);
}
1T单片机110592MHz:
void delay(void) //误差 -0018084490741us
{
unsigned char a,b,c;
for(c=8;c>0;c--)
for(b=197;b>0;b--)
for(a=2;a>0;a--);
};晶振24M
DELAY1s: ;子程序
mov A,R4
jz enddelay
MOV R5,#10H ; ∵ 1s=200000005us
MOV R6,#43H ; ∴ 2000000/2=1000000
MOV R7,#40H ; 1000000用16进制表示为: 0f4240
; 所以 R5=0fH+1=10H
; R6=042H+1=043H
; R7=40H
loop: DJNZ R7,$ ; 延时时间≈2×[(R5-1)×256+R6-1]×256+R7
DJNZ R6,loop ; 当R5、R6等于0,相当于256参与运算
DJNZ R5,loop ; 当R5、R6等于0,相当于256参与运算
DJNZ R4,DELAY1s
enddelay: RET
上面是延时子程序,基础延时是1s,调用前给R4赋值,R4的值就是延时的秒数,比如:
mov R4,#3 ;表示延时3秒
lcall DELAY1s
void delay_1us(void)
{
unsigned char i;
for(i=0;i<N;i++);//其中N的值根据延时需要设定
}
由于延时时间很短,建议用示波器测试下,根据具体要求设定N的取值。
你手头有硬件没有?简单的单片机电路板就可以,你可以写个简单的程序调用延时1us的函数,产生一个周期2us的方波从单片机的某个管脚输出,然后用示波器测试这个管脚就可以确定N的值了。关于示波器的用法,找个会用的人试试就知道了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)