Keil C51编译器的使用

发布者:upsilon30最新更新时间:2024-08-14 来源: cnblogs关键字:Keil  C51  编译器 手机看文章 扫描二维码
随时随地手机看文章

对于学习51系列单片机的人来说,Keil 可以说是最熟悉不过的了,但一直在Keil UI界面的掩盖之下,我们并不了解一个51的HEX文件是怎样从源代码文件一步一步生成的,这其中又有哪些跟我们的目标MCU有关。我们都知道,程序是从源代码—预编译—编译—连接—生成可以执行文件,今天,我将谈谈C51编译器的使用。


安装KEIL4软件

在网上找到KEIL4的安装文件,假设安装路径设在 D:Keil4 ,则找到这个文件夹,你会发现里面有两个子文件夹,一个是'C51',另外一个是'UV4';


'UV4'其实就是Keil软件,利用它可以很方便地建立和编译单片机工程,但是它的编译其实也是调用了'C51'中的编译器来完成的,所以我们将着重讲解一下'C51'文件夹;


C51文件夹下有以下文件夹

(1).ASM – 使用汇编语言时所包含的头文件


(2).BIN – 编译器执行文件


(3).INC – 使用C语言时所包含的头文件(例如reg52.h等文件)


(4).LIB – 各种类型51系列的库文件(正因为有了这些库文件的存在,我们才能使用C语言来对单片机进行编程)


(5).HLP – 帮助,里面有对各个编译器使用方法的介绍,有什么不懂的地方都可以在这里面找到解答


(6).Examples FlashMon ISD51 MON51 MON 390 RtxTiny2这几个文件夹跟我们今天所讲的内容无关,不作介绍


C51编译器

对51系列的单片机程序源文件的编译,主要是通过BIN文件夹下面的C51.EXE(编译) 、BL51.EXE(链接)、OH51.EXE(生成HEX文件)来实现,下面将逐个介绍。

(1)C51


打开HLPC51.CHM文件,在左边的目录中找到Compiling Programs,这里有介绍它的用法。


首先要设置环境变量(Environment Settings):

If you run the Cx51 Compiler within µVision IDE, you do not need any additional settings on your computer. If you want to run the Cx51 Compiler and utilities from the command prompt, you must manually create the following environment variables.

Variable

Path

Description

PATH

KEILC51BIN

Path to the C51 and CX51 executable programs.

TMP


Path to use for temporary files generated by the compiler. If the specified path does not exist, the compiler generates an error and aborts compilation.

C51INC

KEILC51INC

Path to the folder for Cx51 include files.

C51LIB

KEILC51LIB

Path to the folder for Cx51 library files.

在批处理中的设置方法为:


PATH= D:Keil4C51BIN;%PATH%


SET TMP=D:TMP


SET C51INC=D:Keil4C51INC


SET C51LIB=D:Keil4C51LIB


接下来是错误级别:


0为无错误;1为有警告;2为有错误,并且可能有警告;3为有致命错误;


ERRORLEVEL


After linking, the number of errors and warnings detected is output to the screen. The BL51 Linker/Locator then sets the ERRORLEVEL to indicate the status of the link process. Values are listed in the following table:

ERRORLEVEL

Description

0

No Errors or Warnings

1

Warnings Only

2

Errors and Possibly Warnings

3

Fatal Errors

最后是C51的用法(Command Prompt):


C51 sourcefile <[>directives...<]> 

C51 @commandfile 

比如要编译main.c文件的语法就是


C51 main.c 

经过编译之后会生成main.obj文件。


Directives为附加指令,可有可无,具体有什么附件指令及用法见帮助文件中的


Compiling ProgramsDirectives


(2)BL51


BL51的用法跟C51大同小异,用法(Command Prompt)如下:


BL51 <[>inputlist<]> <[>TO outputfile<]> <[>directives<]> 

BL51 @commandfile 

比如要链接之前的main.obj和51库,用法如下:


BL51 main.obj,D:Keil4C51LIBc51s.lib TO main.out RAMSIZE(256) 

 


这里我们用到了RAMSIZE这个附加指令,后面的数字代表我们的目标MCU的RAM大小


C51S.LIB为传统51系列单片机的库文件。


链接之后会产生main.out文件。


(3)OH51


转换输出文件成HEX文件,这个的用法最简单了,如下:


OH51 abs_file <[>HEXFILE (file)<]> 

比如转换上面的main.out文件到main.hex文件,则用法如下:


OH51 main.out HEXFILE(main.hex)


 


 


完整的DEMO

我们的工程目录设在D:51project;


新建 main.c 文件,内容如下

/** @file main.c


* @brief 调用fun.c文件中的fun()函数


* @author 吴宏伟


* @date 2012-2-5


*/


#include


#include 'fun.h'


void main()


{    


    fun();


    while(1);


}


新建fun.h文件,内容如下:

#ifndef __FUN__


void fun();


#endif


新建fun.c文件,内容如下:

/** @file fun.c


* @brief fun()函数定义,设置各IO引脚的输出为0XF0;


* @author 吴宏伟


* @date 2012-2-5


*/


#include


void fun()


{


    P0=P1=P2=P3=0xf0;


}


新建Makefile.cmd批处理文件(什么是批处理,网上搜下吧),内容如下

@echo off


@rem this makefile is executed to build a 51 project


@rem written by homeway from Chaofeng Studio, 2012/2/5


 


@rem first set the environment settings


