Top Banner
Keil C51 使用详解 1 作者:未知 文章来源:21ic 点击数: 3489 更新时间:2005-3-15 第一章 Keil C51 开发系统基本知识... 6 第一节 系统概述... 6 第二节 Keil C51 单片机软件开发系统的整体结构... 6 第三节 Keil C51 工具包的安装... 7 1. C51 for Dos 7 2. C51 for Windows 的安装及注意事项:... 7 第四节 Keil C51 工具包各部分功能及使用简介... 7 1. C51 A51. 7 2. L51 BL51. 8 3. DScope51Tscope51 Monitor51. 8 4. Ishell uVision. 9 第二章 Keil C51 软件使用详解... 10 第一节 Keil C51 编译器的控制指令... 10 1. 源文件控制类... 10 2. 目标文件(Object)控制类:... 10 3. 列表文件(listing)控制类:... 10 第二节 dScope51 的使用... 11 1. dScope51 for Dos 11 2. dScope for Windows 12 第三节 Monitor51 及其使用... 13 1. Monitor51 对硬件的要求... 13 2. Mon51 的使用... 13 3. MON51 的配置... 13 4. 串口连接图:... 13 5. MON51 命令及使用... 14
85

Keil C51 使用详解 1 - Shandong University

May 10, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Keil C51 使用详解 1 - Shandong University

Keil C51使用详解 1

作者:未知 文章来源:21ic 点击数: 3489 更新时间:2005-3-15

第一章 Keil C51开发系统基本知识... 6

第一节 系统概述... 6

第二节 Keil C51单片机软件开发系统的整体结构... 6

第三节 Keil C51工具包的安装... 7

1. C51 for Dos 7

2. C51 for Windows的安装及注意事项:... 7

第四节 Keil C51工具包各部分功能及使用简介... 7

1. C51与 A51. 7

2. L51和 BL51. 8

3. DScope51,Tscope51及Monitor51. 8

4. Ishell及 uVision. 9

第二章 Keil C51软件使用详解... 10

第一节 Keil C51编译器的控制指令... 10

1. 源文件控制类... 10

2. 目标文件(Object)控制类:... 10

3. 列表文件(listing)控制类:... 10

第二节 dScope51的使用... 11

1. dScope51 for Dos 11

2. dScope for Windows 12

第三节 Monitor51及其使用... 13

1. Monitor51对硬件的要求... 13

2. Mon51的使用... 13

3. MON51的配置... 13

4. 串口连接图:... 13

5. MON51命令及使用... 14

Page 2: Keil C51 使用详解 1 - Shandong University

第四节 集成开发环境(IDE)的使用... 14

1. Ishell for Dos的使用... 14

2. uVision for windows的使用... 15

第三章 Keil C51 vs 标准 C.. 15

第一节 Keil C51扩展关键字... 15

第二节 内存区域(Memory Areas):... 16

1. Pragram Area:... 16

2. Internal Data Memory: 16

3. External Data Memory. 16

4. Speciac Function Register Memory. 16

第三节 存储模式... 16

1. Small模式... 16

2. Compact模式... 17

3. large模式... 17

第四节 存储类型声明... 17

第五节 变量或数据类型... 17

第六节 位变量与声明... 17

1. bit型变量... 17

2. 可位寻址区说明 20H-2FH.. 18

第七节 Keil C51指针... 18

1. 一般指针... 18

2. 存储器指针... 18

3. 指针转换... 18

第八节 Keil C51函数... 19

1. 中断函数声明:... 19

2. 通用存储工作区... 19

3. 选通用存储工作区由 using x声明,见上例。... 19

4. 指定存储模式... 19

5. #pragma disable. 19

Page 3: Keil C51 使用详解 1 - Shandong University

6. 递归或可重入函数指定... 19

7. 指定 PL/M-51函数... 20

第四章 Keil C51高级编程... 20

第一节 绝对地址访问... 20

1. 绝对宏:... 20

2. _at_关键字... 21

3. 连接定位控制... 21

第二节 Keil C51与汇编的接口... 21

1. 模块内接口... 21

2. 模块间接口... 21

第三节 Keil C51软件包中的通用文件... 22

1. 动态内存分配... 22

2. C51启动文件 STARTUP.A51. 22

3. 标准输入输出文件... 25

4. 其它文件... 25

第四节 段名协定与程序优化... 25

1. 段名协定(Segment Naming Conventions) 25

2. 程序优化... 25

第五章 Keil C51库函数参考... 26

第一节 本征库函数(intrinsic routines)和非本征证库函数... 26

第二节 几类重要库函数... 26

1. 专用寄存器 include文件... 26

2. 绝对地址 include文件 absacc.h. 26

3. 动态内存分配函数,位于 stdlib.h中... 27

4. 缓冲区处理函数位于“string.h”中... 27

5. 输入输出流函数,位于“stdio.h”中... 27

第三节 Keil C51库函数原型列表... 27

1. CTYPE.H.. 27

2. INTRINS.H.. 27

Page 4: Keil C51 使用详解 1 - Shandong University

3. STDIO.H.. 28

4. STDLIB.H.. 28

5. STRING.H.. 28

第六章 Keil C51例子:Hello.c.. 29

第一节 uVision for Windows的使用步骤... 29

第二节 Ishell for Dos使用步骤... 30

第七章 Keil C51的代码效率... 30

第一节 存储模式的影响... 30

第二节 程序结构的影响... 31

第八章 dScope for Windows使用详解... 32

第一节 概述... 32

1. 主窗口(Mainframe Window)... 32

2. 调试窗口(DEBUG Window)... 32

3. 命令窗口(Command Window)... 32

4. 观察窗口(Watch Window)... 32

5. 寄存器窗口(Registe Window)... 32

6. 串口窗口(Serical Windows)... 32

7. 性能分析窗口... 32

8. 内存窗口(Memory Window)... 32

9. 符号浏览窗口(Symbol Browser Window)... 33

10. 调用线窗口(Call-Stack Window)... 33

11. 代码覆盖窗口... 33

12. 外围设备窗口(peripherals) 33

第二节 dScope for Windows基本操作... 33

1. 指定初始化文件... 33

2. 观察变量... 33

3. 显示 RAM的值... 34

4. 观察堆栈... 34

5. 中断处理程序调试... 34

Page 5: Keil C51 使用详解 1 - Shandong University

6. 性能分析(Performance Analyzer:PA)... 34

第三节 dScope for Windows命令文件的编制... 34

1. 地址空间及地址空间类型... 34

2. 常量... 35

3. 变量... 36

4. 运算符... 38

5. 表达式... 38

6. 数组... 38

7. 结构和联合... 38

8. 指针:... 38

9. dScope命令语句... 38

10. 函数... 43

第一章 Keil C51开发系统基本知识

第一节 系统概述

Keil C51是美国 Keil Software公司出品的 51系列兼容单片机 C语言软件开发系统,与汇编相比,C语言

在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用 C来开发,

体会更加深刻。

Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,

只要看一下编译后生成的汇编代码,就能体会到 Keil C51生成的目标代码效率非常之高,多数语句生成的

汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

下面详细介绍 Keil C51开发系统各部分功能和使用。

第二节 Keil C51单片机软件开发系统的整体结构

C51工具包的整体结构,如图(1)所示,其中 uVision与 Ishell分别是 C51 for Windows和 for Dos的集成开

Page 6: Keil C51 使用详解 1 - Shandong University

发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用 IDE本身或其它编

辑器编辑 C或汇编源文件。然后分别由 C51及 A51编译器编译生成目标文件(.OBJ)。目标文件可由 LIB51

创建生成库文件,也可以与库文件一起经 L51连接定位生成绝对目标文件(.ABS)。ABS文件由 OH51转换

成标准的 Hex文件,以供调试器 dScope51或 tScope51使用进行源代码级调试,也可由仿真器使用直接对目

标板进行调试,也可以直接写入程序存贮器如 EPROM中。

图(1) C51工具包整体结构图

第三节 Keil C51工具包的安装

1. C51 for Dos

在Windows下直接运行软件包中 DOS\C51DOS.exe然后选择安装目录即可。完毕后欲使系统正常工作须

进行以下操作(设 C:\C51为安装目录):

修改 Autoexec.bat,加入

path=C:\C51\Bin

Set C51LIB=C:\C51\LIB

Set C51INC=C:\C51\INC

然后运行 Autoexec.bat

2. C51 for Windows的安装及注意事项:

在Windows下运行软件包中WIN\Setup.exe,最好选择安装目录与 C51 for Dos相同,这样设置最简单(设

安装于 C:\C51目录下)。然后将软件包中 crack目录中的文件拷入 C:\C51\Bin目录下。

第四节 Keil C51工具包各部分功能及使用简介

1. C51与 A51

(1) C51

C51是 C语言编译器,其使用方法为:

C51 sourcefile[编译控制指令]

或者 C51 @ commandfile

其中 sourcefile为 C源文件(.C)。大量的编译控制指令完成 C51编译器的全部功能。包控 C51输出文件 C.

LST,.OBJ,.I和.SRC文件的控制。源文件(.C)的控制等,详见第五部分的具体介绍。

而 Commandfile为一个连接控制文件其内容包括:.C源文件及各编译控制指令,它没有固定的名字,开

发人员可根据自己的习惯指定,它适于用控制指令较多的场合。

Page 7: Keil C51 使用详解 1 - Shandong University

(2) A51

A51是汇编语言编译器,使用方法为:

A51 sourcefile[编译控制指令]

或 A51 @ commandfile

其中 sourcefile为汇编源文件(.asm或.a51),而编译控制指令的使用与其它汇编如 ASM语言类似,可参考其

他汇编语言材料。

Commandfile同 C51中的 Commandfile类似,它使 A51使用和修改方便。

2. L51和 BL51

(1) L51

L51是 Keil C51软件包提供的连接/定位器,其功能是将编译生成的 OBJ文件与库文件连接定位生成绝对

目标文件(.ABS),其使用方法为:

L51 目标文件列表[库文件列表] [to outputfile] [连接控制指令]

或 L51 @Commandfile

源程序的多个模块分别经 C51与 A51编译后生成多个 OBJ文件,连接时,这些文件全列于目标文件列表

中,作为输入文件,如果还需与库文件(.LiB)相连接,则库文件也必须列在其后。outputfile为输文件名,缺

少时为第一模块名,后缀为.ABS。连接控制指令提供了连接定位时的所有控制功能。Commandfile为连接

控制文件,其具体内容是包括了目标文件列表,库文件列表及输出文件、连接控制命令,以取代第一种繁

琐的格式,由于目标模块库文件大多不止 1个,因而第 2种方法较多见,这个文件名字也可由使用者随意

指定。

(2) Bl51

BL51也是 C51软件包的连接/定位器,其具有 L51的所有功能,此外它还具有以下 3点特别之处:

a. 可以连接定位大于 64kBytes的程序。

b. 具有代码域及域切换功能(CodeBanking & Bank Switching)

c. 可用于 RTX51操作系统

RTX51是一个实时多任务操作系统,它改变了传统的编程模式,甚至不必用 main( )函数,单片机系统软

件向 RTOS发展是一种趋势,这种趋势对于 186和 386及 68K系列 CPU更为明显和必须,对 8051因 CPU

较为简单,程序结构等都不太复杂,RTX51作用显得不太突出,其专业版软件 PK51软件包甚至不包括 RT

X51Full,而只有一个 RTX51TINY版本的 RTOS。RTX51 TINY适用于无外部 RAM的单片机系统,因而可

用面很窄,在本文中不作介绍。Bank switching技术因使用很少也不作介绍。

Page 8: Keil C51 使用详解 1 - Shandong University

3. DScope51,Tscope51及Monitor51

(1) dScope51

dScope51是一个源级调试器和模拟器,它可以调试由 C51编译器、A51汇编器、PL/M-51编译器及 ASM

-51汇编器产生的程序。它不需目标板(for windows也可通过 mon51接目标板),只能进行软件模拟,但

其功能强大,可模拟 CPU及其外围器件,如内部串口,外部 I/O及定时器等,能对嵌入式软件功能进行有

效测试。

其使用方法为:

DS51[debugfile][INIT(initfile)]

其中 debugfile是一个 Hex格式的 8051文件,即待调试的文件其为可选的,可在进入 dScope51后用 load

命令装入。

Initfile为一个初使化文件,它在启动 dScope51后,在 debugfile装入前装入,装有一些 dScope的初使化

参数及常用调试函数等。下面是一个 dScope.ini文件(for dos)的内容:

Load ..\..\ds51\8051.iof

Map 0,0xffff

dScope51 for Windows则直接用鼠标进入,然后用 load装入待调文件。

(2) tScope51

与 dScope51不同的是 Scope51必须带目标板,目前它可以通过两种方式访问目标板。(1) 通过 EMul51在

线仿真器,tScope51为该仿真器准备了一个动态连接文件 EMUL51.IOT,但该方法必须配合该仿真器。(2) 通

过Monitov51监控程序,这种方法是可行的,tScope51为访问Monitor51专门带有MON51.IOT连接程序,

使用时可通过串口及监控程序来调试目标板。

其使用方法为:

TS51[INIT(file_name.ini)]

其中 file_name.ini为一个初使化文件。

进入 TS51后,必须装入 IOT文件,可用的有MON51.IOT及 EMUL51.IOT两种,如装入MON51.IOT:

Load.C:\C51\TS51\MON51.IOT CPUTYPE(80517)

可惜的是 tScope51只有 for Dos的版本。

(3) Monitor 51

Monitor51是一个监控程序通过 PC机的串口与目标板进行通信,Monitor操作需要MON51或 dScope51 f

or Windows,后面部分将对Monitor51做较为详细的介绍。

Page 9: Keil C51 使用详解 1 - Shandong University

4. Ishell及 uVision

(1) Ishell for Dos

这是一个 for Dos的 IDE,直接在命令行键入 Ishell,则进入该环境,它使用简单方便。其命令行与 DOS

命令行具有同样的功能,对单模块的 Project直接由菜单进行编译连接,对多模块的 project。则通过批处理,

BAT文件进行编译连接,然后通过菜单控制由 dScope51或 tScope51对程序进行调试,因为是 for dos的,

不做太详细介绍。

(2) uVision for Windows

uVision for Windows是一个标准的Windows应用程序,它是 C51的一个集成软件开发平台,具有源代码

编辑、project管理、集成的 make等功能,它的人机界面友好,操作方便,是开发者的首选,具体配置及使

用见第五部分。

第二章 Keil C51软件使用详解

第一节 Keil C51编译器的控制指令

C51编译器的控制指令分为三类:源文件控制类,目标文件控制类及列表控制类。

1. 源文件控制类

NOEXTEND:C51源文件不允许使用 ANSI C扩展功能。

DEFINE(DF):定义预处理(在 C51命令行)。

2. 目标文件(Object)控制类:

COMPACT LARGE SMALL 选编译模式

DEBUG(DB) 包含调试信息,以供仿真器或 dSCope51使用。

NOAMAKE(NOAM) 禁止 AutoMake信息记录

NOREGPARMS 禁止用寄存器传递参数

OBJECTEXTEND(OE) Object文件包含附加变量类型信息

OPTIMIZE(OT) 指定优化级别

REGFILE(RF) 指定一个寄存器使用的文件以供整体优化用

REGISTERBANK(RB) 指定一个供绝对寄存器访问的寄存器区名

SRC 不生成目标文件只生成汇编源文件

其它控件不常用。

3. 列表文件(listing)控制类:

CODE(CD):向列表文件加入汇编列表

Page 10: Keil C51 使用详解 1 - Shandong University

LISTINCLUDE(LC):显示 indude文件

SYMBOLS(SB):列表文件包括模块内所有符号的列表

WARNINGLEVEL(WL):选择“警告”级别

第二节 dScope51的使用

1. dScope51 for Dos

总的来说 dScope51具有以下特性:

●高级语言显示模式

●集成硬件环境模拟

●单步或“GO”执行模式

●存储器、寄存器及变量访问

●Watch表达式之值

●函数与信号功能

下面,具体说明在进入 dScope51 for Dos之后,如何实现上述功能,dScope51采用下拉菜单格式和窗口显

示控制,共有 language、serial、exe、register四个窗口,其中 exe为命令行窗口,language为程序窗口,ser

ial为串口窗,register为寄存器窗。

(1) 高级语言显示模式

单击主菜单中的“View”,第一栏中的三条命令“Highlevel”、“Mixed”、“Assembly”分别对所装入的程序按

照“高级”、“混合级”及“汇编级”三种方式显示,以方便调试使用。

(2) 集成硬件环境模拟显示

主菜单中“Peripheral”各条能显示模拟硬件环境的状态,其中:

i/o Port:显示各 I/O口之值,对 8031而言 SFR中的 P1、P2、P3、P0与引脚之值分别列出:

Interrupt:显示 5个中断源的入口模式是否允许,优先级等中断状态。

Timer:显示各定时/计数器的模式,初始值状态等。

int Message:中断信息允许,如为允许(“>>”出现),则当中断申请时,显示中断源信息。比如当中断发生

时会显示:

“interrupt Timer 0 occured”等

A/D converter:

显示 A/D转换器状态无时,则提示“无”。

Serial:串口信息显示,包括串口模式、波特产等

Page 11: Keil C51 使用详解 1 - Shandong University

Other:其它器件,如为 8031则显示“ 无”

(3) 单步或“Go”执行

“F8”单步执行,“F5”全速执行到断点。或选主菜单中 Trace单步执行 CPU中的 Go全速执行。

(4) 存储器寄存器及变量访问

外部存储器管理MAP菜单:设置(set)、取消(reset)、显示(Display)处理可用存储空间。

修改 Code代码:ASM命令

存储器显示命令:D 类别为(X、D、I、B、C)

修改存储器命令:E 有以下几种命令 EB、EC、EI、EL、EF、EP

复杂数据类型显示:Object命令;用以显示结构或数组的内容。欲使此命令有效,C51编译器必须有 DB及

OBJECTEXTEND两条。

反汇编命令:U

(5) “Watch”表达式之值

在 View菜单的“Watch”一栏中有四项:其中包括定义Watch Point(Define)、删除Watch Point(remove,kill a

ll),及自动更新选项。

也可用WS、WK等命令代替,下面具体看“表达式”类型:

dScope51一次最多可设 16个WtchPoint表达式,显示于Watch Window之中,表达式可以是简单变量,也

可是复杂数据类型如结构、数组和指向结构的指针等,例如:

>WS *ptime

>WS ptime→hour

>WS some_record[o],analog等等

(6) 关于.IOF文件

启动 DS51后必须装入.IOF文件才能使 CPU及 Peripheral各项起作用,这个函数的使用是依据 8051系列

CPU的不同特点,装入 8051各 CPU硬件设备模拟驱动文件,比如 8031CPU就必须 load DS51目录下的 80

51.IOF。

2. dScope for Windows

dScope for windows具有 dScope for dos的全部功能,此外,它还具有以下明显的优点:

(1) 标准的Windows界面,操作更容易更简单;

(2) 常用操作多用对话框,而非 Dos的行命令方式;

(3) 窗口资源更加丰富:存储器窗口、覆盖率分析、运行状态分析窗口,加强了调试功能;

Page 12: Keil C51 使用详解 1 - Shandong University

因为 dScope for Windows功能强大,具体操作在第八章详细介绍。

第三节 Monitor51及其使用

1. Monitor51对硬件的要求

(1) 硬件系统为 51系列 CPU;

(2) 带 5K外部程序存储器(从 O地址开始),存放Monitor51程序;

(3) 256Bytes的外部数据存储器以及 5K的跟踪缓冲区,此外,外部数据存储器必须足够容纳所有应用程

序代码及数据,且所有外部数据存储器必须为冯·诺伊曼存储器,即能一致访问 XDATA与 Code空间。

(4) 一个定时器作为波特率发生器供串口使用;

(5) 6 Bytes的空余堆栈。

2. Mon51的使用

Mon51的使用途径有三种方式:

(1) Dos行命令方式

即先用 install对MON51进行配置,然后用MON51进入Monitor状态,启用各种命令对Monitor51进行

调试。

(2) tScope51方式

启动 tScope51装入 TS51目录下的MON51.IOT驱动文件,与目标板通信。

(3) dScope51 for Windows方式

在选 CPU驱动文件时,选“MON51.dll”,则检查目标板并进入MON51状态。

3. MON51的配置

(1) MON51 for Dos的配置

运行 install文件(在MON51目录下),不同的参数可以配置不同的硬件环境。INSTALL Serialtype [xdstasta

rt][codestart][bank][PROMCHECK]],具体说明见MON51帮助文件或使用手册。

(2) MON51 for Windows的配置

在启用MON51.dll时,会使得系统自动检查目标板连接,如配置不对,则弹出“Configuration”对话框,设

置 PC串口,波特率等,完毕单击“apply”有效。

4. 串口连接图:

收发交叉互连,RTS、CTS直连,DSR、DTR直连,具体引脚排列参考串口资料。

5. MON51命令及使用

详细的MON51命令可参阅帮助。

Page 13: Keil C51 使用详解 1 - Shandong University

第四节 集成开发环境(IDE)的使用

1. Ishell for Dos的使用

进入 Ishell之后看到两个窗口:一个是文件窗口,一个是 Dos命令行窗口,窗口上方是下拉式的命令菜单,

其中的 Files控制文件窗口的显隐。

使用 Ishell,第一步就是配置系统,即要学习两个文件的修改与创建:

(1) Ishell.CFG文件

每一个 project都有一个 Ishell.CFG,其中存放有“Option菜单和 Setup菜单下的部分信息;Bell enabled、M

onochrome enabled、Editor Selected、CRT Lines、target enviroment、name of user edit、Automatic load for co

nfiguration enabled、file window enabled、file specification for file window、translate command line controls、p

roject name等。

对每个 project都必须设置以上信息,然后存盘“setup”的的“save”,这样才可正式开始下面工作。

(2) IShell.col文件

对 IDE颜色设置,如不改动,可以缺省为主。

(3) CDF文件

该文件位于 BIN目录下,每一文件定义一组外部函数工具包,即定义外部环境如 8051.CDF,USER.CDF

等,开发者可修改 CDF文件,供自己使用,至于 CDF文件内容可查看一下 8051.CDF即可知道。注意.CD

F文件是 Ishell系统的核心所在,不同的 CDF文件可使本 IDE适用于不同的编译、连接系统,即本 IDE并

不仅适于 C51。

下面谈一谈 Automake工具:

C51的 Automake是一个 project管理器,在 8051工具包中以 OBJECT文件形式保留了一个 project的信息,

AutoMake用这些信息来进行 project管理,一旦手工建立一个 project,Automake可生成一个新的 OBJECT,

AutoMake利用此文件来编译那些修改过的文件。

Automake支持 C51、A51、L51/BL51、C166、A166、L166等编译连接器。点中主菜单中的 Automake即

运行本工具。

Ishell for Dos使用比较繁琐,推荐使用 uVision for windows。

2. uVision for windows的使用

uVision是一个标准的 windows应用程序,其编译功能、文件处理功能、project处理功能、窗口功能以及

工具引用功能(如 A51、C51、PL/M41、BL51 dScope等)等都较 Ishell for Dos要强得多。

uVision采用 BL51作连接器,因为 BL51兼容 L51,所以一切能在 Dos下工作的 project都可以到 uVision

Page 14: Keil C51 使用详解 1 - Shandong University

中进行连接调试。

uVision采用 dScope for windows作调试器,该调试器支持MON51及系统模拟两种方式,功能较 for DOS

要强大好用,调试功能强大。

注意:

(1) Option菜单下的各项要会使用,其中 A51、C51、PL/M51、BL51定义各文件所使用的编译、连接控制

指令,dScope定义一个 dScope初始化文件。Make则是定义一个 make文件。

(2) 进入调试是在 RUN菜单下运行 dScope。

(3) project中包括新建、打开、修改、更新、编译、连接等 poject处理,具体使用可参考后面的例子。

第三章 Keil C51 vs 标准 C

深入理解并应用 C51对标准 ANSIC的扩展是学习 C51的关键之一。因为大多数扩展功能都是直接针对 8

051系列 CPU硬件的。大致有以下 8类:

●8051存储类型及存储区域

●存储模式

●存储器类型声明

●变量类型声明

●位变量与位寻址

●特殊功能寄存器(SFR)

●C51指针

●函数属性

具体说明如下(8031为缺省 CPU)。

第一节 Keil C51扩展关键字

C51 V4.0版本有以下扩展关键字(共 19个):

_at_ idata sfr16 alien interrupt small

bdata large _task_ Code bit pdata

using reentrant xdata compact sbit data sfr

第二节 内存区域(Memory Areas):

1. Pragram Area:

由 Code说明可有多达 64kBytes的程序存储器

2. Internal Data Memory:

Page 15: Keil C51 使用详解 1 - Shandong University

内部数据存储器可用以下关键字说明:

data:直接寻址区,为内部 RAM的低 128字节 00H~7FH

idata:间接寻址区,包括整个内部 RAM区 00H~FFH

bdata:可位寻址区, 20H~2FH

3. External Data Memory

外部 RAM视使用情况可由以下关键字标识:

xdata:可指定多达 64KB的外部直接寻址区,地址范围 0000H~0FFFFH

pdata:能访问 1页(25bBytes)的外部 RAM,主要用于紧凑模式(Compact Model)。

4. Speciac Function Register Memory

8051提供 128Bytes的 SFR寻址区,这区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串

口、I/O及其它部件,可由以下几种关键字说明:

sfr:字节寻址 比如 sfr P0=0x80;为 PO口地址为 80H,“=”后 H~FFH之间的常数。

sfr16:字寻址,如 sfr16 T2=0xcc;指定 Timer2口地址 T2L=0xcc T2H=0xCD

sbit:位寻址,如 sbit EA=0xAF;指定第 0xAF位为 EA,即中断允许

还可以有如下定义方法:

sbit 0V=PSW^2;(定义 0V为 PSW的第 2位)

sbit 0V=0XDO^2;(同上)

或 bit 0V-=0xD2(同上)。

第三节 存储模式

存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:

1. Small模式

所有缺省变量参数均装入内部 RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。

2. Compact模式

所有缺省变量均位于外部 RAM区的一页(256Bytes),具体哪一页可由 P2口指定,在 STARTUP.A51文件

中说明,也可用 pdata指定,优点是空间较 Small为宽裕速度较 Small慢,较 large要快,是一种中间状态。

3. large模式

所有缺省变量可放在多达 64KB的外部 RAM区,优点是空间大,可存变量多,缺点是速度较慢。

提示:存储模式在 C51编译器选项中选择。

第四节 存储类型声明

Page 16: Keil C51 使用详解 1 - Shandong University

变量或参数的存储类型可由存储模式指定缺省类型,也可由关键字直接声明指定。各类型分别用:code,d

ata,idata,xdata,pdata说明,例:

data uar1

char code array[ ]=“hello!”;

unsigned char xdata arr[10][4][4];

第五节 变量或数据类型

C51提供以下几种扩展数据类型:

bit 位变量值为 0或 1

sbit 从字节中定义的位变量 0或 1

sfr sfr字节地址 0~255

sfr16 sfr字地址 0~65535

其余数据类型如:char,enum,short,int,long,float等与 ANSI C相同。

第六节 位变量与声明

1. bit型变量

bit型变量可用变量类型,函数声明、函数返回值等,存贮于内部 RAM20H~2FH。

注意:

(1) 用#pragma disable说明函数和用“usign”指定的函数,不能返回 bit值。

(2) 一个 bit变量不能声明为指针,如 bit *ptr;是错误的

(3) 不能有 bit数组如:bit arr[5];错误。

2. 可位寻址区说明 20H-2FH

可作如下定义:

int bdata i;

char bdata arr[3],

然后:

sbit bito=in0;sbit bit15=I^15;

sbit arr07=arr[0]^7;sbit arr15=arr[i]^7;

第七节 Keil C51指针

C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).

1. 一般指针

Page 17: Keil C51 使用详解 1 - Shandong University

一般指针的声明和使用均与标准 C相同,不过同时还可以说明指针的存储类型,例如:

long * state;为一个指向 long型整数的指针,而 state本身则依存储模式存放。

char * xdata ptr;ptr为一个指向 char数据的指针,而 ptr本身放于外部 RAM区,以上的 long,char等指针

指向的数据可存放于任何存储器中。

一般指针本身用 3个字节存放,分别为存储器类型,高位偏移,低位偏移量。

2. 存储器指针

基于存储器的指针说明时即指定了存贮类型,例如:

char data * str;str指向 data区中 char型数据

int xdata * pow; pow指向外部 RAM的 int型整数。

这种指针存放时,只需一个字节或 2个字节就够了,因为只需存放偏移量。

3. 指针转换

即指针在上两种类型之间转化:

●当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。

●如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说

明所有函数原形。

●可以强行改变指针类型。

第八节 Keil C51函数

C51函数声明对 ANSI C作了扩展,具体包括:

1. 中断函数声明:

中断声明方法如下:

void serial_ISR () interrupt 4 [using 1]

{

/* ISR */

}

为提高代码的容错能力,在没用到的中断入口处生成 iret语句,定义没用到的中断。

/* define not used interrupt, so generate "IRET" in their entrance */

void extern0_ISR() interrupt 0{} /* not used */

void timer0_ISR () interrupt 1{} /* not used */

void extern1_ISR() interrupt 2{} /* not used */

Page 18: Keil C51 使用详解 1 - Shandong University

void timer1_ISR () interrupt 3{} /* not used */

void serial_ISR () interrupt 4{} /* not used */

2. 通用存储工作区

3. 选通用存储工作区由 using x声明,见上例。

4. 指定存储模式

由 small compact 及 large说明,例如:

void fun1(void) small { }

提示:small说明的函数内部变量全部使用内部 RAM。关键的经常性的耗时的地方可以这样声明,以提高

运行速度。

5. #pragma disable

在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。

6. 递归或可重入函数指定

在主程序和中断中都可调用的函数,容易产生问题。因为 51和 PC不同,PC使用堆栈传递参数,且静态

变量以外的内部变量都在堆栈中;而 51一般使用寄存器传递参数,内部变量一般在 RAM中,函数重入时

会破坏上次调用的数据。可以用以下两种方法解决函数重入:

a、在相应的函数前使用前述“#pragma disable”声明,即只允许主程序或中断之一调用该函数;

b、将该函数说明为可重入的。如下:

void func(param...) reentrant;

KeilC51编译后将生成一个可重入变量堆栈,然后就可以模拟通过堆栈传递变量的方法。

由于一般可重入函数由主程序和中断调用,所以通常中断使用与主程序不同的 R寄存器组。

另外,对可重入函数,在相应的函数前面加上开关“#pragma noaregs”,以禁止编译器使用绝对寄存器寻址,

可生成不依赖于寄存器组的代码。

7. 指定 PL/M-51函数

由 alien指定。

第四章 Keil C51高级编程

本章讨论以下内容:

●绝对地址访问

●C与汇编的接口

●C51软件包中的通用文件

Page 19: Keil C51 使用详解 1 - Shandong University

●段名转换与程序优化

第一节 绝对地址访问

C51提供了三种访问绝对地址的方法:

1. 绝对宏:

在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:

CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD

具体使用可看一看 absacc.h便知

例如:

rval=CBYTE[0x0002];指向程序存贮器的 0002h地址

rval=XWORD [0x0002];指向外 RAM的 0004h地址

2. _at_关键字

直接在数据定义后加上_at_ const即可,但是注意:

(1)绝对变量不能被初使化;

(2)bit型函数及变量不能用_at_指定。

例如:

idata struct link list _at_ 0x40;指定 list结构从 40h开始。

xdata char text[25b] _at_0xE000;指定 text数组从 0E000H开始

提示:如果外部绝对变量是 I/O端口等可自行变化数据,需要使用 volatile关键字进行描述,请参考 absacc.

h。

3. 连接定位控制

此法是利用连接控制指令 code xdata pdata \data bdata对“段”地址进行,如要指定某具体变量地址,则很有局

限性,不作详细讨论。

第二节 Keil C51与汇编的接口

1. 模块内接口

方法是用#pragma语句具体结构是:

#pragma asm

汇编行

Page 20: Keil C51 使用详解 1 - Shandong University

#pragma endasm

这种方法实质是通过 asm与 ndasm告诉 C51编译器中间行不用编译为汇编行,因而在编译控制指令中有

SRC以控制将这些不用编译的行存入其中。

2. 模块间接口

C模块与汇编模块的接口较简单,分别用 C51与 A51对源文件进行编译,然后用 L51将 obj文件连接即

可,关键问题在于 C函数与汇编函数之间的参数传递问题,C51中有两种参数传递方法。

(1) 通过寄存器传递函数参数

最多只能有 3个参数通过寄存器传递,规律如下表:

参数数目 CharIntlong,float 一般指针

1R7R6 & R7R4~R7R1~R3

2R5R4 & R5R4~R7R1~R3

3R3R2 & R3R1~R3

(2) 通过固定存储区传递(fixed memory)

这种方法将 bit型参数传给一个存储段中:

?function_name?BIT

将其它类型参数均传给下面的段:?function_name?BYTE,且按照预选顺序存放。

至于这个固定存储区本身在何处,则由存储模式默认。

(3) 函数的返回值

函数返回值一律放于寄存器中,有如下规律:

Return typeRegistev说明

Bit标志位由具体标志位返回

char/unsigned char 1_byte指针 R7单字节由 R7返回

int/unsigned int 2_byte指针 R6 & R7双字节由 R6和 R7返回,MSB在 R6

long&unsigned longR4~R7MSB在 R4, LSB在 R7

FloatR4~R732Bit IEEE格式

一般指针 R1~R3存储类型在 R3 高位 R2 低 R1

(4) SRC控制

该控制指令将 C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用 A51进行

编译。

Page 21: Keil C51 使用详解 1 - Shandong University

第三节 Keil C51软件包中的通用文件

在 C51\LiB目录下有几个 C源文件,这几个 C源文件有非常重要的作用,对它们稍事修改,就可以用在

自己的专用系统中。

1. 动态内存分配

init_mem.C:此文件是初始化动态内存区的程序源代码。它可以指定动态内存的位置及大小,只有使用了

init_mem( )才可以调回其它函数,诸如 malloc calloc,realloc等。

calloc.c:此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。

malloc.c:此文件是 malloc的源代码,分配一段固定大小的内存。

realloc.c:此文件是 realloc.c源代码,其功能是调整当前分配动态内存的大小。

2. C51启动文件 STARTUP.A51

启动文件 STARTUP.A51中包含目标板启动代码,可在每个 project中加入这个文件,只要复位,则该文

件立即执行,其功能包括:

●定义内部 RAM大小、外部 RAM大小、可重入堆栈位置

●清除内部、外部或者以此页为单元的外部存储器

●按存储模式初使化重入堆栈及堆栈指针

●初始化 8051硬件堆栈指针

●向 main( )函数交权

开发人员可修改以下数据从而对系统初始化

常数名 意义

IDATALEN 待清内部 RAM长度

XDATA START 指定待清外部 RAM起始地址

XDATALEN 待清外部 RAM长度

IBPSTACK 是否小模式重入堆栈指针需初始化标志,1为需要。缺省为 0

IBPSTACKTOP 指定小模式重入堆栈顶部地址

XBPSTACK 是否大模式重入堆栈指针需初始化标志,缺省为 0

XBPSTACKTOP 指定大模式重入堆栈顶部地址

PBPSTACK 是否 Compact重入堆栈指针,需初始化标志,缺省为 0

PBPSTACKTOP 指定 Compact模式重入堆栈顶部地址

PPAGEENABLE P2初始化允许开关

Page 22: Keil C51 使用详解 1 - Shandong University

PPAGE 指定 P2值

PDATASTART 待清外部 RAM页首址

PDATALEN 待清外部 RAM页长度

提示:如果要初始化 P2作为紧凑模式高端地址,必须:PPAGEENAGLE=1,PPAGE为 P2值,例如指定

某页 1000H-10FFH,则 PPAGE=10H,而且连接时必须如下:

L51 PDATA(1080H),其中 1080H是 1000H-10FFH中的任一个值。

以下是 STARTUP.A51代码片断,红色是经常可能需要修改的地方:

;------------------------------------------------------------------------------

; This file is part of the C51 Compiler package

; Copyright KEIL ELEKTRONIK GmbH 1990

;------------------------------------------------------------------------------

; STARTUP.A51: This code is executed after processor reset.

;

; To translate this file use A51 with the following invocation:

;

; A51 STARTUP.A51

;

; To link the modified STARTUP.OBJ file to your application use the following

; L51 invocation:

;

; L51 , STARTUP.OBJ

;

;------------------------------------------------------------------------------

;

; User-defined Power-On Initialization of Memory

;

; With the following EQU statements the initialization of memory

; at processor reset can be defined:

;

Page 23: Keil C51 使用详解 1 - Shandong University

; the absolute start-address of IDATA memory is always 0

IDATALEN EQU 80H the length of IDATA memory in bytes.

;

XDATASTART EQU 0H the absolute start-address of XDATA memory

XDATALEN EQU 0H the length of XDATA memory in bytes.

;

PDATASTART EQU 0H the absolute start-address of PDATA memory

PDATALEN EQU 0H the length of PDATA memory in bytes.

;

; Notes: The IDATA space overlaps physically the DATA and BIT areas of the

; 8051 CPU. At minimum the memory space occupied from the C51

; run-time routines must be set to zero.

;------------------------------------------------------------------------------

;

; Reentrant Stack Initilization

;

; The following EQU statements define the stack pointer for reentrant

; functions and initialized it:

;

; Stack Space for reentrant functions in the SMALL model.

IBPSTACK EQU 0 set to 1 if small reentrant is used.

IBPSTACKTOP EQU 0FFH+1 set top of stack to highest location+1.

;

; Stack Space for reentrant functions in the LARGE model.

XBPSTACK EQU 0 set to 1 if large reentrant is used.

XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.

;

; Stack Space for reentrant functions in the COMPACT model.

PBPSTACK EQU 0 set to 1 if compact reentrant is used.

