历史上的今天
返回首页

历史上的今天

今天是:2025年01月02日(星期四)

正在发生

2018年01月02日 | 利用for多重循环实现C语言精确延时

2018-01-02 来源:eefocus

C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章51单片机Keil C延时程序的简单研究,作者:InfiniteSPACe Studio/isjfk

写得不错,他是用while(--i);产生DJNZ来实现精确延时,后来有人说如果while里面不能放其它语句,否则也不行,用do-while就可以,具体怎样我没有去试.所有这些都没有给出具体的实例程序来.还看到一些延时的例子多多少少总有点延时差.为此我用for循环写了几个延时的子程序贴上来,希望能对初学者有所帮助.(晶振12MHz,一个机器周期1us.)

void Delay(uchar i)
{
 while(--i);
}

    21: void Delay(uchar i)
    22: {
    23:         while(--i);
C:0x001F    DFFE     DJNZ     R7,Delay(C:001F)
    24: }

 

一. 500ms延时子程序

程序:

    void delay500ms(void)

       {

       unsigned char i,j,k;

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

        for(j=202;j>0;j--)

        for(k=81;k>0;k--);

       }

产生的汇编:

    C:0x0800    7F0F     MOV      R7,#0x0F

    C:0x0802    7ECA     MOV      R6,#0xCA

    C:0x0804    7D51     MOV      R5,#0x51

    C:0x0806    DDFE     DJNZ     R5,C:0806

    C:0x0808    DEFA     DJNZ     R6,C:0804

    C:0x080A    DFF6     DJNZ     R7,C:0802

    C:0x080C    22       RET      

计算分析:

    程序共有三层循环

    一层循环n:R5*2 = 81*2 = 162us                  DJNZ  2us

    二层循环m:R6*(n+3) = 202*165 = 33330us          DJNZ  2us + R5赋值1us = 3us

    三层循环: R7*(m+3) = 15*33333 = 499995us        DJNZ  2us + R6赋值1us = 3us

    循环外:   5us            子程序调用2us +子程序返回2us + R7赋值1us  = 5us

    延时总时间=三层循环+循环外= 499995+5 = 500000us =500ms

计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5

二. 200ms延时子程序

程序:

void delay200ms(void)

{

       unsigned char i,j,k;

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

        for(j=132;j>0;j--)

        for(k=150;k>0;k--);

}

产生的汇编

C:0x0800    7F05     MOV      R7,#0x05

C:0x0802    7E84     MOV      R6,#0x84

C:0x0804    7D96     MOV      R5,#0x96

C:0x0806    DDFE     DJNZ     R5,C:0806

C:0x0808    DEFA     DJNZ     R6,C:0804

C:0x080A    DFF6     DJNZ     R7,C:0802

C:0x080C    22       RET

三. 10ms延时子程序

程序:

void delay10ms(void)

{

       unsigned char i,j,k;

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

        for(j=4;j>0;j--)

        for(k=248;k>0;k--);

}

产生的汇编

C:0x0800    7F05     MOV      R7,#0x05

C:0x0802    7E04     MOV      R6,#0x04

C:0x0804    7DF8     MOV      R5,#0xF8

C:0x0806    DDFE     DJNZ     R5,C:0806

C:0x0808    DEFA     DJNZ     R6,C:0804

C:0x080A    DFF6     DJNZ     R7,C:0802

C:0x080C    22       RET      

四. 1s延时子程序

程序:

void delay1s(void)

{

       unsigned char h,i,j,k;

        for(h=5;h>0;h--)

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

        for(j=116;j>0;j--)

        for(k=214;k>0;k--);

}

产生的汇编

C:0x0800    7F05     MOV      R7,#0x05

C:0x0802    7E04     MOV      R6,#0x04

C:0x0804    7D74     MOV      R5,#0x74

C:0x0806    7CD6     MOV      R4,#0xD6

C:0x0808    DCFE     DJNZ     R4,C:0808

C:0x080A    DDFA     DJNZ     R5,C:0806

C:0x080C    DEF6     DJNZ     R6,C:0804

C:0x080E    DFF2     DJNZ     R7,C:0802

C:0x0810    22       RET

在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响.


推荐阅读

史海拾趣

CYANLITE公司的发展小趣事

CYANLITE公司非常重视产品品质的管理和控制。他们建立了严格的质量检测体系,确保每一件产品都符合高标准的质量要求。此外,公司还注重客户反馈的收集和分析,不断改进产品和服务以满足客户的需求。这种对品质的执着追求使得CYANLITE公司赢得了客户的信任和忠诚。许多客户都表示愿意长期与CYANLITE公司合作,并推荐他们的产品给其他人。

浙江东亚电子(DongYa)公司的发展小趣事

浙江东亚电子自成立以来,一直致力于技术创新和研发。公司拥有一支由50余名技术研发人员组成的专业团队,不断开发新产品和解决方案,以满足市场需求。这些创新产品不仅在国内外市场上获得了广泛认可,还为公司在新能源、通讯和军工等领域树立了良好的品牌形象。

Gravitech公司的发展小趣事

