上传时间:2012年2月28日 作者:朱耀东 张焕春 经亚枝 关键词:可编程测控、网络

电子产品的更新换代越来越快,怎样缩短设计时间,快速推出产品,降低设计成本和提高系统整体性能是每个设计人员共同关心的问题。一种叫做在应用可编程(In Application Programming-IAP)的设计方案应运而生,它可以在现场(当原存在的代码正在运行时)重新写入运行代码。这种方案的优点是可以降低开发代码的时间、可在装配线上测试和改装产品、可在现场修正代码错误、可以容易地添加产品新功能甚至可以远程进行系统的升级。目前,实现在应用可编程一般有两种方法:一种方法是使用与单片机配套的专用芯片;另一种是采用新型的支持在应用可编程的单片机。本文介绍一种基于AT89C51单片机的在应用可编程的设计方案,它只占用AT89C51的UART,只需少数的几块芯片就能实现上述功能。特别适用于需要用UART进行通讯的测控网络的设计。


1 设计思路

基于8051核的单片机提供两个独立的地址空间,一个用于程序存储器,一个用于数据存储器。这种特殊的地址结构在任何情况下都不会将数据写入程序空间,保护程序代码不会被数据覆盖,但这种特性使单片机在应用可编程不能实现。如果采用一种方法“欺骗”系统使之误认为程序存储器即为数据存储器,则可向程序存储器中写数据了。“欺骗”系统的方法是在IAP期间暂时将程序存储器“重新分类”为数据空间而不是程序空间,然后在IAP完成后再将它重新分类为程序空间。这种方案需要一款存储器既可以当作数据存储器又能作为程序存储器。现在市面上的多种具有掉电保护功能的静态随机存储器既具有数据存储器的高读写速度又具有程序存储器的非挥发性。如DALLAS公司的DS1230Y-70是与通用RAM27256管脚兼容的,内嵌锂电池保护的非易失性存储器,读写速度为70ns,掉电状态下可以保存数据10年。

按照上述思路设计的具有在应用可编程能力的单片机系统结构框图如图1所示。该系统有以下几个特点:

  (1)有三块RAM,其中RAM3是数据存储器, RAMA、RAMB既是数据存储器又是程序存储器,RAMA和RAMB采用DS1230Y-70静态RAM。RAMA和RAMB具有相同的地址,当其中一块作为程序存储器时,另一块是数据存储器。AT89C51的数据空间与地址空间分开的特性保证了这两块存储器不会冲突。

  (2)增加了选择电路,用来将程序存储器和数据存储器“重新分类”,通过DN_CON控制信号线来选择是钭WR信号还是钭PSEN信号送入相应的静态RAM。

  (3)增加了串行EEPROM 以保存重要的信息,如模块号及下载标志等。


AT89C51 具有4K的片内Flash存储器,可以存放引导程序。系统初始化、串口中断等程序作为引导程序,固化在AT89C51的Flash存储器中,而将主程序放在32KB的静态RAM程序存储器中。因此,该系统程序存储器的地址空间从0000h~03FFh和8000H~0FFFFH。而数据存储器地址从 0000H~0FFFFH,如图2所示。引导程序中将串口中断设定为最高优无级,当AT89C51接收到程序代码下载的命令后,将向 8000H~0FFFH的数据空间依次写入程序代码。当程序代码写结束时,改变DN_CON控制信号,使原来的数据存储器变为程序存储器,而原来的程序存储器变为数据存储器。在串口中断程序结束时,将堆栈中的串行中断返回指针指向8000H,并退出中断,使程序跳至8000H运行下载的程序代码。图2中串行EEPROM采用基于I2C总线的24C01芯片,用以存放一些关键的数据信息,加测控模块的站号、下载标志等。

2 选择电路的实现  选择电路如图3所示,74HC157是四路二选一芯片。当P1.0(DN_CON)为低电平时,A=Y,此时RAMA的RD接PSEN,WR接VCC;RAMB的RD接RD数据读出线,WR接WR数据写入线,RAMA作为程序存储器,RAMB作为数据存储器。反之,当P1.0为高电平时,B=Y,RAMB是程序存储器,RAMA是数据存储器。


