找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4580|回复: 14
打印 上一主题 下一主题
收起左侧

51单片机自适应延时函数的问题

  [复制链接]
跳转到指定楼层
楼主
ID:254774 发表于 2018-12-3 13:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好关于自适应延时函数,有一个地方不太明白。请帮忙解释一下,谢谢。

    do{
        i=MAIN_Fosc/96000;
        while(--i);     //96T per loop
    }

do语句里面为什么要除以96000?一直想不明白

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:410942 发表于 2018-12-3 13:43 | 只看该作者
用在哪里。能否具体一点。是不是用作波特率计算定时器的初值,晶振是多少?
回复

使用道具 举报

板凳
ID:438357 发表于 2018-12-3 14:03 | 只看该作者
这个你就需要去看看MAIN_Fosc了。看懂了它你就知道了
回复

使用道具 举报

地板
ID:254774 发表于 2018-12-3 15:00 | 只看该作者
hzh2008 发表于 2018-12-3 13:43
用在哪里。能否具体一点。是不是用作波特率计算定时器的初值,晶振是多少?

是的,就是计算初值的。因为不同的单片机用到了不同的主时钟,我在网上看到一个自适应主时钟的代码,每台看明白为什么要除以96000
void delay_ms(INT16U ms)   
{
    INT16U i;
    do{
        i=MAIN_Fosc/96000;
        while(--i);     
    }while(--ms);      
}
回复

使用道具 举报

5#
ID:254774 发表于 2018-12-3 15:01 | 只看该作者
w_h 发表于 2018-12-3 14:03
这个你就需要去看看MAIN_Fosc了。看懂了它你就知道了

是的,MAIN_Fosc代表主时钟,比如11.0592或者12M。我没明白的地方是,为什么都要除以96000?这个96000是怎么出来的?
回复

使用道具 举报

6#
ID:123289 发表于 2018-12-4 04:36 | 只看该作者
意义不大。不必纠结!知道延时的原理就行了、
回复

使用道具 举报

7#
ID:438962 发表于 2018-12-4 09:20 | 只看该作者
这个问题无关紧要,可以不必考虑。
回复

使用道具 举报

8#
ID:254774 发表于 2018-12-4 09:27 | 只看该作者
yzwzfyz 发表于 2018-12-4 04:36
意义不大。不必纠结!知道延时的原理就行了、

好吧。谢谢。
回复

使用道具 举报

9#
ID:702446 发表于 2020-3-12 21:38 | 只看该作者
这个是毫秒级延时函数,9600可以理解为波特率,这个数是根据你的晶阵频率以及你要延时的精度来确定的。假如晶振是11.052M,那么除以9600,i约等于1202微妙。也就是约等于1毫秒。那么带回到程序内部理解就是,把i的值减1000微秒(也就是延时一毫秒)再执行下一步。
希望对你有帮助
回复

使用道具 举报

10#
ID:707575 发表于 2020-3-13 12:10 | 只看该作者
MAIN_Fosc定义的是什么?你要先说一下
回复

使用道具 举报

11#
ID:707575 发表于 2020-3-13 12:11 | 只看该作者
知道这个是什么就行,不必纠结
回复

使用道具 举报

12#
ID:431670 发表于 2021-8-31 13:13 | 只看该作者
每一条自减指令需要96个时钟周期。
回复

使用道具 举报

13#
ID:887371 发表于 2021-8-31 15:56 | 只看该作者
owlthree 发表于 2018-12-3 15:00
是的,就是计算初值的。因为不同的单片机用到了不同的主时钟,我在网上看到一个自适应主时钟的代码,每台 ...

注释提到每次循环96步,即每次循环时间为96/MAIN_Fosc微秒,1mS=1000uS需要循环为1000/(96/MAIN_Fosc)=MAIN_Fosc/96000.

型号AT89C2051,晶振12MHz,12分频,所以MAIN_Fosc=(10^6)Hz=1MHz.
型号TM5268,内振7.3728MHz,4分频,所以MAIN_Fosc=1.8432*(10^6)Hz=1.8432MHz.
型号STC15F102,内振11.0592MHz,1分频,所以MAIN_Fosc=11.0592*(10^6)Hz=11.0592MHz.
型号SH88F2051,内振16.6MHz,1分频,所以MAIN_Fosc=16.6*(10^6)Hz=16.6MHz.

可以参考我的贴子“给大家提供一个51的软延时例程.”只要确定了主频,软延时就能自动适应。

回复

使用道具 举报

14#
ID:963284 发表于 2021-8-31 16:13 | 只看该作者
每一条自减指令需要96个时钟周期。这个可以参考,或者设置好延时用示波器测量对比
回复

使用道具 举报

15#
ID:624769 发表于 2021-8-31 18:17 | 只看该作者
他注释不是写了么,每个循环,96个周期,这就是他的目的阿。估计是早期的Flash擦写程序的一部分,必须等够96个周期,才能完成写错作。现在等待写操作完成都在硬件层完成了,周期也没这么久了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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