Keil C51 详细设置

发布者:VelvetDreamer最新更新时间:2016-12-15 来源: eefocus关键字:Keil  C51  详细设置 手机看文章 扫描二维码
随时随地手机看文章

一.target名更改


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


二.option for target 设置之TARGET项


1 MEMARY MODEL


Small:变量存储在内部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 SIZE


  Small: 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. OPERATING NONE:不适用操作系统 RTX51-TINY:使用TINY操作系统 RTX-FULL:使用FULL操作系统


  Keil C51 提供了Tiny多任务操作系统,使用定时器0来做任务切换,效率很低,无实用价值。Full需要用户使用外部RAM,且需要单独购买运行库,不能使用,默认选NONE。


4. 存储器选择 1. Use On-chip ROM(0x0-0x1fff)


  这个选项是使用片上的Flash Rom,我们知道At89c52有8k的flash Rom.取决于你的应用系统,你的单片机的EA接高电平的话,请选中这个选项,如果你的单片机的EA接低电平,表示使用外部Rom,那么不要选中该选项.


2. Off-chip Code memory


  表示你在片外接的Rom的开始地址和大小,如果你没有外接程序存储器,那么不要填任何数据.我们在这里假设使用一个片外的Rom,地址从0x8000开始(不要填成8000,如果是8000,是10进制的数,一般填16进制的数),Size为外接Rom的大小.假设接了一块0x1000字节的rom.最多可以外接3块Rom,如果你还用了别的地址,那么就添上.


