EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
高手总结!C51编程经验三则
4 O8 W; e7 z6 S/ h; Z5 l8 M& e- E5 x- X# y- Q5 Q3 W- s) F4 Y
& \# R: B4 Q4 ~/ F+ m6 S; F# lC51编程经验三则 在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。用惯了汇编的人,总觉得高级语言“可控性”不好,不如汇编那样随心所欲。以下是笔者在C51编程中的几点经验,希望对初学C51者有所帮助。 一、C51热启动代码的编制 工业控制计算机,往往设有看门狗电路,看门狗动作,计算机复位,这就是热启动。热启动时,一般不允许程序从头开始,因为这将使测量或计算值复位,导致系 统工作异常。故程序必须判断是热启动还是冷启动。常用的方法是:设定某内存单位为标志位(如0x7f位和0x7e位),启动时首先读该内存单元的内容,如 果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部分,并将0xaa赋予这两个内存单元。 根据以上的设计思路,编程时,设置一个指针,指向特定的内存单元如0x7f,然后在程序中根据特定内存单元的值判断冷/热启动,程序如下: void main() { char data*HotPoint=(char*)0x7f; if((*HotPoint==0xaa)&&(*(--Hot Point)==0xaa)) { /*热启动的处理 */ } else { HotPoint=0x7e; /*冷启动的处理 *HotPoint-0xaa; *(++HotPoint)=0xaa; } /*正常工作代码*/ } 实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,实现不了热启动的要求。这是为什么呢?原来,用C语言编程时,开机时执 行的代码并非是从main()函数的第一语句开始的,在main()函数的第一语句执行前要先执行一段‘起始代码’。正是这段代码执行了内存清零的工作。 C编译程序提供了这段起始代码的源程序,名为CSTARTUP A51,打开这个文件,可以看到如下代码: IDATALEN EQU 8011 the length of IDATA memory m bytes STARTUP1: IF IDATALEN<>0 MOV R0,#IDATALEN-I CLR A IDATALOOP: MOV @R0,A DJNZ R0,IDATALOOP ENDIF 可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在起始代码是可以更改的,方法是:修改 startup.a51源文件,然后用编译程序所附带的a51.exe程序对startup.a51编译,得到startup.obj文件,用这段代码代 替原来的起始代码。具体步骤是(设C源程序名为HOTSTART C): 1 修改startup.a51源文件(这个文件在C51/LIB目录下)。 2 执行如下命令: A51 startup.a51得到startup.obj文件。将此文件拷入HOTSTART C所在目录。 3 将编好的C源程序用C51 EXE编译好,得到目标文件HOTSTART OBJ。 4 用L51 HOTSTART,STARTUP OBJ命令连接,得到绝对目标文件HOTSTART。 5 用OHS51 HOTSTART得到HOTSTART HEX文件,即可完成启动代码的修改。 对于startup.a51的修改,根据自己的需要进行,如将IDATALEN EQU 80H中的80H改为70H,就可以使6F到7F的16字节内存不被清零。 |