MCS-51单片机在我国应用最为关广泛、经久不衰。以往单片机应用程序主要用汇编语言编写。由于汇编语言程序的可读性和可移植性都较差,采用汇编语言编写单片机应用程序不但周期长,而且调试和排错也比较困难。为了提高编制单片机应用程序的效率,改善程序的可读性和可移植性,采用高级语言无疑是一种最好的选择。C语言是一种通用的计算机程序设计语言,既具有一般高级语言的特点,又能直接对计算机的硬件进行操作,表达和运算能力也较强,许多以往只能采用汇编语言来解决的问题现在都可以改用C语言解决。德国Keil公司多年来致力于单片机C语言编译器的研究。该公司开发的Keil C51是一种专门为8051单片机设计的高效率C语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储器空间极小,完全可以与汇编语言媲美。
近年来,Keil C51不断升级,目前最高版本为V7.0。高版本的 Keil C51编译器,尤其是 Keil uVision2(基于Windows的C51集成编译环境)以其性能优越、使用方便,受到了众多单片机爱好者的欢迎。Keil C51以软件包的形式向用户提供主要包括C51交叉编译器、A51宏汇编器、 BL连接定位器等一系列工具和uVision2模拟仿真、调试器等。C51具有丰富的函数库,包含100多种功能函数,为用户编程提供了极大的方便。C51程序可以实现与汇编语言的接口,两者相互之间的调用十分方便。
笔者是Keil C51的用户,并成功自制了Monitor-51仿真板,有一些心得。本文提供了Monitor-51仿真板的硬件电路,并对其进行了分析, 详细说明了监控程序的生成方法,对使用中常出现的问题给出了解决方法。
1.硬件电路
Monitor-51仿真板的硬件资源要求如下:
*5K字节的程序存储空间,用于存放监控程序;
*256字节的外部数据存储单元(系统需要)和可选的5K字节的跟踪缓冲区;
*足够大的外部数据存储空间用于装载完整的用户应用程序;
*串行口及一个用作波特率发生器的内部定时器;
*6字节的队栈空间,用于用户程序的测试;
*如果用户程序大于64K字节,P1口的部分引脚要用于程序存储空间扩展;
*其它资源均可为应用程序所用。
根据以上要求,笔者设计的Monitor-51仿真板电路原理如图(图略,详见《电子技术应用》2002.7)。
需要说明的是,图中存放用户程序的32K字节外部数据存储器62256的OE(输出允许引脚),是将CPU的PSEN和RD信号相与后再与之相连, 称为von Neumann接法。此时外部数据存储器在PSEN有效时,就相当于外部程序存储器,当然监控程序的存放地址空间不能与这种接法的外部数据存储空间相重复。von Neumann接法的另一个作用是调试时可以在用户程序中设置断点,监控程序修改用户程序代码在所有的断点处插入ACALL指令。
2.监控程序
Monitor-51仿真板的监控程序可用Keil C51提供的INSTALL.BAT批处理文件生成,此文件在\KEIL\C51\MON51路径下,须在DOS环境下执 行,语法如下:
INSTALL serialtype [xdatastart [codestart [BANK] [PROMCHECK]]], [ ]为可选项。
命令中的各参数解释如下: serialtype:串行通信设置,现将有关MCS-51系列单片机的serialtype设置的含义列于表1中。
表1 MCS-51系列单片机的serialtype设置含义
serialtype 时钟源 波特率 晶振 CPU
0
2
7
8 定时器1
定时器2
定时器1
定时器2 9600
9600
自适应
自适应 11.059MHz
12.000MHz
无限制
无限制 所有8051系列
8052及兼容
所有8051系列系列
8052及兼容
xdatastart:指定Monitor-51监控程序使用的外部存储单元的页号(一页为256字节),即上节所需硬件资源的第2项,取值为0~FF。例: xdatastart=FF,则X:0xFFFF(X表示外部数据存储单元)被Monitor-51监控程序存放内部变量,用户应用程序不能使用。
codestart:指定监控程序代码在程序存储器起始页数,即起始位置,取值为0~F0之间的十六进制数,缺省值为0。
BANK:可选项,为代码区分组的应用程序安排,应用程序不超过64K,一般不选此项。
PROMCHECK:可选项,Monitor-51监控程序在CPU复位时检查在程序存储区0地址处是EPROM还是RAM。
例:INSTALL 0 7F 0
这条命令将设置波特率为9600bps,内部定时器1为波特率发生器,要求CPU时钟为11.059MHz,Monitor-51内部变量空间为:X:0x7F00... X:0x7FFF,Monitor-51监控程序代码起始地址为:C:0x0000(C表示程序存储单元)。该命令生成一个MON51.HEX,将其固化在EPROM中即可使用。
应该提醒的是,INSTALL批处理命令中主要用到两个汇编文件:INSTALL.A51和MON_BANK.A51。根据硬件配置的具体情况,可能要作一些修改。
INSTALL.A51中修改项主要有两项:
(1)中断偏移量设置:当Monitor-51监控程序在ROM中起始地址为0时,用户程序将无法使用MCS-51的中断功能。为此Monitor-51将所有的中断入口地址转移至高地址的RAM区(大于监控程序的长度),这样用户程序就可以使用中断功能了。当Monitor-51监控程序代码的起始地址不为0时,中断偏移量设置无意义。
例:监控程序代码的起始地址为0,采用von Newmann接法的外部数据存储器起始地址为8000H,则中断偏移量必须设为8000H,而用户 应用程序将存放在8000H之后。INSTALL.A51中的INT_ADR_OFF定义如下:
INT_ADR_OFF EQU 8000H。
(2)波特率修改:Monitor-51的波特率一般设置为9600bps或自适应。若要改成其它波特率,若4800bps,则修改“InitSerial:”节中的定时器初始化值。
INSTALL.A51中还有许多其它设置,一般不作修改。
MON_BANK.A51是为代码区分组的应用程序安排的,此处不作讨论。
3.使用中的几个问题
按前两节提供的硬件电路图和监控程序,如果仿真板与目标系统连接无误,就可调试使用了。但仿真板与目标系统连接有问题或Keil C51软件设置不当会遇到一些麻烦,在程序调试中的主要错误与警告有: ERROR 22:NO CODE MEMORY AT 0x80xx,这是因为仿真板用于存放用户程序的外部数据存储空间与目标系统地址存在冲突。应检查硬件 电路予以解决。 ?
ERROR L107:ADDRESS SPACE OVERFLOW,这是因为用户程序大于uVision2中设定的允许长度。可将用户程序允许长度设到仿真板许可的最大值;若还不能解决,可将程序分段进行调试。
WARNING L1: UNRESOLVED EXTERNAL SYMBOL,多数程序员都遇到过此警告,这是由于在生成 Monitor-51监控程序时 (执行INSTALL批处理命令)没有使用[BANK]选项。解决方法是将 Startup.A51文件中第140、141行最前面加“;”号注释掉。
Startup.A51是加入到用户工程文件 中的汇编程序,使用Monitor-51仿真板必须加入此文件。
由于Monitor-51仿真板比较简单,占用了一些系统资源,有时给用户带来了不便。程序员实际编程中常要解决以下两个问题:
(1)串行接口功能:串行通信是MCS-51单片机经常要用到的功能,而MCS-51系列单片机只有一个串行通信接口,在与PC机相连的仿真状态时,串口用于与PC机通信。若在应用程序中也用到串行口,就会发生冲突。解决方法是用户程序装载完毕后,运行用户程序,再断开仿真板与PC机的串行通信线。这样串口就可归用户程序使用了,当然这时PC机就不能在线调试了。
(2)外部存储空间:用户程序越长,占用的外部数据存储将越大。解决的方法是对较长的程序进行分段调试。所有的程序完成后在软件仿真状态(不用Monitor-51仿真板)生成一个完整的HEX文件。另外,如果系统中还有其它接口器件占用外部数据存储空间,要合理安排。如有一EEPROM要存放历史数据,可以在调试过程中用#define预处理命令将存放历史数据的存储空间定义在较小的范围内,程序编完后再修改范围进行编译生成HEX文件。
笔者有多年的汇编语言编程经历,改用Keil C51后感觉很好,编程效率大为提高。经过一段时间的摸索,自制成了Monitor-51仿真板。
使用Monitor-51仿真板,给调试程序带来了极大的方便。虽然仿真板占用了一些系统资源资源,但经合理安排,一般的应用程序还是可以承受的。
1楼
0
0
回复