在利用keil进行8051单片机编程的时,常常需要进行绝对地址进行访问.特别是对硬件操作,如DA AD 采样 ,LCD 液晶操作,打印操作.等等.
C51提供了三种访问绝对地址的方法: 
1. 绝对宏: 
    在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括: 
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 
具体使用可看一看absacc.h便知

例如:

#include<absacc.h>

#define ADstart  XBYTE[0x8000]        //总线方式访问AD

#define ADL     XBYTE[0x8000]

#define ADH     XBYTE[0x8001]

rval=CBYTE[0x0002];指向程序存贮器的0002h地址 
rval=XWORD [0x0002];指向外RAM的0004h地址

2. _at_关键字 
直接在数据定义后加上_at_ const即可,但是注意: 
(1)绝对变量不能被初使化; 
(2)bit型函数及变量不能用_at_指定。

例如:

idata struct link list _at_ 0x40;指定list结构从40h开始。 
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始 
提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。

3. 连接定位控制 
    此法是利用连接控制指令code xdata pdata \data bdata对“段”地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论。

附:(c51)

/*-------------------------------------------------------------------------- 
ABSACC.H

Direct access to 8051, extended 8051 and Philips 80C51MX memory areas. 
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. 
All rights reserved. 
--------------------------------------------------------------------------*/

#ifndef __ABSACC_H__ 
#define __ABSACC_H__

#define CBYTE ((unsigned char volatile code *) 0) 
#define DBYTE ((unsigned char volatile data *) 0) 
#define PBYTE ((unsigned char volatile pdata *) 0) 
#define XBYTE ((unsigned char volatile xdata *) 0)

#define CWORD ((unsigned int volatile code *) 0) 
#define DWORD ((unsigned int volatile data *) 0) 
#define PWORD ((unsigned int volatile pdata *) 0) 
#define XWORD ((unsigned int volatile xdata *) 0)

#ifdef __CX51__ 
#define FVAR(object, addr) (*((object volatile far *) (addr))) 
#define FARRAY(object, base) ((object volatile far *) (base)) 
#define FCVAR(object, addr) (*((object const far *) (addr))) 
#define FCARRAY(object, base) ((object const far *) (base)) 
#else 
#define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L))) 
#define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L))) 
#define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L)) 
#define FCARRAY(object, base) ((object const far *) ((base)+0x810000L)) 
#endif

#endif

附:(c166)

/*-------------------------------------------------------------------------- 
ABSACC.H

Direct access to 166 memory areas for C166/EC++ Version 5. 
Copyright (c) 1992-2004 Keil Elektronik GmbH and Keil Software, Inc. 
All rights reserved. 
--------------------------------------------------------------------------*/

#ifndef __ABSACC_H__ 
#define __ABSACC_H__

#if (__MODEL__ == 0) 
#define MVAR(object, addr) (*((object volatile *) (addr))) 
#define MARRAY(object, base) ((object volatile *) (base)) 
#else 
#define MVAR(object, addr) (*((object volatile far *) (addr))) 
#define MARRAY(object, base) ((object volatile far *) (base))

#define HVAR(object, addr) (*((object volatile huge *) (addr))) 
#define HARRAY(object, base) ((object volatile huge *) (base)) 
#define XVAR(object, addr) (*((object volatile xhuge *) (addr))) 
#define XARRAY(object, base) ((object volatile xhuge *) (base)) 
#endif

#endif

转载自:

http://www.dz863.com/Microprocessors/MCS-8051/keil-C51-CBYTE.htm

参考资料:

1)Cx51 User's Guide: XBYTE

http://www.keil.com/support/man/docs/c51/c51_xbyte.htm

51单片机C语言学习笔记4:keil C51绝对地址访问的更多相关文章

  1. 51单片机C语言学习笔记6:51单片机C语言头文件及其使用

    很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这个是在头文件中用sfr定义的,现在定义好了的是这样的 sfr P1 ...

  2. 51单片机C语言学习笔记3: 存储器结构

    MCS-51单片机在物理结构上有四个存储空间: 1.片内程序存储器2.片外程序存储器3.片内数据存储器4.片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1.片内外统一编 ...

  3. 51单片机C语言学习笔记5:include的区别

    #include <iostream.h>#include "myfile_h" #include 是预处理器标识符.<>表示是标准的工程.标准的头文件.查 ...

  4. 51单片机C语言学习笔记7:关于.c文件和.h文件

    1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明: 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h). 2)h文件里应该有什么 ...

  5. 51单片机C语言学习笔记8:单片机C51编程规范

    1.单片机C51编程规范- 前言  为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范. 2.单片机C51编程规范-范围 本标准规定了程序设计人员进行程序设计时必须遵循的规范.本 ...

  6. keil C51绝对地址访问

    在利用keil进行8051单片机编程的时,常常需要进行绝对地址进行访问.特别是对硬件操作,如DA AD 采样 ,LCD 液晶操作,打印操作.等等.C51提供了三种访问绝对地址的方法: 1. 绝对宏 在 ...

  7. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  8. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  9. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

随机推荐

  1. linux/hpux 添加用户

    #添加用户组, 组名dev, 组id为1001groupadd -g 1001 dev #添加用户组dev,不指定组idgroupadd dev #添加用户user1, id为111, 属于dev组, ...

  2. Java TCP服务端向客户端发送图片

    /** * 1.创建TCP服务端,TCP客户端 * 2.服务端等待客户端连接,客户端连接后,服务端向客户端写入图片 * 3.客户端收到后进行文件保存 * @author Administrator * ...

  3. Install Oracle 10g on Red Hat Linux 5.3 Step by Step

    一.虚拟机配置 1. 虚拟机(VBox 4.3.12) 2. 配置虚拟机网卡网络.选择host-only.VirtualBox Host-Only Network网卡IP为设置为192.168.1.1 ...

  4. linux开关机命令

    1.reboot重启 2.shutdown -r now 立即重启 root用户使用,与reboot命令相同 3.shutdown -r 10 过10分钟后重启root用户使用 4.shutdown ...

  5. OD: Ring0 & Kernel

    开发技术讲究封装与模块化,安全技术强调底层安全性.安全技术需要打开封装.追根溯源! <0day 安全:软件漏洞分析技术(第2版)> 第21章 探索 Ring0 笔记 Intel x86 系 ...

  6. hdu 1869

    题意是给m组人物关系,然后判断是否符合六度分离,代码主要就是三个for那里 然后要记得后面判断的时候是大于7,这题除了Florde算法,还有另外一种算法,不过我没记.... #include < ...

  7. (转)Discuz!NT图文安装教程

    不同目录下的安装方法根据目前大家对论坛的使用需求,在安装上面大致有三种情况,站点根目录下安装,站点虚拟目录下安装和站点子目录下安装. 1.根目录安装 根目录安装是最简单也是稳定系数最高的安装和使用方式 ...

  8. \r \n有什么区别

    '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来.下面转一篇文章. 回车和换行 今天,我总算搞清楚“回车”(carriage return)和“换行 ...

  9. sql 判断表、列、视图等是否存在

    1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名')     drop database [数据库名] 2 判 ...

  10. BitmapImage使用FileStream读取文件

    var bitmapImage = new BitmapImage(); using (FileStream fs = new FileStream(file.FullName, FileMode.O ...