PIC C延时函数和循环体优化

发布者:WanderlustSoul最新更新时间:2016-08-26 来源: eefocus关键字:PIC  C延时函数  循环体优化 手机看文章 扫描二维码
随时随地手机看文章
PIC C延时函数和循环体优化

 很多朋友说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  C延时函数  循环体优化 引用地址:PIC C延时函数和循环体优化

上一篇:PIC单片机A/D转换过程
下一篇:PIC16F87x单片机I/O口

推荐阅读最新更新时间:2024-03-16 15:07

PIC单片机中晶体选择的注意
  对于一个高可靠性的系统设计,晶体的选择非常重要。在振荡回路中,晶体既不能过激励(容易振到高次谐波上)也不能欠激励(不容易起振)。尤其在设计带有睡眠唤醒(往往用低电压以求低功耗)的系统中,若还是随手拿一颗晶体就用,你的系统可能会出问题。   这是因为低供电电压使提供给晶体的激励功率减少,造成晶体起振很慢或根本就不能起振。这一现象在上电复位时并不特别明显,原因时上电时电路有足够的扰动,很容易建立振荡。在睡眠唤醒时,电路的扰动要比上电时小得多得多,起振变得很不容易。   有人评价:PIC单片机对晶体的要求怎么这么高,用51好象从来就没有这么麻烦,手里抓到什么就用什么,也不见有问题呀?且慢,这样比较前提并不一样,同样在睡眠时,有谁
[单片机]
PIC 18XXX PORT LAT
PIC18系列单片机是美国微芯公司(Microchip)8位单片机系列中的高档系列,其任一I/O引脚允许的最大灌电流或最大拉电流达25mA,可以直接驱动LED和继电器。PORTA、PORTB 和PORTE 的最大灌电流或最大拉电流总和为200mA,PORTC和PORTD的最大灌电流或最大拉电流总和为200mA,PORTF和PORTG的最大灌电流或最大拉电流总和为100mA(注:PIC18F4550没有这两个端口)。 单片机和外设的交互都是通过I/O端口进行,每个I/O端口均有三个操作寄存器: 1、TRISx 数据方向寄存器 用来控制 I/O 引脚的方向,即用来控制PORTx 是输入还是输出。 2、PORTx
[单片机]
PIC16F877定时器0的中断方式调试
PIC16F877单片机定时器0的中断方式调试程序 #include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); void init(void); uint intnum; void main(void) { init(); while(1) { if(intnum = 20)//1S到时 { intnum = 0; RD0 = !RD0; } } } void init(void) { TRISD = 0; //PORTD引脚为输出 PORTD = 0; //POR
[单片机]
PIC单片机的大数组RAM分配错误解决
在编译程序时出现 Error - section '.udata_main.o' can not fit the section. Section '.udata_main.o' length=0x00000606 Errors : 1 询问高人得知该错误为RAM分配超过256B。 解决方法为: 1、打开18f452.lkr 即所选MCU的lkr文件 lkr文件所在位置为:C:\Program Files\Microchip\mplabc18\v3.40\bin\LKR,用记事本打开。 其关于RAM分配的为 ACCESSBANK NAME=accessram
[单片机]
基于PIC单片机的护理机自动控制系统设计
引言 随着我国老龄化进程的加剧,当今社会中存在着一种因失去生活自理能力而“长期卧床的弱势群体”,特别是那些几乎无意识的弱势群体,他们需要被人长期照顾,特别是他们的大小便的清洁处理。然而由于该弱势群体数量大、护理人员紧缺和护理费用高等问题,导致这些弱势群体的家庭护理矛盾日益凸显。目前市场上的长期卧床病人大小便清洁护理机在“智能护理”方面己比较完善,已经具有大小便自动识别与回收、温水清洗与自动烘干等功能,达到了“人性化”护理的要求,但在使用过程中仍然需要专门的“陪护人员”,对于绝大多数现代家庭而言,无论从人力还是财力,这都将是一个沉重的负担,同时也限制了大小便清洁护理机在家庭中的推广使用,因此,社会迫切需要一种在现有护理功能的基础上能
[单片机]
基于<font color='red'>PIC</font>单片机的护理机自动控制系统设计
PIC18F25K80,timer0定时器中断
volatile uint32_t uwTick = 0; void __interrupt() ISR(void) //void attribute ( (interrupt, no_auto_psv) ) _T1Interrupt( void ) { if((T0IF)&&(T0IE)) //定时器 { TMR0IF=0; //T0CON=0B10010011; //enable T0,16bit,FSCO/4,16:1 TMR0H=0x9E; //40549(0x9E65)--- (65536-40549+13)*0.25*16=100,000 TMR0L=0x65;
[单片机]
基于PIC12C508的定时器
说明 1、PIC12C508单片机的设置 P2脚---设置输入 P3脚---软件PWM产生输出 P4脚---开始/停止开关输入 P5脚---50HZ时钟基准输入 P6脚---驱动继电器输出 P7脚---比较器输入。 2、电源 由变压器T1,二级管D1,D2,D3,电容C1,C2,C3和U3组成。为继电器和I.C.S提供5V电压.如果有绝缘需求,可心使用无变压电源. 3、时间基准 为产生时钟基准,第二运算放大器U2B常常用来产生50HZ的方波,由电阻或稳压二级管产生近似方波.甚至也使用内部时钟. 4、设置 通常是由跳线来选择时间基准的范围.如果J3跳线,时间基准为0-100S,若不跳线,时钟基准范围为0-100分钟.
[单片机]
基于<font color='red'>PIC</font>12<font color='red'>C</font>508的定时器
Microchip高性能USB、LCD及通用8位PIC系列再添12位ADC
12款新型PIC18单片机迎合需高分辨率模数转换功能的先进传感器设计,为外部模数转换器节省成本并化繁为简 全球领先的单片机和模拟半导体供应商——Microchip Technology Inc.(美国微芯科技公司)宣布推出12款全新的高性能、8位闪存单片机,其中包括该公司首款集成片上高速12位模数转换器外设的USB及LCD单片机系列。三个新产品系列共备有16种集成高分辨率片上模数转换器的高性能PIC18 单片机,扩展了Microchip通用PIC18F4523系列产品线并极大地丰富了客户的选择。 在这三个新产品系列中,PIC18F8723大容量存储器通用系列提供丰富的外设集以及高达10 MIPS的卓越性能;PIC18F4553
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved