C51 怎样将1个子程序段定位在1个固定的地址位置?

发布者:钱老李最新更新时间:2015-03-12 来源: laogu关键字:C51  子程序段  地址位置 手机看文章 扫描二维码
随时随地手机看文章
以下2问题均要用C51解决
1。 怎样将1个子程序段定位在1个固定的地址位置?
    例如将 INT BCD2HEX(INT XX)定位在1000H
2。 HOW在EEPROM 中固定的位置存放1字符串?
    如在200H处放“COPYRIGHT 2001-11”
答: 函数定位与变量定位... 

1、函数定位:
假如要把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处了

2、赋初值的变量定位:
要将某变量定位在一绝对位置且要赋初值,此时用 _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、若有多个变量或函数要进行绝对地址定位,则应按地址从低到高的顺序排列
关键字:C51  子程序段  地址位置 引用地址:C51 怎样将1个子程序段定位在1个固定的地址位置?

上一篇:如何用C51编AD程序
下一篇:CRC16-STANDARD的快速算法,51汇编

推荐阅读最新更新时间:2024-03-16 13:54

Keil C51详细设置
一.target名更改 打开Keil后,左侧Project Workspace中的target可改,方法:右击Target——Manage Compnents——双击待修改项即可,若要添加,使用对话框内对应工具栏。 二.optionfor target 设置之TARGET项 1 MEMARY MODEL Small:变量存储在内部ram里. Compact:变量存储在外部ram里,使用页8位间接寻址 Large:变量存储在外部Ram里,使用16位间接寻址. 我们一般使用Small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram不够了,才会存到外部去.Compact的方式要自己通过程序来指定页的高
[单片机]
c51单片机中断详解
工程图 第一题 **每次亮一个灯的流水灯,定义P1为led1。 外部中断0允许中断:EX0=1;下降沿触发:IT0=1;总开关:EA=1; 中断要执行的是P0引脚的4个二极管闪六次。 其实这里还有个想说的是,IE在中断请求的时候,会置位为1,然后CPU同意并执行中断程序后,IE自动清零。为什么说这个,这个可以在以后的一些情况,作为中断条件。 第二题 每次亮一个灯的流水灯和第一题的一样; 中断0下降沿触发也和第二题一样; 中断0程序是:P1引脚每次亮两个二极管的流水灯 讨论一下:每次亮两个二极管,如果低电平亮,那就要11111100B→11110011B。 个人觉得在中断中使用while造成的后果是很致命的
[单片机]
<font color='red'>c51</font>单片机中断详解
c51单片机 独立按键
用独立按键实现按一个按键时,数字从F到0递减的变化程序,即每按一次按键,数码管显示字符减一,减到0后重新显示。 #include reg52.h sbit ADDR0= P2^2; sbit ADDR1=P2^3; sbit ADDR2=P2^4; sbit key1=P3^0; unsigned char code ledchar = {0x00,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; bit keysta = 1; void main() { bit backup = 1;
[单片机]
C51编程经验三则
在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。用惯了汇编的人,总觉得高级语言 可控性 不好,不如汇编那样随心所欲。以下是笔者在C51编程中的几点经验,希望对初学C51者有所帮助。   一、C51热启动代码的编制   工业控制计算机,往往设有看门狗电路,看门狗动作,计算机复位,这就是热启动。热启动时,一般不允许程序从头开始,因为这将使测量或计算值复位,导致系统工作异常。故程序必须判断是热启动还是冷启动。常用的方法是:设定某内存单位为标志位(如0x7f位和0x7e位),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部分,并将0
[单片机]
c51循环移位的浅谈
如果学习单片机,最基本的考题就是流水灯了,呵呵,可是有时候一个很厉害的工程师,还真是不好弄出来,当然,我不是工程师,可是学习51单片机也有很长时间了,回想起当初学习51的时候,一直都是没有自己的核心的东西,今天就谈谈c51循环移位的见解 记得如果你打开intri ns.h(51自带的一个头文件),你会发现其中有关于定义_crol_()(字符循环左移函数)(一般我们用的多的是这个,呵呵),还有一个是_cror_()(字符循环右移函数) 可是,如果你去面试的时候,这个时候,你难道还用它自带的循环函数么?当然不能了。真是的(有时候我们自己小组出的笔试题就是流水灯,可是我却紧锁眉头,感觉很是窝囊。咳,今天就把源程序
[单片机]
C51单片机学习笔记之LCD1602
简介 简单说LCD1602这玩意就是液晶显示屏。 引脚功能: 写操作时序 读操作时序 指令集 cgrom表 原理图 代码部分 LCD1602.C #include reg52.h #include intrins.h sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; #define RS_CLR RS = 0 #define RS_SET RS = 1 #define RW_CLR RW = 0 #define RW_SET RW = 1 #define EN_CLR
[单片机]
<font color='red'>C51</font>单片机学习笔记之LCD1602
C51指针定义和应用小结
一. 指针变量的定义 指针变量定义与一般变量的定义类似,其形式如下: 数据类型 * 标识符; 表示被定义为基于存储器的指针,无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。存储器类型的编码值如下: 存储类型I Idata/data/bdata xdata pdata Code 编码值 0x00 0x01 0xFE 0xFF 用于指定指针本身的存储器空间。 char * c_ptr; int * i_ptr; lon
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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