Page 24: Keil C51 使用详解 1 - Shandong University

PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.

;

;------------------------------------------------------------------------------

;

; Page Definition for Using the Compact Model with 64 KByte xdata RAM

;

; The following EQU statements define the xdata page used for pdata

; variables. The EQU PPAGE must conform with the PPAGE control used

; in the linker invocation.

;

PPAGEENABLE EQU 0 set to 1 if pdata object are used.

PPAGE EQU 0 define PPAGE number.

;

;------------------------------------------------------------------------------

3. 标准输入输出文件

putchar.c

putchar.c是一个低级字符输出子程,开发人员可修改后应用到自己的硬件系统上,例如向 CLD或 LEN输

出字符。

缺省:putchar.c是向串口输出一个字符 XON|XOFF是流控标志,换行符“\*n”自动转化为回车/换行“\r\n”。

getkey.c

getkey函数是一个低级字符输入子程,该程序可用到自己硬件系统,如矩阵键盘输入中,缺省时通过串口

输入字符。

4. 其它文件

还包括对Watch-Dog有独特功能的 INIT.A51函数以及对 8×C751适用的函数,可参考源代码。

第四节 段名协定与程序优化

1. 段名协定(Segment Naming Conventions)

C51编译器生成的目标文件存放于许多段中,这些段是代码空间或数据空间的一些单元,一个段可以是

可重定位的,也可以是绝对段,每一个可重定位的段都有一个类型和名字,C51段名有以下规定:

每个段名包括前缀与模块名两部分,前缀表示存储类型,模块名则是被编译的模块的名字,例如:

Page 25: Keil C51 使用详解 1 - Shandong University

?CO?main1 :表示 main1模块中的代码段中的常数部分

?PR?function1?module 表 module模块中函数 function1的可执行段,具体规定参阅手册。

2. 程序优化

C51编译器是一个具有优化功能的编译器,它共提供六级优化功能。确保生成目标代码的最高效率(代码

最少,运行速度最快)。具体六级优化的内容可参考帮助。

在 C51中提供以下编译控制指令控制代码优化:

OPTIMIZE(SJXE):尽量采用子程序,使程序代码减少。

NOAREGS:不使用绝对寄存器访问,程序代码与寄存器段独立。

NOREGPARMS:参数传递总是在局部数据段实现,程序代码与低版本 C51兼容。

OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供 6级优化功能,缺省为: OPTIMIZE(6,SPEED)。

第五章 Keil C51库函数参考

C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简

单,结构清晰,易于调试和维护,下面介绍 C51的库函数系统。

第一节 本征库函数(intrinsic routines)和非本征证库函数

C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用 ACALL和 LCALL语句来实现,

这样就大大提供了函数访问的效率,而非本征函数则必须由 ACALL及 LCALL调用。

C51的本征库函数只有 9个,数目虽少,但都非常有用,列如下:

_crol_,_cror_:将 char型变量循环向左(右)移动指定位数后返回

_iror_,_irol_:将 int型变量循环向左(右)移动指定位数后返回

_lrol_,_lror_:将 long型变量循环向左(右)移动指定位数后返回

_nop_: 相当于插入 NOP

_testbit_: 相当于 JBC bitvar测试该位变量并跳转同时清除。

_chkfloat_: 测试并返回源点数状态。

使用时,必须包含#inclucle 一行。

如不说明,下面谈到的库函数均指非本征库函数。

第二节 几类重要库函数

1. 专用寄存器 include文件

例如 8031、8051均为 REG51.h其中包括了所有 8051的 SFR及其位定义,一般系统都必须包括本文件。

2. 绝对地址 include文件 absacc.h

Page 26: Keil C51 使用详解 1 - Shandong University

该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。

3. 动态内存分配函数,位于 stdlib.h中

4. 缓冲区处理函数位于“string.h”中

其中包括拷贝比较移动等函数如:

memccpy memchr memcmp memcpy memmove memset

这样很方便地对缓冲区进行处理。

5. 输入输出流函数,位于“stdio.h”中

流函数通 8051的串口或用户定义的 I/O口读写数据,缺省为 8051串口,如要修改,比如改为 LCD显示,

可修改 lib目录中的 getkey.c及 putchar.c源文件,然后在库中替换它们即可。

第三节 Keil C51库函数原型列表

1. CTYPE.H

bit isalnum(char c);

bit isalpha(char c);

bit iscntrl(char c);

bit isdigit(char c);

bit isgraph(char c);

bit islower(char c);

bit isprint(char c);

bit ispunct(char c);

bit isspace(char c);

bit isupper(char c);

bit isxdigit(char c);

bit toascii(char c);

bit toint(char c);

char tolower(char c);

char __tolower(char c);

char toupper(char c);

char __toupper(char c);

2. INTRINS.H

Page 27: Keil C51 使用详解 1 - Shandong University

unsigned char _crol_(unsigned char c,unsigned char b);

unsigned char _cror_(unsigned char c,unsigned char b);

unsigned char _chkfloat_(float ual);

unsigned int _irol_(unsigned int i,unsigned char b);

unsigned int _iror_(unsigned int i,unsigned char b);

unsigned long _irol_(unsigned long l,unsigned char b);

unsigned long _iror_(unsigned long L,unsigned char b);

void _nop_(void);

bit _testbit_(bit b);

3. STDIO.H

char getchar(void);

char _getkey(void);

char *gets(char * string,int len);

int printf(const char * fmtstr[,argument]…);

char putchar(char c);

int puts (const char * string);

int scanf(const char * fmtstr.[,argument]…);

int sprintf(char * buffer,const char *fmtstr[;argument]);

int sscanf(char *buffer,const char * fmtstr[,argument]);

char ungetchar(char c);

void vprintf (const char *fmtstr,char * argptr);

void vsprintf(char *buffer,const char * fmtstr,char * argptr);

4. STDLIB.H

float atof(void * string);

int atoi(void * string);

long atol(void * string);

void * calloc(unsigned int num,unsigned int len);

void free(void xdata *p);

void init_mempool(void *data *p,unsigned int size);

Page 28: Keil C51 使用详解 1 - Shandong University

void *malloc (unsigned int size);

int rand(void);

void *realloc (void xdata *p,unsigned int size);

void srand (int seed);

5. STRING.H

void *memccpy (void *dest,void *src,char c,int len);

void *memchr (void *buf,char c,int len);

char memcmp(void *buf1,void *buf2,int len);

void *memcopy (void *dest,void *SRC,int len);

void *memmove (void *dest,void *src,int len);

void *memset (void *buf,char c,int len);

char *strcat (char *dest,char *src);

char *strchr (const char *string,char c);

char strcmp (char *string1,char *string2);

char *strcpy (char *dest,char *src);

int strcspn(char *src,char * set);

int strlen (char *src);

char *strncat (char 8dest,char *src,int len);

char strncmp(char *string1,char *string2,int len);

char strncpy (char *dest,char *src,int len);

char *strpbrk (char *string,char *set);

int strpos (const char *string,char c);

char *strrchr (const char *string,char c);

char *strrpbrk (char *string,char *set);

int strrpos (const char *string,char c);

int strspn(char *string,char *set);

第六章 Keil C51例子:Hello.c

Hello位于\C51\excmples\Hello\目录,其功能是向串口输出“Hello,world”整个程序如下:

#pragma DB OE CD

Page 29: Keil C51 使用详解 1 - Shandong University

#indule

#include

void main(void)

{

SCOn=0x50;

TMOD=0x20

TH1=0xf3;

Tri=1;

TI=1;

printf(“Hello,world \n”);

while(1) { }

}

第一节 uVision for Windows的使用步骤

(1) file_new新建一个 hello.c文件,输入如上内容或直接用目录下源文件。

(2) file_save或工具栏将文件存盘。

(3) project_new project创建一个 project名为 hello,并在其中加入 hello.c。

这时该 project已是打开状态,或用 open project打开已存在的 project。

(4) option_C51 compiler中选出至少包括两项 DB OE。

(5) option_dscope Debugger选中 hello\DS51.INI

查看 DS51.INI看其是否为:

“load…\…\BIN\8051.DLL

map 0, 0xffff”

否则修改。

(6) 在 option_make选 make文件顺序。

(7) project选 Build project,看是否有语法错误,若无则生成 HEX文件,若有则修改源文件后重复以上部分

步骤。

(8) run_dScope debugger进入 dScope51后装入 hello则可用 go直接运行看 serial窗口有无输出,正常每系统

运行一次,serial窗口均出现一个“Hello,world”表明运行无误。

第二节 Ishell for Dos使用步骤

Page 30: Keil C51 使用详解 1 - Shandong University

(1) 进入 Ishell 用 Setup editer选择编辑器。

然后单击 Edit或用 Edit命令编辑 hello.c源文件,存盘,也可以在 files窗口中直接选中 hello.c。

(2) 用 cd改换 project目录至 hello目录。

(3) 在 setup_target一项目选 8051。

(4) 在 setup_C51中输出 DB OE。

(5) 在 setup_project输入 project名 hello。

(6) 在 setup_save保存 Ishell.CFG文件。

(7) 编辑一个 Link文件 hello.lin中有“hell.obj”一行。

(8) 由光标落在 files菜单中的 Hello.c上,单击“translate”,如无语法错,再击“link”,则 Hex文件生成。

(9) 单击 Simulate如在 8051.CDF中选 Simulate为 dScope则进入 dScope调试直接“Go”,看 serial窗口输出

为“Hello.world”。

(10) 如程序有误修改源代码后不必再 translate或 link了,只要一步 Amake即可。

若 project中包括不止一个文件,在 DOS的 Ishell中不能用 Translate编译,而应建立 bat文件,直接在命令

窗编译,然后 link连接。

如还需用 Translate则只能多个文件分别编译,然后连接。

第七章 Keil C51的代码效率

C51程序编译生成汇编代码的效率,是由许多因素共同决定的,对于 Keil C51,主要受以下两种因素影响:

第一节 存储模式的影响

存储模式决定了缺省变量的存储空间,而访问各空间变量的汇编代码的繁简程度决定了代码率的高低。

例如:一个整形变量 i,如放于内存 18H、19H空间,则++i的操作编译成四条语句:

INC 0x19

MOV A,0x19

JNZ 0x272D

INC 0x18

0x272D:

而如果放于外存空间 0000H、0001H则++i的操作编译成九条语句:

MOV DPTR,0001

MOVX A,@ DPTR

INC A

Page 31: Keil C51 使用详解 1 - Shandong University

MOVX @ DPTR,A

JNz #5

MOV OPTR,#0000

MOVX A,@DPTR

INC A

MOVX @ DPTR,A

就汇编之后的语句而言,对外部存储器的操作较内部存储器操作代码率要低得多,生成的语句为内存的两

倍以上,而程序中有大量的这种操作,可见存储模式对代码率的响了。

因此程序设计的原则是

1、存储模式从 small-Compact-large依次选择,实在是变量太多,才选 large模式。

2、即使选择了 large模式,对一些常用的局部的或者可放于内存中的变量,最好放于内存中,以尽量提高

程序的代码率。

第二节 程序结构的影响

程序的结构单元包括模块、函数等等。同样的功能,如果结构越复杂,其所涉及的操作、变量、功能模块

函数等就越多,较之结构性好,代码简单的程序其代码率自然就低得多。

此外程序的运行控制语句,也是影响代码率的关键因素,例如:switch -case语句,许多编译器都把它们

译得非常复杂,Keil C51也不例外,相对较为简易的 Switch-case语句,编译成跳转指令形式,代码率较高,

但对较为复杂的 Switch-Case,则要调用一个系统库函数?C?ICASE进行处理,非常复杂。

再如 if( ),while( ),等语句也是代码相对较低的语句,但编译以后比 switch-case要高得多。

因此建议设计者尽量少用 switch-case之类语句来控制程序结构,以提高代码率。

除以上两点外,其它因素也会对代码率产生影响,例如:

是否用寄存器传递参数 即 NOAREGS选项是否有

是否包括调试信息:即 DEBUG选项

是否包括扩展的调试信息:即 BJECTEXTEND

第八章 dScope for Windows使用详解

第一节 概述

1. 主窗口(Mainframe Window)

可设置其它各种调试窗口,设置断点、观察点,修改地址空间,加载文件等等;

2. 调试窗口(DEBUG Window)

Page 32: Keil C51 使用详解 1 - Shandong University

支持用户程序的各种显示方式,可连续运行,单步运行用户程序,并可在线 汇编;

3. 命令窗口(Command Window)

支持命令行的输入;

4. 观察窗口(Watch Window)

可设置所要观察的变量、表达式等;

5. 寄存器窗口(Registe Window)

显示内部寄存器的内容,程序运行次数等;

6. 串口窗口(Serical Windows)

显示串口接收和发送的数据;

7. 性能分析窗口

显示所要观察的各程序段占用 CPU的空间;

8. 内存窗口(Memory Window)

显示所选择的内存中的数据;

9. 符号浏览窗口(Symbol Browser Window)

显示各种符号名称,包括专有符号,用户自定义符号(函数名、变量、标号)等;

10. 调用线窗口(Call-Stack Window)

动态显示当前执行的程序段的函数调用关系;

11. 代码覆盖窗口

提供当前模块内各程序段中被执行代码的比率;。

12. 外围设备窗口(peripherals)

可显示 I/O口,定时器,中断,串口等外围设备状态;

第二节 dScope for Windows基本操作

1. 指定初始化文件

在 uVision的 Option菜单 dScope Debugger中指定 dScope的初始化文件,用 uVision的 RUN启动 dScope

将自动加载此初始化文件,自动执行其中命令;

下面是一个例子,可以看出调入一个调试代码的过程。Ds51.ini:

load 8051.dll

load test

slog>>test.log

Page 33: Keil C51 使用详解 1 - Shandong University

xtal=11.0592

define button "go to main","g,main"

ws RevCounter

ws rm.r

g,main

PA RESET

PA serial

PA timer0

2. 观察变量

方法 1:命令行

WS expression [, numberbase ] [ LINE ]

其中 numberbase为显示数制,10对应 10进制,16对应 16进制,缺省为 16进制。LINE为单行显示,缺省

为多行显示。

方法 2:setup->Watchpoints,在对话框中输入变量

3. 显示 RAM的值

d i(x,d):起始地址,终止地址

d 变量名

4. 观察堆栈

View->Call-stack->Show invocation,可以跟踪调用过程;

5. 中断处理程序调试

在装入 8051.dll后,在 dScope的主菜单中将增加 Peripherial,其有 4个字菜单:

I/0 port:Pi端口状态

Interrupt:中断设置

Timer:定时器中断状态

Serial:串口中断状态

设置相应的中断请求标志位即可产生中断。

6. 性能分析(Performance Analyzer:PA)

PA用来分析一段代码执行占用 CPU的百分比。定义

命令行 PA func_name

Page 34: Keil C51 使用详解 1 - Shandong University

第三节 dScope for Windows命令文件的编制

dScope除了用命令行的方式进行调试以外,还可将各种调试命令汇集于一个调试文件中,

然后调用该文件,就可达到自动测试用户源代码的目的。dScope的命令文件支持 C/PL/M的

格式,因而编制调试命令文件与编制 C语言程序有些类似。

1. 地址空间及地址空间类型

(1) 地址空间分段

dScope提供的最大可用空间为 16M,实际上我们只用以下三段:

① 内部数据空间段(0X00段或 D段)

0X00:0X0000~0X00:0XFFFF(对MSC51而言为 0X00:0X00FF)

② 外部数据空间段(0X01段式或 X段)

0X01:0X0000~0X01~0XFFFF

③ 程序空间段(0XFF段或 C段)

0XFF:0X0000~0XFF:0XFFFF

(2) 地址空间类型

C:代码空间

D:内部直接寻址空间

I: 内部间接寻址空间

X:外部数据空间

B:位寻址空间

P:I/O口

EB:扩展的位寻址空间(MCS251专有)

ED:扩展的数据空间(MCS251专有)

CO:常数空间(MCS251专有)

HC:正常数空间(MCS251专有)

2. 常量

dScope支持十六进制、八进制、十进制、二进制常数,其后缀分别为 H、Q(O)、T(或无)、

Y;

dScope不区分常量的大、小写。

(1) 整型常量

分为整型(int),无符号整型(uint,00rd),长整型(long),无符号长整型(Wlong、Word)。

(2) 浮点型常量

与 ANSI C相同。

(3) 字符串常量

与 ANSI C相同

(4) 字符常量

分为字符型(Char)和无符号字符型(Uchar)一种。

(5) 行号常数

指用户程序中的行号,实际上是个地址

(6) 位常量(Bit):

0和 1

(7) 地址常数

地址常数的种类很多,地址常数不同于行号常数,行号常数就是一个地址,而地址数被引

用时,实际上是取该地址中的数据。

C:代码地址常数,如 C:0X0012或 0XFF:0X0012

Page 35: Keil C51 使用详解 1 - Shandong University

D:内部直接寻址地址常数,如 D:0X0068或 0X00:0X0068

I:内部间按寻址地址常数,如 I:0X0010或 0X00:0X0010

X:外部数据空间地址常数,如 X:0X0028或 0X01:0X0028

B:位地址常数,如 B:0X20或 B:0X24.0

EB:扩展的位地址常数(MCS251专有),

ED:扩展的数据空间地址常数(MCS251专有)

CO:常数空间地址常数(MCS251专有)

HC:正常数空间地址常数(MCS251专有)

(8) 标识符常量

即用户源程序中的标号、函数名等,实际上代表某一地址。

(9) 用户源程序中定义的常数

3. 变量

dScope所支持的变量名或标识符最多可由 31个字符组成,第一个字母为 A~Z,a~z,下

划线或问号,后续字符可为字母、数字、下划线和问号。除 CPU变量和系统变量外,dScope

不支持全局变量,但可视“define”命令定义的变量为全局变量。

Dscope所支持的变量分为以下几种(变量名称不区分大、小写),支持类型转换:

(1) 整型变量

分为整型变量(int)、无符号整型变量(uint/word),长整型(Long) 、无符号长整型

(Ulong/dword)。

(2) 浮点型变量(float)

与 ANSI C相同。

(3) 字符型变量 L

分为字符型(char)变量和无符号字符型(Uchar)

(4) 位变量(Bit)

(5) 系统变量

dScope 自己定义了一系列内部变量,用户可对这些变量进行读或读/写操作, 可被用户

自定义数所引用。

a. Cycles (Read Only)

32位变量(Ulong),指示当前程序执行已花费的指令周期(cycle)。

b. Ramsize(R/W)

16位变量(Uint),指示内部可直接寻址的数据空间大小。

c. Radix(R/N)

8位变量(Uchar),决定输出的数制

Radix=0X0A (10进制),Radix=0X10 (16进制)

d. -IIP-(R/W)

8位变量(Uchar),指示当前的中断嵌套数目。

e. $ (R/W)

32位变量(Ulong),指出 PC值,通过对其进行写操作,可改变程序执行的流程。

f. Itrace (R/W)

8位变量(Uchar),决定是否对程序运行情况进行记录

Itrace=1,使能记录操作

Itrace=0,根本上记录操作

g. __Break__(R/W)