PATH=D:KEIL4C51BIN;%PATH%


SET C51INC=D:KEIL4C51INC


SET C51LIB=D:KEIL4C51LIB


SET PROJECT=D:51PROJECT


SET OUTPUT=D:51PROJECT51.hex


 


%rem compile the project files


C51 %PROJECT%main.c


C51 %PROJECT%fun.c


 


IF ERRORLEVEL 2 GOTO :FAILED


IF ERRORLEVEL 3 GOTO :FAILED


 


%rem link the object files


BL51 main.obj,fun.obj,%C51LIB%C51S.lib TO 51 RAMSIZE(256)


 


IF ERRORLEVEL 2 GOTO :FAILED


IF ERRORLEVEL 3 GOTO :FAILED


 


%rem convert 51 to 51.hex


OH51 51 HEXFILE(%OUTPUT%)


goto :SUCCESS


 


:FAILED


echo 编译失败!


pause


exit 1


 


:SUCCESS


echo 编译成功!


pause


exit 0


双击makefile.cmd文件,系统为自动编译并生成51.hex

 


后记:最近才刚刚接触对各种单片机代码的手工编译,因此今天只是简单介绍一下C51编译器的简单用法,更高级的应用本人将继续学习,接下来将有一篇在SlickEdit环境下如何配置C51编译命令的文章,敬请期待。


关键字:Keil  C51  编译器 引用地址:Keil C51编译器的使用

上一篇:让SlickEdit 自动编译Keil C51工程
下一篇:闪烁的LED灯

推荐阅读最新更新时间:2024-11-12 21:26

关于c51串口的驱动
1、C51串口的弊端。 C51的串口收发程序相信大家都很熟悉了,在hello.c里面有很简单的例程,不知 道大家有没有注意到hello.c里面有一句很不显眼的语句 TI = 1; 当你在初始化串口的时候如果你不让TI = 1的话,相信你看到你的数据永远都发不出去,debug里运行stop会看到程序实际上是进行到了while(!TI);的语句处进入死循环了。 深 入一点的看,可以在keil/c51/lib下发现putchar函数的原文件,和许多软件串口驱动一样printf()都是反复调用putchar() 来实现的,所以putchar函数是我们进入死循环的症结。putchar函数很简单,在其中有一个最小实现方式,我就以这个简单的例
[单片机]
C51脉冲宽度检测程序
/********************************************** 315无线模块 PT2262 1.5M 270KHz 可以测出脉冲宽度 起始时间 5000us 高电平时间 490us 低 电平 时间 160us HH=1 LL=0 LH=F ***********************************************/ #include reg51.h typedef unsigned int uint; long plu; void delay(uint); main() { TMOD=0x09; //0x0000 1001b ET0=1;
[单片机]
KEIL单片机C语言精确延时值的计算
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。 共有三条延时函数说明如下: 函数调用分两级:一级是小于10US的延时,二级是大于10US的延时 // //----------微秒级延时--------- 延时时间=(3+5*X)/12 提示(单位us, X不能大于255) // { uchar data i; for(;Ms 0;Ms--) for(i=
[单片机]
Keil C51中断程序规则
interrupt 函数属性当包含在一个声明中指定函数为一个中断函数例如 unsigned int interruptcnt; unsigned char second; void timer0 (void) interrupt 1 using 2 { if (++interruptcnt == 4000) { /* count to 4000 */ second++; /* second counter */ interruptcnt = 0; /* clear int counter */ } interrupt 属性的参数为0 到31 的整常数值 函数属性用来选择和非中断程序不同的寄存器组 带操作数的表达式和in
[单片机]
AVR单片机入门+使用keil-MDK裸奔TQ2440
两三个月没更新博客了,近两个月在学习AVR单片机,芯片的复杂度提高了不少,光300页的数据手册就看了三遍才有个大概的认识。接下来要做实验来熟悉各个模块啊,就找到了马潮老师的《单片机C语言程序设计实训--基于AVR PROTEUS仿真》这本极好的入门书籍,到现在基础练习就差一个上位机和下位机通信和看门狗实验没有做了,遗憾的是这本书布置的“作业”整体难度不高,有些作业一眼就能想出解决方案的就没有做,我认为还不清楚该怎么做的就一个也不放过。 每次开始学习新类型单片机的时候,都需要做的事是: 1)选择合适的单片机芯片 2)选择合适的开发环境 3)选择合适的烧写工具 4)学写裸奔程序以此熟悉单片机片上的资源 这样才能开始应用级的开发。我
[单片机]
AVR单片机入门+使用<font color='red'>keil</font>-MDK裸奔TQ2440
KEIL 同一工程中的多文件处理
首先,我们需要一个新文档,这个文档的建立有两种方法(以delay1s函数为例)。第一种,在工程目录下建立一个delay1s.txt然后将其改名为delay1s.h。因为都是同编码的所以不会出现乱码,然后在工程中将其打开。第二种方法是直接在工程中新建一个文档,然后保存的时候将名字保存为delay1s.h即可。如果是需要添加很多文件的话建议使用第一种方法,这是个人建议。其次,我们需要编写delay1s.h这个文件的内容,其内容如下: #ifndef _DELAY1S_H_ #define _DELAY1S_H_ void delay1s();//延时函数 #endif 这个是头文件的定义,作用是声明了delay1s()函数,因为
[单片机]
keil c51程序设计中集中精确延时方法
1使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved