找回密码
 立即注册
查看: 798|回复: 6

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

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 102 天

    [LV.6]常住居民II

    1

    主题

    20

    回帖

    673

    积分

    高级会员

    积分
    673
    发表于 2023-6-21 11:36:27 | 显示全部楼层 |阅读模式
    本帖最后由 xueyeteng 于 2023-10-20 08:53 编辑

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


    1. #define MainFosc 35 // 定义晶振的主频(MHz)
    2. #define DelayCount (MainFosc/3)-1 //取得主频除3的整数部分-1
    3. #define DelayRemainder MainFosc%3 //取得主频除3的余数部分
    4. /*----------------------------
    5. 延时函数 1us*N 适用于STC8系列Y6指令集
    6. 延时 t us,就是延时 round(t * CPU / SPEED) 个机器周期
    7. CPU=主频/SPEED=1或12 表示单片机机器周期与时钟周期的比值 STC8为1 即时钟周期=机器周期
    8. t:0~65535(unsigned int) 0~255(unsigned char)
    9. Code:xueyeteng(引用请保留)
    10. ----------------------------*/
    11. void Delay(unsigned int t)
    12. {
    13.     unsigned char i ;
    14.     //未考虑首us的跳转和程序返回的call+RET共6个时钟周期时,每调用一次该函数会额外多5个机器周期(后续比较时找回一个差距)
    15.     do      //每个do while 循环运行MainFosc个时钟周期
    16.     {
    17.         i = DelayCount;//对应汇编代码MOV 消耗1个时钟周期 赋值i=0时消耗2个周期,即多一个CLR
    18.         #if (DelayRemainder==1)//补齐空指令
    19.             _nop_();
    20.         #elif (DelayRemainder==2)
    21.             _nop_();_nop_();
    22.         #endif
    23.         while (--i); //对应汇编代码DJNZ, i-1个跳转+1个不跳转 共T1=(i-1)*3+2个时钟=3i-1               
    24.     } while (--t);//对应汇编代码DJNZ , t-1个(循环体消耗的时间+跳转)+1个(循环体消耗的时间+不跳转)即(t-1)*(T1+3)+(T1+2)=t*(T1+3)-1=t*(3i+2)-1=35t
    25. }
    复制代码


    回复 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9297

    回帖

    1万

    积分

    管理员

    积分
    14043
    发表于 2023-6-21 13:32:53 | 显示全部楼层
    感谢,也帮查下我们下面这个软件哪些地方需要改善的
    1.png

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 102 天

    [LV.6]常住居民II

    1

    主题

    20

    回帖

    673

    积分

    高级会员

    积分
    673
     楼主| 发表于 2023-6-22 20:52:18 | 显示全部楼层
    神农鼎 发表于 2023-6-21 13:32
    感谢,也帮查下我们下面这个软件哪些地方需要改善的

    客气,软件写的延时程序其实很准,但调用起来不太方便。所以改了一下。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 07:41
  • 签到天数: 159 天

    [LV.7]常住居民III

    12

    主题

    341

    回帖

    1076

    积分

    金牌会员

    积分
    1076
    发表于 2024-1-18 10:04:10 | 显示全部楼层
    厉害了,
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 05:07
  • 签到天数: 55 天

    [LV.5]常住居民I

    4

    主题

    129

    回帖

    279

    积分

    中级会员

    积分
    279
    发表于 2024-4-13 14:45:12 | 显示全部楼层
    你好,请问如果是11.0592或者22.1184的频率,主频那里应该怎么设置,
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 102 天

    [LV.6]常住居民II

    1

    主题

    20

    回帖

    673

    积分

    高级会员

    积分
    673
     楼主| 发表于 2024-4-15 07:43:58 | 显示全部楼层
    lezjin 发表于 2024-4-13 14:45
    你好,请问如果是11.0592或者22.1184的频率,主频那里应该怎么设置,

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 05:07
  • 签到天数: 55 天

    [LV.5]常住居民I

    4

    主题

    129

    回帖

    279

    积分

    中级会员

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

    好的 ,谢谢,了解了,也不需要太准确,另外昨天我把这个和官方的毫秒延时程序弄到一起,用的时候编译不通过,提示是#if条件编译这里不通过, 还没看咋回事
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 05:01 , Processed in 0.063530 second(s), 55 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表