8位变量(Uchar) __Break__=1,中止程序的运行

Page 36: Keil C51 使用详解 1 - Shandong University

h. __Mode__和__Frame size__是MCS 251专有的变量。

(6) CPU变量

即 R0~R7、A、C(位变量)、B、DPTR及特殊功能寄存器变量,对这些变量均可进行读、

写操作。

(7) 用户源程序中定义的变量、数组、结构等

4. 运算符

dScope支持 ANSI C的运算符,包括算术运算符,逻辑运算符,关系运算符。

5. 表达式

以运算符将 dScope所支持的常量、变量、函数等连接在一起,就构成了 dScope的表达式。

6. 数组

dScope不支持在命令文件中定义数组,但可引用用户程序中的数组,引用方式如同 C。

7. 结构和联合

dScope不支持在命令文件中定义结构和联合,但可引用用户程序中的结构和联合,引用方

式如同 C,但如要输出整个结构或联合的结果,就要用命令“OBJ”。

8. 指针:

不可自定义指针,但支持用户源程序中的指针变量。

9. dScope命令语句

dScope 提供了一系列调试命令。在命令文件中,dScope 只支持这些语句及前述定义的表

达式,C语言的语句均不被支持,但在命令文件所包含的用户自定义函数(非用户源程序中

的函数)中支持 C语句,但用户自定义函数中同样不支持数组、结构、联合和指针。

(1) ASM

在线汇编命令,格式如下:

ASM C:0Xnnnn (或标号);设定插入汇编指令的地址

ASM 汇编指令

ASM 汇编指令

插入完毕后,在 debug窗口内选择“Assemble->Assemble”完成编译。

(2) Assign

串行口分配指令,格式如下:

Assign channeloutreg

对MCS51为:Assign Win Soot

但目前的 dScope版本并未提供完整串口窗口功能。

(3) Define

用户自定义变量指令,格式如下:

Define <类型> <变量名>

类型一为如前所述的变量类型,Define指令定义的变量可能为全局变量,可为用户自定义函

数所引用。

(4) Display

内存显示命令,格式如下二:

D 起始地址,结束地址

地址如前所述的地址常数,标识符常量。

(5) Enter

内存修改指令,格式如下:

E 类型地址=表达式 [表达式 2],[⋯⋯]

Page 37: Keil C51 使用详解 1 - Shandong University

类型如前所述,地址如前所述的地址常数。表达式如前所述,但如果是函数名称(含标号、

指针变量),则关键字 E→EP

(6) Map/Reset map

Map为内存段修改指令,Reset map将内存段复位或缺省值。

(7) Object

用以引用用户源程序中的结构(联合)、数组、格式如下:

Obj表达式 [n,],[Line]

表达式为用户源程序中的数组,结构(联合)名称。当 Line 缺省时,数目、结构(联合)

的内容按 n行输出;如有 Line,则单行输出。

(8) U

反汇编命令,格式如下:

U [地址]

地址包括地址常 数及标识符常量,指明反汇编的起始地址。

(9) WK

观察点删除命令,格式如下:

WK n1[n2 ],[⋯⋯] ;删除指定的观察点,n为字符型,整型

常数

WK * ;删除所有的观察点

(10) WS

观察点设置命令,格式如下:

WS 表达式[,n][LINE]

关键字 LINE存在时,观察点表达式单行输出

LINE缺省时,观察点表达式 n行输出。

(11) G

连续运行命令,格式如下:

G [起始地址],[终止地址]

地址为标识符常量或地址常数,地址缺省时,为连续运行。

(12) T/P

单步运行指令,格式如下:

T/P n ;n 指至单行运行的步数,P 指给用户当调用某函数时,把它作为一步处理,并

不进入该函数运行。

(13) PA

性能分析操作指令,其分以下几种:

PA

显示当前所设置的性能分析程度段

PA Kill *

删除当前所设置的所有性能分析程序段

PA Kill n1 [,n2],[⋯⋯]

删除指定的性能分析程序段

PA 地址范围

设置性能分析程序段,地址范围可以起始地址和结束地址的方式给出,也可给出函数名,行

号范围。

PA Reset

复位性能分析窗口(PA Windows),清除所有的记录。

Page 38: Keil C51 使用详解 1 - Shandong University

(14) BD

断点失效命令,格式如下:

BD n1 [,n2],[,⋯⋯] ;disable指定的断点

DB * ;disable所有的断点

(15) BE

断点使能命令,格式如下:

BE M [,n2],[,⋯⋯] ;使能指定的断点

BE * ;使能所有的断点

(16) BK

断点删除指令,格式如下:

BK M[,n2],[,⋯⋯] ;删除指定的断点

BK * ;删除所有的断点

(17) BL

断点显示指令,显示所有被定义的断点。

(18) BS

断点定义指令,dScope支持多达 40个断点,具体格式如下:

a.BS 表达式[,count] [,“cmd”]

count:经过该断点的次数 [选项]

“cmd”:断点到达后附带执行的 dScope命令(连项)

表达式一个条件表达式,此时该断点称为条件断点(运算符为&.&&,<<=>,>=,= =,!=)

BS READ 表达式 [,count] [,“cmd”]

BS WRITE 表达式 [,count] [“cmd”]

BS READWRITE 表达式 [,count] [,“cmd”]

以上三种断点称访问式(Access断点),当某一址或变量被访问(R/W)或某些值被读写时,

程序被中断。

(19) Define button

图标定义指令,用于当窗口(Toolbox)

(20) !

DOS窗口 Open命令,以“EXIT”命令退出 DOS窗口。

(21) Include

文件包含命令,格式如下:

Include [路径] 文件名

dScope 支持以文件包含的方式调入并执行调试命令文件,用户自定义函数文件,调试命令

文件可以有后缀,也可无后缀。

(22) Load

加载命令,格式如下:

Load [路径] 文件名

Load指令能够加载的文件必须具有以下格式之一。

Intel Hex/Hex 386格式

Intel Object (OMF_51) 格式

Intel Object (OMF-251) 格式

dScope的 CPU驱动文件(.DLL)

(23) LOG

Command Window存盘指令,用于将 Command Windows中的内容输出到指定的文件中,格

Page 39: Keil C51 使用详解 1 - Shandong University

式如下:

LOG > [路径]文件名 ;创建一个新文件

LOG >> [路径]文件名 ;将 Command Windows的内容输出到某个已

存在的文件中。

LOG OFF 完成输出操作并开闭该文件

LOG指令只将 LOG>或 LOG>>与 LOG OFF指令之间的操作命令存入该指定文件。

(24) Reset

复位指令,具体格式如下:

Reset ;执行 dScope的复位

Reset Map ;复位外部数据空间

Reset Var ;复位 SET指令定义的变量

(25) Save

该指令将一段内存映象以 19EX386/HEX的格式存盘,具体格式如下:

Save 路径 文件名:地址 1、地址 2

地址 1、地址 2指所要保存的空间范围,既可是标识符,也可是址常数。

(26) SET

该指令回来定义 dScope目标代码预定义变量的含义,这些预定义变量包括以下二种:

SRC ;指出所在的路径

F1~F12;对应于键盘上的 12个功能键,定义这些功能键的含义。

SET指令的格式为:

SET 变量=“字符串”

SET 变量

10. 函数

dScope支持三种函数,即 dScope预定义函数,用户自定义函数和信号函数,分别详述如下:

(1) dScope预定义函数

dScope号提供 8个预定义函数(可视为 dScope的库函数)

①Void Printf(“String”,输出表列)

屏幕打印函数,与 ANSI C的 Printf ( ) 函数相同

②Void exec(“Command__String”)

Command__String为一有效的命令字符串,此函数用于在运行用户自定义函数的过程中执

行 dScope命令,这个函数提供了一个很重要的编制测试命令文件的方法。

③int getint(“Prompt__String”);从键盘输入一个整数

int getlong (“Prompt__String”);从键盘输入一个长整数

float getfloat (“Prompt__String”);从键盘输入一个浮点数

以上这三个函数被执行时,dScope会弹出一个 dialog box等待用户输入数据,其标题栏上是

“Prompt__String”,利用这个函数,不仅可以为变量赋值,也可使用户得以看清前一阶段的

测试结果。

④int rand (int seed)

该函数会输出一个随机数(-32768~32768)

⑤Void memeset (ulorg start , ulong end ,uchar val)

该函数用于给地址范围(Start__end)内的内存赋值(Val)

⑥Void twatch (Long cycles)

定时函数,时间由(Long cycles)决定,它是以指令周期计数的,它也 用于产生一个信

号波形,该函数必须用于信号函数中。

Page 40: Keil C51 使用详解 1 - Shandong University

(2) 用户自定义函数

这类函数不同于用户源程序中的数函,其定义格式为

Func 返回类型 函数名(参数序列)

{

语句

}

返回类型如前所述的变量类型

用户自定义函数中的语句与 ANSI C相似,只是不支持数组结构、联合、指针,可引用 dScope

系统变量,define 语句定义的变量和用户源程序变量,不支持 dScope 命令,如想在函数中

执行 dScope命令,要借助于 exec(“Command__String”)函数,可引用 dScope预定义的函

数(除了 twatch ( )函数),不支持 ANSI C的库函数。

(3) 信号函数

用于产生具有某一波形的信号,定义格式为:

Signal返回类型函数名(参数长列){

语句

}

信号函数主要是利用 twatch ( )函数,目前 dScope版本在提供这一功能上面还有一定问题。

(4) dScope函数与 ANSI函数的区别

① 不支持条件汇编

② 不支持头文件

③ 无变量的初始化

④ 不支持数组、结构、指针

⑤ 调用方式不同,自定义函数和信号函数首先要包含一个函数文件之中,然而在测试命令

文件中以 Inclule指令调用该函数文件,最后才能以函数名调用之。

⑥ 函数调用只支持传值方式。

BACK>>

Keil C51使用詳解

Keil C51使用詳解

(

Keil C51使用詳解

©電子設計世界!版權所有,歡迎轉貼,請勿修改並注明出處。保留一切權利。

第一章 Keil C51開發系統基本知識... 6

第一節 系統概述... 6

第二節 Keil C51單片機軟體發展系統的整體結構... 6

第三節 Keil C51工具包的安裝... 7

1. C51 for Dos 7

2. C51 for Windows的安裝及注意事項:... 7

Page 41: Keil C51 使用详解 1 - Shandong University

第四節 Keil C51工具包各部分功能及使用簡介... 7

1. C51與 A51. 7

2. L51和 BL51. 8

3. DScope51,Tscope51及Monitor51. 8

4. Ishell及 uVision. 9

第二章 Keil C51軟體使用詳解... 10

第一節 Keil C51編譯器的控制指令... 10

1. 原始檔案控制類... 10

2. 目標檔(Object)控制類:... 10

3. 列表文件(listing)控制類:... 10

第二節 dScope51的使用... 11

1. dScope51 for Dos 11

2. dScope for Windows 12

第三節 Monitor51及其使用... 13

1. Monitor51對硬體的要求... 13

2. Mon51的使用... 13

3. MON51的配置... 13

4. 串口連接圖:... 13

5. MON51命令及使用... 14

第四節 集成開發環境(IDE)的使用... 14

1. Ishell for Dos的使用... 14

2. uVision for windows的使用... 15

第三章 Keil C51 vs 標準 C.. 15

第一節 Keil C51擴展關鍵字... 15

第二節 記憶體區域(Memory Areas):... 16

1. Pragram Area:... 16

2. Internal Data Memory: 16

3. External Data Memory. 16

4. Speciac Function Register Memory. 16

第三節 存儲模式... 16

1. Small模式... 16

2. Compact模式... 17

3. large模式... 17

第四節 存儲類型聲明... 17

第五節 變數或資料類型... 17

第六節 位元變數與聲明... 17

1. bit型變數... 17

2. 可位定址區說明 20H-2FH.. 1811

1. dScope51 for Dos 11

2. dScope for Windows 12

第三節 Monitor51及其使用... 13

1. Monitor51對硬體的要求... 13

2. Mon51的使用... 13

3. MON51的配置... 13

Page 42: Keil C51 使用详解 1 - Shandong University

4. 串口連接圖:... 13

5. MON51命令及使用... 14

第四節 集成開發環境(IDE)的使用... 14

1. Ishell for Dos的使用... 14

2. uVision for windows的使用... 15

第三章 Keil C51 vs 標準 C.. 15

第一節 Keil C51擴展關鍵字... 15

第二節 記憶體區域(Memory Areas):... 16

1. Pragram Area:... 16

2. Internal Data Memory: 16

3. External Data Memory. 16

4. Speciac Function Register Memory. 16

第三節 存儲模式... 16

1. Small模式... 16

2. Compact模式... 17

3. large模式... 17

第四節 存儲類型聲明... 17

第五節 變數或資料類型... 17

第六節 位元變數與聲明... 17

1. bit型變數... 17

2. 可位定址區說明 20H-2FH.. 18

第七節 Keil C51指針... 18

1. 一般指針... 18

2. 記憶體指針... 18

3. 指針轉換... 18

第八節 Keil C51函數... 19

1. 中斷函數聲明:... 19

2. 通用存儲工作區... 19

3. 選通用存儲工作區由 using x聲明,見上例。... 19

4. 指定存儲模式... 19

5. #pragma disable. 19

6. 遞迴或可重入函數指定... 19

7. 指定 PL/M-51函數... 20

第四章 Keil C51高級編程... 20

第一節 絕對位址訪問... 20

1. 絕對宏:... 20

2. _at_關鍵字... 21

3. 連接定位控制... 21

第二節 Keil C51與彙編的介面... 21

1. 模組內介面... 21

2. 模組間介面... 21

第三節 Keil C51套裝軟體中的通用檔... 22

1. 動態記憶體分配... 22

2. C51啟動檔 STARTUP.A51. 22

Page 43: Keil C51 使用详解 1 - Shandong University

3. 標準輸入輸出檔... 25

4. 其他文件... 25

第四節 段名?

第七節 Keil C51指針... 18

1. 一般指針... 18

2. 記憶體指針... 18

3. 指針轉換... 18

第八節 Keil C51函數... 19

1. 中斷函數聲明:... 19

2. 通用存儲工作區... 19

3. 選通用存儲工作區由 using x聲明,見上例。... 19

4. 指定存儲模式... 19

5. #pragma disable. 19

6. 遞迴或可重入函數指定... 19

7. 指定 PL/M-51函數... 20

第四章 Keil C51高級編程... 20

第一節 絕對位址訪問... 20

1. 絕對宏:... 20

2. _at_關鍵字... 21

3. 連接定位控制... 21

第二節 Keil C51與彙編的介面... 21

1. 模組內介面... 21

2. 模組間介面... 21

第三節 Keil C51套裝軟體中的通用檔... 22

1. 動態記憶體分配... 22

2. C51啟動檔 STARTUP.A51. 22

3. 標準輸入輸出檔... 25

4. 其他文件... 25

第四節 段名協定與程式優化... 25

1. 段名協定(Segment Naming Conventions) 25

2. 程式優化... 25

第五章 Keil C51庫函數參考... 26

第一節 本征庫函數(intrinsic routines)和非本征證庫函數... 26

第二節 幾類重要庫函數... 26

1. 專用寄存器 include檔... 26

2. 絕對位址 include文件 absacc.h. 26

3. 動態記憶體分配函數,位於 stdlib.h中... 27

4. 緩衝區處理函數位於“string.h”中... 27

5. 輸入輸出流函數,位於“stdio.h”中... 27

第三節 Keil C51庫函數原型列表... 27

1. CTYPE.H.. 27

2. INTRINS.H.. 27

3. STDIO.H.. 28

4. STDLIB.H.. 28

Page 44: Keil C51 使用详解 1 - Shandong University

5. STRING.H.. 28

第六章 Keil C51例子:Hello.c.. 29

第一節 uVision for Windows的使用步驟... 29

第二節 Ishell for Dos使用步驟... 30

第七章 Keil C51的代碼效率... 30

第一節 存儲模式的影響... 30

第二節 程式結構的影響... 31

第八章 dScope for Windows使用詳詢 3定與程式優化... 25

1. 段名協定(Segment Naming Conventions) 25

2. 程式優化... 25

第五章 Keil C51庫函數參考... 26

第一節 本征庫函數(intrinsic routines)和非本征證庫函數... 26

第二節 幾類重要庫函數... 26

1. 專用寄存器 include檔... 26

2. 絕對位址 include文件 absacc.h. 26

3. 動態記憶體分配函數,位於 stdlib.h中... 27

4. 緩衝區處理函數位於“string.h”中... 27

5. 輸入輸出流函數,位於“stdio.h”中... 27

第三節 Keil C51庫函數原型列表... 27

1. CTYPE.H.. 27

2. INTRINS.H.. 27

3. STDIO.H.. 28

4. STDLIB.H.. 28

5. STRING.H.. 28

第六章 Keil C51例子:Hello.c.. 29

第一節 uVision for Windows的使用步驟... 29

第二節 Ishell for Dos使用步驟... 30

第七章 Keil C51的代碼效率... 30

第一節 存儲模式的影響... 30

第二節 程式結構的影響... 31

第八章 dScope for Windows使用詳解... 32

第一節 概述... 32

1. 主窗口(Mainframe Window)... 32

2. 調試窗口(DEBUG Window)... 32

3. 命令窗口(Command Window)... 32

4. 觀察視窗(Watch Window)... 32

5. 寄存器窗口(Registe Window)... 32

6. 串口窗口(Serical Windows)... 32

7. 性能分析視窗... 32

8. 記憶體視窗(Memory Window)... 32

9. 符號流覽視窗(Symbol Browser Window)... 33

10. 調用線窗口(Call-Stack Window)... 33

11. 代碼覆蓋視窗... 33

12. 週邊設備窗口(peripherals) 33

Page 45: Keil C51 使用详解 1 - Shandong University

第二節 dScope for Windows基本操作... 33

1. 指定初始化檔... 33

2. 觀察變數... 33

3. 顯示 RAM的值... 34

4. 觀察堆疊... 34

5. 中斷處理程式調試... 34

6. 性能分析(Performance Analyzer:PA)... 34

第三節 dScope for Windows命令文件的編制... 34

1. 位址空間及位址空間類型... 34

2. 常量... 35

3. 變數... 36

4. 運算符... 38

5. ?... 32

第一節 概述... 32

1. 主窗口(Mainframe Window)... 32

2. 調試窗口(DEBUG Window)... 32

3. 命令窗口(Command Window)... 32

4. 觀察視窗(Watch Window)... 32

5. 寄存器窗口(Registe Window)... 32

6. 串口窗口(Serical Windows)... 32

7. 性能分析視窗... 32

8. 記憶體視窗(Memory Window)... 32

9. 符號流覽視窗(Symbol Browser Window)... 33

10. 調用線窗口(Call-Stack Window)... 33

11. 代碼覆蓋視窗... 33

12. 週邊設備窗口(peripherals) 33

第二節 dScope for Windows基本操作... 33

1. 指定初始化檔... 33

2. 觀察變數... 33

3. 顯示 RAM的值... 34

4. 觀察堆疊... 34

5. 中斷處理程式調試... 34

6. 性能尷 R(Performance Analyzer:PA)... 34

第三節 dScope for Windows命令文件的編制... 34

1. 位址空間及位址空間類型... 34

2. 常量... 35

3. 變數... 36

4. 運算符... 38

5. 運算式... 38

6. 陣列... 38

7. 結構和聯合... 38

8. 指針:... 38

9. dScope命令語句... 38

10. 函數... 43

Page 46: Keil C51 使用详解 1 - Shandong University

第一章 Keil C51開發系統基本知識

第一節 系統概述

Keil C51是美國 Keil Software公司出品的 51系列相容單片機 C語言軟體發展系統,與彙編

相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。用過

組合語言後再使用 C來開發,體會更加深刻。

Keil C51 軟體提供豐富的庫函數和功能強大的集成開發調試工具,全 Windows 介面。另外

重要的一點,只要看一下編譯後生成的彙編代碼,就能體會到 Keil C51 生成的目標代碼效

率非常之高,多數語句生成的彙編代碼很緊湊,容易理解。在開發大型軟體時更能體現高階

語言的優勢。

下面詳細六算式... 38

6. 陣列... 38

7. 結構和聯合... 38

8. 指針:... 38

9. dScope命令語句... 38

10. 函數... 43

第一章 Keil C51開發系統基本知識

第一節 系統概述

Keil C51是美國 Keil Software公司出品的 51系列相容單片機 C語言軟體發展系統,與彙編

相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。用過

組合語言後再使用 C來開發,體會更加深刻。

Keil C51 軟體提供豐富的庫函數和功能強大的集成開發調試工具,全 Windows 介面。另外

重要的一點,只要看一下編譯後生成的彙編代碼,就能體會到 Keil C51 生成的目標代碼效

率非常之高,多數語句生成的彙編代碼很緊湊,容易理解。在開發大型軟體時更能體現高階

語言的優勢。

下面詳細介紹 Keil C51開發系統各部分功能和使用。

第二節 Keil C51單片機軟體發展系統的整體結構

C51工具包的整體結構,如圖(1)所示,其中 uVision與 Ishell分別是C51 for Windows和 for Dos

的集成開發環境(IDE),可以完成編輯、編譯、連接、調試、仿真等整個開發流程。開發人

員可用 IDE本身或其他編輯器編輯 C或彙編原始檔案。然後分別由 C51及 A51編譯器編譯

生成目標檔(.OBJ)。目標檔可由 LIB51創建生成庫檔,也可以與庫檔一起經 L51連接定位生

成絕對目標檔(.ABS)。ABS 檔由 OH51 轉換成標準的 Hex 檔,以供調試器 dScope51 或

tScope51使用進行源代碼級調試,也可由模擬器使用直接對目標板進行調試,也可以直接寫

Page 47: Keil C51 使用详解 1 - Shandong University

入程式記憶體如 EPROM中。

圖(1) C51工具包整體結構圖

第三節 Keil C51工 6紹 Keil C51開發系統各部分功能和使用。

第二節 Keil C51單片機軟體發展系統的整體結構

C51工具包的整體結構,如圖(1)所示,其中 uVision與 Ishell分別是C51 for Windows和 for Dos

的集成開發環境(IDE),可以完成編輯、編譯、連接、調試、仿真等整個開發流程。開發人

員可用 IDE本身或其他編輯器編輯 C或彙編原始檔案。然後分別由 C51及 A51編譯器編譯

生成目標檔(.OBJ)。目標檔可由 LIB51創建生成庫檔,也可以與庫檔一起經 L51連接定位生

成絕對目標檔(.ABS)。ABS 檔由 OH51 轉換成標準的 Hex 檔,以供調試器 dScope51 或

tScope51使用進行源代碼級調試,也可由模擬器使用直接對目標板進行調試,也可以直接寫

入程式記憶體如 EPROM中。

圖(1) C51工具包整體結構圖

第三節 Keil C51工具包的安裝

1. C51 for Dos

在 Windows下直接運行套裝軟體中 DOS\C51DOS.exe然後選擇安裝目錄即可。完畢後欲使

系統正常工作須進行以下操作(設 C:\C51為安裝目錄):

修改 Autoexec.bat,加入

path=C:\C51\Bin

Set C51LIB=C:\C51\LIB

Set C51INC=C:\C51\INC

然後運行 Autoexec.bat

2. C51 for Windows的安裝及注意事項:

在 Windows 下運行套裝軟體中 WIN\Setup.exe,最好選擇安裝目錄與 C51 for Dos 相同,這

樣設置最簡單(設安裝於C:\C51目錄下)。然後將套裝軟體中 crack目錄中的檔拷入C:\C51\Bin

目錄下。

第四節 Keil C51工具包各部分功能及使用簡介

1. C51與 A51

(1) C51

C51是 C語言編譯器,其使用方法為:

C51 sourcefile[編譯控制指令]

或者 C51 @ commandfile

其中 sourcefile為 C原始檔案(.C)。大量的編譯控制指令完成 C51編譯器%A具包的安裝

1. C51 for Dos

在 Windows下直接運行套裝軟體中 DOS\C51DOS.exe然後選擇安裝目錄即可。完畢後欲使

系統正常工作須進行以下操作(設 C:\C51為安裝目錄):

修改 Autoexec.bat,加入

path=C:\C51\Bin

Set C51LIB=C:\C51\LIB

Set C51INC=C:\C51\INC

然後運行 Autoexec.bat

2. C51 for Windows的安裝及注意事項:

在 Windows 下運行套裝軟體中 WIN\Setup.exe,最好選擇安裝目錄與 C51 for Dos 相同,這

Page 48: Keil C51 使用详解 1 - Shandong University

樣設置最簡單(設安裝於C:\C51目錄下)。然後將套裝軟體中 crack目錄中的檔拷入C:\C51\Bin

目錄下。

第四節 Keil C51工具包各部分功能及使用簡介

1. C51與 A51

(1) C51

C51是 C語言編譯器,其使用方法為:

C51 sourcefile[編譯控制指令]

或者 C51 @ commandfile

其中 sourcefile為 C原始檔案(.C)。大量的編譯控制指令完成 C51編譯器的全部功能。包控

C51輸出檔 C.LST,.OBJ,.I和.SRC文件的控制。原始檔案(.C)的控制等,詳見第五部分的

具體介紹。

而 Commandfile 為一個連接控制檔其內容包括:.C 原始檔案及各編譯控制指令,它沒有固

定的名字,開發人員可根據自己的習慣指定,它適於用控制指令較多的場合。

(2) A51

A51是組合語言編譯器,使用方法為:

A51 sourcefile[編譯控制指令]

或 A51 @ commandfile

其中 sourcefile為彙編原始檔案(.asm或.a51),而編譯控制指令的使用與其他彙編如 ASM語

言類似,可參考其他組合語言材料。

Commandfile同 C51中的 Commandfile類似,它使 A51使用和修改方便。

2. L51和 BL51

(1) L51

L51是 Keil C51套裝軟體提供的連接/定位器,其功能是將編譯生成的 OBJ檔與庫檔連接定

位生成絕對 A漸�‘\能。包控 C51輸出檔 C.LST,.OBJ,.I和.SRC文件的控制。原始檔案

(.C)的控制等,詳見第五部分的具體介紹。

而 Commandfile 為一個連接控制檔其內容包括:.C 原始檔案及各編譯控制指令,它沒有固

定的名字,開發人員可根據自己的習慣指定,它適於用控制指令較多的場合。

(2) A51

A51是組合語言編譯器,使用方法為:

A51 sourcefile[編譯控制指令]

或 A51 @ commandfile

其中 sourcefile為彙編原始檔案(.asm或.a51),而編譯控制指令的使用與其他彙編如 ASM語

言類似,可參考其他組合語言材料。

Commandfile同 C51中的 Commandfile類似,它使 A51使用和修改方便。

2. L51和 BL51

(1) L51

L51是 Keil C51套裝軟體提供的連接/定位器,其功能是將編譯生成的 OBJ檔與庫檔連接定

位生成絕對目標檔(.ABS),其使用方法為:

L51 目標檔列表[庫檔列表] [to outputfile] [連接控制指令]

或 L51 @Commandfile

根源程式的多個模組分別經 C51與 A51編譯後生成多個 OBJ檔,連接時,這些檔全列於目

標檔列表中,作為輸入檔,如果還需與庫檔(.LiB)相連接,則庫檔也必須列在其後。outputfile

為輸檔案名,缺少時為第一模組名,尾碼為.ABS。連接控制指令提供了連接定位時的所有

控制功能。Commandfile為連接控制檔,其具體內容是包括了目標檔列表,庫檔列表及輸出

Page 49: Keil C51 使用详解 1 - Shandong University

檔、連接控制命令,以取代第一種繁瑣的格式,由於目的模組庫檔大多不止 1個,因而第 2

種方法較多見,這個檔案名字也可由使用者隨意指定。

(2) Bl51

BL51也是 C51套裝軟體的連接/定位器,言媦釔?.ABS),其使用方法為:

