一、不带初值的变量或数组
直接使用_at_ 关键字加上地址就行。
如:
unsigned char idata myvar _at_ 0x40;
unsigned char code myvar[10] _at_ 0x40;
_at_ 关键字的前后都有空格。
二、带初值的变量或数组
要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,要进行如下操作:
1、在工程中建立一个新的文件,如InitVars.c,在其中对要处理的变量赋初值(假设是code变量):
char code myVer = {'COPYRIGHT 2001-11'};
2、然后将该文件加入工程,编译,打开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)
再次编译即可。
1、相应地,如为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等变量,则相应处理即可。
三、函数的定位
假如要把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处了
如果同时定位多个函数,中间用“,”隔开就行了:
?PR?myTest1?MAIN(0x3900), ?PR?myTest2?MAIN(0x4000)
四、知道函数地址但不知道函数名字的调用方法(使用函数指针调用绝对地址处的函数)
1、定义调用的函数原形
typedef void (*CALL_MYTEST)(void);
这是一个回调函数的原形, 参数为空.
2、定义相应的函数指针变量
CALL_MYTEST myTestCall = NULL;
3、函数指针变量赋值, 指向我们定位的绝对地址的函数
myTestCall = 0x3900;
4、函数指针调用
if (myTestCall != NULL)
{
myTestCall(); // 调用函数指针处的函数 myTest1, 置 PC 指针为 0x3900
}
关键字:51单片机 变量 数组 函数设置 固定位置 绝对地址
引用地址:
51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
推荐阅读最新更新时间:2024-11-12 13:37
基于51单片机的超声波测距设计(带温度补偿)
利用STC89C52单片机、超声波模块(HC-RS04)、DS18B20数字温度传感器和LCD1602液晶显示模块制作一个超声波测距仪,液晶屏第一行显示温度和超声波速度“T:30°C V:349m/s”,第二行显示测量距离“S=X.XXXm”。 所设计的测距仪测量单位为米,精确到小数点后面3位(毫米),测量范围:0.05m~5m。 (一)基本部分 1、液晶显示功能 (1)开机时,液晶屏第一行显示温度和超声波速度,例如“T:30°C V:349m/s”,第二行显示测量距离“S=0.000m” (2)操作对应的功能按键时,液晶屏第一行显示温度和超声波速度,例如“T:30°C V:349m/s”,第二行显示测量距离“S=X.XXXm”
[单片机]
51单片机封装库HML_FwLib_STC89/STC11
HML_FwLib_STC89/11 项目地址 https://github.com/MCU-ZHISHAN-IoT/HML_FwLib_STC89 https://github.com/MCU-ZHISHAN-IoT/HML_FwLib_STC11 这些项目主要是封装了8051和STC89, STC11的寄存器配置信息, 提供接口方法给上层调用. 因为传统的代码都是直接用八进制值给寄存器赋值进行操作, 不便于记忆, 用这个封装库就可以使用类似于STM的高级语言方式进行开发, 解决了开发过程极度依赖手册的问题. 如果使用STC12C5A60S2系列, 可以用STC11封装库. 目录结构 HML_FwLib_STC89 ├─
[单片机]
基于51单片机的7键8键电子琴proteus仿真数码管显示程序原理设计
硬件设计 8键仿真图: 方案: 7键仿真图: 7个按键表示7个音,另外一个按键播放歌曲 程序设计 /******************************************************************/ #include reg52.h #include main.h /******************************************************************/ sbit BeepIO = P2^0; //定义音频输出管脚 sbit KEY1 = P1^0; //按键1 do sbit KEY2 = P1^1; //按键2 re sb
[单片机]
什么是MCS-51单片机、8051单片机、51单片机
MCS-51单片机---是指美国INTEL公司生产的内核兼容的一系列单片机的总称。“MCS-51”也代表这一系列单片机的内核。这一系列单片机硬件结构和指令系统一致,包括8031、8051、8751、8032、8052、8752等基本型。 8051单片机---是MCS-51系列单片机中的一个基本型,是MCS-51系列中最早期、最典型、应用最广泛的产品,所以8051单片机也就成了MCS-51系列单片机的典型代表。 51单片机---51单片机是对目前所有兼容MCS-51指令系统的单片机的统称,包括INTEL MCS-51系列单片机、以及其他厂商生产的兼容MCS-51内核的增强型8051单片机。只要和MCS-51内核兼容的
[单片机]
51单片机---串口通讯
一、简介 MCS-51单片机内部有一个可编程的双向全双工串行通信接口,简称串口;该串口有4种工作方式,以适用于不同场合;其波特率由单片机内部的定时器/计数器产生,可由软件设置;接收和发送均可工作在查询模式和中断模式,比较灵活; 二、串口结构与控制 MCS-51单片机内部的串口拥有两个物理上相互独立的接收、发送缓冲器SBUF,可以同时接收和发送数据;发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入;两个缓冲器占用同一个地址(99H);控制MCS-51单片机串口的寄存器有两个SCON和PCON; 1、串口工作方式控制寄存器SCON(99H) 如下图: (1)、SM0和SM1:控制单片机的工作方式; (2)、SM2:允许方式
[单片机]
基于51单片机智能红外温控风扇设计
1、设计需求及目标 本产品采用单片机+最小系统+数码管显示模块+数码管驱动模块+温度采集模块+人体感应模块+风扇模块+按键模块等构成; 功能描述: (1)采用DS18B20温度传感器测温,人体感应模块检测是否有人。 (2)共3个按键:1键切换/设置、2键加、3键减。 (3)本设计共三种模式:自动模式、手动模式和自然风模式。 (4)自动模式,按一下1键可以设置温度上限,再按下设置温度下限,均可以按键加减调整。数码管第一位不显示,后三位显示温度值。人体感应模块检测有人时,温度小于下限风扇不转,温度在上下限之间50%转动,大于上限时,风扇全速转动。人离开后,延迟几秒风扇停止转动,起到节能环保的作用。 (5)手动模
[单片机]
在MCS51单片机中对特殊功能寄存器的C51定义
在开始讲对C51单片机中特殊寄存器(SPR)的定义前,先简单介绍下我们在进行51单片机开发时经常看到的两个关键字 sbit 和 sfr : sfr用于将一个单片机的特殊功能寄存器(specialfunctionregister)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(referto)该寄存器 sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。 接着我们以STC系列的51单片机为例简单的了解下单片机的特殊功能寄存器布局,如下: MCS-51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(S
[单片机]
51单片机 ret和reti
原来在8051构架中--中断系统中含有两个不可寻址的“优先级生效”触发器。一个用于指出CPU是否正在执行高优先级的中断服务程序,这个触发器为1时,系统将屏蔽所有的中断请求;另一个则指出CPU是否正在执行低优先级中断服务程序,该触发器为1时,将阻止除高优先级以外的一切中断请求。由此可见,若要响应同级甚至是低级中断请求,必须使得该“优先级生效”触发器清零。但该触发器又是不可寻址的,所以无法用软件直接清零。” 通常情况下,在普通的汇编子程序中用RET做返回,在中断服务子程序中用RETI起中断返回作用。两条指令都能从堆栈中弹出断点地址并装入PC中,使 CPU回到原来主程序的断点处继续运行。然而,RET和RETI有本质的区别:当某一中断源响
[单片机]