随着公司的发展,浙江东亚电子不断拓展其产业布局。除了传统的电力电子元件、分流器等产品外,公司还涉足新能源汽车、充电桩、变频器和储能等领域。特别是在新能源汽车和充电桩领域,公司紧跟国家“新基建”发展战略,推出了一系列具有竞争力的产品,为公司带来了新的增长点。

全智景(Allvision)公司的发展小趣事

为了进一步提升公司的竞争力,全智景公司开始实施全球化战略。公司积极拓展海外市场,与多个国家和地区的企业建立了合作关系。通过引进国外先进的技术和管理经验,全智景公司不断提升自身的综合实力。同时,公司还积极参与国际展览和交流活动,提升了品牌知名度和影响力。这一全球化战略为全智景公司带来了更广阔的发展空间和市场机遇。

EDAC公司的发展小趣事

精英电脑(ECS)自1987年成立以来,一直以其卓越的技术创新能力在电子行业中占据一席之地。公司早期专注于主板的研发和生产,凭借其稳定的性能和出色的兼容性,迅速赢得了市场的认可。随着科技的进步,ECS不断拓宽产品线,从主板扩展到台式机、笔记本电脑、平板电脑等多个领域。在技术创新方面,ECS始终坚持自主研发,不断推出具有行业领先水平的新产品,如采用最新制程技术的主板、搭载高性能处理器的笔记本电脑等。这些创新产品不仅提升了ECS的品牌形象,也为公司带来了可观的利润。

ALLEN BRADLEY公司的发展小趣事

随着全球环保意识的提高,ECS-C公司积极响应国家号召,将绿色环保理念融入到企业的生产经营中。公司采用环保材料和生产工艺,减少废弃物排放和能源消耗。同时,ECS-C公司还积极参与环保公益活动,推动社会环保事业的发展。这些环保举措不仅提升了公司的社会形象,也为企业带来了可持续发展的动力。

问答坊 | AI 解惑

实用单片机电子钟的制作

实用单片机电子钟的制作  文件大小:100K使用语言:简体中文资源类别:单片机源码 添加时间:2005-10-5 21:44:08更新时间:2005-10-5 21:44:08资源添加:guo资源评级:会员级别:匿名用户下载统计:本日:0 本周:0 本月:0 总计:0  下载 ...…

查看全部问答>

OMAP1710 USB driver 问题

各位大大江湖救急, 有没有人做过OMAP1710 USB模块的FW驱动,从模式,使用的是TUSB1105外部tranciver,6pin. 问题是:core控制的中断完全没反应,IRQ_SRC寄存器的值始终为0,完全不能进入中断,无法枚举。不知道问题出在哪,哪位大大帮忙解答一下 ...…

查看全部问答>

为你做红娘

   本公司是家上海的猎头公司,与上海众多IT公司有合作.希望全国各地的IT人才联系我们,我们希望通过我们的平台,尽我们最大的努力帮你们找到一份满意的工作. 有意者请联系我们~ MSN:jack_8310@hotmail.com,   QQ:286141 ...…

查看全部问答>

evc++ 中带有菜单的按钮

麻烦问一下,有没有人在evc++中编过带有菜单的按钮呀,我初学不太会,最好有个范例程序我看一下,多谢了…

查看全部问答>

K60示例代码

K60N512的示例代码,硬件是那个tower上使用的小板子。 有了它作参考,使用Kinetis那是相当的方便啊。 [ 本帖最后由 kernelpanic 于 2011-5-26 10:38 编辑 ]…

查看全部问答>

应聘高级底层软件工程师一举成功

这是个很意外的面试.也很意外的收获.   我根本没给那个公司投简历,莫名的一个面试电话,,,原来是人家在网上搜到我的简历滴   上周六,面试路上出奇顺利,那天只花了我2个小时.三个月前,我也去那条路去另个公司面,花了我4个 ...…

查看全部问答>

【TI建议】开辟TI少量购买及样片申请绿色通道

有时需要些样片做些实验(不一定是做批量产品),采购太麻烦而且怕买到的不行, 直接去TI申请的话,怕没量,然后电话经常催着,自己也觉的不好意思!  …

查看全部问答>

玩游戏体验易电源

游戏中只要对电路稍加分析就可以完全做对了:        暂时还没有使用过TI的易电源,但自己设计制作过几个电源,是通过7805、7905、7812、7912等稳压芯片制作的,当时觉得这电路已经很简单了。      ...…

查看全部问答>

xds510仿真器仿真出错,会的帮忙解决下啊,谢谢

之前还可以连接和仿真,就今天出现了这个错误,帮忙看下,已经弄了一上午,这个仿真出错,后面的学习就没法进行了,多谢各位了,是c5509的板子 Error connecting to the target: Error 0x80002240/-121 Fatal Error during: Initialization, OCS ...…

查看全部问答>

一步步教你使用云端服务器yeelink远程监控

replyreload += \',\' + 1710967; 本帖最后由 jeansonm 于 2014-7-11 11:48 编辑 随着物联网逐渐进入我们的生活,我们需要随时随地查看远端的设备运行状态及对设备进行控制,Yeelink为我们提供了一个很好的云端服务器平台,设备通过网络连接到Yeel ...…

查看全部问答>