L51 目標檔列表[庫檔列表] [to outputfile] [連接控制指令]

或 L51 @Commandfile

根源程式的多個模組分別經 C51與 A51編譯後生成多個 OBJ檔,連接時,這些檔全列於目

標檔列表中,作為輸入檔,如果還需與庫檔(.LiB)相連接,則庫檔也必須列在其後。outputfile

為輸檔案名,缺少時為第一模組名,尾碼為.ABS。連接控制指令提供了連接定位時的所有

控制功能。Commandfile為連接控制檔,其具體內容是包括了目標檔列表,庫檔列表及輸出

檔、連接控制命令,以取代第一種繁瑣的格式,由於目的模組庫檔大多不止 1個,因而第 2

種方法較多見,這個檔案名字也可由使用者隨意指定。

(2) Bl51

BL51 也是 C51 套裝軟體的連接/定位器,其具有 L51 的所有功能,此外它還具有以下 3點

特別之處:

a. 可以連接定位大於 64kBytes的程式。

b. 具有代碼域及域切換功能(CodeBanking & Bank Switching)

c. 可用於 RTX51作業系統

RTX51 是一個即時多工作業系統,它改變了傳統的編程模式,甚至不必用 main( )函數,單

片機系統軟體向 RTOS發展是一種趨勢,這種趨勢對於 186和 386及 68K系列 CPU更為明

顯和必須,對 8051因 CPU較為簡單,程式結構等都不太複雜,RTX51作用顯得不太突出,

其專業版軟體PK51套裝軟體甚至不包括RTX51Full,而只有一個RTX51TINY版本的RTOS。

RTX51 TINY 適用於無外部 RAM 的單片機系統,因而可用面很窄,在本文中不作介紹。

Bank switching技術因使用很少也不作介紹。

3. DScope51,Tscope51及Monitor51

(1) dScope51

dScope51是一個源級調鋮膃蚯 51的所有功能,此外它還具有以下 3點特別之處:

a. 可以連接定位大於 64kBytes的程式。

b. 具有代碼域及域切換功能(CodeBanking & Bank Switching)

c. 可用於 RTX51作業系統

RTX51 是一個即時多工作業系統,它改變了傳統的編程模式,甚至不必用 main( )函數,單

片機系統軟體向 RTOS發展是一種趨勢,這種趨勢對於 186和 386及 68K系列 CPU更為明

顯和必須,對 8051因 CPU較為簡單,程式結構等都不太複雜,RTX51作用顯得不太突出,

其專業版軟體PK51套裝軟體甚至不包括RTX51Full,而只有一個RTX51TINY版本的RTOS。

RTX51 TINY 適用於無外部 RAM 的單片機系統,因而可用面很窄,在本文中不作介紹。

Bank switching技術因使用很少也不作介紹。

3. DScope51,Tscope51及Monitor51

(1) dScope51

dScope51 是一個源級調試器和模擬器,它可以調試由 C51 編譯器、A51 彙編器、PL/M-51

編譯器及 ASM-51 彙編器產生的程式。它不需目標板(for windows 也可通過 mon51 接目

標板),只能進行軟體類比,但其功能強大,可類比 CPU及其週邊器件,如內部串口,外部

I/O及計時器等,能對嵌入式軟體功能進行有效測試。

其使用方法為:

DS51[debugfile][INIT(initfile)]

Page 50: Keil C51 使用详解 1 - Shandong University

其中 debugfile 是一個 Hex 格式的 8051檔,即待調試的檔其為可選的,可在進入 dScope51

後用 load命令裝入。

Initfile為一個初使化檔,它在啟動 dScope51後,在 debugfile裝入前裝入,裝有一些 dScope

的初使化參數及常用調試函數等。下面是一個 dScope.ini檔(for dos)的內容:

Load ..\..\ds51\8051.iof

Map 0,0xffff

dScope51 for Windows則直接用滑鼠進入,然後用 load裝入待調檔。

(2試器和模擬器,它可以調試由 C51編譯器、A51彙編器、PL/M-51編譯器及 ASM-51彙

編器產生的程式。它不需目標板(for windows 也可通過 mon51 接目標板),只能進行軟體

類比,但其功能強大,可類比 CPU 及其週邊器件,如內部串口,外部 I/O 及計時器等,能

對嵌入式軟體功能進行有效測試。

其使用方法為:

DS51[debugfile][INIT(initfile)]

其中 debugfile 是一個 Hex 格式的 8051檔,即待調試的檔其為可選的,可在進入 dScope51

後用 load命令裝入。

Initfile為一個初使化檔,它在啟動 dScope51後,在 debugfile裝入前裝入,裝有一些 dScope

的初使化參數及常用調試函數等。下面是一個 dScope.ini檔(for dos)的內容:

Load ..\..\ds51\8051.iof

Map 0,0xffff

dScope51 for Windows則直接用滑鼠進入,然後用 load裝入待調檔。

(2) tScope51

與 dScope51不同的是 Scope51必須帶目標板,目前它可以通過兩種方式訪問目標板。(1) 通

過 EMul51線上模擬器,tScope51為該模擬器準備了一個動態連接檔 EMUL51.IOT,但該方

法必須配合該模擬器。(2) 通過 Monitov51 監控程序,這種方法是可行的,tScope51 為訪問

Monitor51專門帶有MON51.IOT連接程式,使用時可通過串口及監控程序來調試目標板。

其使用方法為:

TS51[INIT(file_name.ini)]

其中 file_name.ini為一個初使化檔。

進入 TS51 後,必須裝入 IOT 檔,可用的有 MON51.IOT 及 EMUL51.IOT 兩種,如裝入

MON51.IOT:

Load.C:\C51\TS51\MON51.IOT CPUTYPE(80517)

可惜的是 tScope51只有 for Dos的版本。

(3) Monitor 51

Monitor51 是一個監控程序通過 PC機的串口與目標板進行通信,Monitor 操作需要 MON51

或 dScope51 for Windows,後面部分將對Monitor51做較為詳細%) tScope51

與 dScope51不同的是 Scope51必須帶目標板,目前它可以通過兩種方式訪問目標板。(1) 通

過 EMul51線上模擬器,tScope51為該模擬器準備了一個動態連接檔 EMUL51.IOT,但該方

法必須配合該模擬器。(2) 通過 Monitov51 監控程序,這種方法是可行的,tScope51 為訪問

Monitor51專門帶有MON51.IOT連接程式,使用時可通過串口及監控程序來調試目標板。

其使用方法為:

TS51[INIT(file_name.ini)]

其中 file_name.ini為一個初使化檔。

進入 TS51 後,必須裝入 IOT 檔,可用的有 MON51.IOT 及 EMUL51.IOT 兩種,如裝入

MON51.IOT:

Page 51: Keil C51 使用详解 1 - Shandong University

Load.C:\C51\TS51\MON51.IOT CPUTYPE(80517)

可惜的是 tScope51只有 for Dos的版本。

(3) Monitor 51

Monitor51 是一個監控程序通過 PC機的串口與目標板進行通信,Monitor 操作需要 MON51

或 dScope51 for Windows,後面部分將對Monitor51做較為詳細的介紹。

4. Ishell及 uVision

(1) Ishell for Dos

這是一個 for Dos的 IDE,直接在命令行鍵入 Ishell,則進入該環境,它使用簡單方便。其命

令行與 DOS命令行具有同樣的功能,對單模組的 Project直接由功能表進行編譯連接,對多

模組的 project。則通過批次處理,BAT檔進行編譯連接,然後通過功能表控制由 dScope51

或 tScope51對程式進行調試,因為是 for dos的,不做太詳細介紹。

(2) uVision for Windows

uVision for Windows是一個標準的Windows應用程式,它是 C51的一個集成軟體發展平臺,

具有源代碼編輯、project管理、集成的 make等功能,它的人機界面友好,操作方便,是開

發者的首選,具體配置及使用見第五部分。

第二章 Keil C51軟體使用詳解

第一節 Keil C51編譯器的控制指令

C51編譯器的控制指的介紹。

4. Ishell及 uVision

(1) Ishell for Dos

這是一個 for Dos的 IDE,直接在命令行鍵入 Ishell,則進入該環境,它使用簡單方便。其命

令行與 DOS命令行具有同樣的功能,對單模組的 Project直接由功能表進行編譯連接,對多

模組的 project。則通過批次處理,BAT檔進行編譯連接,然後通過功能表控制由 dScope51

或 tScope51對程式進行調試,因為是 for dos的,不做太詳細介紹。

(2) uVision for Windows

uVision for Windows是一個標準的Windows應用程式,它是 C51的一個集成軟體發展平臺,

具有源代碼編輯、project管理、集成的 make等功能,它的人機界面友好,操作方便,是開

發者的首選,具體配置及使用見第五部分。

第二章 Keil C51軟體使用詳解

第一節 Keil C51編譯器的控制指令

C51編譯器的控制指令分為三類:原始檔案控制類,目標檔控制類及列表控制類。

1. 原始檔案控制類

NOEXTEND:C51原始檔案不允許使用 ANSI C擴展功能。

DEFINE(DF):定義預處理(在 C51命令行)。

2. 目標檔(Object)控制類:

COMPACT LARGE SMALL 選編譯模式

DEBUG(DB) 包含調試資訊,以供模擬器或 dSCope51使用。

NOAMAKE(NOAM) 禁止 AutoMake資訊記錄

NOREGPARMS 禁止用寄存器傳遞參數

OBJECTEXTEND(OE) Object檔包含附加變數類型資訊

OPTIMIZE(OT) 指定優化級別

REGFILE(RF) 指定一個寄存器使用的檔以供整體優化用

REGISTERBANK(RB) 指定一個供絕對寄存器訪問的寄存器區名

SRC 不生成目標檔只生成彙編原始檔案

Page 52: Keil C51 使用详解 1 - Shandong University

其他控制項不常用。

3. 列表文件(listing)控制類:

CODE(CD):向列表文件加入彙編列表

令分為三類:原始檔案控制類,目標檔控制類及列表控制類。

1. 原始檔案控制類

NOEXTEND:C51原始檔案不允許使用 ANSI C擴展功能。

DEFINE(DF):定義預處理(在 C51命令行)。

2. 目標檔(Object)控制類:

COMPACT LARGE SMALL 選編譯模式

DEBUG(DB) 包含調試資訊,以供模擬器或 dSCope51使用。

