keil c51中启动代码详细说明

合集下载

C51程序在Keil C51下的调试步骤

C51程序在Keil C51下的调试步骤

C51程序在Keil C51下的调试步骤现在广泛使用的C51集成开发环境是Keil软件。

要使用Keil软件,首先要正确安装Keil软件,该软件的Eval版本可以直接去http://www. 下载,其步骤与一般Windows 程序安装类似,这里就不再赘述了。

Keil软件的详细说明见相关资料,这里仅作简要说明,以便于读者在后面的章节中实际动手调试、仿真程序。

1.建立工作项目文件图1启动Keil μVison2启动Keil μVison2,如果打开后就有打开的文件,单击“Project->Close Project”菜单将其关闭。

单击“File->New... ",打开一个新的文件输入窗口,在这个窗口里输入上述源程序。

输入完毕之后,选择“File-->Save",给这个文件取名保存,取名字的时候必须要加上扩展名,一般C语言程序均以“.c”为扩展名(一定要加扩展名,否则后面添加文件就找不到该文件,这是初学者很容易忘记的),这里将其命名为mytest.c。

图2 建立工程文件单击“Project->New Project...",出现对话框,要求给将要建立的工程起一个名字,这里起名为test,不需要输入扩展名。

单击“保存”按钮,出现第二个对话框,如图3所示:图3 CPU选择窗口这个对话框要求选择工程中所用的单片机型号,这里选择Atmel公司的89S52芯片。

单击ATMEL前面的“+”号,展开该层,单击其中的89S52,然后再单击“确定”按钮,会出现一个对话框,询问是否要将标准的8052启动代码加入工程,单击“是”按钮。

此时,在工程窗口的文件页中出现了“Target 1”,前面有“+”号,单击“+”号展开,可以看到下一层的“Source Group 1 ",需要手动把刚才编写好的源程序加入,方法如下:单击“Source Group 1 ",使其反白显示,然后单击鼠标右键,出现一个下拉菜单,如图4所示。

keil下C51启动代码详解

keil下C51启动代码详解

