求一个精准延时的函数(51单片机用)

求一个精准延时的函数(51单片机用),void delay(unsigned int t)          …

求一个精准延时的函数(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秒。

,用定时器中断来做比较“精准“的延时,除此之外别无它法,这个”精准“取决于你晶体的的温飘、误差、电压等等指标。,怎么个精准法,你要的延时最小单位是多少,你用的晶振是多少兆的,要延时精准,只是相对的精准。定时部分用汇编写,再后期调试修正。,

  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. }

复制代码

不知道这样可不可以呢?,第一、不同的单片机,比如STC12和STC8 速度就不同。你算那么精准有啥用?,第一、不同的单片机,比如STC12跟STC8就不一样。你算这么精准有啥用?
第二、同一片单片机芯片,不同的晶振频率速度也不一样。你算这么精准有啥用?
第三、相同的时钟,不同的指令,速度也不相同。你算这么精准有啥用?
第四、不同的变量长度,执行速度也不同。你算这么精准有啥用?
第五、不同的变量存放位置,执行速度也不同。你算这么精准有啥用?
第六、中断一打开,这种延迟函数 误差可能会增加250%,你算这么精准有啥用?
所以,看《人人学会单片机》课程,来学习我们的框架式编程方式。没要求的用计数延迟,有要求的必须定时器。程序里面不能这样死等、提高代码执行效率才是最需要考虑的事情。,可以用一些辅助软件计算的呢,论坛里也都有!,

1984528951 发表于 2021-1-14 15:47

怎么个精准法,你要的延时最小单位是多少,你用的晶振是多少兆的

当然是12MHZ的哟,

留住这一刻2014 发表于 2021-1-14 20:14

可以用一些辅助软件计算的呢,论坛里也都有!

是单片机小精灵吧,我知道哇,

cedtek 发表于 2021-1-14 17:11

不知道这样可不可以呢?

就是用定时器嘛,这个可以。,STC单片机的下载程序里头有软件延时程序计算器很方便,精准就呵呵了罢,除非你对精准的要求和“最美”一样随便就能拉一车。
软件写得再精准,没有精准的硬件还是不可能,难不成你是航天科技派出的探子 求一个精准延时的函数(51单片机用)插图
硬件大多都有个宽容度,大多对延时要求都不高,甚至很多步骤省去也能正常工作的,你可以调试好硬件后对单片机的主频(软件写或硬改晶振)动一下试试就知道了。,STC下载器有专用的软件延时,直接生成C或者汇编就可以了
就算是一样的时钟,不同的STC系列延时都不一样的
想要真正的精准,直接上汇编

作者: soufei

为您推荐


Fatal error: Can't use function return value in write context in /www/wwwroot/www.qianrushi.com.cn/wp-content/themes/news/footer.php on line 115