NOAMAKE(NOAM) 禁止 AutoMake資訊記錄

NOREGPARMS 禁止用寄存器傳遞參數

OBJECTEXTEND(OE) Object檔包含附加變數類型資訊

OPTIMIZE(OT) 指定優化級別

REGFILE(RF) 指定一個寄存器使用的檔以供整體優化用

REGISTERBANK(RB) 指定一個供絕對寄存器訪問的寄存器區名

SRC 不生成目標檔只生成彙編原始檔案

其他控制項不常用。

3. 列表文件(listing)控制類:

CODE(CD):向列表文件加入彙編列表

LISTINCLUDE(LC):顯示 indude檔

SYMBOLS(SB):列表檔包括模組內所有符號的列表

WARNINGLEVEL(WL):選擇“警告”級別

第二節 dScope51的使用

1. dScope51 for Dos

總的來說 dScope51具有以下特性:

●高階語言顯示模式

●集成硬體環境類比

●單步或“GO”執行模式

●記憶體、寄存器及變數訪問

●Watch運算式之值

●函數與信號功能

下面,具體說明在進入 dScope51 for Dos之後,如何實現上述功能,dScope51採用下拉功能

表格式和視窗顯示控制,共有 language、serial、exe、register四個視窗,其中 exe為命令行

視窗,language為程式視窗,serial為串口窗,register為寄存器窗。

(1) 高階語言顯示模式

單擊主功能表中的“View”,第一欄中的三條命令?ALISTINCLUDE(LC):顯示 indude檔

SYMBOLS(SB):列表檔包括模組內所有符號的列表

WARNINGLEVEL(WL):選擇“警告”級別

第二節 dScope51的使用

1. dScope51 for Dos

總的來說 dScope51具有以下特性:

●高階語言顯示模式

●集成硬體環境類比

Page 53: Keil C51 使用详解 1 - Shandong University

●單步或“GO”執行模式

●記憶體、寄存器及變數訪問

●Watch運算式之值

●函數與信號功能

下面,具體說明在進入 dScope51 for Dos之後,如何實現上述功能,dScope51採用下拉功能

表格式和視窗顯示控制,共有 language、serial、exe、register四個視窗,其中 exe為命令行

視窗,language為程式視窗,serial為串口窗,register為寄存器窗。

(1) 高階語言顯示模式

單擊主功能表中的“View”,第一欄中的三條命令“Highlevel”、“Mixed”、“Assembly”分

別對所裝入的程式按照“高級”、“混合級”及“彙編級”三種方式顯示,以方便調試使用。

(2) 集成硬體環境類比顯示

主功能表中“Peripheral”各條能顯示類比硬體環境的狀態,其中:

i/o Port:顯示各 I/O口之值,對 8031而言 SFR中的 P1、P2、P3、P0與引腳之值分別列出:

Interrupt:顯示 5個中斷源的入口模式是否允許,優先順序等中斷狀態。

Timer:顯示各定時/計數器的模式,初始值狀態等。

int Message:中斷資訊允許,如為允許(“>>”出現),則當中斷申請時,顯示中斷源資訊。

比如當中斷發生時會顯示:

“interrupt Timer 0 occured”等

A/D converter:

顯示 A/D轉換器狀態無時,則提示“無”。

Serial%佚 ighlevel”、“Mixed”、“Assembly”分別對所裝入的程式按照“高級”、“混合級”

及“彙編級”三種方式顯示,以方便調試使用。

(2) 集成硬體環境類比顯示

主功能表中“Peripheral”各條能顯示類比硬體環境的狀態,其中:

i/o Port:顯示各 I/O口之值,對 8031而言 SFR中的 P1、P2、P3、P0與引腳之值分別列出:

Interrupt:顯示 5個中斷源的入口模式是否允許,優先順序等中斷狀態。

Timer:顯示各定時/計數器的模式,初始值狀態等。

int Message:中斷資訊允許,如為允許(“>>”出現),則當中斷申請時,顯示中斷源資訊。

比如當中斷發生時會顯示:

“interrupt Timer 0 occured”等

A/D converter:

顯示 A/D轉換器狀態無時,則提示“無”。

Serial:串口資訊顯示,包括串口模式、波特產等

Other:其他器件,如為 8031則顯示“ 無”

(3) 單步或“Go”執行

“F8”單步執行,“F5”全速執行到中斷點。或選主功能表中 Trace單步執行 CPU中的 Go

全速執行。

(4) 記憶體寄存器及變數訪問

外部記憶體管理MAP功能表:設置(set)、取消(reset)、顯示(Display)處理可用存儲空間。

修改 Code代碼:ASM命令

記憶體顯示命令:D 類別為(X、D、I、B、C)

修改記憶體命令:E 有以下幾種命令 EB、EC、EI、EL、EF、EP

複雜資料類型顯示:Object命令;用以顯示結構或陣列的內容。欲使此命令有效,C51編譯

器必須有 DB及 OBJECTEXTEND兩條。

Page 54: Keil C51 使用详解 1 - Shandong University

反彙編命令:U

(5) “Watch”運算式之值

在 View 菜單的“Watch”一欄中有四項:其中包括定:串口資訊顯示,包括串口模式、波

特產等

Other:其他器件,如為 8031則顯示“ 無”

(3) 單步或“Go”執行

“F8”單步執行,“F5”全速執行到中斷點。或選主功能表中 Trace單步執行 CPU中的 Go

全速執行。

(4) 記憶體寄存器及變數訪問

外部記憶體管理MAP功能表:設置(set)、取消(reset)、顯示(Display)處理可用存儲空間。

修改 Code代碼:ASM命令

記憶體顯示命令:D 類別為(X、D、I、B、C)

修改記憶體命令:E 有以下幾種命令 EB、EC、EI、EL、EF、EP

複雜資料類型顯示:Object命令;用以顯示結構或陣列的內容。欲使此命令有效,C51編譯

器必須有 DB及 OBJECTEXTEND兩條。

反彙編命令:U

(5) “Watch”運算式之值

在 View 菜單的“Watch”一欄中有四項:其中包括定義 Watch Point(Define)、刪除

Watch Point(remove,kill all),及自動更新選項。

也可用WS、WK等命令代替,下面具體看“運算式”類型:

dScope51 一次最多可設 16 個 WtchPoint 運算式,顯示於 Watch Window 之中,運算式可以

是簡單變數,也可是複雜資料類型如結構、陣列和指向結構的指標等,例如:

>WS *ptime

>WS ptime→hour

>WS some_record[o],analog等等

(6) 關於.IOF文件

啟動 DS51後必須裝入.IOF檔才能使 CPU及 Peripheral各項起作用,這個函數的使用是依據

8051系列 CPU的不同特點,裝入 8051各 CPU硬體設備類比驅動檔,比如 8031CPU就必

須 load DS51目錄下的 8051.IOF。

2. dScope for Windows

dScope for windows具有 dScope for dos的全部功能,此外,它還具有以下明顯的優點:

(1) 標準的Windows介面,操作更容易更簡單;

(2) 常用操義Watch Point(Define)、刪除Watch Point(remove,kill all),及自動更新選項。

也可用WS、WK等命令代替,下面具體看“運算式”類型:

dScope51 一次最多可設 16 個 WtchPoint 運算式,顯示於 Watch Window 之中,運算式可以

是簡單變數,也可是複雜資料類型如結構、陣列和指向結構的指標等,例如:

>WS *ptime

>WS ptime→hour

>WS some_record[o],analog等等

(6) 關於.IOF文件

啟動 DS51後必須裝入.IOF檔才能使 CPU及 Peripheral各項起作用,這個函數的使用是依據

8051系列 CPU的不同特點,裝入 8051各 CPU硬體設備類比驅動檔,比如 8031CPU就必

須 load DS51目錄下的 8051.IOF。

2. dScope for Windows

Page 55: Keil C51 使用详解 1 - Shandong University

dScope for windows具有 dScope for dos的全部功能,此外,它還具有以下明顯的優點:

(1) 標準的Windows介面,操作更容易更簡單;

(2) 常用操作多用對話方塊,而非 Dos的行命令方式;

(3) 視窗資源更加豐富:記憶體視窗、覆蓋率分析、運行狀態分析視窗,加強了調試功能;

因為 dScope for Windows功能強大,具體操作在第八章詳細介紹。

第三節 Monitor51及其使用

1. Monitor51對硬體的要求

(1) 硬體系統為 51系列 CPU;

(2) 帶 5K外部程式記憶體(從 O位址開始),存放Monitor51程式;

(3) 256Bytes 的外部資料記憶體以及 5K 的跟蹤緩衝區,此外,外部資料記憶體必須足夠容

納所有應用程式碼及資料,且所有外部資料記憶體必須為馮•諾伊曼記憶體,即能一致訪問

XDATA與 Code空間。

(4) 一個計時器作為串列傳輸速率發生器供串口使用;

(5) 6 Bytes的空餘堆疊。

2. Mon51的使用

Mon51的京 7@多用對話方塊,而非 Dos的行命令方式;

(3) 視窗資源更加豐富:記憶體視窗、覆蓋率分析、運行狀態分析視窗,加強了調試功能;

因為 dScope for Windows功能強大,具體操作在第八章詳細介紹。

第三節 Monitor51及其使用

1. Monitor51對硬體的要求

(1) 硬體系統為 51系列 CPU;

(2) 帶 5K外部程式記憶體(從 O位址開始),存放Monitor51程式;

(3) 256Bytes 的外部資料記憶體以及 5K 的跟蹤緩衝區,此外,外部資料記憶體必須足夠容

納所有應用程式碼及資料,且所有外部資料記憶體必須為馮•諾伊曼記憶體,即能一致訪問

XDATA與 Code空間。

(4) 一個計時器作為串列傳輸速率發生器供串口使用;

(5) 6 Bytes的空餘堆疊。

2. Mon51的使用

Mon51的使用途徑有三種方式:

(1) Dos行命令方式

即先用 install 對 MON51 進行配置,然後用 MON51 進入 Monitor 狀態,啟用各種命令對

Monitor51進行調試。

(2) tScope51方式

啟動 tScope51裝入 TS51目錄下的MON51.IOT驅動檔,與目標板通信。

(3) dScope51 for Windows方式

在選 CPU驅動文件時,選“MON51.dll”,則檢查目標板並進入MON51狀態。

3. MON51的配置

(1) MON51 for Dos的配置

運行 install 檔 (在 MON51 目錄下 ),不同的參數可以配置不同的硬體環境。

INSTALL Serialtype [xdstastart][codestart][bank][PROMCHECK]],具體說明見MON51幫助文

件或使用手冊。

(2) MON51 for Windows的配置

在啟用MON51.dll時,會使得系統自動檢查目標板連接,如配置不對,則彈出“Configuration”

對話方塊,設置 PC串口,串列傳輸速率等,完畢單擊“apply”有效。

Page 56: Keil C51 使用详解 1 - Shandong University

4. 串口縞帠~徑有三種方式:

(1) Dos行命令方式

即先用install對MON51進行配置,然後用MON51進入Monitor狀態,啟用各種命令對

Monitor51進行調試。

(2) tScope51方式

啟動tScope51裝入TS51目錄下的MON51.IOT驅動檔,與目標板通信。

(3) dScope51 for Windows方式

在選CPU驅動文件時,選“MON51.dll”,則檢查目標板並進入MON51狀態。

3. MON51的配置

(1) MON51 for Dos的配置

運行install檔(在MON51目錄下),不同的參數可以配置不同的硬體環境。

INSTALL Serialtype [xdstastart][codestart][bank][PROMCHECK]],具體說明見MON51

幫助文件或使用手冊。

(2) MON51 for Windows的配置

在啟用MON51.dll時,會使得系統自動檢查目標板連接,如配置不對,則彈出

“Configuration”對話方塊,設置PC串口,串列傳輸速率等,完畢單擊“apply”有效。

4. 串口連接圖:

收發交叉互連,RTS、CTS直連,DSR、DTR直連,具體引腳排列參考串口資料。

5. MON51命令及使用

詳細的MON51命令可參閱幫助。

第四節 集成開發環境(IDE)的使用

1. Ishell for Dos的使用

進入Ishell之後看到兩個視窗:一個是檔視窗,一個是Dos命令行視窗,視窗上方是下拉

式的命令功能表,其中的Files控制檔視窗的顯隱。

使用Ishell,第一步就是配置系統,即要學習兩個檔的修改與創建:

(1) Ishell.CFG文件

每一個project都有一個Ishell.CFG,其中存放有“Option功能表和Setup功能表下的部

分資訊;Bell enabled、Monochrome enabled、Editor Selected、CRT Lines、

target enviroment、name of user edit、Automatic load for configuration enabled、

Page 57: Keil C51 使用详解 1 - Shandong University

file window enabled、file specification for file window、

translate command line controls、project name等。

對每個project都必須設置以上?s接圖:

收發交叉互連,RTS、CTS直連,DSR、DTR直連,具體引腳排列參考串口資料。

5. MON51命令及使用

詳細的MON51命令可參閱幫助。

第四節 集成開發環境(IDE)的使用

1. Ishell for Dos的使用

進入Ishell之後看到兩個視窗:一個是檔視窗,一個是Dos命令行視窗,視窗上方是下拉

式的命令功能表,其中的Files控制檔視窗的顯隱。

使用Ishell,第一步就是配置系統,即要學習兩個檔的修改與創建:

(1) Ishell.CFG文件

每一個project都有一個Ishell.CFG,其中存放有“Option功能表和Setup功能表下的部

分資訊;Bell enabled、Monochrome enabled、Editor Selected、CRT Lines、

target enviroment、name of user edit、Automatic load for configuration enabled、

file window enabled、file specification for file window、

translate command line controls、project name等。

對每個project都必須設置以上資訊,然後存檔“setup”的的“save”,這樣才可正式開

始下面工作。

(2) IShell.col文件

對IDE顏色設置,如不改動,可以缺省為主。

(3) CDF文件

該檔位於BIN目錄下,每一檔定義一組外部函數工具包,即定義外部環境如8051.CDF,

USER.CDF等,開發者可修改CDF檔,供自己使用,至於CDF檔內容可查看一下8051.CDF即

可知道。注意.CDF檔是Ishell系統的核心所在,不同的CDF檔可使本IDE適用於不同的編

譯、連接系統,即本IDE並不僅適於C51。

下面談一談Automake工具:

C51的Automake是一個project管理器,在8051工具包中以OBJECT檔形式保留了一個

project的資訊,AutoMake用這些資訊來進行project管理,一旦手工建立一個project,

Page 58: Keil C51 使用详解 1 - Shandong University

Automake可生成一個新的OBJECT,AutoMake利用此檔來編譯那些修改過的檔。

Automake支持C51、A51%A穈T,然後存檔“setup”的的“save”,這樣才可正式開始下面

工作。

(2) IShell.col文件

對IDE顏色設置,如不改動,可以缺省為主。

(3) CDF文件

該檔位於BIN目錄下,每一檔定義一組外部函數工具包,即定義外部環境如8051.CDF,

USER.CDF等,開發者可修改CDF檔,供自己使用,至於CDF檔內容可查看一下8051.CDF即

可知道。注意.CDF檔是Ishell系統的核心所在,不同的CDF檔可使本IDE適用於不同的編

譯、連接系統,即本IDE並不僅適於C51。

下面談一談Automake工具:

C51的Automake是一個project管理器,在8051工具包中以OBJECT檔形式保留了一個

project的資訊,AutoMake用這些資訊來進行project管理,一旦手工建立一個project,

Automake可生成一個新的OBJECT,AutoMake利用此檔來編譯那些修改過的檔。

Automake支持C51、A51、L51/BL51、C166、A166、L166等編譯連接器。點中主功能表中的

Automake即運行本工具。

Ishell for Dos使用比較繁瑣,推薦使用uVision for windows。

2. uVision for windows的使用

uVision是一個標準的windows應用程式,其編譯功能、檔處理功能、project處理功能、

視窗功能以及工具引用功能(如A51、C51、PL/M41、BL51 dScope等)等都較Ishell for Dos

要強得多。

uVision採用BL51作連接器,因為BL51相容L51,所以一切能在Dos下工作的project都

可以到uVision中進行連接調試C

uVision採用dScope for windows作調試器,該調試器支援MON51及系統類比兩種方式,

功能較for DOS要強大好用,調試功能強大。

注意:

(1) Option功能表下的各項要會使用,其中A51、C51、PL/M51、BL51定義各檔所使用的編

譯、連接控制指令,dScope定義一個dScope初始化檔。Make則是定婚L51/BL51、C166、

A166、L166等編譯連接器。點中主功能表中的Automake即運行本工具。

Page 59: Keil C51 使用详解 1 - Shandong University

Ishell for Dos使用比較繁瑣,推薦使用uVision for windows。

2. uVision for windows的使用

uVision是一個標準的windows應用程式,其編譯功能、檔處理功能、project處理功能、

視窗功能以及工具引用功能(如A51、C51、PL/M41、BL51 dScope等)等都較Ishell for Dos

要強得多。

uVision採用BL51作連接器,因為BL51相容L51,所以一切能在Dos下工作的project都

可以到uVision中進行連接調試。

uVision採用dScope for windows作調試器,該調試器支援MON51及系統類比兩種方式,

功能較for DOS要強大好用,調試功能強大。

注意:

(1) Option功能表下的各項要會使用,其中A51、C51、PL/M51、BL51定義各檔所使用的編

譯、連接控制指令,dScope定義一個dScope初始化檔。Make則是定義一個make檔。

(2) 進入調試是在RUN菜單下運行dScope。

(3) project中包括新建、打開、修改、更新、編譯、連接等poject處理,具體使用可參

考後面的例子。

第三章 Keil C51 vs 標準C

深入理解並應用C51對標準ANSIC的擴展是學習C51的關鍵之一。因為大多數擴展功能都是

直接針對8051系列CPU硬體的。大致有以下8類:

●8051存儲類型及存儲區域

●存儲模式

●記憶體類型聲明

●變數類型聲明

●位元變數與位元定址

●特殊功能寄存器(SFR)

●C51指針

●函數屬性

具體說明如下(8031為缺省CPU)。

第一節 Keil C51擴展關鍵字

C51 V4.0版本有以下擴展關鍵字(共19個):

Page 60: Keil C51 使用详解 1 - Shandong University

_at_ idata sfr16 alien interrupt small

bdata large _task_ Code bit pdata �q一個make檔。

(2) 進入調試是在RUN菜單下運行dScope。

(3) project中包括新建、打開、修改、更新、編譯、連接等poject處理,具體使用可參

考後面的例子。

第三章 Keil C51 vs 標準C

深入理解並應用C51對標準ANSIC的擴展是學習C51的關鍵之一。因為大多數擴展功能都是

直接針對8051系列CPU硬體的。大致有以下8類:

●8051存儲類型及存儲區域

●存儲模式

●記憶體類型聲明

●變數類型聲明

●位元變數與位元定址

●特殊功能寄存器(SFR)

●C51指針

●函數屬性

具體說明如下(8031為缺省CPU)。

第一節 Keil C51擴展關鍵字

C51 V4.0版本有以下擴展關鍵字(共19個):