由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下:;---------------------------------------------------;startup.A51: 用户上电初始化程序;----------------------------------------------------;;使用以下EQU命令可定义在CPU复位时需要用0进行初始化的内存空间;;IDA TA存储器的空间的绝对起始地址总是零IDA TALEN EQU 80H ;需用0进行初始化的IDA TA存储器空间的字节数;XDA TASTART EQU 0H ;XDA TA存储器空间的绝对起始地址XDA TALEN EQU 0H ;需用0进行初始化的XDA TA存储器的空间字节数;PDA TASTART EQU 0H ;PDA TA存储器的空间的绝对起始地址PDA TALEN EQU 0H ;需用0进行初始化的PDA TA存储器的空间字节数;注意:IDA TA存储器的空间在物理上包括了8051单片机的DA TA和BIT存储空间;至少要保证与C51编译器运行库有关的存储器的空间进行0初始化;;再入函数模拟初始化;-----------------------------------------------------------;以下用EQU指令定义了再入函数模拟堆栈指针的初始化;;使用SMALL存储器模式时再入函数的堆栈空间IBPSACK EQU 0 ;使用SMALL存储器模式再入函数时将其设置成1IBPSTACKTOP EQU 0FFH+1 ;将堆栈顶设置为最高地址加1;;使用LARGE存储器模式时再入函数的堆栈空间XBPSTACK EQU 0 ;使用LARGE存储器模式再入函数时将其设置成1XBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1;;使用COMPACT存储器模式时再入函数的堆栈空间PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1PBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1;;----------------------------------------------------;使用COMPACT存储器模式时,64KB X DA TA存储器空间的分页定义;;以下用EQU指令定义PDA TA类型变量在XDA TA存储器空间的页地址;使用EQU指令定义PFAGE时必须与L51连接定位器PDA TA指令的控制参数一致;PPAGEENABLE EQU 0 ;使用PDA TA类型变量时将其设置成1PPAGE EQU 0 ;定义页号;;------------------------------------------------NAME ? C_STARTUP ;模块名为? C_STARTUP? C_51STARTUP SEGMENT CODE ;代码段? STACK SEGMENT IDA TA;堆栈段RSEG ? STACK ;堆栈DS 1EXTRN COE(? C_START) ;程序开始地址PUBLIC ? C_STARTUPCSEG A T 0x8000 ;定义用户程序的起始地址,用MON51仿真器时可能有用? C_STARTUP: LFMP STARTUP1RSEG ? C_51STARTUPSTARTUP1:;;初始化串口MOV SCOM, #40HMOV TMOD, #20HMOV TH1, #0FDHSETB TR1CLR T1;单片机上电IDA TA内存清零,如果不需要上电清零IDA TA,可以注销IF到IFEDN之间的;语句,或者修改IDTALEN的长度,为了让CPU具有掉电保护功能,需要确定IDTALEN的长度IF IDA TALEN <> 0MOV R0, # IDA TALEN-1CLR AIDA TALOOP: MOV @R0,ADJNZ R0,IDA TALOOPENDIF;;单片机上电XDA TA内存清零,如果不需要上电清零XDA TA,可以注销IF到IFEDN之间的;语句,或者修改XDTALEN的长度IF XDA TALEN <> 0MOV DPTR, #XDA TASTARTMOV R7,#LOW (XDA TALEN)IF (LOW(XDA TALEN)) <> 0MOV R6, #(HIGH(XDA TALEN))+1ELSEMOV R6, #HIGH (XDA TALEN)ENDIFCLR AXDA TALOOP: MOVX @DPTR, AINC DPTRDJNZ R7, XDA TALOOPDJNZ R6, XDA TALOOPEND IF;;送PDA TA存储器页面高位地址IF PPAGEENABLE <> 0MOV P2, #PPAGEENDIF;;单片机上电PDA TA内存清零,如果不需要上电清零XDA TA,可注销IF到IFEDN之;间的语句或者修改PDA TALEN的长度IF PDA TALEN <> 0MOV R0, #PDA TASTARTMOV R7, #LOW (PDA TALEN)CLR APDA TALOOP: MOV @R0, AINC R0DJNZ R7,PDA TALOOPENDIF;;设置使用SMALL存储器模式时再入函数的堆栈空间IF IBPSTACK <> 0EXTRN DA TA(? C_IBP)MOV ? C_IBP, #LOW IBPSTACKTOPENDIF;;设置使用LARGE存储器模式时再入函数的堆栈空间IF XBPSTACK <> 0EXTRN DA TA (? C_XBP)MOV ? C_XBP, #HIGH XBPSTACKTOPMOV ? C_XBP +1, #LOW XBPSTACKTOPENDIF;;设置使用COMPACT存储器模式时再入函数的堆栈空间IF PBPSTACK <> 0EXTRN DA TA(? C_PBP)MOV ? C_PBP, #LOW PBPSTACKTOPEND IF;;设置堆栈的起始地址MOV SP, #? STACK-1 ;例如MOV SP, #4FH;;如果程序超过64K,则使用程序分组技术,启动下面的程序;EXTRN CODE(? B_SWITCH0);CALL ? B_SWITCH0;程序从第一组bank 0 块开始执行;跳转到用户程序MAIN函数LJMP ? C_STARTEND。

Keil C51的开关语句目标代码分析

Keil C51的开关语句目标代码分析

Keil C51的开关语句目标代码分析∗侯济恭【摘要】Keil C5 1 is currently the most popular embedded programming language,this paper analyzes the compiling method and effect of its"switch" sentence.In general,the branches number of the"switch-case" sentence is less than 8,the object codes are divided into three layers,that are the head code,the transfer control code and the switch body.When the branches number of the more complex"switch-case"sentence is more than 8,the target codes are divided into four layers,which are the head code,the transfer control code,the transfer sheet and the switch body.Considering the code execution efficiency,the transfer control code of the system library function is different corresponding to different data types of the selected factor.%分析目前流行的Keil C51对switch 的编译方法及其编译效果。

keil c51 详细中文手册

keil c51 详细中文手册

Keil C51使用详解V1.0第一章 Keil C51开发系统基本知识 (6)第一节系统概述 (6)第二节Keil C51单片机软件开发系统的整体结构 (6)1. C51 for Dos 72. C51 for Windows的安装及注意事项: (7)第四节Keil C51工具包各部分功能及使用简介 (7)1. C51与A51. 72. L51和BL51. 83. DScope51,Tscope51及Monitor51. 84. Ishell及uVision. 9第二章 Keil C51软件使用详解 (10)第一节Keil C51编译器的控制指令 (10)1. 源文件控制类 (10)2. 目标文件(Object)控制类: (10)3. 列表文件(listing)控制类: (10)第二节dScope51的使用 (11)1. dScope51 for Dos 112. 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第二节内存区域(Memory Areas): (16)1. Pragram Area: (16)2. Internal Data Memory: 163. External Data Memory. 164. 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声明,见上例。

