标题: 求一个精准延时的函数(51单片机用) [打印本页]

作者: 测控系吴~    时间: 2021-1-14 13:18
标题: 求一个精准延时的函数(51单片机用)
void delay(unsigned int t)                                
{
    unsigned int i,j;
        for(i=t;i>0;i--)                     
    for(j=112;j>0;j--);
}

类似于这种,输入变量t, 就延时t毫秒,delay(1000)就是延时1秒。


作者: 名字不是重点    时间: 2021-1-14 15:18
用定时器中断来做比较“精准“的延时,除此之外别无它法,这个”精准“取决于你晶体的的温飘、误差、电压等等指标。
作者: 1984528951    时间: 2021-1-14 15:47
怎么个精准法,你要的延时最小单位是多少,你用的晶振是多少兆的
作者: munuc_w    时间: 2021-1-14 16:20
要延时精准,只是相对的精准。定时部分用汇编写,再后期调试修正。
作者: cedtek    时间: 2021-1-14 17:11
  1. // 全局变量,ms时标
  2. unsigned char xms = 0;

  3. // 定时函数
  4. void delay(unsigned int t) {
  5.     TR0 = 1; // 定时器 T0 开始计时
  6.     while (xms != t); // 直至计时至 t ms 退出
  7. }

  8. // 定时器 T0 初始化
  9. void t0_init() {
  10.     TMOD = 0x02; // 定时器 T0,方式 2
  11.     TH0 = (256-200)%256; // 定时200us 初值
  12.     TL0 = (256-200)%256;
  13.     EA = 1;
  14.     ET0 = 1;
  15.     TR0 = 0;
  16. }

  17. void t0_srv() interrupt 1 {
  18.     static unsigned char 200us = 0;
  19.     200us++;
  20.     if (200us == 5) {
  21.         xms++;
  22.         200us = 0;
  23.     }
  24. }
复制代码


不知道这样可不可以呢?
作者: 人人学会单片机    时间: 2021-1-14 18:25
第一、不同的单片机,比如STC12和STC8 速度就不同。你算那么精准有啥用?
作者: 人人学会单片机    时间: 2021-1-14 18:31
第一、不同的单片机,比如STC12跟STC8就不一样。你算这么精准有啥用?
第二、同一片单片机芯片,不同的晶振频率速度也不一样。你算这么精准有啥用?
第三、相同的时钟,不同的指令,速度也不相同。你算这么精准有啥用?
第四、不同的变量长度,执行速度也不同。你算这么精准有啥用?
第五、不同的变量存放位置,执行速度也不同。你算这么精准有啥用?
第六、中断一打开,这种延迟函数 误差可能会增加250%,你算这么精准有啥用?
所以,看《人人学会单片机》课程,来学习我们的框架式编程方式。没要求的用计数延迟,有要求的必须定时器。程序里面不能这样死等、提高代码执行效率才是最需要考虑的事情。
作者: 留住这一刻2014    时间: 2021-1-14 20:14
可以用一些辅助软件计算的呢,论坛里也都有!
作者: 测控系吴~    时间: 2021-1-14 20:34
1984528951 发表于 2021-1-14 15:47
怎么个精准法,你要的延时最小单位是多少,你用的晶振是多少兆的

当然是12MHZ的哟
作者: 测控系吴~    时间: 2021-1-14 20:35
留住这一刻2014 发表于 2021-1-14 20:14
可以用一些辅助软件计算的呢,论坛里也都有!

是单片机小精灵吧,我知道哇
作者: 测控系吴~    时间: 2021-1-14 20:36
cedtek 发表于 2021-1-14 17:11
不知道这样可不可以呢?

就是用定时器嘛,这个可以。
作者: weijoyer    时间: 2021-1-14 21:37
STC单片机的下载程序里头有软件延时程序计算器很方便
作者: man1234567    时间: 2021-1-14 22:57
精准就呵呵了罢,除非你对精准的要求和“最美”一样随便就能拉一车。
软件写得再精准,没有精准的硬件还是不可能,难不成你是航天科技派出的探子
硬件大多都有个宽容度,大多对延时要求都不高,甚至很多步骤省去也能正常工作的,你可以调试好硬件后对单片机的主频(软件写或硬改晶振)动一下试试就知道了。
作者: Y_G_G    时间: 2021-1-15 08:53
STC下载器有专用的软件延时,直接生成C或者汇编就可以了
就算是一样的时钟,不同的STC系列延时都不一样的
想要真正的精准,直接上汇编
作者: 2890069    时间: 2021-1-15 15:02
用汇编吧,可以自己计算每条指令的时间
作者: 测控系吴~    时间: 2021-1-16 21:21
人人学会单片机 发表于 2021-1-14 18:31
第一、不同的单片机,比如STC12跟STC8就不一样。你算这么精准有啥用?
第二、同一片单片机芯片,不同的晶 ...

嗯,有道理哟
作者: 梁廷明    时间: 2021-1-18 15:41
定时器一开,误差值偏大的
作者: YinSh    时间: 2021-1-18 16:27
汇编可能会相对精准一些
作者: 袁木子爱学习    时间: 2021-1-18 16:59
要延时精准,只是相对的精准。不同的单片机是不同的。
作者: jchrui    时间: 2021-1-25 17:05
和你的晶振有关系,晶振的频率越高精度越高。
作者: 学生1    时间: 2021-1-27 11:37
利用定时器进行延时精确,其它的延时都有一定的误差
作者: wufa1986    时间: 2021-1-27 13:45
打开STC官方软件延时比较靠谱,前提是程序不能由中断响应

作者: 317285178    时间: 2021-1-27 14:46
取决于晶振,采用外部晶振准确度较高,但是一般ms级延时,内部晶振可以了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1