使用Keil写C51程序或汇编程序时,Keil软件存在两个严重问题,一是操作较为繁琐,其实这是所有大型IDE的共同问题,Keil和VS比起来也只能是小巫见大巫;二是Keil软件自带的编辑器委实功能有限,换行处理起来都显得很吃力,每次操作,都有一种又回到二十年前的感觉。
下面我们给出一个手动编译C51程序的方案,目标只有一个,用起来顺手,能给出一些基本的错误提示,过程极为简单,如果要进行调试等复杂操作,还是在Keil环境较为可靠。
一、准备
这里需要做两项准备工作,:
一是安装Keil软件;
二是安装你个人较为顺手的文本编辑器。
二、Keil是如何编译C51程序的
Keil软件是如何编译C51程序的呢,自不待言,编译过程和普通的C程序一样,同样包括编译和链接过程,但是最后不是生成可执行文件;二是由于一般51单片机中没有操作系统,需要生成一种绝对目标文件(.abs),由此生成可被单片机执行的hex文件。
需要得到这样的过程。
首先在某个目录下建立一个Keil工程,工程名为mcc(manual compile c51,手动编译C51的意思),芯片选择Atmel的at89c52,添加三个文件,分别为:main.c,func.h和func.c进行测试。内容如下:
/* main.c */
#include <reg52.h>
#include "func.h"
void main(void)
{
display();
while(1) {
;
}
}
及
/* func.h */
#ifndef FUNC_H
#define FUNC_H
void display();
#endif // FUNC_H
和
/* func.c */
#include <reg52.h>
#include "func.h"
void display()
{
P1 = 0x0f;
}
将其添加到Keil工程,执行,看看有没有错误和警告。
然后打开“Target Options…”对话框,如下图:

在弹出的Options for Target ‘Target 1’对话框中,选Output选项卡,勾选上“Creat HEX File”和“Create Batch File”两个选项,如下图:

然后点击OK,后再次执行,这个时候回到mcc工程目录下,能看到生成了hex文件,同时生成一个Target 1.BAT文件,这是个windows批处理脚本。用文本编辑器将其打开,内容如下:
SET C51INC=e:\Keil\C51\INC\Atmel\;e:\Keil\C51\INC\
SET C51LIB=e:\Keil\C51\LIB
SET CPU_TYPE=AT89C52
SET CPU_VENDOR=Atmel
SET UV2_TARGET=Target 1
SET CPU_XTAL=0x016E3600
"e:\Keil\C51\BIN\C51.EXE" @main.__i
"e:\Keil\C51\BIN\C51.EXE" @func.__i
"e:\Keil\C51\BIN\BL51.EXE" @mcc.lnp
"e:\Keil\C51\BIN\OH51.EXE" "mcc"
你可以看到一些信息:
C51INC变量是引入的标准头文件;
C51LIB变量引入标准链接库;
CPU_TYPE和CPU_VENDOR为引入的芯片类型;
UV2_TARGET为源文件分组;
CPU_XTALL为设定的晶振频率,调试时有用,0x016E3600为十进制的24M,这是生成Keil工程时默认的晶振频率。
上面这些变量对于今天的简单配置并没有什么用处,有用的是下面4行。
一个可执行的EXE后面跟一个@+纯文本文件,是一种批处理格式,意思是执行该文件中的内容。这里main.__i、func.__i和mcc.lnp看起来挺玄乎,其实就是纯文本文件,它们都在keil工程目录下。
用文本编辑器查看main.__i的内容为:
"main.c" BROWSE DEBUG OBJECTEXTEND
其后缀BROWSE DEBUG OBJECTEXTEND对于我们并没有什么用,Keil软件编译过程中用于附加一些调试信息。
同样,用文本编辑器查看func.__i的内容为:
"func.c" BROWSE DEBUG OBJECTEXTEND
这样,
"e:\Keil\C51\BIN\C51.EXE" @main.__i
"e:\Keil\C51\BIN\C51.EXE" @func.__i
两行代码,实际执行的是,
"e:\Keil\C51\BIN\C51.EXE" main.c
"e:\Keil\C51\BIN\C51.EXE" func.c
这是编译过程,生成同名目标文件main.obj和func.obj。
再来查看mcc.lnp的内容:
"main.obj",
"func.obj"
TO "mcc"
RAMSIZE(256)
这里,最后的
RAMSIZE(256)
给出at89c52的RAM容量。于是,
"e:\Keil\C51\BIN\BL51.EXE" @mcc.lnp
执行的内容其实为:
"e:\Keil\C51\BIN\BL51.EXE" "main.obj","func.obj" TO "mcc"
这是链接过程,生成一个没有扩展名的文件mcc,这是绝对目标文件。最后:
"e:\Keil\C51\BIN\OH51.EXE" "mcc"
用于生成hex文件。
其总体过程需要keil三个命令,这三个命令在“Keil安装目录\C51\BIN”目录下,分别为:
c51.exe ——用于编译原文件,默认生成同名的OBJ文件;
bl51.exe —— 用于链接目标文件,多个目标文件间用逗号连接,格式为:
BL51.EXE 目标文件1.obj, 目标文件2.obj, … , 目标文件n.obj TO 绝对目标文件
oh51.exe —— 用于生成hex文件。默认名称同绝对目标文件名。
三、手动编译
试验一:手动编译C51
为了试验简单,将刚才写的main.c,func.h,func.c三个文件复制到一个目录下,例如我是保存在:J:\program\program_tibits\mcc_test_1目录下。
win+r,键入cmd打开控制台窗口。键入:
cd /d J:\program\program_tibits\mcc_test_1
后回车,便可以转到所建的目录下:用dir命令查看,为:
J:\program\program_tibits\mcc_test_1>dir
驱动器 J 中的卷是 写作
卷的序列号是 9AE3-528D
J:\program\program_tibits\mcc_test_1 的目录
2024/01/28 08:49 <DIR> .
2024/01/28 08:49 <DIR> ..
2024/01/28 08:07 90 func.c
2024/01/28 08:07 85 func.h
2024/01/28 08:03 116 main.c
3 个文件 291 字节
2 个目录 79,599,349,760 可用字节
然后键入:
e:\Keil\C51\BIN\C51.EXE main.c
便可以对main.c进行编译,再次dir查看目录,可以看到生成了main.OBJ文件。然后键入:
e:\Keil\C51\BIN\C51.EXE func.c
对func.c进行编译,再次dir查看目录,可以看到生成了func.OBJ文件。然后键入:
e:\Keil\C51\BIN\BL51.EXE main.obj,func.obj to mcc
再次dir查看生成了一个mcc文件。然后键入:
e:\Keil\C51\BIN\OH51.EXE mcc
再次dir命令查看,看到目录中生成了一个hex文件,为:
J:\program\program_tibits\mcc_test_1>dir
驱动器 J 中的卷是 写作
卷的序列号是 9AE3-528D
J:\program\program_tibits\mcc_test_1 的目录
2024/01/28 08:58 <DIR> .
2024/01/28 08:58 <DIR> ..
2024/01/28 08:07 90 func.c
2024/01/28 08:07 85 func.h
2024/01/28 08:55 894 func.LST
2024/01/28 08:55 189 func.OBJ
2024/01/28 08:03 116 main.c
2024/01/28 08:54 1,003 main.LST
2024/01/28 08:54 237 main.OBJ
2024/01/28 08:57 363 MCC
2024/01/28 08:58 113 mcc.hex
2024/01/28 08:57 1,334 MCC.M51
10 个文件 4,424 字节
2 个目录 79,599,337,472 可用字节
如果你有兴趣,可以将这个mcc.hex下到52单片机中,看看运行。
四、配置环境变量
这个操作过程还是相对繁琐,我们简化操作。
将E:\Keil\C51\BIN目录添加到系统环境变量path中,如下操作。
首先右键点击“此电脑”,在弹出的菜单中选“属性”菜单项,弹出“系统”界面,选择其中的“高级系统设置”:

