`

STC51单片机延时函数

阅读更多
#define STC_Y1  97560UL  // 89C/LEXX、90C/LEXX
#define STC_Y3  14050UL  // 10F/Lxx、11F/Lxx 、12C/LExx、15F104E/L104E(A版)、15F204E/L204EA(A版)
#define STC_Y5  13043UL  // 15F/L/Wxx(Y3内核个别型号除外)

#define Fosc 12000000UL  // 主频频率
#define Core STC_Y5      // 内核型号

/**
 *  功能:延时t毫秒
 *  入参:0~65535
 */
void delay_ms(unsigned int t)
{
    unsigned int i;
    do{
        i = (unsigned int)(Fosc / Core);
        while(--i);
    }while(--t);
}

 取个最大值看看延时误差就行了,t = 65000 ,误差才几十us,较一般的延时准确度已经很高了。

至于最开始的宏定义,看似magic number,其实就是debug得到汇编代码,得到调用函数到返回函数执行的所有指令,然后根据各个内核的指令速度稍作修改就可以了。这几个数可以在一定范围内修改,因为

Fosc/Core是个浮点数,最后做了一下取整,好在这一套操作是在编译时期就解决了,对性能没有影响。

发文的时候STC已经出Y6内核了。不过手上没有STC的新片,估计以后也不会有了,手头这些STC15系列的还没怎么玩。况且还有一堆mega8/16 另外有几片msp430,stm8/32,下一步打算玩玩这些。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics