-
Keil C51
使用详解
V1.0
第一章
Keil
C51
开发系统基本知识
... 6
第一节
系统概述
... 6
第二节
Keil
C51
单片机软件开发系统的整体结构
... 6
1
第三节
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)<
/p>
控制类:
... 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
2
第一节
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
声明,见上例。
4.
指定存储模式
... 19
5. #pragma
disable. 19
6.
递归或可重入函数指定
...
19
3
... 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.
动态内存分配函数,位于
std
lib.h
中
... 27
4. <
/p>
缓冲区处理函数位于“
string.h”
中
... 27
5.
输入输出流
函数,位于“
stdio.h”
中
..
. 27
第三节
Keil
C51
库函数原型列表
... 27
1. CTYPE.H.. 27
4
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
第二节
dScope for
Windows
基本操作
... 33
1.
指定初始化文件
... 33
5
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.
表达式
... 38
6.
数组
... 38
7.
结构和联合
... 38
8.
指针:
... 38
9. dScope
命令语句
...
38
10.
函数
... 43
第一章
Keil
C51
开发系统基本知识
第一节
系统概述
Keil
C51
是美国
Keil Software
公司出品的
51
系列兼容单片机
C
语言软件开发系
统,与汇编相比,
C<
/p>
语言在功能上、结构性、可读性、可维护性上有明显的优势,因
6
而易学易用。用过汇编语言后再使用
C
来开发,体会更加深刻。
Keil
C51
软件提供丰富的库函
数和功能强大的集成开发调试工具,全
Windows
界面。另
外重要的一点,只要看一下编译后生成的汇编代码,就能体会到
Keil
C51
生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易
理解。在开
发大型软件时更能体现高级语言的优势。
下面详细介绍
Keil
C51
开发系统各部分功能和使用。
第二节
Keil
C51
单片机软件开发系统的整体结构
p>
C51
工具包的整体结构,如图
(1)
p>
所示,其中
uVision
与
Ishell
分别是
C51
for
Windows
和
for Dos
p>
的集成开发环境
(IDE)
,可以完成编辑
、编译、连接、调试、仿真
等整个开发流程。开发人员可用
ID
E
本身或其它编辑器编辑
C
或汇编源文
件。然后
分别由
C51
及
A51
编译器编译生成目标文件
(.OBJ)
。目标文件可由
LIB51
创建生成
库文件,也可以与库文件一起经
L51
连接定位
生成绝对目标文件
(.ABS)
。
AB
S
文件
由
OH51
转换成标准的
Hex
文件,
以供调
试器
dScope51
或
tScope
51
使用进行源代码
级调试,也可由仿真器使用直接对目标板进
行调试,也可以直接写入程序存贮器如
EPROM
中。
图
(1)
C51
工具包整体结构图
第三节
Keil
C51
工具包的安装
1. C51
for Dos
在
Windows
< br>下直接运行软件包中
然后选择安装目录即可。完
7
毕后欲使系统正常工作须进行以下操作<
/p>
(
设
C:C51
为安装目录
)
:
修改
,加入
path=C:C51Bin
Set
C51LIB=C:C51LIB
Set
C51INC=C:C51INC
然后运行
2. C51 for
Windows
的安装及注意事项:
在
p>
Windows
下运行软件包中
,最好选择安装目录与
C51
for
Dos
相同,
这样设置最简单
< br>(
设安装于
C:C51
目录下<
/p>
)
。
然后将软件包中
crack
目录中的文
件拷入
C:
C51Bin
目录下。
第四节
Keil
C51
工具包各部分功能及使用简介
1. C51
与
A51
(1) C51
C51
是
C
语言编译器,其使用方法为:
C51
sourcefile[<
/p>
编译控制指令
]
或者
C51 @ commandfile
其中<
/p>
sourcefile
为
C
源文件
(.C)
。大量的编译控制指令完成
C51
编译器的全部功
能。包控
C51
输出文件
,
.OBJ
,
.I
和
.SRC
文件的控制。源文件
(.C)
的控制等,
详见第五部分的具体介绍。
p>
而
Commandfile
为一个连接控制
文件其内容包括:
.C
源文件及各编译控制指令,
它没有固定的名字,开发人员可根据自己的习惯指定,它适于用控制指令较多的场
合。
(2) A51
A51<
/p>
是汇编语言编译器,使用方法为:
A51
sourcefile[
编译控制指令
]
或
A51
@ commandfile
8
其中
sourcefile
为汇编源文
件
(.asm
或
.a51)
,
而编译控制指令的使用与其它汇编如
ASM
p>
语言类似,可参考其他汇编语言材料。
C
ommandfile
同
C51
中的<
/p>
Commandfile
类似,它使
A5
1
使用和修改方便。
2.
L51
和
BL51
(1) L51
L51
是
Keil C51
软件包提供的连接
/
定位器,其功能是将编译生成
的
OBJ
文件与
库文件连接定位生成绝
对目标文件
(.ABS)
,其使用方法为:
L51
目标文件列表
[
库文件列表
] [to
outputfile] [
连接控制指令
]
或
L51
@Commandfile
p>
源程序的多个模块分别经
C51
与
A51
编译后生成多个
OBJ
< br>文件,连接时,这些
文件全列于目标文件列表中,作为输入文件,如果还需与库文
件
(.LiB)
相连接,则库
文件也必
须列在其后。
outputfile
为输文件名,缺少时为第一
模块名,后缀为
.ABS
。
连接控制指
令提供了连接定位时的所有控制功能。
Commandfile
为连接控制文件,
其
具体内容是包括了目标文件列表,库文件列
表及输出文件、连接控制命令,以取代
第一种繁琐的格式,由于目标模块库文件大多不止
1
个,因而第
2
种方法较多见,
这个文件名字也可由使用者随意指定。
(2) Bl51
BL51
也是
C51
软件包的连接
/
定位器,其具有
L51
的所有功能,此外它还具有
以下
3
点特别之处:
< br>
a.
可以连接定位大于
64kBytes
的程序。
b.
具有代码域及域切换功能
(CodeBanking &
Bank Switching)
c.
可
用于
RTX51
操作系统
p>
RTX51
是一个实时多任务操作系统,它改变了传统的编程模式,
甚至不必用
main(
)
函数,单片
机系统软件向
RTOS
发展是一种趋势,这种趋势对于
186
和
386
及
p>
68K
系列
CPU
更为明显和必须,对
8051
因
CPU
较为简单,程序结构等都不太复
杂,
R
TX51
作用显得不太突出,其专业版软件
PK51
软件包甚至不包括
RTX51Full
,
9
而只有一个
RT
X51TINY
版本的
RTOS
。
p>
RTX51
TINY
适用于无外部
RAM
的单片机
系统,因而可用面很窄,在本
文中不作介绍。
Bank switching
技术因使用很少
也不作
介绍。
3. DScope5
1
,
Tscope51
及
Monitor51
(1) dScope51
dSc
ope51
是一个源级调试器和模拟器,
它可以调试由
C51
编译器、
A51
汇编器、
PL/M-51
编译器及
AS
M
-
51
汇编器产生的程序。
它不需目标板
(
for windows
也可通
过
mon51
接目标板)
,只能进行软件模拟,但其功能强大,可模拟
CPU
及其外围器
件,如内部串口,外部
I/
O
及定时器等,能对嵌入式软件功能进行有效测试。
其使用方法为:
DS51[debugfile][INIT(initfile)]
p>
其中
debugfile
是一个
Hex
格式的
8051
文
件,即待调试的文件其为可选的,可
在进入
dScope51<
/p>
后用
load
命令装入。
Initfile
为一个初使化文件
,它在启动
dScope51
后,在
d
ebugfile
装入前装入,装
有一些
dScope
的初使化参数及常用调试函数等。
下面是一个<
/p>
文件
(for
dos)
的内容:
Load ....
Map 0,0xffff
dScope51 for Windows
则直接用鼠标进入
,然后用
load
装入待调文件。
(2) tScope51
与
dSc
ope51
不同的是
Scope51
必
须带目标板,目前它可以通过两种方式访问目
标板。
(1) <
/p>
通过
EMul51
在线仿真器,
tScope51
为该仿真器准备了一个动态连接文件
< br>
,但该方法必须配合该仿真器。
(2)
通过
Monitov51
监控程序,这种方
法是可行的,
tScope51
为访问
Monitor51
专门带有
连接程序,使用时可
通过串口及监控程序来调试目标板。
其使用方法为:
TS51[INIT(file_)]
10
其中
file_
为一个初使化文件。
进入
TS
51
后,
必须装入
IOT
文件,
可用的有
及
两种,
如装入
:
Load.C:
CPUTYPE(80517)
可
惜的是
tScope51
只有
for
Dos
的版本。
(3)
Monitor 51
Monitor51
是一个监控程序
通过
PC
机的串口与目标板进行通信,
Monitor
操作需
要
MON51<
/p>
或
dScope51 for Windows,
后面部分将对
Monitor51
做较为详细的介绍。
4.
Ishell
及
uVision
(1) Ishell for Dos
这是一个
for Dos
的
IDE
,
直接在命令行键入
Ishell
,
则进入该环境,
它使
用简单
方便。
其命令行与
DOS
命令行具有同样的功能,
对单模块的
Proj
ect
直接由菜单进行
编译连接,对多模块的
< br>project
。则通过批处理,
BAT
文件进行编译连接,然后通过
菜单控制由
dScope
51
或
tScope51
对程序进行调
试,因为是
for
dos
的,不做太
详细
介绍。
(2) uVision
for Windows
uVision for Windows
< br>是一个标准的
Windows
应用程序,它是
C51
的一个集成软
件开发平台,具有源代码编辑
、
project
管理、集成的
mak
e
等功能,它的人机界面友
好,操作方便,是开发者的首选,具
体配置及使用见第五部分。
第二章
Keil C51
软件使用详解
第一节
Keil
C51
编译器的控制指令
C51
编译器的控制指令分为三类:
源文件控制类,目标文件控制类及列表控制类。
1.
源文件控制类
NOE
XTEND
:
C51
源文件不允许使用
ANSI C
扩展功能。
p>
DEFINE(DF)
:定义预处理
(
p>
在
C51
命令行
)
。
2.
目
标文件
(Object)
控制类:
11
COMPACT LARGE
SMALL
选编译模式
DEBUG(DB)
包含调试信息,以供仿真器或
dSCope51
使用。
NOAMAKE(NOAM)
<
/p>
禁止
AutoMake
信息记录
NOREGPARMS
禁止用寄存器传递参数
OBJECTEXTEND(OE)
Object
文件包含附加变量类型
信息
OPTIMIZE(OT)
指定优化级别
REGFILE(RF)
指定一个寄存器使用的文件以供整体优化用
REGISTERBANK(RB)
指定一个供绝对寄存器访问的寄存器区名
SRC
不生成目标文件只生成汇编源文件
其它控件不常用。
3.
列表文件
(listing)
控制类:
CODE(CD)
:
向列表文件加入汇编列表
LIST
INCLUDE(LC)
:显示
indude
< br>文件
SYMBOLS(SB
)
:列表文件包括模块内所有符号的列表
W
ARNINGLEVEL(WL)
:选择“警告”级别
第二节
dScope51
的使用
1. dScope51 for Dos
总的来
说
dScope51
具有以下特性:
●高级语言显示模式
●集成硬件环境模拟
●单步
或“
GO”
执行模式
●存储器、寄存器及变量访问
●
p>
Watch
表达式之值
●函数与信号功能
下面,具体说明在进入
dScope51
for
Dos
之后,如何实现上述功
能,
dScope51
采用下拉菜单格式和窗口显示控制,共有
language
、
serial
p>
、
exe
、
reg
ister
四个窗口,
12
其中
exe
为命令行窗口,
< br>language
为程序窗口,
serial
为串口窗,
register
为寄存器窗。
(1)
高级语言显示模式
p>
单击主菜单
中的“
View”
,第一栏中的三条命令“
Highlevel”
、<
/p>
“
Mixed”
、
“
Assembly”
分别对所装入的程序按照“高级”
p>
、
“混合级”及“汇编级”三种方式显
示,
以方便调试使用。
(2)
集成硬件环境模拟显示
主菜单
中“
Peripheral”
各条能显示模拟硬件环境的状态,
其中:
i/o
Port
< br>:显示各
I/O
口之值,对
80
31
而言
SFR
中的
< br>P1
、
P2
、
< br>P3
、
P0
与引脚之
值分别列出:
Interrupt
:显示
5
个中断源的入口模式是否允许,优先级等中
断状态。
Timer
:显示各定时
/
计数器的模式,初始值状态等。
int Message
:中断信息
允许,如为允许
(“>>”
出现
)
p>
,则当中断申请时,显示中断
源信息。比如当中断发生时会显示:<
/p>
“interrupt Timer 0
occured”
等
A/D
converter
:
显示
A/
D
转换器状态无时,则提示“无”
。
p>
Serial
:串口信息显示,包括串口模式、波特产等
Other
:其它器件,如为
8031
则显示“
无”
(3)
单步或“
Go”
执行
p>
“
F8”
单步执行,
“
F5”
全速执行到断点。
或选主菜
单中
Trace
单步执行
CPU
中的
Go
全速执行。
(4)
存储器寄存器及变量访问
p>
外部存储器管理
MAP
菜单:设置
(set)
、取消
(reset)
、显示
(Display)
处理可用存储
空间。
修改
Code<
/p>
代码:
ASM
命令
存储器显示命令:
D
类别为
(X
、
D
、
I
、
B
、
C)
13
修改存储器命令:
E
有以下几种命令
EB
、
EC
、
EI
、
EL
、
EF
、
EP
复杂数据类型显示:
Object
命令
;用以显示结构或数组的内容。欲使此命令有效,
C51
编译器
必须有
DB
及
OBJECTEXTEN
D
两条。
反汇编命令:
U
(5)
“Watch”
表达式之值
在
p>
View
菜单的“
Watch”
一栏中有四项:其中包括定义
Watch
Poi
nt(Define)
、删
除
Watc
h Point(remove,kill
all)
,及自动更新选项。
也可用
WS
、
WK
等
命令代替,下面具体看“表达式”类型:
dScope51<
/p>
一次最多可设
16
个
WtchPoint
表达式,显示于
Watch
Window
之中,表达
式可以是简单变量,也
可是复杂数据类型如结构、数组和指向结构的指针等,例如:
>WS
*ptime
>WS
ptime
→
hour
>WS
some_record[
o]
,
analog
等等
(6)
关于
.IOF<
/p>
文件
启动
DS
51
后必须装入
.IOF
文件才能使<
/p>
CPU
及
Peripheral
各项起作用,这个函
数的使用是依据
8051<
/p>
系列
CPU
的不同特点,
装入
8051
各
CPU
硬件设备模拟驱动文
件,比如
8031CPU
就必须
load DS51
目录下的<
/p>
。
2.
dScope for Windows
dScope for
windows
具有
dScope for dos
的全部功能,此外,它还具有以下明显
的优点:
(1)
标准的
Windows
界面,操作更容易更简单;
(2)
常用操作多用对话框,而非
D
os
的行命令方式;
(3)
窗口资源更加丰富:存储器窗口、覆盖率分析、运行状
态分析窗口,加强了调
试功能;
因为
dScope for
Windows
功能强大,具体操作在第八章详细介绍。
第三节
Monitor51
及其使用
14
1.
Monitor51
对硬件的要求
(1)
硬件系统为
51
系列
< br>CPU
;
(2)
带
5K
外部程序存储器
(
从
O
地址开始
)
,存放
Monitor51
程序;
(3)
256Bytes
的外部数据存储器以及
5K
< br>的跟踪缓冲区,此外,外部数据存储器
必须足够容纳所有应用程序代码及数据,且
所有外部数据存储器必须为冯·诺伊曼
存储器,即能一致访问
X
DATA
与
Code
空间。
(4)
一个定时器作为波特率发生器供串口使用;
(5) 6 Bytes
的空余堆栈。
2. Mon51
的使用
Mon51
的使用途径有三种方式:
(1) Dos
行命令方式
p>
即先用
install
对
< br>MON51
进行配置,然后用
MON51
进入
Monitor
状态,启用各
种命令对
Monitor51
进行调试。
< br>
(2)
tScope51
方式
启动<
/p>
tScope51
装入
TS51
目录下的
驱动文件,与目标板通信。
(3) dScope51 for
Windows
方式
在选<
/p>
CPU
驱动文件时,选“
”
,则检查目标板并进入
MON51
状态。
3.
MON51
的配置
(1)
MON51 for Dos
的配置
运行<
/p>
install
文件
(
< br>在
MON51
目录下
)
,不同的参数可以配置不同的硬件环境。
INSTALL
Serialtype [xdstastart[codestart[bank][PROMCHECK]]
]
,具体说明见
MON51
帮助文件或
使用手册。
(2) MON51 for
Windows
的配置
在启用
时,会使得系统自动检查目标板连接,如配置不对,则弹出
p>
“
Configuration”
对话框,
设置
PC
串口,波特率等,完毕单击“
apply”
有效。
4.
串口连接图:
15
收发交叉互连,
RTS
、
CTS
直连,
DSR
、
DTR
直连,具体引脚排列参考串口
资料。
5.
MON51
命令及使用
详细的
MON51
命令可参阅帮助。
第四节
集成开发环境
(IDE)
的使用
1.
Ishell for Dos
的使用
p>
进入
Ishell
之后看到两个窗口:
p>
一个是文件窗口,
一个是
Dos
命令行窗口,
窗口
上方是下拉式的命令菜单,其中
的
Files
控制文件窗口的显隐。
p>
使用
Ishell
,第一步就是配置系统,
即要学习两个文件的修改与创建:
(1)
文件
每一个
p
roject
都有一个
,
其中存放有
“
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)
文件
p>
对
IDE
颜色设置,如不改动,可以缺省为
主。
(3)
CDF
文件
该文件
位于
BIN
目录下,每一文件定义一组外部函数工具包,即定义
外部环境
如
,
等,开发者可修改
CDF
文件,供自己
使用,至于
CDF
文
件内容可查看一下
即可知道。
注意
.CDF
文件是
Ishell
系统的
核心所在,
不
同的
CDF
文件可使本
IDE
适用于不同的编译、
连接系统,
即本
IDE
并不
仅适于
C51
。
下面谈一谈
Automake
工具:
C51
的
A
utomake
是一个
project
管理器,在
8051
工具包中以
OBJ
ECT
文件形
式保留了一个
proje
ct
的信息,
AutoMake
用这些
信息来进行
project
管理,一旦手工
16
建立一个
project
,
Automake
可生成一个新的<
/p>
OBJECT
,
AutoMake
利用此文件来编译
那些修改过的文件。
p>
Automake
支持
C51
、
A51
、
L51/BL5
1
、
C166
、
A166
、
L166
等编译连接器。
点
中主菜单中的
Automake
即运
行本工具。
Ishell for
Dos
使用比较繁琐,推荐使用
uVision for
windows
。
2.
uVision for windows
的使用
p>
uVision
是一个标准的
window
s
应用程序,其编译功能、文件处理功能、
project
p>
处理功能、窗口功能以及工具引用功能
(
如
A51
、
C51
、
PL/M41
、
BL51 dSc
ope
等
)
等
都较
Ishell for
Dos
要强得多。
uVi
sion
采用
BL51
作连接器,
p>
因为
BL51
兼容
L51
,
所以一切能在
Dos
下工作的
project
都可以到
uVision
中进行连接调试。
uVision
采用
dScope
for windows
作调试器,
该调试器支持
MON51
及系统模拟两
种方式,功能较
for DOS
要强大好用,调试功能强大。
注意:
(1)
Option
菜单下的各项要会使用,其中
A51
、
C51
、
PL/M5
1
、
BL51
定义各文件所
使用的编译、连接控制指令,
dScope
定义一
个
dScope
初始化文件。
Make
则是定义
一个
make
文件。
(2)
进入调试是
在
RUN
菜单下运行
dScope
p>
。
(3) project
中包括新建、打开、修改、更新、编译、连接等
poject
处理,具体使用可
参考后面的例子。
第三章
Keil C51 vs
标准
C
深入理解并应用
< br>C51
对标准
ANSIC
的扩展
是学习
C51
的关键之一。
因为大多数
扩展功能都是直接针对
8051
系列<
/p>
CPU
硬件的。大致有以下
8
类:
●
805
1
存储类型及存储区域
●存储模式
●存储器类型声明
17
●变量类型声明
●位变量与位寻址
●特殊功能寄存器
(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
:
由
p>
Code
说明可有多达
64kBytes<
/p>
的程序存储器
2. Internal
Data Memory:
内部数据存储器可用以下关键字说明:
p>
data
:直接寻址区,为内部
RAM
p>
的低
128
字节
00H
~
7FH
p>
idata
:间接寻址区,包括整个内部
R
AM
区
00H
~
FFH
bdata
:可位寻址区,
20H
~
2FH
3. External Data Memory
外部<
/p>
RAM
视使用情况可由以下关键字标识:
p>
xdata
:可指定多达
64KB
的外部直接寻址区,地址范围
0000H
~
p>
0FFFFH
pdata
:
能访问
1
页
(25bBytes)
的外部
RAM
,
主要用于紧凑模式
(Compact
Model)
。
4.
Speciac Function Register Memory
805
1
提供
128Bytes
的
SFR
寻址区,这区域可位寻址、
字节寻址或字寻
址,用以
控制定时器、计数器、串口、
I/O
< br>及其它部件,可由以下几种关键字说明:
18
sfr
:字节寻址
比如
sfr
P0=0x80;
为
PO
口地址为
80H
,
“=”后
H
~
FFH
之间
的常数。
sfr16
:字寻址,如
sfr16
T2=0xcc;
指定
Timer2
口地址
T2L=0xcc
T2H=0xCD
sbit
:位寻址,如
sbit EA
=0xAF;
指定第
0xAF
位为
p>
EA
,即中断允许
还可以有如下定义方法:
sbit
0V=PSW^2
;
(
定义
0V
为
PSW
的第
p>
2
位
)
sbit
0V
=
0XDO^2
;
(
同上
)
或
bit
0V-
=
0xD2(
同上
)
。
第三节
存储模式
存储模式决定了没有明确指定存储
类型的变量,函数参数等的缺省存储区域,
共三种:
1. Small
模式
p>
所有缺省变量参数均装入内部
RAM
,优点
是访问速度快,缺点是空间有限,只
适用于小程序。
2. Compact
模式
p>
所有缺省变量均位于外部
RAM
区的一页<
/p>
(256Bytes)
,
具体哪一页可由
P2
口指定,
在
STARTUP.A51
文件中说明,也可用
pdata
p>
指定,优点是空间较
Small
为宽裕速度
较
Small
慢,较
< br>large
要快,是一种中间状态。
3. large
模式
p>
所有缺省变量可放在多达
64KB
的外部<
/p>
RAM
区,优点是空间大,可存变量多,
缺点是速度较慢。
提示:存储模式在
C51
编译器选项中选择。
第四节
存储类型声明
变量或
参数的存储类型可由存储模式指定缺省类型,也可由关键字直接声明指
定。各类型分别用
:
code,data,idata,xdata,pdata
说明,例:
data uar1
19
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,floa
t
等与
ANSI
C
相同。
第六节
位变量与声明
1.
bit
型变量
bit
型变量可用变量类型,
函数声明、
函数
返回值等,
存贮于内部
RAM20H
~
2FH
。
注意:
(1)
用#
pragma disable
说
明函数和用“
usign”
指定的函数,不能返回
bit
值。
(2)
p>
一个
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_Specif
ic Pointer).
1.
一般指针
20
一般指针的声明和使用均与标准
C<
/p>
相同,
不过同时还可以说明指针的存储类型,
例如:
long * state;
p>
为一个指向
long
型整数的指针,而
p>
state
本身则依存储模式存放。
char * xdata ptr
;
ptr
为一个指向
char
数据的指针
,
而
ptr
本身放于外部
RAM
区,
以上的
long
,char
等指针指向的数据可存放于任何存储器中。
p>
一般指针本身用
3
个字节存放,分别为存储
器类型,高位偏移,低位偏移量。
2.
存储器指针
基于存储器的指针说明时即指定了存贮类型,例如:
char data * str;str
指向
data
区中
char
型数据
int xdata * pow; pow
指向外部
RAM
的
int
p>
型整数。
这种指针存放时,只需一个字节
或
2
个字节就够了,因为只需存放偏移量。
3.
指针转换
即指针在上两种类型之间转化:
●当基
于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动
转化。
●如果不说明外部函数原形,基于存储器的指针自动转化为一
般指针,导致错
误,因而请用“#
include”
说明所有函数原形。
●可以强行改变指针类型。
第八节
Keil
C51
函数
C51
函数声明对
ANSI
C
作了扩展,具体包括:
1.
中断函数声明:
中断声明方法如下:
void
serial_ISR () interrupt 4 [using 1]
{
/* ISR */
}
21
为提高代码的容错能力,在没用到的中断入口处生成
p>
iret
语句,定义没用到的中断。
/* define not used interrupt, so
generate
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
及<
/p>
large
说明,例如:
void fun1(void) small {
}
提示:
small
< br>说明的函数内部变量全部使用内部
RAM
。关键的经常性
的耗时的
地方可以这样声明,以提高运行速度。
5. #pragma disable
在函数
前声明,只对一个函数有效。该函数调用过程中将不可被中断。
6.
递归或可重入函数指定
p>
在主程序和中断中都可调用的函数,容易产生问题。因为
51
和
PC
不同,
PC<
/p>
使
用堆栈传递参数,且静态变量以外的内部变量都在堆栈中;而<
/p>
51
一般使用寄存器传
递参数,内部变量
一般在
RAM
中,函数重入时会破坏上次调用的数据。可以用以
下
两种方法解决函数重入:
a
、在相应的函数前使用前述“
#pragma disable”
p>
声明,即只允许主程序或中断之一调
用该函数;
b
、将该函数说明为可重入的。如下:
void func(param...) reentrant;
< br>KeilC51
编译后将生成一个可重入变量堆栈,
然后
就可以模拟通过堆栈传递变量的方
22
法。
由于一般可重入函数由主程序和中
断调用,
所以通常中断使用与主程序不同的
R
< br>寄存器组。
另外,对可重入函数,在相应的函
数前面加上开关“
#pragma
noaregs”
,以禁止
编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。
7.
指定
PL/M
-
51
函数
< br>
由
alien
指定。
第四章
Keil
C51
高级编程
本章讨论以下内容:
●绝对地址访问
●
p>
C
与汇编的接口
●
p>
C51
软件包中的通用文件
●段名转换与程序优化
第一节
绝对地址访问
C51
提供了三种访问绝对地址的方法:
1.
绝对宏:
在程序中,用“#
include
即可使用其中定义的宏来访问绝对地址,包括:
CBYTE<
/p>
、
XBYTE
、
PWORD
、
DBYTE
、
CWORD
、
XWORD
、
PBYTE
、
DWORD
具体使用可看一看
absacc.h
便知
例如:
rval
=CBYTE[0x0002];
指向程序存贮器的
0002h
地址
rval=XWORD
[0x0002];
指向外
RAM
的
0004h
地址
2.
_at_
关键字
直接在数据定义后加上
_at_
const
即可,但是注意:
(1)
绝对变量不能被初使化;
p>
(2)bit
型函数及变量不能用
_at_
指定。
23
例如:
idata struct link list _at_ 0x40;
指定
list
结构从
40h
开始。
xdata char
text[25b] _at_0xE000
;指定
text<
/p>
数组从
0E000H
开始
提示:如果外部绝对变量是
I/O
< br>端口等可自行变化数据,需要使用
volatile
关键
字进
行描述,请参考
absacc.h
。
3.
连接定位控制
此法是利用连接控制指令
code xdata pdata
data bdata
对
“段”
地址进
行,
如要指定某
具体变量地址,则很有局限性,不作详细讨论。
第二节
Keil C51
与汇编的接口
1.
模块内接口
< br>方法是用#
pragma
语句具体结构是:
#pragma asm
汇编行
#pragma
endasm
这种方法实质是通过
asm
与
ndasm
告诉
C5
1
编译器中间行不用编译为汇编行,
因而在编译控制指令中有<
/p>
SRC
以控制将这些不用编译的行存入其中。
2.
模块间接口
p>
C
模块与汇编模块的接口较简单,分别用
C
51
与
A51
对源文件进行编译,然后
用
L51
将
o
bj
文件连接即可,关键问题在于
C
函
数与汇编函数之间的参数传递问题,
C51
中有两种参数传递方
法。
(1)
通过寄存器传递函数参数
最多只能有
3
个参数通过寄存器传递,规律如下表:
参数数目
1
2
3
Char
R7
R5
R3
Int
R6 & R7
R4 &
R5
R2 & R3
long,float
R4
~
R7
R4
~
R7
一般指针
R1
~
R3
R1
~
R3
R1
~
R3
(2)
通过固定存储区传递
(fixed memory)
这种方法将
bit
型参数传给一个存储段中:<
/p>
24
?
function_name?BIT
将其它类型参数均传给下面的段:?
function_name?BYTE,
p>
且按照预选顺序存放。
至于这个固定存储区本身在何处,则由存储模式默认。
(3)
函数的返回值
函数返回值一律放于寄存器中,有如下规律:
Return type
Bit
char/unsigned char
1_byte
指针
int/unsigned
int
2_byte
指针
long&unsigned long
Float
一般指针
(4)
SRC
控制
该控制指令将
C
文件编译生成汇编文件
(.SRC)
,
该汇编文件可改名后,
生成汇编
.ASM
文件,再用
A51
进
行编译。
第三节
Keil C51
软件包中的通用文件
p>
在
C51LiB
目录下有几个
C
源文件,这几个
C
源文件
有非常重要的作用,对它
们稍事修改,就可以用在自己的专用系统中。
< br>
1.
动态内存分配
p>
init_mem.C
:
此文件是初始化动
态内存区的程序源代码。
它可以指定动态内存的
位置及大小,只
有使用了
init_mem(
)
才可以调回其它函数,诸如
malloc
calloc,realloc
等。
cal
loc.c
:此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单
元数目。
malloc.c
:此文件是
malloc
的源代码,分配一段固定大小
的内存。
realloc.c
:此文件是
realloc.c
源代码,其功能是调
整当前分配动态内存的大小。
2.
C51
启动文件
STARTUP.A51
p>
启动文件
STARTUP.A51
中包含目
标板启动代码,可在每个
project
中加入这个
25
Registev
标志位
R7
R6 & R7
R4
~
R7
R4
~
R7
R1
~
R3
说明
由具体标志位返回
单字节由
R7
返回
双字节由<
/p>
R6
和
R7
返回
,MSB
在
R6
MSB
在
R4,
LSB
在
R7
32Bit IEEE
格式
存储类型在
R3
高位
R2
低
R1
文件,只要复位,则该文件立即执行,其功能包括:
p>
●定义内部
RAM
大小、外部
RAM
大小、可重入堆栈位置
●清除内部、外部或者以此页为单元的外部存储器
●按存储模式初使化重入堆栈及堆栈指针
p>
●初始化
8051
硬件堆栈指针
●向
main(
)
函数交权
开发人员可修改以下数据从而对系统初始化
常数名
意义
IDATALEN
p>
待清内部
RAM
长度
XDATA START
指定待清外部
RAM
起始地址
XDATALEN
待清外部
RAM
长度
IBPSTACK
是否小
模式重入堆栈指针需初始化标志,
1
为需要。缺省为
0
IBPSTACKTOP
指定小模式重入堆栈顶部地址
XBPSTACK
是否大模式重入堆栈指针需初始化标志,缺省为
0
XBPSTACKTOP
指定大模式重入堆栈顶部地址
PBPSTACK
是否
Compact
重入堆栈指针,需初始化标志,缺省为
0
PBPSTACKTOP
指定
Compact
模式重入堆栈顶部地址
PPAGEENABLE
P2
初始化允许开关
PPAGE
指定
P2
值
PDATASTART
待清外
部
RAM
页首址
PDATALEN
待清外部
RAM
页长度
提示:
如果要初始化
p>
P2
作为紧凑模式高端地址,
必须:
PPAGEENAGLE
=
1
,
PPAGE
为
P2
值,例如指定某页
1000H
-
10FFH
,则
PPAGE
=
10H
,而且连接时必须如下:
L51 PDATA(1080H)
< br>,其中
1080H
是
1000H
-
10FFH
中的任一个值。
以下是
STARTUP.A51
代码片断,红色是经常可能需要修改的地方:
;-
--------------------------------------------------
---------------------------
;
This file is part of the
C51 Compiler package
26
-
-
-
-
-
-
-
-
-
上一篇:keilc51_使用详解
下一篇:常用乳化剂的HLB值