后弹出“系统属性对话框”,选择环境变量:

在弹出的“环境变量”对话框中点击“新建”按钮:

然后弹出“新建用户变量”对话框,在“变量名”后的文本框输入“C51”在“变量值”后的文本框中输入KEIL安装的C51路径:

然后确定,然后在“环境变量”对话框中,选中“path”变量,点“编辑”(如果你的系统没有该变量,可以选择新建,建立这样一个变量),弹出“编辑环境变量对话框”,在末尾添加“%C51%\BIN”:

然后一直确定回去,退出“属性”对话框。现在环境变量中已经有了C51、BL51、OH51命令。
在回到控制台,可以直接使用:
C51 main.c
C51 func.c
BL51 main.obj,func.obj to mcc
OH51 mcc
进行编译了,其结果和上面一样。
五、bat脚本编译
这还是太过于繁琐,我们可以在保存mian.c、func.h和func.c的目录下建立一个bat脚本,如命名为:exec51prj.bat,用文本编辑器打开,键入如下内容:
C51 main.c
C51 func.c
BL51 main.obj,func.obj to mcc
OH51 mcc
@pause
如此,便可以通过鼠标双击exec51prj.bat文件完成整个过程。其后的语句@pause几乎是必须的,不然控制台弹出执行完成后,便会自动退出,一旦有编程错误,便无法发现了。双击后执行如下:
J:\program\program_tibits\mcc_test_1>C51 main.c
C51 COMPILER V9.01 - SN: K1PMC-DDHSRC
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2009
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
J:\program\program_tibits\mcc_test_1>C51 func.c
C51 COMPILER V9.01 - SN: K1PMC-DDHSRC
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2009
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
J:\program\program_tibits\mcc_test_1>BL51 main.obj,func.obj to mcc
BL51 BANKED LINKER/LOCATER V6.22 - SN: K1PMC-DDHSRC
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2009
Program Size: data=9.0 xdata=0 code=24
LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 0 ERROR(S)
J:\program\program_tibits\mcc_test_1>OH51 mcc
OBJECT TO HEX FILE CONVERTER OH51 V2.6
COPYRIGHT KEIL ELEKTRONIK GmbH 1991 - 2001
GENERATING INTEL HEX FILE: mcc.hex
OBJECT TO HEX CONVERSION COMPLETED.
请按任意键继续. . .
六、总结
这样就可以使用顺手的文本编辑器编辑源文件,然后用bat脚本执行,这个办法相对简陋,需要注意几件事:
1、一般的文本编辑器对C51的特殊关键字没有语法高亮,如xdata,较为容易出现录入错误;
2、编程人对单片机容量、关键字声明等要极度心中有数,不然会出现一些莫名其妙的错误,编译能通过,但是不能执行,如下代码:
#include <reg52.h>
char xdata my_mempool[1024];
void main(void)
{
//...
init_mempool(my_mempool, sizeof(my_mempool));
}
编译过程并不会报错,但是分配的内存池明显太大了。程序在单片机中无法顺利执行。
3、如果要手动进行调试,会相当繁琐,调试工作还是在Keil下进行较好。
另,也可以使用VS Code来进行配置,以后文章进行介绍。
230



被折叠的 条评论
为什么被折叠?