[计算机软件及应用]Keil C51软件使用说明

[计算机软件及应用]Keil C51软件使用说明

* ——表示是指针类型,此处*不含取内容之意;
数据类型——声明指针所指变量的类型;
[存储器类型1]——声明指针所指变量的存储类型,若默认则定义
为一般指针;
[存储器类型2]——声明该指针变量本身的存储类型;
标识符——声明指针变量本身的数据类型和名称.
22
MCS-51单片机原理、接口及应用
第6章 单片机的C51语言编程
6
MCS-51单片机原理、接口及应用
第6章 单片机的C51语言编程
6.1.2 C51中常用的头文件
reg51.h、reg52.h、math.h、ctype.h、stdio.h、stdlib.h、 absacc.h和intrins.h. 〔1〕reg51.h和reg52.h
〔定义51或52子系列单片机特殊功能寄存器和特殊位〕 reg52.h比reg51.h多了几行定义T2寄存器的内容.
第6章 单片机的C51语言编程
汇编语言:
优点:面向机器、目标代码短、占用存储器空间少、运行
快. 缺点:指令助记符多、编程灵活性差.
C语言: 优点:具有面向机器和面向用户的特点,良好的可读性﹑易
维护性和可移植性,对硬件的控制能力也很强, C语言的数据类 型及运算符丰富,具有良好的程序结构.
缺点:代码效率稍低〔同汇编语言相比〕,占用存储空间较 大. 解决方法:单片机内部都嵌入了大容量的Flash ROM,有效的 弥补了这个缺陷.
{
局部变量说明
执行语句〔包括子函数的调用语句〕
}
4
MCS-51单片机原理、接口及应用
第6章 单片机的C51语言编程
func1<形式参数及说明>
//子函数1
{ 局部变量说明

Keil C51使用详解

Keil C51使用详解

Keil C51使用详解keilc51使用详解v1.0电子设计世界!版权所有,热烈欢迎贴文,切勿修正并标明原文。

留存一切权利。

第一章keilc51开发系统基本知识 (6)1第一节系统概述 (6)第二节keilc51单片机软件开发系统的整体结构...6第三节keilc51工具包的加装...71.c51fordos72.c51forwindows的安装及注意事项:...7第四节keilc51工具包各部分功能及使用简介...71.c51与a51.72.l51和bl51.83.dscope51,tscope51及monitor51.84.ishell及uvision.9第二章keilc51软件使用详解 (10)第一节keilc51编译器的控制指令...101.源文件掌控类 (10)2.目标文件(object)控制类:...103.列表文件(listing)控制类:...10第二节dscope51的使用...111.dscope51fordos112.dscopeforwindows12第三节monitor51及其使用...131.monitor51对硬件的要求...132.mon51的使用...133.mon51的配置...134.串口连接图:...135.mon51命令及使用...14第四节集成开发环境(ide)的使用...141.ishellfordos的使用 (14)22.uvisionforwindows的使用 (15)第三章keilc51vs标准c..15第一节keilc51扩展关键字...15第二节内存区域(memoryareas):...161.pragramarea:...162.internaldatamemory:163.externaldatam emory.162.可位串行区表明20h-2fh..18第七节keilc51指针...181.通常指针...182.存储器指针...183.指针切换...18第八节keilc51函数...191.中断函数声明:...192.通用型存储工作区 (19)3.选通用存储工作区由usingx声明,见上例。

Keil C51详细设置

Keil C51详细设置一.target名更改打开Keil后,左侧Project Workspace中的target可改,方法:右击Target——Manage Compnents——双击待修改项即可,若要添加,使用对话框内对应工具栏。

二.option for target 设置之TARGET项1 MEMARY MODELSmall:变量存储在内部ram里.Compact:变量存储在外部ram里,使用页8位间接寻址Large:变量存储在外部Ram里,使用16位间接寻址.我们一般使用Small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram不够了,才会存到外部去.Compact的方式要自己通过程序来指定页的高位地址,编程比较复杂,如果外部ram很少,只有256个字节,那么对该256个字节的读取就比较快,用MOVX Ri,A 或MOVX A,Ri 指令.如果超过256字节,那么要不断地进行切换的话,就比较麻烦.Compact模式适用于比较少的外部ram的情况.Large模式,是指变量会优先分配到外部ram里,用MOVX A,DPTR或MOVX DPTR,A 来读取.要注意的是,3种存储方式都支持内部256字节和外部64k字节的ram.区别是变量的优先<或默认>存储在哪里的区别.除非你不想把变量存储在内部ram,才使用后面的Compact,Large模式.因为变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应用都是选择Small 的模式.使用Small的方式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,比如:unsigned char xdata a;那么变量a就存储在外部的ram.unsigned char a;变量存储在内部ram.假如用Large的模式:unsigned char xdata a;那么变量a就存储在外部的ram.unsigned char a;变量存储在外部ram.这就是区别,就是说这几个选项只是影响没有特别指定变量的存储空间的时候,默认存储在哪里,比如上面的变量定义unsigned char a .2. CODE ROM SIZESmall: program 2K or less ;适用于89c2051这些芯片,2051只有2k的代码空间,所以跳转地址只有2k,编译的时候会使用ACALL AJMP这些短跳转指令,而不会使用LCALL,LJMP指令.如果你的代码跳转超过2k,那么会出错.Compact:2k functiongs ,64k program:表示每个子函数的程序大小不超过2k,整个工程可以有64k的代码.就是说在main<>里可以使用LCALL, LJMP指令,但在子程序里只会使用ACALL,AJMP 指令.除非你确认你的每个子程序不会超过2k,否则不要用Compact方式.Large:64K program:表示程序或子函数都可以大到64k.使用code bank还可以更大.通常我们都选用该方式.Code Rom Size选择Large方式速度不会比Small慢很多,所以一般没有必要选择Compact和Small的方式.我们这里选择Large方式.3. OPERATINGNONE:不适用操作系统RTX51-TINY:使用TINY操作系统RTX-FULL:使用FULL操作系统Keil C51 提供了Tiny多任务操作系统,使用定时器0来做任务切换,效率很低,无实用价值。

Keil C51详细设置

Keil C51详细设置一.target名更改打开Keil后,左侧Project Workspace中的target可改,方法:右击Target——Manage Compnents——双击待修改项即可,若要添加,使用对话框内对应工具栏。

二.option for target 设置之TARGET项1 MEMARY MODELSmall:变量存储在内部ram里.Compact:变量存储在外部ram里,使用页8位间接寻址Large:变量存储在外部Ram里,使用16位间接寻址.我们一般使用Small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram不够了,才会存到外部去.Compact的方式要自己通过程序来指定页的高位地址,编程比较复杂,如果外部ram很少,只有256个字节,那么对该256个字节的读取就比较快,用MOVX @Ri,A 或MOVX A,@Ri指令.如果超过256字节,那么要不断地进行切换的话,就比较麻烦.Compact模式适用于比较少的外部ram的情况.Large模式,是指变量会优先分配到外部ram里,用MOVX A,@DPTR或MOVX @DPTR,A 来读取.要注意的是,3种存储方式都支持内部256字节和外部64k字节的ram.区别是变量的优先(或默认)存储在哪里的区别.除非你不想把变量存储在内部ram,才使用后面的Compact,Large模式.因为变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应用都是选择Small的模式.使用Small的方式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,比如:unsigned char xdata a;那么变量a就存储在外部的ram.unsigned char a;变量存储在内部ram.假如用Large的模式:unsigned char xdata a;那么变量a就存储在外部的ram.unsigned char a;变量存储在外部ram.这就是区别,就是说这几个选项只是影响没有特别指定变量的存储空间的时候,默认存储在哪里,比如上面的变量定义unsigned char a .2. CODE ROM SIZESmall: program 2K or less ;适用于89c2051这些芯片,2051只有2k的代码空间,所以跳转地址只有2k,编译的时候会使用ACALL AJMP这些短跳转指令,而不会使用LCALL,LJMP指令.如果你的代码跳转超过2k,那么会出错.Compact:2k functiongs ,64k program:表示每个子函数的程序大小不超过2k,整个工程可以有64k的代码.就是说在main()里可以使用LCALL, LJMP指令,但在子程序里只会使用ACALL,AJMP 指令.除非你确认你的每个子程序不会超过2k,否则不要用Compact方式.Large:64K program:表示程序或子函数都可以大到64k.使用code bank还可以更大.通常我们都选用该方式.Code Rom Size选择Large方式速度不会比Small慢很多,所以一般没有必要选择Compact和Small的方式.我们这里选择Large方式.3. OPERATINGNONE:不适用操作系统RTX51-TINY:使用TINY操作系统RTX-FULL:使用FULL操作系统Keil C51 提供了Tiny多任务操作系统,使用定时器0来做任务切换,效率很低,无实用价值。

KEIL C51 的使用

KEIL的使用
1、安装KEIL C51
2、安装完后打开KEIL,进入KEIL界面
3、进入KEIL工作界面
4、新建工程点击Project→New µVsion Project
5、然后选择你要保存的路径,输入工程文件的名字,如下所示:
5、选择单片机类型,如A TC8951,然后点击是
6、完成以上步骤后,展开Taget 1,如下图所示:
7、用记事本输入如下程序:
9、输入完后保存后缀为.asm 的格式(汇编语言)(注意:如果是C语言的,就保存后缀为.C 格式)。

10、把刚才编写好程序添加到soursce group 1,过程如下所示:
11、展开soursce group 1,如下所示:
12、双击打开KEIL C51,工作界面如下:
13、单击“Project”菜单,再在下拉菜单中单击“” 在下图中,单击“Output”中单击“Create HEX File” 选项,使程序编译后产生HEX代码,供下载
器软件使用。

(或右键打开Targe 1 再选择)
14、这里还可以改变晶振的周期,如下所示:
15、设置完以上的设置后,然后单击“Project”菜单,再在下拉菜单中单击“Buid target”(创建目标文件)。

16、如有语句错误,则不能创建成功,如下所示,直到把错误排除,才能创建成功。

以上是KEIL C51 的入门教程。

关于51单片机启动程序和头文件的深入学习

总的作用:STARTUP.A51//启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main 函数<reg51.h> //特殊寄存器的字节地址和位地址,sfr定义字节变量、sbit定义位变量,用通俗名作为变量名,并赋地址值,从而用名称来使用这些特殊寄存器。

<intrins.h> //定义了一些外部函数,在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便.特别需要注意的概念:地址与地址值:“地址是存放值的内存空间对应的门牌号码。

地址值是门牌号对应内存空间里存放内容。

通俗讲,一栋楼房, 101号房间什么都没只有1个人。

这个人是值。

101是地址。

房间是内存空间。

”启动程序详细解释;STARTUP.A51:用户上电初始化程序;------------------------------------------------------------------------------;; 用户定义需上电初始化的内存空间;; 使用以下EQU命令可定义在CPU复位时需用0进行初始化的内存空间;; ;IDATA 存储器的空间的绝对起始地址总是0.IDATALENEQU 80H ; 需用0进行初始化的IDATA存储器空间的字节数;XDATASTARTEQU 0H ; XDATA存储器空间的绝对起始地址XDATALENEQU 0H ; 需用0进行初始化的XDATA存储器的空间字节数.;PDATASTARTEQU 0H ; PDATA存储器的空间的绝对起始地址PDATALENEQU 0H ; 需用0进行初始化的PDATA存储器的空间字节数.;; 注意: IDATA 存储器的空间在物理上包括了8051单片机的DATA和BIT存储器空间.; 听说至少要保证与C51编译器运行库有关的存储器的空间进行0初始化不知是否;------------------------------------------------------------------------------;; 再入函数模拟初始化;; 以下用EQU指令定义了再入函数模拟堆栈指针的初始化;; 使用SMALL存储器模式时再入函数的堆栈空间.IBPSTACKEQU 0 ; 使用SMALL存储器模式再入函数时将其设置成1. IBPSTACKTOPEQU 0FFH+1 ; 将堆栈顶设置为最高地址+1.;; 使用LARGE存储器模式时再入函数的堆栈空间.XBPSTACKEQU 0 ; 使用LARGE存储器模式再入函数时将其设置成1. XBPSTACKTOPEQU 0FFFFH+1; 将堆栈顶设置为最高地址+1.;; 使用COMPACT存储器模式时再入函数的堆栈空间.PBPSTACKEQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1. PBPSTACKTOPEQU 0FFFFH+1; 将堆栈顶设置为最高地址+1.;;------------------------------------------------------------------------------;; 使用COMPACT存储器模式时64K字节XDATA存储器空间的分页定义;; 以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址; 使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致;PPAGEENABLEEQU 0 ; 使用PDATA类型变量时将其设置成1.PPAGEEQU 0 ; 定义页号.;;------------------------------------------------------------------------------NAME?C_STARTUP ; 模块名为?C_STAUTUP?C_C51STARTUPSEGMENT CODE ; 代码?STACKSEGMENT IDATA ; 堆栈RSEG?STACK ; 堆栈DS 1EXTRNCODE (?C_START) ; 程序开始地址PUBLIC?C_STARTUPCSEGAT 0x8000 ; 定义用户程序的起始地址,用MON51仿真器时可能有用?C_STARTUP:LJMP STARTUP1RSEG?C_C51STARTUPSTARTUP1:;; 初始化串口MOVSCON,#40HMOVTMOD,#20HMOVTH1,#0fdHSETBTR1CLRTI; 单片机上电IDATA内存清零如果不需要上电清零IDATA可以注销IF到IFEDN之间的话句; 或者修改IDTALEN的长度为了具有掉电保护功能不知IDTALEN多长为好IFIDATALEN <> 0MOVR0,#IDATALEN - 1CLR AIDATALOOP:MOV @R0,ADJNZR0,IDATALOOPENDIF;; 单片机上电XDATA内存清零如果不需要上电清零XDATA可以注销IF到IFEDN之间的话句; 或者修改XDATALEN的长度IFXDATALEN <> 0MOVDPTR,#XDATASTARTMOVR7,#LOW (XDATALEN)IF(LOW (XDATALEN)) <> 0MOVR6,#(HIGH (XDATALEN)) +1ELSEMOVR6,#HIGH (XDATALEN)ENDIFCLR AXDATALOOP:MOVX @DPTR,AINCDPTRDJNZR7,XDATALOOPDJNZR6,XDATALOOPENDIF;; 送PDATA存储器页面高位地址IFPPAGEENABLE <> 0MOVP2,#PPAGEENDIF;; 单片机上电PDATA内存清零如果不需要上电清零XDATA可以注销IF到IFEDN之间的话句; 或者修改PDATALEN的长度IFPDATALEN <> 0MOVR0,#PDATASTARTMOVR7,#LOW (PDATALEN)CLR APDATALOOP:MOVX @R0,AINCR0DJNZR7,PDATALOOPENDIF;; 设置使用SMALL存储器模式时再入函数的堆栈空间.IFIBPSTACK <> 0EXTRNDATA (?C_IBP)MOV?C_IBP,#LOW IBPSTACKTOPENDIF;; 设置使用LARGE存储器模式时再入函数的堆栈空间.IFXBPSTACK <> 0EXTRNDATA (?C_XBP)MOV?C_XBP,#HIGH XBPSTACKTOPMOV?C_XBP+1,#LOW XBPSTACKTOPENDIF;; 设置使用COMPACT存储器模式时再入函数的堆栈空间.IFPBPSTACK <> 0EXTRNDATA (?C_PBP)MOV?C_PBP,#LOW PBPSTACKTOPENDIF;; 设置堆栈的起始地址MOVSP,#?STACK-1 ; 例如MOV SP,#4FH;;This code is required if you use L51_BANK.A51 with Banking Mode 4; 如果你的程序使用了Mode 4 程序分组技术请启动下面的程序,不会吧你的程序超过64K 利害;EXTRN CODE (?B_SWITCH0);CALL ?B_SWITCH0 ; init bank mechanism to code bank 0; 程序从第一组bank 0 块开始执行; 跳转到用户程序MAIN函数LJMP?C_STARTEND总之,在KEIL中,汇编是从ORG 000H开始启动,那么它在C51中是如何启动MAIN()函数的呢?实际上是C51中有一个启启动程序STARTUP.A51,它总是和C程序一起编译和链接的.启动文件STARTUP.A51中包含目标板启动代码,可在每个project中加入这个文件,只要复位,则该文件立即执行,其功能包括:z 定义内部RAM大小、外部RAM大小、可重入堆栈位置z 清除内部、外部或者以此页为单元的外部存储器z 按存储模式初使化重入堆栈及堆栈指针z 初始化8051硬件堆栈指针z 向main( )函数交权头文件详解/*--------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */ sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0; sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99;/* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF;sbit ES = 0xAC;sbit ET1 = 0xAB;sbit EX1 = 0xAA;sbit ET0 = 0xA9;sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC;sbit PT1 = 0xBB;sbit PX1 = 0xBA;sbit PT0 = 0xB9;sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7;sbit WR = 0xB6;sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;#endif/*-------------------------------------------------------------------------- INTRINS.HIntrinsic functions for C51.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved.--------------------------------------------------------------------------*/#ifndef __INTRINS_H__#define __INTRINS_H__extern void _nop_ (void);extern bit _testbit_ (bit);extern unsigned char _cror_ (unsigned char, unsigned char);extern unsigned int _iror_ (unsigned int, unsigned char);extern unsigned long _lror_ (unsigned long, unsigned char);extern unsigned char _crol_ (unsigned char, unsigned char);extern unsigned int _irol_ (unsigned int, unsigned char);extern unsigned long _lrol_ (unsigned long, unsigned char);extern unsigned char _chkfloat_(float);#endif关于sfr、sbit://如同int、char...sfr 似乎不是标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[ 2006-10-27 18:23:00 | By: CHYB_HSH ]让我们先来看看STARTUP.A51文件(默认设置)吧!根据源文件中的说明文字,我们很容易分析出STARTUP.A51文件的工作方式和作用!让我们把它先汉化一下看看!$NOMOD51;Ax51宏汇编器控制命令:禁止预定义的8051;------------------------------------------------------------------------------; This file is part of the C51 Compiler package; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.;------------------------------------------------------------------------------; STARTUP.A51: This code is executed after processor reset.; STARTUP.A51: STARTUP.A51文件所生成的代码将在单片机复位后被执行!; To translate this file use A51 with the following invocation:; 将按照下面的命令行语句调用A51编译器进行编译产生目标文件; A51 STARTUP.A51;; To link the modified STARTUP.OBJ file to your application use the following; BL51 invocation:; 将按照下面的命令行语句调用BL51连接器把STARTUP.OBJ定位连接到您的程序代码中; BL51 <your object file list>, STARTUP.OBJ <controls>;;;------------------------------------------------------------------------------;; User-defined Power-On Initialization of Memory; 自定义上电后需要初始化的储存区域; With the following EQU statements the initialization of memory; at processor reset can be defined:; 使用下列EQU伪指令定义初始化的存储区域在单片机复位后定义生效; ; the absolute start-address of IDATA memory is always 0IDATALEN EQU 80H ; the length of IDATA memory in bytes.; IDATA(间接寻址区)其起始地址固定为0;IDA TALEN用于指定需要初始化; 的 IDATA区长度(以字节为单位)*XDATASTART EQU 0H ; the absolute start-address of XDATA memoryXDATALEN EQU 0H ; the length of XDA TA memory in bytes.;XDATA (外部直接寻址区)XDA TASTART用于指定需要初始化的XDA TA区起始地;址 XDATALEN 用于指定需要初始化的XDA TA区长度(以字节为单位)*PDATASTART EQU 0H ; the absolute start-address of PDA TA memoryPDATALEN EQU 0H ; the length of PDATA memory in bytes.;PDA TA(页寻址区)PDATASTART用于指定需要初始化的PDA TA区起始地址;PDATALEN 用于指定需要初始化的;PDATA区长度(以字节为单位)*; Notes: The IDA TA 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.;注释:8051中 IDATA 区物理上已经包括了DA TA区(直接寻址区)以及 BIT区(位寻址区)。

C51(库)占用了最小;化内存空间,运行时程序需要把它设为0;------------------------------------------------------------------------------;; Reentrant Stack Initilization; 重入堆栈初始化; The following EQU statements define the stack pointer for reentrant; functions and initialized it:; 下面的EQU语句定义重入函数的堆栈指针并初始化它; Stack Space for reentrant functions in the SMALL model.; SMALL模式下的重入函数的堆栈空间IBPSTACK EQU 0 ; set to 1 if small reentrant is used.;如果再SMALL模式下使用重入则设为1IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1.;设置堆栈顶最高位置+1;; Stack Space for reentrant functions in the LARGE model.; LARGE模式下的重入函数的堆栈空间XBPSTACK EQU 0 ; set to 1 if large reentrant is used.;如果再LARGE模式下使用重入则设为1XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.;设置堆栈顶最高位置+1;; Stack Space for reentrant functions in the COMPACT model.; COMPACT模式下的重入函数的堆栈空间PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.;如果再COMPACT模式下使用重入则设为1PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.;设置堆栈顶最高位置+1;;------------------------------------------------------------------------------;; Page Definition for Using the Compact Model with 64 KByte xdata RAM; 使用COMPACT模式时为64KB的XDA TA 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.; 下面的EQU语句定义PDATA变量的使用了XDATA页PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.;如果使用PDATA页则设为1;PPAGE EQU 0 ; define PPAGE number.;定义页号;PPAGE_SFR DATA 0A0H ; SFR that supplies uppermost address byte ;SFR的最高地址字节; (most 8051 variants use P2 as uppermost address byte); (大多数8051变量要用P2的最高地址字节);------------------------------------------------------------------------------; Standard SFR Symbols; 标准SFR符号ACC DATA 0E0HB DATA 0F0HSP DATA 81HDPL DATA 82HDPH DATA 83HNAME ?C_STARTUP?C_C51STARTUP SEGMENT CODE?STACK SEGMENT IDATARSEG ?STACKDS 1EXTRN CODE (?C_START);外部代码(这个标号将代表用户程序的启始地址)PUBLIC ?C_STARTUP;给外部使用的符号CSEG AT 0;在code段的0地址处放以下代码(使用AT指令进行绝对地址的定位)?C_STARTUP: LJMP STARTUP1RSEG ?C_C51STARTUPSTARTUP1:IF IDATALEN <> 0;如果长度大于1则初始化IDATAMOV R0,#IDA TALEN - 1CLR AIDATALOOP: MOV @R0,ADJNZ R0,IDA TALOOPENDIFIF XDA TALEN <> 0;如果长度大于1则初始化XDATAMOV DPTR,#XDA TASTARTMOV R7,#LOW (XDA TALEN)IF (LOW (XDATALEN)) <> 0;预置初始化时的外循环次数到R6MOV R6,#(HIGH (XDATALEN)) +1ELSEMOV R6,#HIGH (XDATALEN)ENDIFCLR AXDATALOOP: MOVX @DPTR,AINC DPTRDJNZ R7,XDA TALOOPDJNZ R6,XDA TALOOPENDIFIF PPAGEENABLE <> 0MOV PPAGE_SFR,#PPAGEENDIFIF PDA TALEN <> 0;如果长度大于1则初始化PDA TAMOV R0,#LOW (PDATASTART)MOV R7,#LOW (PDATALEN)CLR APDATALOOP: MOVX @R0,AINC R0DJNZ R7,PDA TALOOPENDIFIF IBPSTACK <> 0;SMALL模式下使用重入函数时要设置的堆栈EXTRN DATA (?C_IBP)MOV ?C_IBP,#LOW IBPSTACKTOPENDIFIF XBPSTACK <> 0;COMPACT模式下使用重入函数时要设置的堆栈EXTRN DATA (?C_XBP)MOV ?C_XBP,#HIGH XBPSTACKTOPMOV ?C_XBP+1,#LOW XBPSTACKTOPENDIFIF PBPSTACK <> 0;LARGE模式下使用重入函数时要设置的堆栈EXTRN DATA (?C_PBP)MOV ?C_PBP,#LOW PBPSTACKTOPENDIFMOV SP,#?STACK-1; This code is required if you use L51_BANK.A51 with Banking Mode 4; 如果你的程序使用了Mode 4 程序分组技术(BANKING)请启用下面的程序代码; EXTRN CODE (?B_SWITCH0); CALL ?B_SWITCH0 ; init bank mechanism to code bank 0;程序从第一个块(bank0)开始执行LJMP ?C_START ;从这里跳到你的程序入口END先说到这里,下面将进入实战!看看它究竟能够做些什么,修改某些参数后会带来什么变化,从而最终弄清它的真正用途!。

相关文档
最新文档