历史上的今天
返回首页

历史上的今天

今天是:2025年02月07日(星期五)

正在发生

2020年02月07日 | PIC单片机C语言延时程序和循环子程序实现方法

2020-02-07 来源:eefocus

很多朋友说C中不能精确控制延时时间,不能象汇编那样直观。

其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来。


一般的我们都用


for(x=100;--x;){;}此句等同与x=100;while(--x){;};


或for(x=0;x<100;x++){;}


来写一个延时函数。


在这里要特别注意:X=100,并不表示只运行100个指令时间就跳出循环。


可以看看编译后的汇编:


x=100;while(--x){;}


汇编后:


movlw 100


bcf 3,5


bcf 3,6


movwf_delay


l2 decfsz _delay


goto l2


return


从代码可以看出总的指令是是303个,其公式是8+3*(X-1)。注意其中循环周期是X-1是99个。


这里总结的是x为char类型的循环体,当x为int时候,其中受X值的影响较大。


建议设计一个char类型的循环体,然后再用一个循环体来调用它,可以实现精确的长时间的延时。


下面给出一个能精确控制延时的函数,此函数的汇编代码是最简洁、最能精确控制指令时间的:


void delay(char x,char y){


char z;


do{


z=y;


do{;}while(--z);


}while(--x);


}


其指令时间为:7+(3*(Y-1)+7)*(X-1)


如果再加上函数调用的call指令、页面设定、传递参数花掉的7个指令。


则是:14+(3*(Y-1)+7)*(X-1)。


如果要求不是特别严格的延时,可以用这个函数:


void delay(){


unsigned int d=1000;


while(--d){;}


}


此函数在4M晶体下产生10003us的延时,也就是10MS。


如果把D改成2000,则是20003us,以此类推。


有朋友不明白,为什么不用while(x--)后减量,来控制设定X值是多少就循环多少周期呢?


现在看看编译它的汇编代码:


bcf 3,5


bcf 3,6


movlw 10


movwf _delay


l2


decf _delay


incfsz _delay,w


goto l2


return


可以看出循环体中多了一条指令,不简洁。所以在PICC中最好用前减量来控制循环体。


再谈谈这样的语句:


for(x=100;--x;){;}和for(x=0;x<100;x++){;}


从字面上看2者意思一样,但可以通过汇编查看代码。后者代码雍长,而前者就很好的汇编出了简洁的代码。


所以在PICC中最好用前者的形式来写循环体,好的C编译器会自动把增量循环化为减量循环。因为这是由处理器硬件特性决定的。


PIC并不是一个很智能的C编译器,所以还是人脑才是第一的,掌握一些经验对写出高效,简洁的代码是有好处的。

推荐阅读

史海拾趣

Caliber公司的发展小趣事

Caliber公司自创立之初,便以技术创新为核心竞争力。在电子行业的早期,该公司敏锐地捕捉到市场对高性能计算芯片的需求,投入大量资源进行研发。经过数年的努力,Caliber成功推出了一款具有划时代意义的芯片产品,以其出色的性能和稳定性赢得了市场的广泛认可。这一创新不仅为Caliber带来了巨大的商业成功,也为整个电子行业的发展注入了新的活力。

BEI Sensors公司的发展小趣事

Beckhoff Automation GmbH公司成立于1953年,总部设立在德国Verl市。公司自创立之初,便致力于工业自动化产品的研发与生产。在创始人的领导下,公司逐步建立起一套完整的工业自动化产品体系,包括工业PC、现场总线模块、驱动产品等。凭借卓越的产品质量和创新的技术理念,Beckhoff在行业内逐渐崭露头角,赢得了客户的广泛认可。

台湾町洋(dinkle)公司的发展小趣事

随着电子行业的快速发展,町洋不断投入研发资源,致力于技术创新和产品升级。公司成功开发出了一系列具有高性能、高可靠性和高安全性的接线端子产品,满足了不同客户的需求。同时,町洋还积极引进国际先进技术和管理经验,不断提升自身的竞争力和市场占有率。

Dantona Industries公司的发展小趣事

作为一家有社会责任感的企业,Dantona Industries始终关注环境保护和社会公益。他们积极推广绿色生产理念,采用环保材料和生产工艺,减少对环境的影响。同时,公司还积极参与社会公益活动,为贫困地区的教育、医疗等事业提供援助。这些举措不仅展现了公司的社会担当精神,也为公司赢得了良好的社会声誉和品牌形象。

