1.3 应用实例——MON51单片机仿真应用系统

在51单片机的应用系统的设计过程中,常使用仿真器/系统来辅助开发人员进行设计,仿真器/系统是一个能模拟51单片机运行并且将其相关状态返回以供开发人员观察和调试的应用工具,能够提高硬件的设计和调试效率。

MON51仿真器是德国Keil公司提供的,可以和Keil μVision开发环境配合使用的一种硬件仿真器,本小节将详细介绍这种仿真器的设计过程。

1.3.1 MON51单片机仿真器基础

MON51仿真器结构如图1.11所示,其由Keil μVision软件、51单片机及外部RAM三个模块构成。

图1.11 MON51仿真器结构

● Keil μVision软件环境:其运行在PC上,给用户提供一个编辑和编译用户代码项目的环境,并且通过PC串口和内部运行监控程序的单片机相连接,进行数据信息交流,包括把用户程序下载到外部RAM中,以及把51单片机反馈回来的相关数据(寄存器状态、内存状态、变量数据等)显示出来以供用户观测。

● 51单片机:其在内部同时运行一个由Keil公司提供的监控程序和用户自己的代码,并且受到PC上的Keil μVision软件环境的控制,将对应的数据通过串口反馈给Keil μVision。由于监控程序也需要占用一部分单片机系统资源,所以,在MON51仿真器的使用过程中用户并不能够使用单片机的全部资源。

● 外部RAM:用于存放用户自己的代码。

在使用MON51仿真器时,用户在Keil μVision中编写自己的程序代码,编译通过之后将HEX文件下载到MON51仿真器中的外部RAM内,51单片机在监控程序下执行外部RAM内的程序代码,并且将相关的信息通过串口返回到PC端,用户可以在Keil μVision开发环境中设置断点,使用SFR观测界面等来观看当前的运行情况。

1.3.2 MON51单片机仿真器的应用电路

1.MON51仿真器需要占用的基础资源

MON-51仿真器需要的硬件资源如下:

● 8051及其兼容的MCS-51系列单片机。

● 5KB的程序存储空间,用于存放监控程序。

● 256B的外部数据存储单元(系统需要)和可选的5KB的跟踪缓冲区。

● 足够大的外部数据存储空间用于装载完整的用户应用程序。

● 串行口及一个用做波特率发生器的内部定时器。

● 6B的堆栈空间,用于用户程序的测试。

● 如果用户程序大于64KB,P1口的部分引脚要用于程序存储空间扩展。

注:除了以上所必需的资源,51单片机的其他资源均可为用户程序所使用。

2.MON51仿真器中的串口和外部RAM

从图1.11中可以看到,MON51仿真器除了需要一块51单片机之外,还需要一块外部RAM及一个PC的串口。

在MON51仿真器中,用户自己的程序代码是存放到外部的RAM空间中而不是51单片机ROM空间中的,所以,该外部RAM必须使用Von-Neumann(冯·诺依曼)连接方式。Von-Neumann连接方式是指将51单片机的外部数据存储器(XDATA)区和程序代码空间(CODE)区统一编址的方式,在物理连接上其将51单片机的PSEN引脚和RD引脚通过一个与门相“与”,将与门的输入信号连接到外部RAM的输出允许端(OE);在Von-Neumann连接方式下该外部RAM就相当于51单片机的外部程序存储器,需要注意的是,51单片机内的监控程序的存放地址空间不能与这种接法的外部数据存储空间相重复。

串口用于Keil μVision环境和51单片机的通信,使用方式和普通串口相同,也仅仅需要串口的第2、第3、第5引脚即可进行通信,其中,第2、第3、第5引脚分别对应“收”、“发”、“地”信号。但是出于综合考虑,在Keil公司推荐的连接方式中将串口的第7、第8引脚相连,第1、第4、第6引脚相连,这样可以保证串口在大多数情况下使用。

3.MON51仿真器的应用电路

图1.12所示是MON51仿真器的应用电路图,其中,外部RAM使用HM62256的64KB并行接口RAM芯片,其有足够的存储空间可以用于存放用户程序;使用74HC08把51单片机的PSEN和RD信号相“与”,然后连接到HM62256的OE端口,实现Von-Neumann;使用一个MAX232作为串口电平转化芯片来将51单片机的串行接口和PC连接起来。

图1.12 MON51仿真器的应用电路

1.3.3 MON51单片机仿真器的软件环境配置

在Keil μVision开发环境的安装目录“\Keil\C51\MON51”中有MON51仿真器的配置软件INSTALL.BAT,用户可以使用该文件来生成自己需要的配置文件。在相同文件夹下还有文件INSTALL.A51和MON_BANK.A51,这两个文件是MON51仿真器的资源配置文件,用户需要修改相关参数才能使得仿真器正常运行,如图1.13所示。

1.配置INSTALL.BAT

INSTALL.BAT文件用于配置MON51仿真器的具体硬件资源,是必须在DOS或者CMD环境下运行的批处理文件,其命令行参数格式如下:

INSTALL serialtype [xdatastart  [codestart   [BANK]   [PROMCHECK]]]
//后面两参数为可选项

注:直接在DOS或者CMD环境下输入上述命令行(serialtype、xdatastart等参数要更换为具体的实际使用值)即可。

图1.13 MON51目录中的文件

● serialtype参数用于设置单片机串口相关参数,是0~12的正整数,具体设置如表1.1所示。

表1.1 serialtype参数选择

● xdatastart参数用于指定MON51仿真器上运行的监控程序所使用的外部存储单元的页号(一页为256B),其取值为0x00~0xFF。如果xdatastart为0xFF,则外部数据存储单元0xFFFF被MON51仿真器的监控程序用于存放内部变量,用户自己的程序代码不能使用这个地址空间。

● codestart参数用于指定监控程序在程序存储器的起始位置,其取值为0x00~0xF0之间的十六进制数,默认值为0x00。

● BANK参数是可选项,为代码区分组的应用程序安排,应用程序不超过64KB,一般不选此项,可以通过修改INSTALL.A51来修改相关的设置。

● PROMCHECK参数也是可选项,如果选择了该参数则MON51的监控程序会在51单片机复位时检查在程序存储区0x0000地址处的存储器是EPROM还是RAM。

例1.1是使用INSTALL.BAT来生成MON51仿真器配置文件的实例,图1.14和图1.15所示是在WindowsXP的CMD命令行格式下对应的操作界面。

【例1.1】使用“0 7F 0”作为参数,该参数指明当前MON51仿真器使用的是8051系列的单片机,单片机的时钟为11.0592MHz,串口的波特率为9600bps,使用单片机内部定时器1作为波特率发生器;MON51仿真器所使用的内部变量空间是外部RAM位于0x7F00~0x7FFF的部分,MON51监控程序代码存放的起始地址是程序存储器的0x0000地址单元。

INSTALL   0  7F  0

使用以上配置命令行的过程如图1.14和图1.15所示,在批处理文件运行完成后可以在INSTALL.BAT的相同目录下看到生成一个名称为MON51.HEX的文件,将该十六进制文件烧写进MON51仿真器中的51单片机中即可。

图1.14 配置INSTALL.BAT实例(步骤1)

图1.15 配置INSTALL.BAT实例(步骤2)

2.配置“.A51”文件

“\Keil\C51\MON51”目录下的INSTALL.A51和MON_BANK.A51文件用于配置不同MON51仿真器硬件环境下的内存空间。

INSTALL.A51文件主要用于设置MON51仿真器的中断偏移量和波特率。当MON51仿真器的监控程序在ROM中起始地址为0x0000时,用户程序将无法使用51单片机的的中断功能,此时必须将MON51仿真器中的51单片机的所有的中断入口地址转移至高地址中的RAM区,这样用户程序就可以使用中断功能了。如果MON51仿真器的监控程序代码的起始地址不为0x0000时,则不需要设置中断偏移量。需要注意的是,在修改RAM中断入口地址时一定要将该地址设置到监控程序未使用的地址空间,例1.2是配置“.A51”文件来修改中断偏移量的实例。

【例1.2】MON51仿真器的监控程序代码的起始地址为0,采用Von-Neumann连接方式的外部数据存储器起始地址为0x8000H,则中断偏移量的起始地址也必须修改为0x8000H,而用户应该将应用程序存放在地址0x8000H之后。INSTALL.A51中的INT_ADR_OFF应该被修改,用编辑器打开“.A51”文件,找到对应的行,进行如下修改。

INT_ADR_OFF  EQU  8000H

INSTALL.A51还可以用于修改MON51仿真器和PC通信的波特率,MON51仿真器的波特率一般设置为9600bps或自适应,若要改成其他波特率,则修改“InitSerial:”节中的定时器初始化值即可,如例1.3所示。

【例1.3】通过修改InitSerial相关参数来修改通信波特率。

;********************************************************************
;*  Using TIMER 1 to Generate Baud Rates                        *
;*  Oscillator frequency = 11.059 MHz                           *
;*  Set Baudrate to 9600 Baud                                  *
;********************************************************************
InitSerial: PROMCHECK             ; Check if PROM in System
              MOV    TMOD,#00100000B ;C/T = 0, Mode = 2
              MOV    TH1,#0FDH
              SETB   TR1
              MOV    SCON,#01011010B ; Init Serial Interface
              JMP    Mon51
$ENDIF

注:通过设置TMOD等相关参数值即可以修改MON51仿真器的通信波特率,不过这个值一般使用INSTALL.BAT批处理参数来设置,除非这个波特率不是表1.1中列出的非标准波特率并且在自适应中出现困难。

INSTALL.A51文件中还有许多其他设置,一般不需要进行修改,而MON_BANK.A51文件是为代码区分组的应用程序安排的,此处不作讨论,读者如果有兴趣可以参看“\Keil\C51\MON51”下的PDF文件。

1.3.4 MON51单片机仿真器的使用方法

在配置好INSTALL.BAT文件后生成的MON51.HEX文件烧入51单片机之后,MON51仿真器就可以使用了,本小节介绍该仿真器的使用方法,主要讲解如何设置PC端的Keil μVision软件环境和修改工程项目的相关运行文件。

1.配置Keil μVision工程项目环境

在Keil μVision环境中建立一个项目文件并且编译通过,确定MON51仿真器硬件系统已经连接,则可以进入软件环境设置步骤。

● 修改MON51仿真器波特率:在“Project/Options for Target 'Target1'/Options for Target 'Target1'”对话框中的Target标签下,修改Xtal(MHz)为MON51仿真器所使用的波特率,如11.0592,如图1.16和图1.17所示。

● 修改中断向量偏移地址:将上述对话框中的C51标签下的Interrupt vectors at address修改为实际使用的地址,如0x8000,如图1.17所示。

图1.16 Keil μVision环境设置(步骤1)

图1.17 Keil μVision环境设置(步骤2)

● 修改代码空间地址:在如上对话框中的BL51 Locate标签Code中填入对应的代码空间地址,如0x8000,如图1.18所示。

图1.18 Keil μVision环境设置(步骤3)

● 选择仿真器:在如上对话框的Debug标签选中Use:keil Monitor-51 Driver,如图1.19所示。

图1.19 Keil μVision环境设置(步骤4)

● 设置MON51仿真器使用的串口号:单击Debug标签中的Settings按键,根据现实中使用的PC串口来选择Port编号,如图1.20所示。

● 设置用户代码运行方式:选中Debug标签下的Load Application at Start,然后选中Go till main(),如图1.21所示。

