找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2135|回复: 22
收起左侧

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

  [复制链接]
回帖奖励 10 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:584041 发表于 2021-1-14 13:18 | 显示全部楼层 |阅读模式
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秒。

回复

使用道具 举报

ID:824490 发表于 2021-1-14 15:18 | 显示全部楼层
用定时器中断来做比较“精准“的延时,除此之外别无它法,这个”精准“取决于你晶体的的温飘、误差、电压等等指标。
回复

使用道具 举报

ID:388013 发表于 2021-1-14 15:47 | 显示全部楼层
怎么个精准法,你要的延时最小单位是多少,你用的晶振是多少兆的
回复

使用道具 举报

ID:752974 发表于 2021-1-14 16:20 | 显示全部楼层
要延时精准,只是相对的精准。定时部分用汇编写,再后期调试修正。
回复

使用道具 举报

ID:866313 发表于 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. }
复制代码


不知道这样可不可以呢?
回复

使用道具 举报

ID:390416 发表于 2021-1-14 18:25 | 显示全部楼层
第一、不同的单片机,比如STC12和STC8 速度就不同。你算那么精准有啥用?
回复

使用道具 举报

ID:390416 发表于 2021-1-14 18:31 | 显示全部楼层
第一、不同的单片机,比如STC12跟STC8就不一样。你算这么精准有啥用?
第二、同一片单片机芯片,不同的晶振频率速度也不一样。你算这么精准有啥用?
第三、相同的时钟,不同的指令,速度也不相同。你算这么精准有啥用?
第四、不同的变量长度,执行速度也不同。你算这么精准有啥用?
第五、不同的变量存放位置,执行速度也不同。你算这么精准有啥用?
第六、中断一打开,这种延迟函数 误差可能会增加250%,你算这么精准有啥用?
所以,看《人人学会单片机》课程,来学习我们的框架式编程方式。没要求的用计数延迟,有要求的必须定时器。程序里面不能这样死等、提高代码执行效率才是最需要考虑的事情。
回复

使用道具 举报

ID:398477 发表于 2021-1-14 20:14 来自手机 | 显示全部楼层
可以用一些辅助软件计算的呢,论坛里也都有!
回复

使用道具 举报

ID:584041 发表于 2021-1-14 20:34 | 显示全部楼层
1984528951 发表于 2021-1-14 15:47
怎么个精准法,你要的延时最小单位是多少,你用的晶振是多少兆的

当然是12MHZ的哟
回复

使用道具 举报

ID:584041 发表于 2021-1-14 20:35 | 显示全部楼层
留住这一刻2014 发表于 2021-1-14 20:14
可以用一些辅助软件计算的呢,论坛里也都有!

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

使用道具 举报

ID:584041 发表于 2021-1-14 20:36 | 显示全部楼层
cedtek 发表于 2021-1-14 17:11
不知道这样可不可以呢?

就是用定时器嘛,这个可以。
回复

使用道具 举报

ID:339654 发表于 2021-1-14 21:37 | 显示全部楼层
STC单片机的下载程序里头有软件延时程序计算器很方便
回复

使用道具 举报

ID:584814 发表于 2021-1-14 22:57 | 显示全部楼层
精准就呵呵了罢,除非你对精准的要求和“最美”一样随便就能拉一车。
软件写得再精准,没有精准的硬件还是不可能,难不成你是航天科技派出的探子
硬件大多都有个宽容度,大多对延时要求都不高,甚至很多步骤省去也能正常工作的,你可以调试好硬件后对单片机的主频(软件写或硬改晶振)动一下试试就知道了。
回复

使用道具 举报

ID:401564 发表于 2021-1-15 08:53 | 显示全部楼层
STC下载器有专用的软件延时,直接生成C或者汇编就可以了
就算是一样的时钟,不同的STC系列延时都不一样的
想要真正的精准,直接上汇编
回复

使用道具 举报

ID:854772 发表于 2021-1-15 15:02 | 显示全部楼层
用汇编吧,可以自己计算每条指令的时间
回复

使用道具 举报

ID:584041 发表于 2021-1-16 21:21 | 显示全部楼层
人人学会单片机 发表于 2021-1-14 18:31
第一、不同的单片机,比如STC12跟STC8就不一样。你算这么精准有啥用?
第二、同一片单片机芯片,不同的晶 ...

嗯,有道理哟
回复

使用道具 举报

ID:235954 发表于 2021-1-18 15:41 | 显示全部楼层
定时器一开,误差值偏大的
回复

使用道具 举报

ID:878649 发表于 2021-1-18 16:27 | 显示全部楼层
汇编可能会相对精准一些
回复

使用道具 举报

ID:851922 发表于 2021-1-18 16:59 | 显示全部楼层
要延时精准,只是相对的精准。不同的单片机是不同的。
回复

使用道具 举报

ID:847443 发表于 2021-1-25 17:05 | 显示全部楼层
和你的晶振有关系,晶振的频率越高精度越高。
回复

使用道具 举报

ID:811405 发表于 2021-1-27 11:37 | 显示全部楼层
利用定时器进行延时精确,其它的延时都有一定的误差
回复

使用道具 举报

ID:879348 发表于 2021-1-27 13:45 | 显示全部楼层
打开STC官方软件延时比较靠谱,前提是程序不能由中断响应
51hei截图20210127134526.jpg
回复

使用道具 举报

ID:854242 发表于 2021-1-27 14:46 | 显示全部楼层
取决于晶振,采用外部晶振准确度较高,但是一般ms级延时,内部晶振可以了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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