数码之家

 找回密码
 立即注册
搜索
查看: 2173|回复: 15

[C51] C51精确延时

[复制链接]
发表于 2019-12-27 10:20:04 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x

在开发中有时候需要同外部芯片进行通信,此时对时序要求很高,希望延时准确,下面是经过实测的12T 51单片机延时语句。

/**********************  void Delay10us() **********************
时钟为11.0592MHz时, 调用该函数延时9.77us,调用两次延时19.53us
可以在多个Delay10us()间加入_nop_()指令, _nop_()指令延时1.08us
1 如延时30us, 如下调用实际延时30.39us:
   _nop_();
   Delay10us();
   Delay10us();
   Delay10us();
2 如延时40us, 如下调用实际延时40.14us:
   _nop_();
   Delay10us();
   Delay10us();
   Delay10us();
   Delay10us();
****************************************************************/
void Delay10us()
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

/**********************  void Delay100us() **********************
时钟为11.0592MHz时, 调用该函数延时99.83us
****************************************************************/
void Delay100us()
{
  Delay10us();
  Delay10us();
  Delay10us();
  Delay10us();
  Delay10us();
  Delay10us();
  Delay10us();
  Delay10us();
  Delay10us();
  Delay10us();
}

/**********************  void Delay1ms() **********************
时钟为11.0592MHz时, 调用该函数延时1000.5us
****************************************************************/
void Delay1ms()
{
  unsigned char i;

  for(i=0; i<229; i++)
  {
    _nop_();
  }
}

/**********************  void Delay10ms() **********************
时钟为11.0592MHz时, 调用该函数延时10006us
****************************************************************/
void Delay10ms()
{
  Delay1ms();  
  Delay1ms();
  Delay1ms();
  Delay1ms();
  Delay1ms();
  Delay1ms();
  Delay1ms();
  Delay1ms();
  Delay1ms();
  Delay1ms();  
}

/**********************  void DelayX10ms() *********************
时钟为11.0592MHz时, 调用该函数延时N(N<=255)倍的10ms
****************************************************************/
void DelayX10ms(unsigned char nCount)
{
   while(nCount--)
   {
     Delay10ms();
   }
}


打赏

参与人数 1家元 +10 收起 理由
人艰不拆了 + 10

查看全部打赏

发表于 2019-12-27 10:28:21 | 显示全部楼层
哈哈,还是不很精确啊:loveliness:
回复 支持 反对

使用道具 举报

发表于 2019-12-27 10:45:55 | 显示全部楼层
晶振的精度也是个问题
回复 支持 反对

使用道具 举报

发表于 2019-12-27 11:48:04 | 显示全部楼层
精确延时要用定时器,这样还是不准的。

打赏

参与人数 1家元 +20 收起 理由
杨雪飞 + 20 我很贊同

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-27 11:49:40 | 显示全部楼层
netbeetle 发表于 2019-12-27 11:48
精确延时要用定时器,这样还是不准的。

用途不同,适合的就是最好的。
回复 支持 反对

使用道具 举报

发表于 2019-12-27 13:49:48 | 显示全部楼层
STC-ISP软件里有啊,输入想要的延时和时钟,选择什么类型的单片机,自动生成啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-27 15:54:37 | 显示全部楼层
水表君 发表于 2019-12-27 13:49
STC-ISP软件里有啊,输入想要的延时和时钟,选择什么类型的单片机,自动生成啊 ...

学习了,谢谢!
回复 支持 反对

使用道具 举报

发表于 2019-12-27 17:32:36 | 显示全部楼层
楼上+1,STC ISP软件上面的就很好用。。
回复 支持 反对

使用道具 举报

发表于 2019-12-27 18:13:18 | 显示全部楼层
以内部RC的精度来说根本不存在精确延时
回复 支持 反对

使用道具 举报

发表于 2019-12-27 21:00:50 | 显示全部楼层
netbeetle 发表于 2019-12-27 11:48
精确延时要用定时器,这样还是不准的。

定时器的真的是最精确的也是最专业的,只可惜,一群业余的教师出了N多的教程,全特么减法延时,跟开发板学了很多年,回头看看真特么是浪费时间,只是记住了一些名词。
回复 支持 反对

使用道具 举报

发表于 2019-12-27 22:20:55 | 显示全部楼层
这个要在实际的应用中用逻辑分析仪看,最准确。
回复 支持 反对

使用道具 举报

发表于 2019-12-28 09:30:03 来自手机浏览器 | 显示全部楼层
满屏的delay,这程序就不会好用了。
回复 支持 反对

使用道具 举报

发表于 2019-12-28 12:57:15 | 显示全部楼层
用delay函数不会精确到哪里去,而且发现好多外置晶振的精度也很差,还不如内置振荡器的精度。
回复 支持 反对

使用道具 举报

发表于 2020-2-7 20:36:08 | 显示全部楼层
学习了,确实只知道用delay,定时器基本是一脸懵B
回复 支持 反对

使用道具 举报

发表于 2020-2-8 11:01:12 | 显示全部楼层
万一刚好错过喂狗,那就...
回复 支持 反对

使用道具 举报

发表于 2020-3-1 00:32:38 | 显示全部楼层
还是用定时器最好
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-6 02:40 , Processed in 0.421201 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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