#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,下一步打算玩玩这些。