日志档案

发表于 2008-5-9 14:49:03

0

标签: 无标签

编写Cx51程序原则

1.当语句嵌套较多时

   容易产生花括号不匹配的情况,可以用uVision2 的Edit下的“Goto Matching Brace”选项,将光标放在某个括号处,单击该选项,与之相匹配的括号的内容将反现

2.数组指针有密切的关系

      char *name="hello";

     可以采用数组形式name[0]或指针形式*name来表示字符串第一个字母 h

     指针比较灵活,简洁

     数组比较直观,容易理解

3.为了保持整个程序具有较好的模块化结构,应尽量避免使用外部全局变量来传递数据信息。

4.编译链接时的初始化和程序执行过程的初始化具有不同的意义。

  通常,对静态和外部变量在编译链接时进行初始化

   sub()

  {static int count="0x1234";

   }

静态变量count是在编译链接时通过运行库中的初始化模块INIT.OBJ对其进行初始化

而不是每次调用函数sub()时都对其进行初始化。

   sub()

{static int count;

 count=0x1234;

}

    这实际上是程序执行的过程中的赋值,因此在每次的调用中进行赋值操作。

对于自动变量只能在程序运行的过程中进行初始化

5.由于静态变量和外部变量的初始化是通过INIT.OBJ模块实现的,在具有这类变量的程序开头会增加一段初始化程序INIT.A51的代码,这样显然会增加程序的运行时间,同时会增加程序代码所占用的空间。

6.Cx51程序经过编译后产生的目标代码具有浮动的地址,其绝对地址必须经过BL51连接定位后才能确定。

  为了能在Cx51程序中直接对任意指定的存储地址进行操作,可以采用指针的办法

  void testmodule(void)

{  char xdata *xdp; //定义一个指向XDATA存储空间的指针

    char data  *dp;   //定义一个指向DATA存储空间的指针

    xdp="0x0002";    //XDATA存储器地址

   *xdp=0xaa;       //将数据0XAA送入指定XDATA存储空间

   dp="0x30";

   *dp=0xbb;

}

   另外一种直接操作存储空间地址的方法是利用Cx51运行库中提供的一套预定义宏

“absacc.h”

#include <absacc.h>

 char c_var;

  int     i_var;

  XBYTE[0X12]=c_var;

  i_var=XWORD[0x100]; 

XWORD[0x100] 意义是将字节地址0 x200和0x201中内容取出,并赋给int型变量i_var

i_var=XWORD[0x100/2]

就是读取0x100和0x101地址单元的内容。

#include <absacc.h>

#define DAC0832 XBYTE[0X7FFF]

DAC0832=0X80;                     //启动一次D/A转换

 

Cx51编译器还提供了扩展关键字 “_at_”来对指定的存储空间的绝对地址进行定位

 [存储器类型]数据类型标识符_at_常数

idata struct link list _at_ 0x40;

xdata char text[256] _at_ 0xe000;

xdata int  il _at_ 0x8000;

7 通过printf() 调试程序

 #include <stdio.h>

 printf("hello\n");

8.在系统的正式运行前

用一个延时函数进行延时,等待系统上电稳定(除了51以外的 片外外围设备)

void main(void)

{unsigned i;

 for(i=0;i<1000;i++);  // 等待系统上电稳定

}

9  sfr16 T2=0XCC;  //定义TIMER2 ,其地址为T2L=0XCC; T2H=0XCD

    int bdata ibase;

    sbit mybit0=ibase^0;

 

系统分类: 单片机   |   用户分类: 无分类   |   来源: 原创   |   【推荐给朋友】

    阅读(105)    回复(0)  

投一票您将和博主都有获奖机会!