历史上的今天
返回首页

历史上的今天

今天是:2025年05月18日(星期日)

正在发生

2018年05月18日 | 51单片机几种精确延时

2018-05-18 来源:eefocus

        实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 今天主要介绍软件延时,关于硬件延时,之后定时器部分再做详细说明。

        首先介绍单片机的几个周期

        指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。

        时钟周期:也称为振荡周期,一个时钟周期 = 晶振的倒数。s

        机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。

        机器周期=6个状态周期=12个时钟周期。

        51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/ 晶振频率)= x  μs。常用单片机的晶振为11.0592MHz,12MHz,24MHz。其中11.0592MHz的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。

        接下来列出这三种不同的晶振的延时函数

1、 11.0592MHz

        //N ms延时

void delay_ms(uint n)  

{  

    uint i,j;  

    for(i=n;i>0;i--)  

        for(y=114;y>0;y--);  

}  



2、12MHz晶振


//延时n毫秒  

void delay_ms(unsigned int n)  

{  

    unsigned int i=0,j=0;  

    for(i=0;i

        for(j=0;j<123;j++);  

}  


[cpp] view plain copy

//延时n秒  

void delay_m(unsigned int n)  

{  

    unsigned int i=0,j=0;  

    for(i=0;i

        for(j=0;j<21738;j++);  

}  



//延时10*n微秒  

void delay_10um(unsigned int n)  

{  

    while(n--);  

}  


3、24MHz晶振


[cpp] view plain copy

//延时n毫秒  

void delay_ms(unsigned int n)  

{  

    unsigned int i=0,j=0;  

    for(i=0;i

        for(j=0;j<357;j++);   

}  


[cpp] view plain copy

//延时n秒  

void delay_s(unsigned int n)  

{  

    unsigned int i=0,j=0;  

    for(i=0;i

        for(j=0;j<54053;j++);   

}  


[cpp] view plain copy

//延时10*n微秒  

void delay_10us(unsigned int n)  

{  

    unsigned int i=0;  

    char j=0;  

    for(i=0;i

        for(j=0;j<2;j++);  

}  


建议大家封装为头文件,可以方便的调用。


接下来介绍几个自动适应主时钟的延时函数



//参数:ms,要延时的ms数,自动适应主时钟  

#define MAIN_Fosc        11059200UL    //定义主时钟HZ  

typedef unsigned int INT16U;  

  

void delay_ms(INT16U ms)    //INT16U 等价于 unsigned int  

{  

    INT16U i;  

    do{  

        i=MAIN_Fosc/9600;  

        while(--i);     //96T per loop  

    }while(--ms);       //--ms  ms=ms-1  

}  



//5us 延时函数,自动适应主时钟  

#define MAIN_Fosc        11059200UL    //定义主时钟HZ  

  

void delay5us()  

{  

    #if MAIN_Fosc == 11059200  

        _nop_();  

    #elif MAIN_Fosc == 12000000  

        _nop_();  

    #elif MAIN_Fosc == 22118400  

        _nop_(); _nop_(); _nop_();  

    #elif  

}  


推荐阅读

史海拾趣

Antiference公司的发展小趣事

Antiference公司最初以生产电磁屏蔽材料起家,但随着电子设备的普及和电磁干扰问题的日益严重,公司意识到单纯的材料生产已无法满足市场需求。于是,Antiference投入巨资研发新型电磁干扰抑制技术,成功开发出了一款能够显著降低电磁干扰的芯片。这款芯片迅速在市场上获得了广泛认可,Antiference也因此成为了电磁干扰抑制领域的领军企业。

东通电子公司的发展小趣事

东通电子深知人才是企业发展的关键因素。因此,公司一直致力于引进和培养人才,建立了一支高素质、专业化的团队。公司现有员工550人,其中技术人员31人,质量管理人员27人,研发团队12人。这些人才为公司的发展提供了有力的支持,也为公司的技术创新和品质提升奠定了基础。

以上是关于东通电子在电子行业中发展起来的相关故事概述。这些故事展示了东通电子在品质、技术创新、生产规模、环保和人才建设等方面的努力和成就。

AINFO Inc公司的发展小趣事

随着电子行业的快速发展,AINFO Inc公司积极响应国家产业政策,加快了产业升级的步伐。公司引进了先进的生产设备和技术,实现了智能制造和数字化转型。通过优化生产流程和提高生产效率,公司降低了成本,提高了产品质量,进一步巩固了市场地位。

Emhiser Research Inc公司的发展小趣事

Emhiser Research非常注重创新管理和人才培养。公司建立了一套完善的研发流程和激励机制,鼓励员工提出创新性的想法和解决方案。同时,公司还积极与高校和研究机构合作,引进和培养了一批高素质的研发人才。这些人才不仅为公司带来了源源不断的创新动力,也为公司的长期发展奠定了坚实的基础。

Daniels Manufacturing公司的发展小趣事

面对不断变化的市场和客户需求,DMC始终坚持创新驱动的发展战略。通过加强研发投入、引进高端人才、加强产学研合作等方式,DMC不断推出具有创新性和竞争力的新产品。同时,DMC还密切关注行业发展趋势和市场需求变化,及时调整战略规划和产品定位。展望未来,DMC将继续秉承“创新、质量、服务”的理念,致力于成为全球电子行业的领军企业之一。

以上五个故事虽然是虚构的,但它们基于DMC在电子行业中的实际发展情况和可能面临的挑战进行了合理推测和演绎。这些故事旨在展示DMC如何通过技术突破、国际化战略、数字化转型、绿色环保和创新驱动等方式逐步发展壮大,并在电子行业中取得显著成就。

Elcos AG公司的发展小趣事

随着市场竞争的加剧,Elcos AG意识到持续创新的重要性。公司加大了研发投入,成立了专门的研发团队,专注于新产品的研发和现有产品的优化。经过数年的努力,Elcos AG成功推出了一系列具有行业领先性能的新型电子元器件,这些产品以其高性能、低功耗和稳定性强的特点,赢得了市场的广泛认可。

问答坊 | AI 解惑

数字功率管理的优势成为设计人员争论热点

最近,在工程设计人员的词典中,数字功率和数字控制已上升成为最重要的术语。这是一件很奇怪的事,因为电源工程师接受的一般都是模拟技术方面的训练,而客户也是模拟支持者。因此功率控制方案提供商需要一种为模拟工程师架设通向数字领域桥梁的方法 ...…

查看全部问答>

【博客帮助帖】博客的好友功能

1)登录博客后,进入个人空间,点击上方的“好友”,如下图所示: 2)进入好友管理界面,可以查看好友列表,查找可能认识的人,还可以邀请好友加入 3)在界面右侧,可以对好友进行分组,查看。 …

查看全部问答>

测量精度的五大迷思

前言   对于一个数据采集系统而言,测量精度是评估其性能的一个重要参数,也是科学家们不断努力希望提高的一个指标。在实际应用中,很多工程师都会面临测量精度的各种问题:它与模 数转换器的分辨率有什么区别?哪些因素会产生系统的测量噪 ...…

查看全部问答>

如何显示或隐藏输入面板?

如何显示或隐藏输入面板呢?请用过得指点一下!…

查看全部问答>

請教wince可以調用windows下的dll嗎

我現在有一個windows下的dll是針對攝像頭做控制 例如OPEN INTERFACE、IIC的讀寫控制,那我現在可以在WINCE的攝像頭驅動裡用嗎???可以的話,我就可以減少寫攝像頭驅動的時間了。…

查看全部问答>

如何利用手机作为电脑麦克风使用?

   各位大虾,我想实现手机作为电脑麦克风使用,用usb接口连接,希望做过的朋友能给点帮助,如何将手机作为usb接口的麦克风?如能帮助,非常谢谢!…

查看全部问答>

有人用过电量计DS2784这个芯片吗?

   本人系统平台PXA270+WINCE5.0,现在想使用DS2784来读取电量,这个DS2784是使用的是1 wire bus,这个还真没有用过,怎么去实现它读取电量?谁用过没,有源码最好…

查看全部问答>

关于3.5的固件库求助

有人用3.5的固件库吗,我以前用2.0的,后来在网上下了3.5的,感觉变化比较大,不太会用,可否发几个已经调试好的样例,比如led点亮生命的,劳烦发我参考一下,我邮箱1097699242@QQ.COM…

查看全部问答>

ADC0804数字电压表数据处理问题

我想用ADC0804和89C52做了一个数字电压表,但是不知道如何把从ADC0804采集到的数据转换成十进制的数据,然后送数码管显示。 采集到的数据是做了什么处理呢?…

查看全部问答>