_at_ idata sfr16 alien interrupt small

bdata large _task_ Code bit pdata

using reentrant xdata compact sbit data sfr

第二節 記憶體區域(Memory Areas):

1. Pragram Area:

由Code說明可有多達64kBytes的程式記憶體

2. Internal Data Memory:

內部資料記憶體可用以下關鍵字說明:

data:直接定址區,為內部RAM的低128位元組 00H~7FH

idata:間接定址區,包括整個內部RAM區 00H~FFH

Page 61: Keil C51 使用详解 1 - Shandong University

bdata:可位定址區, 20H~2FH

3. External Data Memory

外部RAM視使用情況可由以下關鍵字標識:

xdata:可指定多達64KB的外部直接定址區,位址範圍0000H~0FFFFH

pdata:能訪問1頁(25bBytes)的外部RAM,主要用於緊湊模式(Compact Model)。

4. Speciac Function Register Memory

8051提供128Bytes的SFR定址區,這區域可位元定址、位元組定址或字定址,用以控制計

時器、計數器、串口、I/O及其它部件,可?D

using reentrant xdata compact sbit data sfr

第二節 記憶體區域(Memory Areas):

1. Pragram Area:

由Code說明可有多達64kBytes的程式記憶體

2. Internal Data Memory:

內部資料記憶體可用以下關鍵字說明:

data:直接定址區,為內部RAM的低128位元組 00H~7FH

idata:間接定址區,包括整個內部RAM區 00H~FFH

bdata:可位定址區, 20H~2FH

3. External Data Memory

外部RAM視使用情況可由以下關鍵字標識:

xdata:可指定多達64KB的外部直接定址區,位址範圍0000H~0FFFFH

pdata:能訪問1頁(25bBytes)的外部RAM,主要用於緊湊模式(Compact Model)。

4. Speciac Function Register Memory

8051提供128Bytes的SFR定址區,這區域可位元定址、位元組定址或字定址,用以控制計

時器、計數器、串口、I/O及其它部件,可由以下幾種關鍵字說明:

sfr:位元組定址 比如 sfr P0=0x80;為PO口位址為80H,“=”後H~FFH之間的常數。

sfr16:字定址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD

sbit:位定址,如sbit EA=0xAF;指定第0xAF位為EA,即中斷允許

還可以有如下定義方法:

sbit 0V=PSW2;(定義0V為PSW的第2位)

Page 62: Keil C51 使用详解 1 - Shandong University

sbit 0V=0XDO2;(同上)

或bit 0V-=0xD2(同上)。

第三節 存儲模式

存儲模式決定了沒有明確指定存儲類型的變數,函數參數等的缺省存儲區域,共三種:

1. Small模式

所有缺省變數參數均裝入內部RAM,優點是訪問速度快,缺點是空間有限,只適用於小程式。

2. Compact模式

所有缺省變數均位於外部RAM區的一頁(256Bytes),具體哪一頁可由P2口指定,在

STARTUP.A51文件中說明,也D1以下幾種關鍵字說明:

sfr:位元組定址 比如 sfr P0=0x80;為PO口位址為80H,“=”後H~FFH之間的常數。

sfr16:字定址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD

sbit:位定址,如sbit EA=0xAF;指定第0xAF位為EA,即中斷允許

還可以有如下定義方法:

sbit 0V=PSW2;(定義0V為PSW的第2位)

sbit 0V=0XDO2;(同上)

或bit 0V-=0xD2(同上)。

第三節 存儲模式

存儲模式決定了沒有明確指定存儲類型的變數,函數參數等的缺省存儲區域,共三種:

1. Small模式

所有缺省變數參數均裝入內部RAM,優點是訪問速度快,缺點是空間有限,只適用於小程式。

2. Compact模式

所有缺省變數均位於外部RAM區的一頁(256Bytes),具體哪一頁可由P2口指定,在

STARTUP.A51文件中說明,也可用pdata指定,優點是空間較Small為寬裕速度較Small慢,

較large要快,是一種中間狀態。

3. large模式

所有缺省變數可放在多達64KB的外部RAM區,優點是空間大,可存變數多,缺點是速度較

慢。

提示:存儲模式在C51編譯器選項中選擇。

第四節 存儲類型聲明

Page 63: Keil C51 使用详解 1 - Shandong University

變數或參數的存儲類型可由存儲模式指定缺省類型,也可由關鍵字直接聲明指定。各類型分

別用:code,data,idata,xdata,pdata說明,例:

data uar1

char code array[ ]=“hello!”;

unsigned char xdata arr[10][4][4];

第五節 變數或資料類型

C51提供以下幾種擴展資料類型:

bit 位元變數值為0或1

sbit 從位元組中定義的位元變數 0或1

sfr sfr位元組位址 0~255

sfr16 sfr字地址 0~65535

其餘資料類型如:char,enum%可用pdata指定,優點是空間較Small為寬裕速度較Small

慢,較large要快,是一種中間狀態。

3. large模式

所有缺省變數可放在多達64KB的外部RAM區,優點是空間大,可存變數多,缺點是速度較

慢。

提示:存儲模式在C51編譯器選項中選擇。

第四節 存儲類型聲明

變數或參數的存儲類型可由存儲模式指定缺省類型,也可由關鍵字直接聲明指定。各類型分

別用:code,data,idata,xdata,pdata說明,例:

data uar1

char code array[ ]=“hello!”;

unsigned char xdata arr[10][4][4];

第五節 變數或資料類型

C51提供以下幾種擴展資料類型:

bit 位元變數值為0或1

sbit 從位元組中定義的位元變數 0或1

sfr sfr位元組位址 0~255

sfr16 sfr字地址 0~65535

Page 64: Keil C51 使用详解 1 - Shandong University

其餘資料類型如:char,enum,short,int,long,float等與ANSI C相同。

第六節 位元變數與聲明

1. bit型變數

bit型變數可用變數類型,函數聲明、函數返回值等,存貯於內部RAM20H~2FH。

注意:

(1) 用#pragma disable說明函數和用“usign”指定的函數,不能返回bit值。

(2) 一個bit變數不能聲明為指標,如bit *ptr;是錯誤的

(3) 不能有bit陣列如:bit arr[5];錯誤。

2. 可位定址區說明20H-2FH

可作如下定義:

int bdata i;

char bdata arr[3],

然後:

sbit bito=in0;sbit bit15=I15;

sbit arr07=arr[0]7;sbit arr15=arr[i]7;

第七節 Keil C51指針

C51支援一般指針(Generic Pointer)和記憶體指針(Memory_Specific Pointer).

1. 一般指針

一般指標的聲明和使用均與標準C相同,不過同時還可以說明指標的存儲類型,例如:

long * state;為?Cshort,int,long,float等與ANSI C相同。

第六節 位元變數與聲明

1. bit型變數

bit型變數可用變數類型,函數聲明、函數返回值等,存貯於內部RAM20H~2FH。

注意:

(1) 用#pragma disable說明函數和用“usign”指定的函數,不能返回bit值。

(2) 一個bit變數不能聲明為指標,如bit *ptr;是錯誤的

(3) 不能有bit陣列如:bit arr[5];錯誤。

2. 可位定址區說明20H-2FH

可作如下定義:

Page 65: Keil C51 使用详解 1 - Shandong University

int bdata i;

char bdata arr[3],

然後:

sbit bito=in0;sbit bit15=I15;

sbit arr07=arr[0]7;sbit arr15=arr[i]7;

第七節 Keil C51指針

C51支援一般指針(Generic Pointer)和記憶體指針(Memory_Specific Pointer).

1. 一般指針

一般指標的聲明和使用均與標準C相同,不過同時還可以說明指標的存儲類型,例如:

long * state;為一個指向long型整數的指標,而state本身則依存儲模式存放。

char * xdata ptr;ptr為一個指向char資料的指標,而ptr本身放于外部RAM區,以上

的long,char等指標指向的資料可存放於任何記憶體中。

一般指標本身用3個位元組存放,分別為記憶體類型,高位偏移,低位元偏移量。

2. 記憶體指針

基於記憶體的指標說明時即指定了存貯類型,例如:

char data * str;str指向data區中char型數據

int xdata * pow; pow指向外部RAM的int型整數。

這種指標存放時,只需一個位元組或2個位元組就夠了,因為只需存放偏移量。

3. 指針轉換

即指針在上兩種類型之間轉化:

●當基於記憶體的指標作為一個實參傳遞給需要一般指標的函數時,指標自動%C@個指向

long型整數的指標,而state本身則依存儲模式存放。

char * xdata ptr;ptr為一個指向char資料的指標,而ptr本身放于外部RAM區,以上

的long,char等指標指向的資料可存放於任何記憶體中。

一般指標本身用3個位元組存放,分別為記憶體類型,高位偏移,低位元偏移量。

2. 記憶體指針

基於記憶體的指標說明時即指定了存貯類型,例如:

char data * str;str指向data區中char型數據

int xdata * pow; pow指向外部RAM的int型整數。

Page 66: Keil C51 使用详解 1 - Shandong University

這種指標存放時,只需一個位元組或2個位元組就夠了,因為只需存放偏移量。

3. 指針轉換

即指針在上兩種類型之間轉化:

●當基於記憶體的指標作為一個實參傳遞給需要一般指標的函數時,指標自動轉化。

●如果不說明外部函數原形,基於記憶體的指標自動轉化為一般指標,導致錯誤,因而請用

“#include”說明所有函數原形。

●可以強行改變指標類型。

第八節 Keil C51函數

C51函數聲明對ANSI C作了擴展,具體包括:

1. 中斷函數聲明:

中斷聲明方法如下:

void serial_ISR () interrupt 4 [using 1]

{

/* ISR */

}

為提高代碼的容錯能力,在沒用到的中斷入口處生成iret語句,定義沒用到的中斷。

/* define not used interrupt, so generate "IRET" in their entrance */

void extern0_ISR() interrupt 0{} /* not used */

void timer0_ISR () interrupt 1{} /* not used */

void extern1_ISR() interrupt 2{} /* not used */

void timer1_ISR () interrupt 3{} /* not used */

void serial_ISR () interrupt 4{} /* not used */

2. 通用存儲工作區

3. 選通用存儲工作區由using x聲斧鄐�C

●如果不說明外部函數原形,基於記憶體的指標自動轉化為一般指標,導致錯誤,因而請用

“#include”說明所有函數原形。

●可以強行改變指標類型。

第八節 Keil C51函數

C51函數聲明對ANSI C作了擴展,具體包括:

Page 67: Keil C51 使用详解 1 - Shandong University

1. 中斷函數聲明:

中斷聲明方法如下:

void serial_ISR () interrupt 4 [using 1]

{

/* ISR */

}

為提高代碼的容錯能力,在沒用到的中斷入口處生成iret語句,定義沒用到的中斷。

/* define not used interrupt, so generate "IRET" in their entrance */

void extern0_ISR() interrupt 0{} /* not used */

void timer0_ISR () interrupt 1{} /* not used */

void extern1_ISR() interrupt 2{} /* not used */

void timer1_ISR () interrupt 3{} /* not used */

void serial_ISR () interrupt 4{} /* not used */

2. 通用存儲工作區

3. 選通用存儲工作區由using x聲明,見上例。

4. 指定存儲模式

由small compact 及large說明,例如:

void fun1(void) small { }

提示:small說明的函數內部變數全部使用內部RAM。關鍵的經常性的耗時的地方可以這樣

聲明,以提高運行速度。

5. #pragma disable

在函數前聲明,只對一個函數有效。該函數調用過程中將不可被中斷。

6. 遞迴或可重入函數指定

在主程序和中斷中都可調用的函數,容易產生問題。因為51和PC不同,PC使用堆疊傳遞

參數,且靜態變數以外的內部變數都在堆疊中;而51一般使用寄存器傳遞參數,內部變數

一般在RAM中,函數重入時會破壞上次調用的資料。可以用以下兩種方法解決函數重入:

a、在相應的函數前使用前述“#pragma disable”聲明,即只允許主程A,見上例。

4. 指定存儲模式

由small compact 及large說明,例如:

Page 68: Keil C51 使用详解 1 - Shandong University

void fun1(void) small { }

提示:small說明的函數內部變數全部使用內部RAM。關鍵的經常性的耗時的地方可以這樣

聲明,以提高運行速度。

5. #pragma disable

在函數前聲明,只對一個函數有效。該函數調用過程中將不可被中斷。

6. 遞迴或可重入函數指定

在主程序和中斷中都可調用的函數,容易產生問題。因為51和PC不同,PC使用堆疊傳遞

參數,且靜態變數以外的內部變數都在堆疊中;而51一般使用寄存器傳遞參數,內部變數

一般在RAM中,函數重入時會破壞上次調用的資料。可以用以下兩種方法解決函數重入:

a、在相應的函數前使用前述“#pragma disable”聲明,即只允許主程序或中斷之一調用該

函數;

b、將該函數說明為可重入的。如下:

void func(param...) reentrant;

KeilC51編譯後將生成一個可重入變數堆疊,然後就可以類比通過堆疊傳遞變數的方法。

由於一般可重入函數由主程序和中斷調用,所以通常中斷使用與主程序不同的R寄存器組。

另外,對可重入函數,在相應的函數前面加上開關“#pragma noaregs”,以禁止編譯器使

用絕對寄存器定址,可生成不依賴於寄存器組的代碼。

7. 指定PL/M-51函數

由alien指定。

第四章 Keil C51高級編程

本章討論以下內容:

●絕對位址訪問

●C與彙編的介面

●C51套裝軟體中的通用檔

●段名轉換與程式優化

第一節 絕對位址訪問

C51提供了三種釦�峇刈_之一調用該函數;

b、將該函數說明為可重入的。如下:

void func(param...) reentrant;

Page 69: Keil C51 使用详解 1 - Shandong University

KeilC51編譯後將生成一個可重入變數堆疊,然後就可以類比通過堆疊傳遞變數的方法。

由於一般可重入函數由主程序和中斷調用,所以通常中斷使用與主程序不同的R寄存器組。

另外,對可重入函數,在相應的函數前面加上開關“#pragma noaregs”,以禁止編譯器使

用絕對寄存器定址,可生成不依賴於寄存器組的代碼。

7. 指定PL/M-51函數

由alien指定。

第四章 Keil C51高級編程

本章討論以下內容:

●絕對位址訪問

●C與彙編的介面

●C51套裝軟體中的通用檔

●段名轉換與程式優化

第一節 絕對位址訪問

C51提供了三種訪問絕對位址的方法:

1. 絕對宏:

在程式中,用“#include”即可使用其中定義的宏來訪問絕對位址,包括:

CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD

具體使用可看一看absacc.h便知

例如:

rval=CBYTE[0x0002];指向程式記憶體的0002h位址

rval=XWORD [0x0002];指向外RAM的0004h地址

2. _at_關鍵字

直接在資料定義後加上_at_ const即可,但是注意:

(1)絕對變數不能被初使化;

(2)bit型函數及變數不能用_at_指定。

例如:

idata struct link list _at_ 0x40;指定list結構從40h開始。

xdata char text[25b] _at_0xE000;指定text陣列從0E000H開始

提示:如果外部絕對變數是I/O埠等可自行變化資料,需要使用volatile關鍵字進行描述,

Page 70: Keil C51 使用详解 1 - Shandong University

請參考absacc.h。

3. 連接定位控制

此法是利用連接控制指令code xdata pdata \daX問絕對位址的方法:

1. 絕對宏:

在程式中,用“#include”即可使用其中定義的宏來訪問絕對位址,包括:

CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD

具體使用可看一看absacc.h便知

例如:

rval=CBYTE[0x0002];指向程式記憶體的0002h位址

rval=XWORD [0x0002];指向外RAM的0004h地址

2. _at_關鍵字

直接在資料定義後加上_at_ const即可,但是注意:

(1)絕對變數不能被初使化;

(2)bit型函數及變數不能用_at_指定。

例如:

idata struct link list _at_ 0x40;指定list結構從40h開始。

xdata char text[25b] _at_0xE000;指定text陣列從0E000H開始

提示:如果外部絕對變數是I/O埠等可自行變化資料,需要使用volatile關鍵字進行描述,

請參考absacc.h。

3. 連接定位控制

此法是利用連接控制指令code xdata pdata \data bdata對“段”位址進行,如要指定某

具體變數位址,則很有局限性,不作詳細討論。

第二節 Keil C51與彙編的介面

1. 模組內介面

方法是用#pragma語句具體結構是:

#pragma asm

彙編行

#pragma endasm

這種方法實質是通過asm與ndasm告訴C51編譯器中間行不用編譯為彙編行,因而在編譯控

Page 71: Keil C51 使用详解 1 - Shandong University

制指令中有SRC以控制將這些不用編譯的行存入其中。

2. 模組間介面

C模組與彙編模組的介面較簡單,分別用C51與A51對原始檔案進行編譯,然後用L51將obj

檔連接即可,關鍵問題在於C函數與彙編函數之間的參數傳遞問題,C51中有兩種參數傳遞

方法。

(1) 通過寄存器傳遞函數參數

最多只能有3個參數通過寄存器傳遞,規律如下表:

參數數目CharIntlong,float 一般指%Bta bdata對“段”位址進行,如要指定某具體變數

位址,則很有局限性,不作詳細討論。

第二節 Keil C51與彙編的介面

1. 模組內介面

方法是用#pragma語句具體結構是:

#pragma asm

彙編行

#pragma endasm

這種方法實質是通過asm與ndasm告訴C51編譯器中間行不用編譯為彙編行,因而在編譯控

制指令中有SRC以控制將這些不用編譯的行存入其中。

2. 模組間介面

C模組與彙編模組的介面較簡單,分別用C51與A51對原始檔案進行編譯,然後用L51將obj

檔連接即可,關鍵問題在於C函數與彙編函數之間的參數傳遞問題,C51中有兩種參數傳遞

方法。

(1) 通過寄存器傳遞函數參數

最多只能有3個參數通過寄存器傳遞,規律如下表:

參數數目CharIntlong,float 一般指標

1R7R6 & R7R4�R7R1�R3

2R5R4 & R5R4�R7R1�R3

3R3R2 & R3R1�R3

(2) 通過固定存儲區傳遞(fixed memory)

這種方法將bit型參數傳給一個存儲段中:

Page 72: Keil C51 使用详解 1 - Shandong University

?function_name?BIT

將其他類型參數均傳給下麵的段:?function_name?BYTE,且按照預選順序存放。

至於這個固定存儲區本身在何處,則由存儲模式默認。

(3) 函數的返回值

函數返回值一律放於寄存器中,有如下規律:

Return typeRegistev說明

Bit標誌位元由具體標誌位元返回

char/unsigned char 1_byte指針 R7單字節由R7返回

int/unsigned int 2_byte指標 R6 & R7雙位元組由R6和R7返回,MSB在R6

long&unsigned longR4�R7MSB在R4, LSB在R7

FloatR4�R732Bit IEEE格式

一般指標R1�R3存儲類型在R3 高位R2 低R1

(4) SRC控制

該控制指令將C檔編譯生成彙編檔(.SRC),該彙編文件%C?

1R7R6 & R7R4�R7R1�R3

