stc12c5a60s2单片机 延时函数怎么写 晶振11.0592Mhz 和 12M

stc12c5a60s2单片机 延时函数怎么写 晶振11.0592Mhz 和 12M,第1张

软件延时并不精确,我都是用一个叫dpjxjl的小软件自动生成,具体准确否,没校验过,以1MS例:STC的1T单片机12MHz:
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的值了。关于示波器的用法,找个会用的人试试就知道了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12685877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存