3 引导程序的设计  引导程序的设计,关键要解决以下问题:(1)系统上电时,要能自动设别该系统的主程序代码是否下载及下载在哪个静态RAM中,并能自动正确执行。(2)要保证其它的中断能正确响应,包括除程序下载命令外的其它串行中断。(3)在程序下载串行中断响应后,要能正确退出中断,并跳到主程序的正确位置执行代码。在8000H 开始的主程序区的顶端设立中断映射区如图2所示,在原来的000BH、0013H等中断入口地址处设立相应的长调用语句Ljmp 800BH,Ljmp 8013H,将除串行中断以外的所有中断跳至从8000H开始的中断映射区。而在800BH和8013H等地方放置真正的中断程序入口地址。程序下载命令之外的其它串行中断由串行中断程序判别并跳至8023H,串行中断程序流程图4所示。

  引导程序的主流程图如图5所示。引导主程序中包含系统初始化、串口设置及读下载标志等程序。在引导程序的中断程序中(如图4)包括程序下载命令的解释程序和代码的下载操作。为了编程方便,下载的程序代码都是ASCII码,这样可以方便地定义一些控码(以ASCII码形式)+1BH(文件结束符)+异或校验和”。当中断程序接收到二进制数AAH时,即或认为接收到程序下载的命令,并在中断程序中以查询的方式接收数据,依次将接收的代码转化为二进制数后放入以8000H为首地址的数据空间,同时产生二进制数后放入以8000H为首地址的数据空间,同时产生接收数据的程序代码已结束,并准备接收校舍验和。当程序代码接收正确,在中断程序中依据所读出的下载标志设置新的下载标志,然后改变堆栈指针,使串行中断退出,并使PC指针向8000H,开始运行下载的程序。中断退出代码如图4所示。当串行中断接收的命令不是程序下载命令,则在中断程序直接跳至中断映射区的串行中断入口8023H,执行相应的串行中断程序。

4 上位机软件的编程  上位机软件可以采用Delphi开发工具编写基于Windows95/98/2000平台下的串行通讯程序。MSCOMM32.OCX控制是微软公司在VB 和VC开发软件中随带的串行通信控件,该控件屏蔽了通信过程中的底层操作,程序员应用时只需设置和监视该控件的属性和事件即可完成对串行口的初始化和数据的输入和输出工作。在Delphi5.0中已将它重新定义为TMSComm类。在应用可编程测控网络的设计中需要发送与接收控制字符,这些控制字符有可能包含ASCII值大于80H的字符,因此要求上位机软件既能接收二进制数据又能发送二进制数据。在TMSComm类中一项InputMode属性,当设置 InputMode=1时,数据是以二进制方式取回,而发送二进制数据则需要依照TMSComm类的规则通过动态数组和变体的方法实现。  下面是一个简单的发送和接收二进制数据的例子程序:mscomm1.Comport:=1; //操作对象为串口1mscomm1.Settings:='9600,N,8,1'; 设置串口参数mscomm1.Rthreshold:=1; //收到1个字节后触发串口事件mscomm1.inbuffercount:=0; //清串口接收缓冲区mscomm1.OutBufferCount:=0; //清串口发送缓冲区mscomm1.PortOpen:=true; //打开串口  发送例程:varMyFlexibleArray : array of byte; //定义动态数组Outputdata:variant; //定义变体BeginSetLength(MyFlexibleArray,1); //在使用动态数组前必须设置它的长度MyFlexibleArray[0]:=$AA; //将待发送二进制数放入数组outputdata :=myFlexibleArray; //将动态数组赋给变体mscomm1.Output:=outputdata; //将变体中的二进制数0AAH发出end;


  在串口事件中接收数据全程mscomm1.Inputlen:=1; //每次从接收缓冲区中读1个字节数据mscomm1.InputMode:=1; //以二进制方式接收数据inbuf:=mscomm1.input; //读缓冲区,将数据接收至inbuf变量  本文所述的在应用可编程测控网络的设计已在FWC-2型大坝自动监测系统中实际使用。该系统基于RS-485网络,可以管理255个测量模块的数据采集和程序下载。运行结果表明,该方案具有设计简单、技术成熟、开发迅速等优点。