Daco Semiconductor Co Ltd公司的发展小趣事

在快速发展的过程中,Daco始终注重产品品质和用户体验。公司建立了严格的质量管理体系,对每一批产品都进行严格的检测和测试,确保产品的性能和质量达到客户的要求。同时,Daco也积极倾听客户的反馈和建议,不断改进产品和服务。这种对品质和用户体验的执着追求,使得Daco在客户中树立了良好的口碑。

EXCELTA公司的发展小趣事

进入21世纪后,Excelta公司意识到国际市场的巨大潜力。为了拓展海外市场,公司制定了详细的国际化战略,并在全球范围内建立了多个生产基地和销售网络。通过与国际知名企业的合作和交流,Excelta不断吸收先进技术和管理经验,提升了自身的核心竞争力。同时,公司还积极参与国际展会和论坛,提升了品牌知名度和影响力。

问答坊 | AI 解惑

揭露Altium公司的强卖行为

这里揭露Altium公司的强卖行为。Altium公司会从以下途径得到信息:1、展会留下的名片;2、注册Altium公司网站上的免费培训留下的个人信息。Altium得到这下信息之后,就佯装成其他公司给你打电话推销电子设计软件,首先会说有一款很好的软件,比Alti ...…

查看全部问答>

《自动识别技术基础知识》关于条码技术的

这是我今天在一个资料下载论坛注册后下载的,我就扫了一遍,没有仔细看, 我就传上来,让有兴趣的人看看,呵呵!贵在分享!!希望对大家有用! 一共两篇。…

查看全部问答>

单片机 驱动 继电器 疑问?

没法贴,在这里口述一下, STC11F02E单片机(和51兼容),用P1_0脚输出,后接10K电阻,在后面是三极管3904(反向用)的基极,在后面接在RK1-L2-3V的一个控制脚上(set), RK1-L2_3V是一个继电器,本身想用单片机来控制继电器开合的,可是不知道 ...…

查看全部问答>

GPRS NO dialtone

各位好:我的是基于wince5.0 用的GPRS模块是MC52I , 请问硬件上DCD DTR 是不是必须接到串口上啊? 还有到最后拨号×99# 出现 no dialtone ,请各位大侠指点一下 谢谢?…

查看全部问答>

关于AT89C51SND1C-IL的最小系统的问题

想做个AT89C51SND1C-IL的最小系统,我借鉴别人的图画了个PCB图,然后用感光板做了出来,把各个元件焊上后通过USB接口边上电脑,电脑提示发现新硬件,然后就是装驱动,装好后没想到电脑提示“该设备无法启动(代码10)”,我换了两台电脑,均出现同 ...…

查看全部问答>

学习修改楚狂人的文件过滤驱动的疑惑

刚刚接触文件系统过滤,看了楚狂人的教程,有一定收获。 因为它只支持FAT文件系统,我把它稍稍修改了一下同时支持NTFS(因为刚刚学习) 可是问题来了,在NTFS下有时候能正常解密,有时候不能(但加密一切正常) 。跟踪了一下发现是: 不能正常 ...…

查看全部问答>

部署SqlCe

我已经懂得怎么生成.net   compact项目的安装文件了,如果pocket   pc已经存在SQLCE,那么运行没有问题。但是当pocket   pc没有SQLCE的时候,我却无能为力,请问怎么一起部署这两个东西到真正的pocketpc中呢?或者分 ...…

查看全部问答>

转让搁置全新的2410(带VGA,TV输出)开发板

以前因有一个产品想用2410的,所以买了来打算当开发板使用的,但开发板买来后产品却没做了, 于是这个开发板就一直搁置在那,所有的包装材料都还在,当时拿到手后只通过一次电确认板子OK   S3C2410开发板(预装linux os),具有VGA输出及TV输出 ...…

查看全部问答>

【设计工具】Virtex-5 设备的SEU策略

  单次事件的颠覆很可能形响到大多数的数宇电子电路。赛灵思很严肃地对待SEU问题,设计设备时充分考虑了如何降低对这些辐射引起的事件的敏感性。因为赛灵思也意识到SEU在商用和实用限制内是不可避免的,因此该公司在Virtex.-5和Spartan0-3A 9伸系 ...…

查看全部问答>