C51程序优化

发布者:Bby1978最新更新时间:2016-12-14 来源: eefocus关键字:C51  程序优化 手机看文章 扫描二维码
随时随地手机看文章

  1、指针:

  对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。通常使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的程序代码,编译器通常都能够生成inc和dec之类的指令,而使用a=a+1或a=a-1之类的指令,有很多C编译器都会生成二到三个字节的指令


  2、求余运算:

  a=a%8;  -->  a=a&7;

  说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要求是求2n方的余数,均可使用位操作的方法来代替。


  3、平方运算 :

     a=pow(a,2.0);  -->  a=a*a;

  说明:在有内置硬件乘法器的单片机中(如51系列),乘法运算比求平方运算快得多因为浮点数的求平方是通过调用子程序来实现的,在自带硬件乘法器的AVR单片机中,如ATMega163中,乘法运算只需2个时钟周期就可以完成。既使是在没有内置硬件乘法器的AVR单片机中,乘法运算的子程序比平方运算的子程序代码短,执行速度快。

  如果是求3次方,如:a=pow(a,3.0);  -->  a=a*a*a;  则效率的改善更明显。


  4、乘法和除法:

  a=a*4;  -->  a=a<<2;

  b=b/4;  -->  b=b>>2;

实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:

     a=a*9  -->  a=(a<<3)+a


  5、延时函数:

  通常使用的延时函数均采用自加的形式:


void delay (void)

{

    unsigned int i;

    for (i=0;i<1000;i++)

    ;

}  


  将其改为自减延时函数


void delay (void)

{

    unsigned int i;

    for (i=0;i<1000;i--)

    ;

}   


  两个函数的延时效果相似,但几乎所有的C编译对后一种函数生成的代码均比前一种代码少1~3个字节,因为几乎所有的MCU均有为0转移的指令,采用后一种方式能够生成这类指令。


  6、while循环和do…while循环

  在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环。写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。


关键字:C51  程序优化 引用地址:C51程序优化

上一篇:关于C51的中断函数要注意的几个问题
下一篇:C51库函数积累

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

C51单片机串口通讯的硬件电路图
51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如下图所示。
[单片机]
<font color='red'>C51</font>单片机串口通讯的硬件电路图
C51中的INTRINS.H:内部函数
函数名: _crol_,_irol_,_lrol_ 原 型: unsigned char _crol_(unsigned char val,unsigned char n); unsigned int _irol_(unsigned int val,unsigned char n); unsigned int _lrol_(unsigned int val,unsigned char n); 功 能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051 RLA 指令 相关,上面几个函数不同于参数类型。 例: #include main() { unsigned int y; C
[单片机]
C51编程16-中断篇(定时器中断3)
使用定时器/计数器中断,需要将满足以下的条件。 1)中断总允许打开 EA = 1; 2)中断源允许打开 ET0 = 1或者 ET1= 1; 3)设置定时器计/计数器的工作方式(设置TMOD) 4)装载定时器,设置计数器的初始计算值。 5)开启定时器(TCON中的TR0 = 1或者TR1 = 1) 6)中断服务函数 通过前面一些中断文章的学习,相信除了上面的第4点外,使用定时器/计数器已经没什么难度了。 装载定时器,前面的定时器章节可以知道,定时器/计数器有4种方式。它们分别是13位手动装载(方式0)、16位手动装载(方式1)、8位自动重装(方式2)、8位手动装载(方式3)。根
[单片机]
<font color='red'>C51</font>编程16-中断篇(定时器中断3)
C51红外解码程序
这是一个简单的红外解码程序,是针对9ms起始码和4.5ms结束码的红外信号晶振用的是11.0592M的 #i nclude at89x52.h #i nclude stdio.h sfr p0=0x80; sfr p3=0xb0; sbit p32=p3^2; unsigned char dm,i,j,k; unsigned char data a ;//定义4个数组,用来存储代码 void ds0_9ms(void) { unsigned char j,k; for(j=18;j 0;j--) for(k=20;k 0;k--) ; } void ds1ms(void) { unsigned char i,j; for(i
[单片机]
Keil C51,内存与指针 反汇编比较
dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idATa:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。 idATa是用类似C中的指针方式访问的。 汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好) xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。 pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的
[单片机]
Keil c51指针变量
单片机c语言支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer)。 1. 1. 一般指针 一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如: long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。 char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。 一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。 2. 2. 存储器指针 基于存储器的指针说明时即指定了存贮类
[单片机]
C51 中断服务程序的写法
格式:void 函数名()interrupt 中断号 using 工作组 {    中断服务程序内容 }   注意:中断不能返回任何值,所以前面是 void 后面是函数名,名字可以自己起,但不要与c语言的关键字相同;中断函数不带任何参数,所以 函数名后面的 () 内是 空的,中断号是指单片机的几个中断源的序号。这个序号是单片机识别不同中断的唯一标志。所以一定要写正确。   后面的using 工作组 是指这个这个中断使用单片机内存中 4 个工作寄存器的哪一组, c51 编译后会自动分配工作组,因此最后这句话我们通常省略不写。 c51 中断写法实例   void T1-time() interrupt 3 {   TH1=(65536
[单片机]
C51问答
一、#pragma asm是什么意思? #pragma asm MOV P1,R7 NOP NOP MOV P1,#0 #pragma endasm 实际上就是一个在C51中内嵌汇编语言的开关 二、一个 hex to bcd 的算法程序 HEX_BCD:CLR A MOV 30H,A MOV 31H,A MOV 32H,A MOV R2,#15 H_B0: MOV A,R1 RLC A MOV R1,A MOV A,R0 RLC A MOV R0,A MOV A,32H RLC A ACALL BCD_ADJ
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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