3. Off-Chip Xdata Memory


  那么可以填上你外接的Xdata(外部数据存储器的起始地址和大小,一般的应用是接一个62256,我们在这里特殊的指定Xdata的起始地址为0x2000,大小为0x8000;


 


5. Code Banking


  使用Code Banking技术.keil可以支持程序代码超过64k的情况,最大可以有2兆的程序代码.如果你的代码超过64k,那么就要使用Code Banking技术,以支持更多的程序空间.Code Banking是一个高级的技术,支持自动的Bank的切换,是建立一个大型系统的需要,比如你要在单片机里实现汉字字库,实现汉字输入法,都要用到该技术.我们会在以后的文章里论述Bank技术.我们在这里不选中它.


二.option for target 设置之output项


select folder for object:选择编译之后的目标文件所存放的目录,默认存放在工程文件夹中。


name of executable:设置生成的目标文件的名字,默认是工程名。


creat executable:生成OMF和HEX文件,OMF文件名同工程文件名但没有扩展名。


creat hex file:选中该项编译后生成可以少些的HEX文件。


creat library:生成lib库文件,默认不选。


after make :1.beep when complete:编译完成后提示声响


                     2.start debugging:编译完成后马上启动调试(软件仿真或硬件仿真),默认不选中


                     3.run user program1,run user program2:根据需要设置编译之后的应用程序,比如自己编写的烧写芯片的程序,或调用外部仿真程序。


3.listing


select folder for listings:选择列表文件存放的目录,默认为工程文件所在的目录。


*.lst,*.m51文件对了解程序用到了哪些idata、data、bit、xdata、code、RAM、ROM、Stack等有很重要的作用。


Assembly code生产汇编的代码,根据需要决定是否选择。


4.c51


  用于对Keil的C51编译器编译过程进行控制,其中比较常用的是“code optimization”组,该组中level是优化等级,C51在对源程序进行编译时可以对代码多至9级优化,默认使用8级,一般不必修改。如果在编译中出现一些问题可以降低优化级别试一试。


emphasis是选择编译优先方式,第一项是代码量优化(最终生成的代码量小),第二项是速度优先(最终生成的代码速度快),第三项是默认的,是速度优先,可根据需要更改。


5.BL51 locat


使用KeilC51软件,可以很方便地将代码或者数据绝对定位到某个地址。

1、代码定位

方法1:使用伪指令CSEG。比如要将MyFunc1定位到代码区C:0x1000,则新建一个A51文件,添加以下内容:



PUBLIC  MYFUNC1

 CSEG AT 1000H

MYFUNC1:

 ;其它代码

 RET


 


在其它源文件中,就可以调用MyFunc()函数了。需要注意的是,编译器不检测传递参数的数目,仅检测函数是否有返回值。

方法2:使用BL51 Locate选项。比如在main.c中定义了一个MyFunc2函数,并且要将该函数定位到代码区C:0x2000,则从菜单中选择Project->Options for Target 'Target1',在弹出的对话框中选择BL51 Locate页,在下面的code栏中写上?PR?MYFUNC2?MAIN(0x2000)即可。如果想定位多个函数,也可以使用*通配符。 

2、变量定位

只有全局变量可以绝对定位,局部变量无法实现绝对定位。

方法1:使用_at_关键字。声明一个全局变量unsigned char data MyBuf1[8] _at_ 0x20;

方法2:使用BL51 Locate选项。比如将main.c中定义的所有data型的全局变量定位到数据区D:0x28开始的空间,则从菜单中选择Project->Options for Target 'Target1',在弹出的对话框中选择BL51 Locate页,在下面的data栏中写上?DT?MAIN(0x28)即可。如果是idata,则使用?ID?MAIN(0x28),如果是xdata,则使用?XD?MAIN(0x28),如果是pdata,则使用?PD?MAIN(0x28)

3、堆栈定位

在STARTUP.A51文件中定义了堆栈区?STACK,其起始地址同样可以在BL51 Locate页中设置,在Stack栏写上?STACK(0x80)


4、函数定位

假如要把C源文件 tools.c 中的函数


int BIN2HEX(int xx)

{

  ...

}

放在CODE MEMORY的0x1000处,先编译该工程,然后打开该工程的M51文件,在


* * *   C O D E   M E M O R Y   * * *

;行下找出要定位的函数的名称,应该形如:

CODE    xxxxH     xxxxH     UNIT         ?PR?_BCD2HEX?TOOLS

然后在:Project->Options for Target ...->BL51 Locate:Code中填写如下内容:?PR?_BCD2HEX?TOOLS(0x1000)再次Build,在M51中会发现该函数已放在CODE MEMORY的0x1000处了

5、赋初值的变量定位:

要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,则如下操作:

在工程中建立一个新的文件,如InitVars.c,在其中对要处理的变量赋初值(假设是code变量):


char code myVer = {"COPYRIGHT 2001-11"};

然后将该文件加入工程,编译,打开M51文件,若定义的是code型,则在


* * *   C O D E   M E M O R Y   * * *

;下可找到:

CODE    xxxxH     xxxxH     UNIT         ?CO?INITVARS

然后在:Project->Options for Target ...->BL51 Locate:Code中填入:?CO?INITVARS(0x200),再次编译即可。

相应地,如为xdata变量,则InitVars.c中写:


char xdata myVer = {"COPYRIGHT 2001-11"};

然后将该文件加入工程,编译,打开M51文件,在


* * *  X D A T A   M E M O R Y  * * *

;下可找到:

XDATA   xxxxH     xxxxH     UNIT         ?XD?INITVARS

然后在:Project->Options for Target ...->BL51 Locate:Xdata中填入:?XD?INITVARS(0x200),再次编译即可。相应地,若定义的是data/idata等变量,则相应处理即可。

3、若有多个变量或函数要进行绝对地址定位,则应按地址从低到高的顺序排列。


====


关键字:Keil  C51  详细设置 引用地址:Keil C51 详细设置

上一篇:在C51中如何实现软复位?
下一篇:keil c51的内部RAM(idata)动态内存管理程序

推荐阅读最新更新时间:2024-03-16 15:25

C51: INT0
//P3.0 输出脉冲,用INT0 记录脉冲个数, //用P1输出脉冲个数 //外部连接:P3.0 与 INT0输入端P3.2 连接。 #include reg52.h sbit out=P3^0; void delay() { unsigned int i; for(i=0;i 20000;i++) ; } unsigned int counter=0; void main() { //INT0 设置 EA=1; //CPU 中断允许 EX0=1; //INT0 中断允许 IT0=1; //下降缘触发 // while(1) { out=1; delay(); delay(); out
[单片机]
C51单片机————总线与系统扩展
1.引文 前面说过单片机的特点是体积小,功能全,系统结构紧凑、对于小型的需求可以满足要求。那么稍大一点嵌入式系统呢?那么有可能你的数据存储器、程序存储器还有IO口都可能不够用!那怎么办呢?我们就需要进行系统扩展了。 基本知识与回顾 我们都知道的是CPU大都通过三总线(数据、地址、控制)与外界进行信息交换的。 - 数据总线:传输指令码和数据,外围的芯片都需要它来进行信息交流。 - 地址总线:传输的是地址信息(数据传到哪儿的信息) 2.扩展 单片机系统总线信号 P0口是地址(A0~A7) / 数据复用线(D0~D7),经锁存器提供低8位地址,锁存信号是由CPU的ALE引脚提供的; P2口提供高8位地址 A8 ~ A15。 控
[单片机]
<font color='red'>C51</font>单片机————总线与系统扩展
Keil(MDK-ARM)系列教程(五)_Configuration(Ⅰ)
Ⅰ、写在前面 本文带来的内容正如标题“Configuration”,只是标题包含的内容较多,我计划将其分为:Configuration(Ⅰ)和Configuration(Ⅱ)两篇文章来讲述。 我们常见的字体大小、颜色、关键字、快捷键等这些都是在“Configuration”中进行设置。本文讲述Configuration中的前面3项Editor、Colors & Fonts、User KeyWords。 本文讲述的Configuration配置和前面文章Options for Target目标选项在保存上有一个明显的区别:Configuration修改过后并保存的配置是保存在你Keil(电脑)软件上;而Options for
[单片机]
<font color='red'>Keil</font>(MDK-ARM)系列教程(五)_Configuration(Ⅰ)
Keil软件仿真的串口调试技巧
引言 在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。通常使用单片机串口通过RS232/RS485电平转换芯片与上位机连接,以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的连接等。RS232/RS485串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大的场合,串口通信仍然是很好的选择,有着广阔的使用前景。 在单片机编程中,串口占了很重要的地位。传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。使用硬件仿真器的确是很有效的
[嵌入式]
lcd液晶12232F的串口C51程序
由于12232F这个显示器用得比较平常,但平常见到的是一些并口的汇编程序,并且也没有对应于12232F的并口程序,串口的C51程序极少见,为了方便大家使用,所以本站把它调试了一个出来,大家多多指教! 由于12232F这个显示器用得比较平常,但平常见到的是一些并口的汇编程序,并且也没有对应于12232F的并口程序,串口的C51程序极少见,为了方便大家使用,所以本站把它调试了一个出来,大家多多指教! /******************************************************/ /* 12232F串口驱动程序C51,11.0592M晶振 */ /*使用这款LCD应该要注意的问题: */ z /
[单片机]
msp432快速入门第四节之新建空工程(从keil新建工程)
(一)相对路径和绝对路径的区别 之前写的程序都是绝对路径,因为TI用的是绝对路径,需要修改的文件比较多,所以没改,但是后来发现点击鼠标实在令人厌烦,遂决定修改为相对路径,这篇推文记录了这个过程! 相对路径和绝对路径的主要区别就是能否自由移动工程,keil的路径一般都是基于工程存在,那个特别长的路径正是因为TI的某些文件中的相对路径过长导致的,如下: 这个路径够长了吧! 而且多个文件中都有这种路径,过于烦人,所以最好还是直接从keil建立新的工程比较好,下面会指出如何创建新的空工程。 (二)从Keil创建新工程 1. 建立空工程文件夹 首选建立新的工程文件夹 命名为: empty demo 然后在文件夹中建立四个文件夹
[单片机]
msp432快速入门第四节之新建空工程(从<font color='red'>keil</font>新建工程)
C51编程14-中断篇(定时器中断1)
在MCS-51的中断系统中,除了有外部中断以外,还有定时器/计数器中断、串行中断,本章节将会说明定时器/计数器中断,以及它的四种方式 MCS-51单片机中,内部有两个16位的可以选择的定时器/计数器,称为定时器0(T0)或者定时器1(T1),它们用来做定时器或者计数器。 定时器/计数器工作原理: 作为定时器使用时,输入的时钟脉冲是由晶体振荡器的输出12分频后得到的,所以定时器是对机器周期的计数器,每一个机器周期+1,因此它的定时频率为晶振频率的1/12;当设置了定时器工作方式并启动定时器后,定时器就会按照被设定的工作方式独立工作,不再占用CPU时间。当计数器计满时溢出时向CPU请求中断。 作为计数器工作使用时,计数器
[单片机]
<font color='red'>C51</font>编程14-中断篇(定时器中断1)
Keil宏定义和如何知道单片机资源名称
在Keil的工程设置中需要根据所选单片机来更改宏定义,如果程序移植后,宏定义没有更改过去,有时候会报错。 这个宏定义代表了芯片的类型,如下: 因此需要根据自己芯片的类型,更改宏定义。 如何知道自己芯片的资源名称呢?比如定时器叫什么名字? 可以打开stm32f10x.h文件,往下拉可以看见: 这些宏定义代表: STM32F10X_LD_VL 对应于 LowDensity ValueLine,即小容量的STM32F100 STM32F10X_MD_VL 对应于 MediumDensity ValueLine,即中等容量的STM32F100 STM32F10X_HD_VL 对应于 HighDensit
[单片机]
<font color='red'>Keil</font>宏定义和如何知道单片机资源名称
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved