930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 10640|回复: 1

关于不同晶振的延时函数问题

[复制链接]

10

主题

17

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 2017-9-26 23:20:41 | 显示全部楼层 |阅读模式
一直没有细想延时函数,今天无意中看到延时函数上有一个对晶振的注释。
例程上的延时1ms函数是这样的void Delay1ms()                //@18.432MHz
{
        unsigned char i, j;

        i = 18;
        j = 235;
        do
        {
                while (--j);
        } while (--i);
}
一个指令周期是1/(18.432/12)=0.65μs
那循环17*234次是2585.7μs不等于1ms呀。为什么要用两个参数,不直接一个参数呢?
是否是不同的编程写法用的指令周期个数不同?那我怎么去编写不同晶振的延时函数呢?
另外我看到另一个例程里用的9600MHz晶振也是用一样的延时函数。是否因为误差不大所以使用?这个延时函数是精准度要求不高的情况下通用的吗?
求详解
回复

使用道具 举报

101

主题

333

帖子

7428

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7428
发表于 2017-9-27 09:42:59 | 显示全部楼层
    单片机常常会用到延时功能,比较常见的延时办法是使用定时器和延时函数。一般超过秒的延时就要考虑使用定时器了,因为使用延时函数会大大降低CPU的使用效率,程序需要一直在延时函数里面运行。而使用定时器开启中断,CPU可以在中断没触发时做其他的事情。
    使用延时函数做延时确实和单片机的工作频率有密切关系,只是当工作频率选择差别不大时,延时时间又比较短,可能不容易分辨。
   一般使用延时函数延时时间较长时,会使用3个变量,函数固定格式是:
    void delay500ms()            
    {
        unsigned char i,j,k;             
        for(i=41;i>0;i--)            // 没分号
        for(j=133;j>0;j--)         // 没分号
        for(k=252;k>0;k--);    // 有分号
    }
    使用延时函数延时时间比较短时,只使用一个变量,函数固定格式是:
    void delay (unsigned char t)
    {
        while(--t);
    }
   注:深入理解for和while的使用,两者可以相互转换使用。



回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表