初浅研究PIC之延时函数和循环体优化

发布者:breakthrough3最新更新时间:2015-01-20 来源: laogu关键字:PIC  延时函数  循环体优化 手机看文章 扫描二维码
随时随地手机看文章
初浅研究PIC之延时函数和循环体优化  
  
  很多朋友说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  延时函数  循环体优化 引用地址:初浅研究PIC之延时函数和循环体优化

上一篇:用PIC写高效的位移操作
下一篇:在PIC中使用常数指针

推荐阅读最新更新时间:2024-03-16 13:51

基于PIC16F877单片机的电子秤包装机控制系统
    摘要: 基于单片微处理器PIC16F877研制成功了六嘴回转式电子秤水泥包装机的智能控制器,给出控制系统的硬件电路和软件的设计思想,并阐述了控制器的工作原理。该控制器设计的高精度是本系统的重要性能。中断嵌套是设计软件中的难点。本系统还成功实现了与上位机的通信。     关键词: PIC单片机 A/D转换 中断 通信 包装机系统可用于粉末东颗粒物料(如水泥、化肥、粮食等)的定时包装,自动化程度、计量精度要求越来越高。针对用户的要求,本系统设计了一种基于PIC16F877单片机控制的电子秤水泥包装机控制系统。 控制系统包括调零、调满、设定粗细流阈值、插袋、喂料、压袋、推包、破袋处理等控制功能。另外,对检
[工业控制]
PIC16位单片机CAN(1)新建工程测试
昨天焊接了硬件,硬件没有什么问题。起初使用最新的集成开发环境MPLAB X IDE v1.41,XC16编译器。但是新建简单的工程都不行,找不到KIT3。只好放弃。还是使用MPLAB IDE v8.88集成开发环境吧,依然是XC16编译器。 由MPLAB IDE v8.88的工程向导新建一个工程。选择单片机和编译器之后开始写一个IO口程序控制LED看看有没有硬伤。好久不用PIC了,都忘了怎么使用了。 1:添加相应的头文件 2:写配置位(时钟,仿真口等) 3:写测试程序。 总是忘了写配置位,根据文档写完配置位之后LED终于点亮了!! #include p33EP32GP502.h _FICD(ICS_PGD
[单片机]
PIC数据采集系统接口设计和电路图
ICSP接口电路   在线串行编程ICSP,是PIC单片机的特点之一,它可以把程序直接烧写到单片机中,并对单片机进行在线串行编程与调试。   ICSP接口电路只有五根线,依次为: VPP、VDD、VSS、PGD、PGC,它们与PIC单片机的连接如下图: 为保证ICSP安全正常工作,烧写时序线PGD和PGC、烧写电压VPP要与其它电路完全隔离。 USB接口电路   本设计中的USB接口图如下,PIC18F4550采用总线供电模式,应用的所有电源均来自USB。USB四根接线中,D+,D-是USB通信的两个数据线。   PIC18F4550内置有3.3V 稳压器,为内部收发器和内部/外部上拉电路提供电源。使用USB功能时,要设置内部
[单片机]
<font color='red'>PIC</font>数据采集系统接口设计和电路图
PIC单片机汇编语言学习(一)
1、汇编语言的语句格式: 标号 操作码(指令助记符) 操作数 ;注释 (label) (opcode) (operand) (comment) 2、常用伪指令 a.EQU——符号名赋值伪指令 格式:符号名 EQU nn b.ORG——程序起始地址定义伪指令 格式:ORG nnnn c.END——程序结束伪指令 格式:END d.LIST——列表选项伪指令 格式:LIST e.INCLUDE:调入外部程序文件伪指令 格式:INCLUDE 文件名 2、分支程序结构 ——对于程序中的指令运用作几点说明: (1)凡是需要2个数参与的逻辑运算(与、或、异或)和算术运算(加、减),都需要事先将其中一个操作数放入W中。对于在此使用的减法指令
[单片机]
<font color='red'>PIC</font>单片机汇编语言学习(一)
PIC单片机LCD1602显示单个A字程序
P IC 单片机 LCD 1602显示单个A字程序 STATUS EQU 3H ;定义状态寄存器地址 PORTA EQU 5H ;定义RA口数据寄存器地址 PORTC EQU 7H ;定义RC口数据寄存器地 PORTD EQU 8H ;定义RD口数据寄存器地址 TR ISA EQU 85H ;定义RA口方向控制寄存器地址 TRISC EQU 87H ;定义RC口方向控制寄存器地址 TRISD EQU 88H ;定义RD口方向控制寄存器地址 ADCON1 EQU 9FH ;定义ADC模块控制寄存器1的地址 ;******************** Z EQU 2 ;定义0
[单片机]
PIC16F877的Timer1
Timer1模块是由两个可读写的8 位寄存器(TMR1H 和 TMR1L)组成的 16 位定时器/ 计数器。TMR1寄存器对(TMR1H:TMR1L)从 0000h 递增到 FFFFh 后,计满回零到 0000h。如果允许Timer1中断,则溢出时会产生Timer1 中断。该中断可通过置位/清零TMR1IE位来允许/禁止。 Timer1 可以有三种工作模式: 同步定时器模式 同步计数器模式 异步计数器模式 Timer1 工作在定时器模式 将 TMR1CS (T1CON 1 ) 清 0,选择 TMR1 工作在定时器模式。在这种模式下,定时器的输入时钟是内部时钟频率的4 分频(FOSC/4)。因为内部时钟总是同步的,所以同
[单片机]
ds18b20 pic54单片机通讯源程序
ds18b20 p IC 54 单片机 通讯源程序 ORG PIC54 GOTO MAIN ORG 0 ;---------------------- ;---------------------------- DELAY22 MOV LW D'200' ; DELAY 2*250=500mS MOV WF COUNT1 DE32 MOV LW D'250' ; 8*250=2mS MOV WF COUNT2 DE42 NOP ; 1+2+1=5uS DECFSZ COUNT2
[单片机]
PIC18单片机中使用BootLoader在线升级
引 言   PIC单片机的BootLoader属于需要自己写程序的那种,可以根据自己的需要写出各种功能的BootLoader程序来。目前,比较常见的BootLoader程序有Microchip公司的C18版本和著名的PICC编译器厂商HI-TECH公司(以下简称HI-TECH)的PICC18版本。它们的相似之处在于都占用了系统的0x00~0x1FF的程序空间。Microchip的版本是用纯汇编写的,而HI-TECH的版本是用C语言编写的。   在PIC系列单片机中,只有PIC18系列和PIC16F87X系列的单片机才有IAP功能,才能够使用BootLoader功能。下面只介绍PIC18的BootLoader,PIC16F87X的
[单片机]
在<font color='red'>PIC</font>18单片机中使用BootLoader在线升级
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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