查看: 2888|回复: 12

[其他] 每天解决一个问题18:C语言精确微秒级的延时

[复制链接]

该用户从未签到

33

主题

292

帖子

0

高级会员

Rank: 4

积分
600
最后登录
2016-4-19
发表于 2015-9-20 19:25:45 | 显示全部楼层 |阅读模式

转载自:https://www.eefocus.com/luo_xinli/blog/14-08/305539_30827.html

在使用C语言编程时延时程序是非常常见的,但是实现一个精确的延时是不太容易的,在给一个朋友的公司产品做维护时,发现一段代码,可以实现微妙级的延时。看起来代码非常简单。但是我以前没有想到过。我们一起来看看这段代码。



//-----------------------------------------------------------------------------

// Delay_us

//-----------------------------------------------------------------------------

//

// Return Value : None

// Parameters   : 1. time_us - time delay in microseconds

//                   range: 1 to 255

//

// Creates a delay for the specified time (in microseconds) using TIMER2. The

// time tolerance is approximately +/-50 ns (1/SYSCLK + function call time).

//

//-----------------------------------------------------------------------------

void Delay_us (unsigned char time_us)

{

   unsigned long int  TM_LODAE;

   TR2   = 0;                          // Stop timer

   TF2H  = 0;                          // Clear timer overflow flag


   TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);


  // TMR2  = -( (UINT)(SYSCLK/1000000) * (UINT)(time_us) );


  TMR2H =  TM_LODAE>>8;

  TMR2L        =  TM_LODAE&0x00FF;

   TR2   = 1;                          // Start timer

   while (!TF2H);                      // Wait till timer overflow occurs

   TR2   = 0;                          // Stop timer

}


前面一起住航分析一下该代码,

  • unsigned long int  TM_LODAE;  声明一个长整型数据,
  • TR2   = 0;    定时器2停止计时
  • TF2H  = 0;      清除定时器2中断标志
  •   TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);    计算定时器的初值。 SYSCLK是系统的晶振频率,SYSCLK/1000000是系统 1uS 执行的指令数。 (UINT)(SYSCLK/1000000) * (UINT)(time_us)就是系统 time_us执行的指令数。 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us)定时器需要 TM_LODAE指令周期才会溢出。该单片机的一个指令周期就是一个时钟周期。
  • TMR2H =  TM_LODAE>>8;  TMR2L        =  TM_LODAE&0x00FF;置定时器寄存器的初值、
  • TR2   = 1;   启动单片机计时
  •   while (!TF2H);                等待定时器2寄存器溢出。
  • TR2   = 0;停止计时
  • 在这段代码注释中已经说明了应该有50nS的误差,这个是函数调用产生的。这段代码在需要精确定时的场合非常实用!

我知道答案 目前已有12人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2020-5-24 10:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    140

    主题

    2087

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3913
    最后登录
    2020-5-24
    发表于 2015-9-20 19:56:49 | 显示全部楼层
    谢谢分享学习一下
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-5-24 10:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    140

    主题

    2087

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3913
    最后登录
    2020-5-24
    发表于 2015-9-20 19:57:13 | 显示全部楼层
    arduino C能做到不?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-9-20 21:39:32 | 显示全部楼层
    只有使用硬件定时器做事比较准确
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    33

    主题

    292

    帖子

    0

    高级会员

    Rank: 4

    积分
    600
    最后登录
    2016-4-19
     楼主| 发表于 2015-9-20 22:25:39 | 显示全部楼层
    anger0925 发表于 2015-9-20 21:39
    只有使用硬件定时器做事比较准确

    肯定的呀,软件毕竟有局限性
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-9-20 23:09:39 | 显示全部楼层
    你这是51的。。
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2015-9-20 23:55:08 | 显示全部楼层
    看看有帮助没有

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-21 06:54:09 | 显示全部楼层
    学习了,谢谢分享
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    250

    帖子

    0

    高级会员

    Rank: 4

    积分
    628
    最后登录
    2016-5-3
    发表于 2015-10-16 20:39:57 | 显示全部楼层

    貌似还不错哦,收下了先
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    556

    帖子

    0

    禁止发言

    积分
    735
    最后登录
    2016-7-17
    发表于 2015-10-17 19:26:32 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 15:51 , Processed in 0.109364 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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