数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1442|回复: 7

[C51] SC92F84H3毫秒级软件延时函数(仅供参考)

[复制链接]
发表于 2023-8-16 12:13:23 | 显示全部楼层 |阅读模式
下面是SC92F84H3毫秒级软件延时函数,估计不太准确,所以仅供参考,时钟频率设置见后面图。


  1. void delay_ms(unsigned long ms)   //
  2. {
  3.     unsigned char a,b;
  4.     while(ms--)
  5.     for(b=50;b>0;b--)
  6.         for(a=45;a>0;a--);
  7. }
复制代码

虽说SC92F84H3是1T单片机,但使用“单片机小精灵”工具生成软件函数时,会有较大的偏差(生成的延时大约是准确时长的2倍),所以通过调整参数来尽可能地接近软延时数值。

说明:上述代码中的参数是在10ms环境下结合逻辑分析仪进行调整。也许还不够准确,望各位有兴趣的朋友进行改进。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 2023-8-16 13:36:09 来自手机浏览器 | 显示全部楼层
用stc isp里面设置好晶振,然后用真实的填进去自带工具
回复 支持 反对

使用道具 举报

发表于 2023-8-16 14:26:19 来自手机浏览器 | 显示全部楼层
赛元的芯片?
这种延时我一般看反汇编文件数指令周期数,知道一个循环大概时间,推测1mS大概需要多少个循环,如果需要比较精确,用IO翻转实测一下。
就实际应用来说,需要毫秒级死循环延时的时候不多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-16 21:29:46 | 显示全部楼层
mmxx2015 发表于 2023-8-16 14:26
赛元的芯片?
这种延时我一般看反汇编文件数指令周期数,知道一个循环大概时间,推测1mS大概需要多少个循环 ...

我不会汇编,所以只能用IO翻转实测一下,慢慢调整循环参数。
回复 支持 反对

使用道具 举报

发表于 2023-8-16 21:58:31 | 显示全部楼层
要精确延时就用定时器呀,实现不明白精确延时用指令延时的意义何在
回复 支持 反对

使用道具 举报

发表于 2023-8-16 22:00:21 | 显示全部楼层
赛元芯片也就质量差点,上手很容易,很适合新手入门,烧录仿真比手推车强太多了,就是质量太差,批量生产全靠运气。
回复 支持 反对

使用道具 举报

发表于 2023-8-16 22:49:47 | 显示全部楼层
本帖最后由 mmxx2015 于 2023-8-16 23:08 编辑
lmn2005 发表于 2023-8-16 21:29
我不会汇编,所以只能用IO翻转实测一下,慢慢调整循环参数。

其实,不需要会汇编就可以大概算一下,只要会看指令表,不过,好像赛元没有提供指令表。
一般死循环等待延时不会太长,参数不需要long那大,只需要unsigned char就够用了,你这段程序大概改成这样就简单多了:
  1. void delay_ms_v2(unsigned char ms)
  2. {
  3.         unsigned char        i,j;

  4.         
  5.         //_push_(IE);        //保存IE
  6.         //EA=0;

  7.         do
  8.         {
  9.                 i=10;        //延时时间=2T+(i*11196T)+(((i-1)*5)+3)T=12010T
  10.                 do
  11.                 {
  12.                         j=239;        //延时时间=((2+((j-1)*5)+3)+1)T=11196T
  13.                         while(--j);
  14.                         _nop_();
  15.                 }while(--i);
  16.                
  17.                 //clear_wdt();        //清看门狗
  18.                
  19.         }while(--ms);
  20.         
  21.         //_pop_(IEN0);        //恢复IE
  22. }
复制代码
这段程序会编译成这样:
  1. ; void delay_ms_v2(unsigned char ms)

  2.         RSEG  ?PR?_delay_ms_v2?MAIN
  3. _delay_ms_v2:
  4.         USING        0
  5.                         ; SOURCE LINE # 23
  6. ;---- Variable 'ms?143' assigned to Register 'R7' ----
  7. ; {
  8.                         ; SOURCE LINE # 24
  9. ?C0012:
  10. ;         unsigned char        i,j;
  11. ;
  12. ;         
  13. ;         //_push_(IE);        //保存IE
  14. ;         //EA=0;
  15. ;
  16. ;         do
  17. ;         {
  18.                         ; SOURCE LINE # 32
  19. ;
  20. ;                 i=10;        //延时时间=2T+(i*11196T)+(((i-1)*5)+3)T=12010T
  21.                         ; SOURCE LINE # 34
  22. ;---- Variable 'i?144' assigned to Register 'R6' ----
  23.         MOV          R6,#0AH ---- 2T
  24. ?C0015:
  25. ;                 do
  26. ;                 {
  27.                         ; SOURCE LINE # 36
  28. ;                         j=239;        //延时时间=((2+((j-1)*5)+3)+1)T=11196T
  29.                         ; SOURCE LINE # 37
  30. ;---- Variable 'j?145' assigned to Register 'R5' ----
  31.         MOV          R5,#0EFH ---- 2T
  32. ?C0016:
  33. ;                         while(--j);
  34.                         ; SOURCE LINE # 38
  35.         DJNZ         R5,?C0016 ---- 3T/5T
  36. ?C0017:
  37. ;                         _nop_();
  38.                         ; SOURCE LINE # 39
  39.         NOP ---- 1T
  40. ;                 }while(--i);
  41.                         ; SOURCE LINE # 40
  42.         DJNZ         R6,?C0015 ---- 3T/5T
  43. ;                 
  44. ;                 //clear_wdt();        //清看门狗
  45. ;                 
  46. ;         }while(--ms);
  47.                         ; SOURCE LINE # 44
  48.         DJNZ         R7,?C0012 ---- 3T/5T
  49. ;         
  50. ;         //_pop_(IEN0);        //恢复IE
  51. ; }
  52.                         ; SOURCE LINE # 47
  53.         RET         
  54. ; END OF _delay_ms_v2
复制代码
大部分的延时指令由DJNZ R*实现,对照指令表,DJNZ R*不跳转(=0)时用时3T,跳转(!=0)时用时5T,也就是说,延时时间=5T*(R*-1)+3T。
系统时钟=12MHz时,不考虑ms计数用时,上述程序1mS计时时间=12010T/12MHz=1.000833333333333mS。

回复 支持 反对

使用道具 举报

发表于 2023-8-16 23:16:29 来自手机浏览器 | 显示全部楼层
软件延时一般意思一下89不离十着用就ok了,要精确的话上定时器
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-25 04:25 , Processed in 0.109201 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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