历史上的今天
今天是: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编译器,所以还是人脑才是第一的,掌握一些经验对写出高效,简洁的代码是有好处的。
下一篇:PIC单片机特点和优势介绍
史海拾趣
|
这里揭露Altium公司的强卖行为。Altium公司会从以下途径得到信息:1、展会留下的名片;2、注册Altium公司网站上的免费培训留下的个人信息。Altium得到这下信息之后,就佯装成其他公司给你打电话推销电子设计软件,首先会说有一款很好的软件,比Alti ...… 查看全部问答> |
|
这是我今天在一个资料下载论坛注册后下载的,我就扫了一遍,没有仔细看, 我就传上来,让有兴趣的人看看,呵呵!贵在分享!!希望对大家有用! 一共两篇。… 查看全部问答> |
|
没法贴,在这里口述一下, STC11F02E单片机(和51兼容),用P1_0脚输出,后接10K电阻,在后面是三极管3904(反向用)的基极,在后面接在RK1-L2-3V的一个控制脚上(set), RK1-L2_3V是一个继电器,本身想用单片机来控制继电器开合的,可是不知道 ...… 查看全部问答> |
|
各位好:我的是基于wince5.0 用的GPRS模块是MC52I , 请问硬件上DCD DTR 是不是必须接到串口上啊? 还有到最后拨号×99# 出现 no dialtone ,请各位大侠指点一下 谢谢?… 查看全部问答> |
|
想做个AT89C51SND1C-IL的最小系统,我借鉴别人的图画了个PCB图,然后用感光板做了出来,把各个元件焊上后通过USB接口边上电脑,电脑提示发现新硬件,然后就是装驱动,装好后没想到电脑提示“该设备无法启动(代码10)”,我换了两台电脑,均出现同 ...… 查看全部问答> |
|
刚刚接触文件系统过滤,看了楚狂人的教程,有一定收获。 因为它只支持FAT文件系统,我把它稍稍修改了一下同时支持NTFS(因为刚刚学习) 可是问题来了,在NTFS下有时候能正常解密,有时候不能(但加密一切正常) 。跟踪了一下发现是: 不能正常 ...… 查看全部问答> |
|
以前因有一个产品想用2410的,所以买了来打算当开发板使用的,但开发板买来后产品却没做了, 于是这个开发板就一直搁置在那,所有的包装材料都还在,当时拿到手后只通过一次电确认板子OK S3C2410开发板(预装linux os),具有VGA输出及TV输出 ...… 查看全部问答> |
|
单次事件的颠覆很可能形响到大多数的数宇电子电路。赛灵思很严肃地对待SEU问题,设计设备时充分考虑了如何降低对这些辐射引起的事件的敏感性。因为赛灵思也意识到SEU在商用和实用限制内是不可避免的,因此该公司在Virtex.-5和Spartan0-3A 9伸系 ...… 查看全部问答> |




