xueyeteng 发表于 2023-6-21 11:36:27

KeilC写了一个STC8系列的软件延时程序,有需要的可以参考一下。

本帖最后由 xueyeteng 于 2023-10-20 08:53 编辑

写了个STC8系列的软件延时程序不知道咱们坛子里有没有,转过来,谁需要可以拿去。用的时候把主频改一下,keil的代码优先级设为默认8即可。这个程序每次调用比实际需要多5个机器周期。懒得弄了。一般用途也够了。


#define MainFosc 35 // 定义晶振的主频(MHz)
#define DelayCount (MainFosc/3)-1 //取得主频除3的整数部分-1
#define DelayRemainder MainFosc%3 //取得主频除3的余数部分

/*----------------------------
延时函数 1us*N 适用于STC8系列Y6指令集
延时 t us,就是延时 round(t * CPU / SPEED) 个机器周期
CPU=主频/SPEED=1或12 表示单片机机器周期与时钟周期的比值 STC8为1 即时钟周期=机器周期
t:0~65535(unsigned int) 0~255(unsigned char)
Code:xueyeteng(引用请保留)
----------------------------*/

void Delay(unsigned int t)
{
    unsigned char i ;
    //未考虑首us的跳转和程序返回的call+RET共6个时钟周期时,每调用一次该函数会额外多5个机器周期(后续比较时找回一个差距)
    do      //每个do while 循环运行MainFosc个时钟周期
    {
      i = DelayCount;//对应汇编代码MOV 消耗1个时钟周期 赋值i=0时消耗2个周期,即多一个CLR
      #if (DelayRemainder==1)//补齐空指令
            _nop_();
      #elif (DelayRemainder==2)
            _nop_();_nop_();
      #endif
      while (--i); //对应汇编代码DJNZ, i-1个跳转+1个不跳转 共T1=(i-1)*3+2个时钟=3i-1               
    } while (--t);//对应汇编代码DJNZ , t-1个(循环体消耗的时间+跳转)+1个(循环体消耗的时间+不跳转)即(t-1)*(T1+3)+(T1+2)=t*(T1+3)-1=t*(3i+2)-1=35t
}

神农鼎 发表于 2023-6-21 13:32:53

感谢,也帮查下我们下面这个软件哪些地方需要改善的


xueyeteng 发表于 2023-6-22 20:52:18

神农鼎 发表于 2023-6-21 13:32
感谢,也帮查下我们下面这个软件哪些地方需要改善的
客气,软件写的延时程序其实很准,但调用起来不太方便。所以改了一下。

wangxiangtan 发表于 2024-1-18 10:04:10

厉害了,

lezjin 发表于 2024-4-13 14:45:12

你好,请问如果是11.0592或者22.1184的频率,主频那里应该怎么设置,

xueyeteng 发表于 2024-4-15 07:43:58

lezjin 发表于 2024-4-13 14:45
你好,请问如果是11.0592或者22.1184的频率,主频那里应该怎么设置,

我这个函数本身就不是很精准,你就按11和22设置就行。如果要求很准的话,你可以在这个函数基础上改造一下

lezjin 发表于 2024-4-15 07:54:46

xueyeteng 发表于 2024-4-15 07:43
我这个函数本身就不是很精准,你就按11和22设置就行。如果要求很准的话,你可以在这个函数基础上改造一下 ...

好的 ,谢谢,了解了,也不需要太准确,另外昨天我把这个和官方的毫秒延时程序弄到一起,用的时候编译不通过,提示是#if条件编译这里不通过, 还没看咋回事
页: [1]
查看完整版本: KeilC写了一个STC8系列的软件延时程序,有需要的可以参考一下。