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

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:364
  • 最近打卡:2025-05-01 09:26:00

1

主题

22

回帖

1751

积分

金牌会员

积分
1751
发表于 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. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:364
  • 最近打卡:2025-05-01 09:26:00

1

主题

22

回帖

1751

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:512
  • 最近打卡:2025-05-01 09:14:27

21

主题

564

回帖

2674

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:364
  • 最近打卡:2025-05-01 09:26:00

1

主题

22

回帖

1751

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:34 , Processed in 0.170270 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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