STC系列单片机软件延时,ms级较精确

#include <reg51.H>

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

#define Fosc 12000000UL // 此处修改为实际所用晶振的频率(Hz)
#define Core STC_Y5 // 此处修改为对应的芯片内核版本

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

void main()
{
    delay_ms(1);
}

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

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

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

发文的时候STC已经出了Y6内核(STC8)。不过手上没有STC的新片,之后的坑就留给大家自己填了。手头这些STC15系列的还没怎么玩。况且还有一堆mega8/16 另外有几片msp430,stm8/32,下一步打算玩玩这些。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值