2R5R4 & R5R4�R7R1�R3

3R3R2 & R3R1�R3

(2) 通過固定存儲區傳遞(fixed memory)

這種方法將bit型參數傳給一個存儲段中:

?function_name?BIT

將其他類型參數均傳給下麵的段:?function_name?BYTE,且按照預選順序存放。

至於這個固定存儲區本身在何處,則由存儲模式默認。

(3) 函數的返回值

函數返回值一律放於寄存器中,有如下規律:

Return typeRegistev說明

Bit標誌位元由具體標誌位元返回

char/unsigned char 1_byte指針 R7單字節由R7返回

int/unsigned int 2_byte指標 R6 & R7雙位元組由R6和R7返回,MSB在R6

long&unsigned longR4�R7MSB在R4, LSB在R7

Page 73: Keil C51 使用详解 1 - Shandong University

FloatR4�R732Bit IEEE格式

一般指標R1�R3存儲類型在R3 高位R2 低R1

(4) SRC控制

該控制指令將C檔編譯生成彙編檔(.SRC),該彙編文件可改名後,生成彙編.ASM檔,再用

A51進行編譯。

第三節 Keil C51套裝軟體中的通用檔

在C51\LiB目錄下有幾個C原始檔案,這幾個C原始檔案有非常重要的作用,對它們稍事修

改,就可以用在自己的專用系統中。

1. 動態記憶體分配

init_mem.C:此檔是初始化動態記憶體區的程式源代碼。它可以指定動態記憶體的位置及大

小,只有使用了init_mem( )才可以調回其他函數,諸如malloc calloc,realloc等。

calloc.c:此檔是給陣列分配記憶體的源代碼,它可以指定單位資料類型及該單元數目。

malloc.c:此檔是malloc的源代碼,分配一段固定大小的記憶體。

realloc.c:此文件是realloc.c源代碼,其功能是調整當前分配動態記憶體的大小。

2. C51啟動檔STARTUP.A51

啟動檔STARTUP.A51中包含目標A5i改名後,生成彙編.ASM檔,再用A51進行編譯。

第三節 Keil C51套裝軟體中的通用檔

在C51\LiB目錄下有幾個C原始檔案,這幾個C原始檔案有非常重要的作用,對它們稍事修

改,就可以用在自己的專用系統中。

1. 動態記憶體分配

init_mem.C:此檔是初始化動態記憶體區的程式源代碼。它可以指定動態記憶體的位置及大

小,只有使用了init_mem( )才可以調回其他函數,諸如malloc calloc,realloc等。

calloc.c:此檔是給陣列分配記憶體的源代碼,它可以指定單位資料類型及該單元數目。

malloc.c:此檔是malloc的源代碼,分配一段固定大小的記憶體。

realloc.c:此文件是realloc.c源代碼,其功能是調整當前分配動態記憶體的大小。

2. C51啟動檔STARTUP.A51

啟動檔STARTUP.A51中包含目標板啟動代碼,可在每個project中加入這個檔,只要復位,

則該檔立即執行,其功能包括:

Page 74: Keil C51 使用详解 1 - Shandong University

●定義內部RAM大小、外部RAM大小、可重入堆疊位置

●清除內部、外部或者以此頁為單元的外部記憶體

●按存儲模式初使化重入堆疊及堆疊指標

●初始化8051硬體堆疊指標

●向main( )函數交權

開發人員可修改以下資料從而對系統初始化

常數名 意義

IDATALEN 待清內部RAM長度

XDATA START 指定待清外部RAM起始位址

XDATALEN 待清外部RAM長度

IBPSTACK 是否小模式重入堆疊指標需初始化標誌,1為需要。缺省為0

IBPSTACKTOP 指定小模式重入堆疊頂部位址

XBPSTACK 是否大模式重入堆疊指標需初始化標誌,缺省為0

XBPSTACKTOP 指定云O啟動代碼,可在每個project中加入這個檔,只要復位,則該檔立即

執行,其功能包括:

●定義內部RAM大小、外部RAM大小、可重入堆疊位置

●清除內部、外部或者以此頁為單元的外部記憶體

●按存儲模式初使化重入堆疊及堆疊指標

●初始化8051硬體堆疊指標

●向main( )函數交權

開發人員可修改以下資料從而對系統初始化

常數名 意義

IDATALEN 待清內部RAM長度

XDATA START 指定待清外部RAM起始位址

XDATALEN 待清外部RAM長度

IBPSTACK 是否小模式重入堆疊指標需初始化標誌,1為需要。缺省為0

IBPSTACKTOP 指定小模式重入堆疊頂部位址

XBPSTACK 是否大模式重入堆疊指標需初始化標誌,缺省為0

XBPSTACKTOP 指定大模式重入堆疊頂部位址

Page 75: Keil C51 使用详解 1 - Shandong University

PBPSTACK 是否Compact重入堆疊指標,需初始化標誌,缺省為0

PBPSTACKTOP 指定Compact模式重入堆疊頂部位址

PPAGEENABLE P2初始化允許開關

PPAGE 指定P2值

PDATASTART 待清外部RAM頁首址

PDATALEN 待清外部RAM頁長度

提示:如果要初始化P2作為緊湊模式高端位址,必須:PPAGEENAGLE=1,PPAGE為P2值,

例如指定某頁1000H-10FFH,則PPAGE=10H,而且連接時必須如下:

L51 PDATA(1080H),其中1080H是1000H-10FFH中的任一個值。

以下是STARTUP.A51代碼片斷,紅色是經常可能需要修改的地方:

;------------------------------------------------------------------------------

; This file is part of the C51 Compiler package

; Copyright KEIL ELEKTRONIK GmbH 1990

;------------------------------------------------------------------------------

; STARTUP.A51: This code is executed after processor reset.

;

; To translate this fj模式重入堆疊頂部位址

PBPSTACK 是否Compact重入堆疊指標,需初始化標誌,缺省為0

PBPSTACKTOP 指定Compact模式重入堆疊頂部位址

PPAGEENABLE P2初始化允許開關

PPAGE 指定P2值

PDATASTART 待清外部RAM頁首址

PDATALEN 待清外部RAM頁長度

提示:如果要初始化P2作為緊湊模式高端位址,必須:PPAGEENAGLE=1,PPAGE為P2值,

例如指定某頁1000H-10FFH,則PPAGE=10H,而且連接時必須如下:

L51 PDATA(1080H),其中1080H是1000H-10FFH中的任一個值。

以下是STARTUP.A51代碼片斷,紅色是經常可能需要修改的地方:

Page 76: Keil C51 使用详解 1 - Shandong University

;------------------------------------------------------------------------------

; This file is part of the C51 Compiler package

; Copyright KEIL ELEKTRONIK GmbH 1990

;------------------------------------------------------------------------------

; STARTUP.A51: This code is executed after processor reset.

;

; To translate this file use A51 with the following invocation:

;

; A51 STARTUP.A51

;

; To link the modified STARTUP.OBJ file to your application use the following

; L51 invocation:

;

; L51 , STARTUP.OBJ

;

;------------------------------------------------------------------------------

;

; User-defined Power-On Initialization of Memory

;

; With the following EQU statements the initialization of memory

; at processor reset can be defined:

;

; the absolute start-address of IDATA memory is always 0

IDATALEN EQU 80H the length of IDATA memory in bytes.

;

XDATASTART EQU 0H the absolute start-address of XDATA memory

Page 77: Keil C51 使用详解 1 - Shandong University

XDATALEN EQU 0H the length of XDATA memory in bytes.

;

PDATASTART EQU 0H the absolute start-address of PDATA memory

PDATALEN EQU 0H the length of PDATA memory in bytes.

;

; Notes: The IDATA space overlaps physically the DATA and BIT areas of the

; 8051 CPU. At minimum the memory space occupied from the C51

; run-time routines must be set to zero.

;------------------------------------------------------------------------------

;

; Reentrant Stack Initilization

; %ile use A51 with the following invocation:

;

; A51 STARTUP.A51

;

; To link the modified STARTUP.OBJ file to your application use the following

; L51 invocation:

;

; L51 , STARTUP.OBJ

;

;------------------------------------------------------------------------------

;

; User-defined Power-On Initialization of Memory

;

; With the following EQU statements the initialization of memory

; at processor reset can be defined:

;

Page 78: Keil C51 使用详解 1 - Shandong University

; the absolute start-address of IDATA memory is always 0

IDATALEN EQU 80H the length of IDATA memory in bytes.

;

XDATASTART EQU 0H the absolute start-address of XDATA memory

XDATALEN EQU 0H the length of XDATA memory in bytes.

;

PDATASTART EQU 0H the absolute start-address of PDATA memory

PDATALEN EQU 0H the length of PDATA memory in bytes.

;

; Notes: The IDATA space overlaps physically the DATA and BIT areas of the

; 8051 CPU. At minimum the memory space occupied from the C51

; run-time routines must be set to zero.

;------------------------------------------------------------------------------

;

; Reentrant Stack Initilization

;

; The following EQU statements define the stack pointer for reentrant

; functions and initialized it:

;

; Stack Space for reentrant functions in the SMALL model.

IBPSTACK EQU 0 set to 1 if small reentrant is used.

IBPSTACKTOP EQU 0FFH+1 set top of stack to highest location+1.

;

; Stack Space for reentrant functions in the LARGE model.

XBPSTACK EQU 0 set to 1 if large reentrant is used.

XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.

;

; Stack Space for reentrant functions in the COMPACT model.

Page 79: Keil C51 使用详解 1 - Shandong University

PBPSTACK EQU 0 set to 1 if compact reentrant is used.

PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.

;

;------------------------------------------------------------------------------

;

; Page Definition for Using the Compact Model with 64 KByte xdata RAM

;

; The following EQU statements define the xdata page used for pdata

; variables. The EQU PPAGE must conform with the PPAGE control used

; in the linker invocation.

;

PPAGEENABLE EQU 0 set to 1 if pdata object are used.

PPAGE EQU 0 define PPAGE number.

;

;--------------------------------------------------0D

; The following EQU statements define the stack pointer for reentrant

; functions and initialized it:

;

; Stack Space for reentrant functions in the SMALL model.

IBPSTACK EQU 0 set to 1 if small reentrant is used.

IBPSTACKTOP EQU 0FFH+1 set top of stack to highest location+1.

;

; Stack Space for reentrant functions in the LARGE model.

XBPSTACK EQU 0 set to 1 if large reentrant is used.

XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.

;

; Stack Space for reentrant functions in the COMPACT model.

PBPSTACK EQU 0 set to 1 if compact reentrant is used.

Page 80: Keil C51 使用详解 1 - Shandong University

PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.

;

;------------------------------------------------------------------------------

;

; Page Definition for Using the Compact Model with 64 KByte xdata RAM

;

; The following EQU statements define the xdata page used for pdata

; variables. The EQU PPAGE must conform with the PPAGE control used

; in the linker invocation.

;

PPAGEENABLE EQU 0 set to 1 if pdata object are used.

PPAGE EQU 0 define PPAGE number.

;

;------------------------------------------------------------------------------

3. 標準輸入輸出檔

putchar.c

putchar.c是一個低級字元輸出子程,開發人員可修改後應用到自己的硬體系統上,例如向

CLD或LEN輸出字元。

缺省:putchar.c是向串口輸出一個字元XON|XOFF是流控標誌,換行符“\*n”自動轉化為

回車/換行“\r\n”。

getkey.c

getkey函數是一個低級字元輸入子程,該程式可用到自己硬體系統,如矩陣鍵盤輸入中,

缺省時通過串口輸入字元。

4. 其他文件

還包括對Watch-Dog有獨特功能的INIT.A51函數以及對8×C751適用的函數,可參考源代

碼。

第四節 段名協定與程式優化

Page 81: Keil C51 使用详解 1 - Shandong University

1. 段名協定(Segment Naming Conventions)

C51編譯器生成的目標檔存放于許多段中,這些段是代碼空間或資料空間的一些單元,一個

段可以是可重定位的,也可以是%----------------------------

3. 標準輸入輸出檔

putchar.c

putchar.c是一個低級字元輸出子程,開發人員可修改後應用到自己的硬體系統上,例如向

CLD或LEN輸出字元。

缺省:putchar.c是向串口輸出一個字元XON|XOFF是流控標誌,換行符“\*n”自動轉化為

回車/換行“\r\n”。

getkey.c

getkey函數是一個低級字元輸入子程,該程式可用到自己硬體系統,如矩陣鍵盤輸入中,

缺省時通過串口輸入字元。

4. 其他文件

還包括對Watch-Dog有獨特功能的INIT.A51函數以及對8×C751適用的函數,可參考源代

碼。

第四節 段名協定與程式優化

1. 段名協定(Segment Naming Conventions)

C51編譯器生成的目標檔存放于許多段中,這些段是代碼空間或資料空間的一些單元,一個

段可以是可重定位的,也可以是絕對段,每一個可重定位的段都有一個類型和名字,C51段

名有以下規定:

每個段名包括首碼與模組名兩部分,首碼表示存儲類型,模組名則是被編譯的模組的名字,

例如:

?CO?main1 :表示main1模組中的代碼段中的常數部分

?PR?function1?module 表module模組中函數function1的可執行段,具體規定參閱手

冊。

2. 程式優化

C51編譯器是一個具有優化功能的編譯器,它共提供六級優化功能。確保生成目標代碼的最

高效率(代碼最少,運行速度最快)。具體六級優化的內容可參考幫助。

在C51中提供以下編譯控制指令控制代碼優化:

Page 82: Keil C51 使用详解 1 - Shandong University

OPTIMIZE(SJXE):儘量採用副程式,使程式碼減少。

NOAREGS:不使用絕對寄存器訪問,程式碼與寄存器段獨立。

NOREGPARMS:參數傳絕對段,每一個可重定位的段都有一個類型和名字,C51段名有以下規

定:

每個段名包括首碼與模組名兩部分,首碼表示存儲類型,模組名則是被編譯的模組的名字,

例如:

?CO?main1 :表示main1模組中的代碼段中的常數部分

?PR?function1?module 表module模組中函數function1的可執行段,具體規定參閱手

冊。

2. 程式優化

C51編譯器是一個具有優化功能的編譯器,它共提供六級優化功能。確保生成目標代碼的最

高效率(代碼最少,運行速度最快)。具體六級優化的內容可參考幫助。

在C51中提供以下編譯控制指令控制代碼優化:

OPTIMIZE(SJXE):儘量採用副程式,使程式碼減少。

NOAREGS:不使用絕對寄存器訪問,程式碼與寄存器段獨立。

NOREGPARMS:參數傳遞總是在局部資料段實現,程式碼與低版本C51相容。

OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供6級優化功能,缺省為: OPTIMIZE(6,SPEED)。

第五章 Keil C51庫函數參考

C51強大功能及其高效率的重要體現之一在於其豐富的可直接調用的庫函數,多使用庫函數

使程式碼簡單,結構清晰,易於調試和維護,下面介紹C51的庫函數系統。

第一節 本征庫函數(intrinsic routines)和非本征證庫函數

C51提供的本征函數是指編譯時直接將固定的代碼插入當前行,而不是用ACALL和LCALL語

句來實現,這樣就大大提供了函數訪問的效率,而非本征函數則必須由ACALL及LCALL調用。

C51的本征庫函數只有9個,數目雖少,但都非常有用,列如下:

_crol_,_cror_:將char型變數迴圈向左(右)移動指BB撙 是在局部資料段實現,程式碼與

低版本C51相容。

OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供6級優化功能,缺省為: OPTIMIZE(6,SPEED)。

第五章 Keil C51庫函數參考

C51強大功能及其高效率的重要體現之一在於其豐富的可直接調用的庫函數,多使用庫函數

Page 83: Keil C51 使用详解 1 - Shandong University

使程式碼簡單,結構清晰,易於調試和維護,下面介紹C51的庫函數系統。

第一節 本征庫函數(intrinsic routines)和非本征證庫函數

C51提供的本征函數是指編譯時直接將固定的代碼插入當前行,而不是用ACALL和LCALL語

句來實現,這樣就大大提供了函數訪問的效率,而非本征函數則必須由ACALL及LCALL調用。

C51的本征庫函數只有9個,數目雖少,但都非常有用,列如下:

_crol_,_cror_:將char型變數迴圈向左(右)移動指定位數後返回

_iror_,_irol_:將int型變數迴圈向左(右)移動指定位數後返回

_lrol_,_lror_:將long型變數迴圈向左(右)移動指定位數後返回

_nop_: 相當於插入NOP

_testbit_: 相當於JBC bitvar測試該位元變數並跳轉同時清除。

_chkfloat_: 測試並返回源點數狀態。

使用時,必須包含#inclucle 一行。

如不說明,下面談到的庫函數均指非本征庫函數。

第二節 幾類重要庫函數

1. 專用寄存器include檔

例如8031、8051均為REG51.h其中包括了所有8051的SFR及其位元定義,一般系統都必須

包括本檔。

2. 絕對位址include文件absacc.h

該檔中實際只定義了幾個巨集,以確定各存儲空間的絕對位址。

3. 動態記憶體分配函數,位於stdlib.h中

4. 緩衝區處理函數位於“strin定位數後返回

_iror_,_irol_:將int型變數迴圈向左(右)移動指定位數後返回

_lrol_,_lror_:將long型變數迴圈向左(右)移動指定位數後返回

_nop_: 相當於插入NOP

_testbit_: 相當於JBC bitvar測試該位元變數並跳轉同時清除。

_chkfloat_: 測試並返回源點數狀態。

使用時,必須包含#inclucle 一行。

如不說明,下面談到的庫函數均指非本征庫函數。

第二節 幾類重要庫函數

Page 84: Keil C51 使用详解 1 - Shandong University

1. 專用寄存器include檔

例如8031、8051均為REG51.h其中包括了所有8051的SFR及其位元定義,一般系統都必須

包括本檔。

2. 絕對位址include文件absacc.h

該檔中實際只定義了幾個巨集,以確定各存儲空間的絕對位址。

3. 動態記憶體分配函數,位於stdlib.h中

4. 緩衝區處理函數位於“string.h”中

其中包括拷貝比較移動等函數如:

memccpy memchr memcmp memcpy memmove memset

這樣很方便地對緩衝區進行處理。

5. 輸入輸出流函數,位於“stdio.h”中

流函數通8051的串口或用戶定義的I/O口讀寫資料,缺省為8051串口,如要修改,比如改

為LCD顯示,可修改lib目錄中的getkey.c及putchar.c原始檔案,然後在庫中替換它們

即可。

第三節 Keil C51庫函數原型列表

1. CTYPE.H

bit isalnum(char c);

bit isalpha(char c);

bit iscntrl(char c);

bit isdigit(char c);

bit isgraph(char c);

bit islower(char c);

bit isprint(char c);

bit ispunct(char c);

bit isspace(char c);

bit isupper(char c);

bit isxdigit(char c);

bit toascii(char c);

bit toint(char c);

Page 85: Keil C51 使用详解 1 - Shandong University

char tolower(char c);

char __tolower(char c);

char toupper(char c);

char __toupper(char c)︹.h”中

其中包括拷貝比較移動等函數如:

memccpy memchr