原创 C51的热气动问题的研究

2007-5-31 21:30 3948 8 9 分类: MCU/ 嵌入式

在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。对用惯了汇编的人来说,总觉得高级语言可控性不好,不如汇编那样随心所欲。但是只要我们掌握了一定的C语言知识,有些东西还是容易做出来的,以下是笔者实际工作中遇到的几个问题,希望对初学C51者有所帮助。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


一、C51热启动代码的编制


对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启动。热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(0x7f位和0x7e),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。


根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:


void main()


{ char data *HotPoint=(char *)0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />7f;


if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))


{ /*热启动的处理 */


}


else


{ HotPoint="0x7e"; /*冷启动的处进


*HotPoint=0xaa;


*(++HotPoint)=0xaa;


}


/*正常工作代码*/


}


然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。这是为什么呢?原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段起始代码。正是这段代码执行了清零的工作。C编译程序提供了这段起始代码的源程序,名为CSTARTUP.A51,打开这个文件,可以看到如下代码:


.


IDATALEN EQU 80H ; the length of IDATA memory in bytes.


.


STARTUP1:


IF IDATALEN <> 0


MOV R0,#IDATALEN - 1


CLR A


IDATALOOP: MOV @R0,A


DJNZ R0,IDATALOOP


ENDIF


.


可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在启动代码是可以更改的,方法是:修改 startup.a51源文件,然后用编译程序所附带的a51.exe程序对 startup.a51编译,得到startup.obj文件,然后用这段代码代替原来的起始代码。具体步骤是(设C源程序名为HOTSTART.C):



修改startup.a51源文件(这个文件在C51\LIB目录下)



执行如下命令:


A51 startup.a51 得到startup.obj文件。将此文件拷入HOTSTART.C所在目录。



将编好的C源程序用C51.EXE编译好,得到目标文件HOTSTART.OBJ



L51 HOTSTART, STARTUP.OBJ 命令连接,得到绝对目标文件HOTSTART



OHS51 HOTSTART 得到HOTSTART.HEX文件,即可。


对于startup.a51的修改,根据自已的需要进行,如将IDATALEN EQU 80H中的80H改为70H,就可以使6F7F16字节内存不被清零。


刚开始我用看门狗813,发现手动复位清除RAM,后来发现在简单的10UF电容加上10K电阻的简单复位电路加上开关手动复位也清零,问了很多的人都说程序错误,因为热启动是不清RAM的除非长时间的断电,后来我在一个博克中发现上面的东西,给了我很大的启发但是用它的方法没成功,后来自己研究了一下,(用到了上面的一些东西),首先要用KEIL编译软件,如果没有KEIL的仿真器可以先用其他的编译软件带仿真器的把程序调通,然有用KEIL编译,注意了在用KEIL编译时首先我们建立工程文件,KEIL会提示你是否加入startup.a51文件,同意,最后你会在Source Group中发现startup.a51文件,如上面所说把IDATALEN EQU 80H中的80H改为0H,同时程序框图如下:


Void main(void)


{uchar panduan;


  If(panduan==0xaa)


{热启动程序}


  Else


{panduan=0xaa;


冷启动初始化程序


}


主循环程序


}


然后编译生成HEX文件即可,程序部分我用了上面的试了发现不好用,而上面所说的A51C51等命令我在DOC下试了生成的HEX文件很小,我的这种方法我实验了两个程序都好用,希望能给大家的帮助

文章评论1条评论)

登录后参与讨论

用户75669 2007-6-1 13:39

xiexie
相关推荐阅读
用户7521 2010-01-24 17:43
带驱动器的步进电机控制
     带驱动器的电机,就是给脉冲就能动,不用自己用驱动芯片LM298等做驱动电路了,我用最简单的52。看了驱动器的资料内部带隔离,输入端电流要在10MA左右,我用了74HC04,和ULN2003,...
用户7521 2009-06-11 10:52
pcb再总结
  前一阵学了学FPGA,抽时间画了块开发板,结果做板子时又给我发了回来,说做不了,大连地区的一般的做板要求:现在开工费100拉,线最小8个MIL,线间距最小8个MIL,过孔,内径最小15个MIL,外...
用户7521 2007-09-03 21:34
基于RS485和VB6.0的PC机与51单片机多机通信
前一段时间主要做了几个小项目,都是单片机与PC机的串行通信,采用RS485,上位机采用VB6.0语言编写软件。自己看VB有一段时间了,终于等到用的机会,现在学习的程度还可以完全够用。单片机采用了51单...
用户7521 2007-08-04 08:28
如何成为一个杰出电子工程师
...
用户7521 2007-07-19 19:09
新的起点,新的希望,新的人生!
   从家回来有一个星期了,最近的一周过的很糟糕,先是送走了我最好的朋友去工作,然后有是忙着项目,一个星期下来自己一点收获都没有,最近的状态不知道是怎么了,今天休息了一下午,放松一下同时考虑考虑自己的...
用户7521 2007-06-16 19:26
工业抗干扰
工业现场的环境往往存在严重干扰,这些干扰有时会严重影响仪器的硬件或软件,我一般都采取硬件和软件措施来解决。<?xml:namespace prefix = o ns = "urn:schemas...
我要评论
1
8
关闭 站长推荐上一条 /2 下一条