在利用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. 关于 IOS Runtime Runloop 2

    Runtime 也就是运行时组件,一个纯C语言写的基础库. 我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码 Objective-C编写出来的程序必须得到ru ...

  2. 在DataTable和DataView中查找指定记录

    一.在DataTable中查找 1. 使用Select方法查找没有主键的表DataTable的Select方法返回一个DataRow数组,有四个重载的函数. DataRow[] drs = dt.Se ...

  3. eclipse 32位和64位的jre

    让32位Eclipse和64位Eclipse同是在64的Windows7上运行 用文本编辑器打开eclipse.ini文件,在-vmargs之前加入下面的内容: -vm  C:\Program Fil ...

  4. Drupal 实战

    <Drupal 实战> 基本信息 作者: 葛红儒    丛书名: 实战系列 出版社:机械工业出版社 ISBN:9787111429999 上架时间:2013-6-28 出版日期:2013 ...

  5. struts2处理请求流程详解

    struts2大概分为两块:一是struts2系统初始化,二是struts2处理请求,对请求作出响应. 下面就说说个人对struts2对请求处理流程的理解: 下面是StrutsPrepareAndEx ...

  6. Laravel 4 Quick Tip: Custom Error Pages

    App::error(function($exception, $code) { switch ($code) { case 403: return Response::view('errors.40 ...

  7. JAVA实现AES和MD5加密

    package test; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; ...

  8. 开源消息中间件DotNetMQ

    由于这个开源项目对我这种中间件菜鸟很有帮助,因此,我将官方的说明文档翻译如下: Introduction In this article, I will introduce a new and ind ...

  9. VS2015编译器问题简单记录

    问题:VS2015community 无法查找或打开 pdb 文件 解决办法: 1.点击工具->选项, 在选项窗口中展开左侧菜单: 2.展开调试->常规,然后在右边的窗格中勾选“启用服务器 ...

  10. mysql慢查优化总结

    1.优化sql语句结构 or改成union,使用start,limit 先只查询出所有的id,然后再排序.如果查询出所有的id仍然很慢,就要仔细考虑了. 2.添加索引 mysql每次查询只能使用一个索 ...