通过以上的设置,MON51仿真器的Keil μVision工程项目环境已经设置完成,下一步只需要修改工程项目的相关配置文件“.A51”即可使用。

2.配置工程项目的“.A51”文件

在Keil μVision的每一个项目文件里面都有一个Startup.A51文件,包含了51单片机初始化的一些相关参数,包括中断向量地址、内存初始化值等,在使用MON51仿真器的时候需要将该文件中的CSEG AT 0替换为CSEG AT xxxx,以保证外部地址的不冲突,其中, xxxx为相应的地址单元,通常为0x8000H等。

注:在图1.12给出的应用电路图中,外部RAM地址是从0x0000开始的,所以不需要修改。

图1.20 Keil μVision环境设置(步骤5)

图1.21 Keil μVision环境设置(步骤6)

3.运行MON51仿真器

当完成前两步配置之后即可运行MON51仿真器。

● 单击Debug/Start Stop Debug Session,MON51仿真器则进入Debug模式,在进入Debug的过程中可以看到左下角有一个程序下装的进度条,如图1.22所示。

图1.22 进入Debug模式

● 进入Debug模式之后出现多个Debug对话框,例如,Disassembly(编译)、Serial#1 (串口1)对话框等,可以看到相关的代码执行情况,在左边的Regs(寄存器)对话框则可以看到相应的特殊寄存器情况,可以通过单击Debug菜单来完成相应的设置或者退出Debug环境,如图1.23所示。

图1.24所示的是一个使用中的MON51仿真器实物图。

1.3.5 MON51仿真器注意事项

前面介绍了MON51仿真器的硬件设计和软件配置方法,本小节介绍其在实际使用中的一些使用技巧。

1.常见的错误

● ERROR 22,NO CODE MEMORY AT 0x80xx:这是因为MON51仿真器用于存放用户程序代码的外部数据存储RAM的地址空间与用户程序代码所使用的目标系统地址存在冲突,应检查硬件电路和软件设置,看看地址的分配是不是有冲突,如有则可以通过更改相应的“.A51”文件解决。

图1.23 debug模式下的菜单

图1.24 MON51仿真器实物图

● ERROR L107,ADDRESS SPACE OVERFLOW:这是因为用户程序代码的总长度超过了Keil μVision中设定的允许长度。可将用户程序允许长度设到仿真器所允许的最大值之内;若还不能解决,可将程序分段进行调试。

● WARNING L1,UNRESOLVED EXTERNAL SYMBOL:这是由于在生成MON51仿真器的监控程序时,即执行INSTALL批处理命令时没有使用[BANK]选项。解决方法是将Startup.A51文件中第140、141行最前面加“;”号注释掉。

注:使用MON51仿真器的时候项目工程必须加入Startup.A51文件并且做相应的设置。

2.关于MON51仿真器的资源使用技巧

由于MON51仿真器需要占用51单片机的一些系统资源,给用户在编写自己的用户代码时带来了不便,尤其需要注意以下两个问题。

● 串口的使用归属:串口是51单片机经常需要使用的功能模块,而大多数51单片机只有一个串口,在MON51仿真器与PC相连的仿真状态时,该串口用于MON51仿真器与PC通信。若用户的应用程序中也用到串口,就会发生冲突,解决方法是在用户程序装载完毕后,运行用户程序,再断开仿真器与PC的串行通信线,此时串口就可归用户程序使用了,当然这时PC就不能在线调试了。

● 外部存储空间的大小:当用户的应用程序越长,则其所占用的外部数据存储将越大,当超过了外部存储空间的大小的时候,就会出现错误,其解决的方法是对较长的程序进行分段调试。所有的程序完成后在软件仿真状态(不用MON51仿真器)生成一个完整的HEX文件。另外,如果应用系统中还有其他接口器件占用外部数据存储空间,要合理安排。例如,如果有一块E2PROM用于存放历史数据,可以在调试过程中用#define预处理命令将存放历史数据的存储空间定义在较小的范围内。