XBYTE.doc

上传人:sk****8 文档编号:3502738 上传时间:2019-06-01 格式:DOC 页数:36 大小:230KB
下载 相关 举报
XBYTE.doc_第1页
第1页 / 共36页
XBYTE.doc_第2页
第2页 / 共36页
XBYTE.doc_第3页
第3页 / 共36页
XBYTE.doc_第4页
第4页 / 共36页
XBYTE.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、XBYTEThe XBYTE macro accesses individual bytes in the external data memory of the 8051. You may use this macro in your programs as follows:#include /* Include Macro Definitions */.rval = XBYTE 0x0002;XBYTE 0x0002 = 57;.This example reads and writes the contents of the byte in external data memory at

2、 address 0002h.The range of valid index values for this macro is 0-65535.http:/ keil 的 help 里 ctrl+c 来的,以前在论坛里看到过有人问如何用 c 语言实现定位存储,呵呵,当时还说不可能呢!现在在查找 using 的时候,无意中看到了 XBYTE,点中看看,居然有大发现啊!百度结果:这个主要是在用 C51 的 P0,P2 口做外部扩展时使用,其中 XBYTE 0x0002,P2 口对应于地址高位,P0 口对应于地址低位。一般 P2 口用于控制信号,P0口作为数据通道。如:P2.7 接 WR,P2.6

3、 接 RD,P2.5 接 CS,那么就可以确定个外部 RAM 的一个地址,想往外部 RAM 的一个地址写一个字节时,地址可以定为 XBYTE 0x4000,其中WR,CS 为低,RD 为高,那就是高位的 4,当然其余的可以根据情况自己定,然后通过XBYTE 0x4000 = 57。这赋值语句,就可以把 57 写到外部 RAM 的 0x4000 处了,此地址对应一个字节。一下摘自论坛网友的问答:问:在一般的读写外部 RAM 的程序中,经常看到这样的句子:XBYTEaddress=data 写数据data=XBYTEaddress 读数据但是我想问的是,为什么用了 XBYTE 后,就不用顾及其时序

4、了呢?就是说,读写数据的时候,WR 和 RD 怎么都不用用程序去控制了呢?参考了很多读写外部 RAM 的程序,都找不到其控制 WR 和 RD 控制线的语句哪位大侠能帮忙解释一下这是为什么嘛?最好还能说说 XBYTE 具体的用法.答:外部总线,外部总线由组总线组成,数据 地址 控制,我们常常一般就叫他外部总线,既然是有组不同的信号,那么他们是怎么协调工作的呢?一般情况有特殊的外部数据访问指令如你这里讲的指令(在语言中他会编译成这个指令)在执行这个指令的时候组线是协调工作mov dptr,#1000hmov a,#55hmovx dptr,a上面调语句的语言可以表示如下#define W_DATA

5、 XBYTE0x1000W_DATA=0X55;在使用外部总线的时候,数据 地址和控制信号是直接按照规定的时序输出高低电平的,所以不用你管,当然你必须要满足时序工作一下摘自网友博客文章:如何理解#define XBYTE (unsigned char volatile xdata * 8051 特有的内存型态 code 以 MOVC A+DPTR 读取的程序内存data 可以直接存取的内部数据存储器idata 以 Mov Rn 存取的内部数据存储器bdata 可以位寻址(Bit Addressable)的内部存储器xdata 以 MOVX DPTR 存取的外部数据存储器pdata 以 MOVX

6、 Rn 存取的外部数据存储器特殊资料型态 bit 一般位(bit)变量sbit 绝对寻址的位( bit)变量语法sbit my_flag = location; (location 范围从 0x00 0x7F)范例sbit EA = 0xAF;或是配合 bdata 宣告的位(bit)变量char bdata my_flags;sbit flag0 = my_flags 0;(注意 sbit 前不可以加 static)sfr 特殊功能缓存器(Special Function Register)语法sfr my_sfr = location; (location 范围从 0x80 0xFF)范例s

7、fr P0 = 0x80;指定绝对地址的变量 在单一模块内可以使用下面的语法宣告memory_space type variable_name _at_ location范例pdata char my_pdata _at_ 0x80;如果该变量必须为多个模块所使用(Global Variable)则以抽象指针(Abstract Pointer)的方式在标头档(Header File)定义较为方便。#define variable_name *(data_type *) location)范例#define my_pdata *(char pdata *) 0x80)(注意 char 与 pda

8、ta 的顺序)ABSACC.H 提供了下列方便的宏(Macro )定义。 #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 (unsigne

9、d int volatile data *) 0)#define PWORD (unsigned int volatile pdata *) 0)#define XWORD (unsigned int volatile xdata *) 0)隐藏的初始化程序 80C51 在电源重置后( Power On Reset)所执行的第一个程序模块并不是使用者的主程序 main(),而是一个隐藏在 KEIL-C51 标准链接库中称为 startup.a51 的程序模块。startup.a51 的主要工作是把包含 idata、xdata、pdata 在内的内存区块清除为 0,并且初始化递归指针。接着 st

10、artup.a51 被执行的仍然是一个隐藏在 KEIL-C51 标准链接库中称为 init.a51 的程序模块。而 init.a51 的主要工作则是初始化具有非零初始值设定的变量。 在完成上述的初始化程序之后,80C51 的控制权才会交给 main() 开始执行使用者的程序。#define XBYTE (unsigned char volatile xdata *) 0)定义 XBYTE 为 指向 xdata 地址空间 unsigned char 数据类型的指针,指针值为0这样,可以直接用 XBYTE0xnnnn或*(XBYTE+0xnnnn)访问外部 RAM 了XBYTEXBYTE 宏允许访

11、问 51 外部数据区的单个字节可以如下使用rval = XBYTE0x0002;XBYTE0x002 = 57;读或写外部数据存储区地址 0002h 的字节内容XWORDXWORD 宏允许访问 51 外部数据区的单个字可以如下使用rval = XWORD0x0002;XWORD0x002 = 57;读或写外部数据存储区地址 0004h 2sizeof(unsigned int)=4 的字内容1. 绝对宏:在程序中,用“include”即可使用其中定义的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD 、PBYTE、DWORD具体使用可看一看 absa

12、cc.h 便知,例如:rval=CBYTE0x0002;指向程序存贮器的 0002h 地址rval=XWORD0x0002;指向外 RAM 的 0002h 地址2. _at_关键字直接在数据定义后加上_at_ const 即可,但是注意:(1)绝对变量不能被初使化;(2)bit 型函数及变量不能用_at_指定。例如:idata struct link list _at_ 0x40;指定 list 结构从 40h 开始。xdata char text25b _at_0xE000;指定 text 数组从 0E000H 开始提示:如果外部绝对变量是 I/O端口等可自行变化数据,需要使用 volati

13、le关键字进行描述,请参考 absacc.h。查看文章 51 单片机 C 语言编程中对单片机绝对地址访问的两种方法2009-04-17 14:27在进行 8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间。C51 程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定。为了能够在 C51程序中直接对任意指定的存储器地址进行操作,可以采用扩展关键字“at”、指针、预定义以及连接定位控制命令。在这些方法中,本人认为最简单而有效的方法是用“ _at_ ”关键字来对指定变量存储器空间绝对地址来指定。一般格式如下:存储器类型 数据类型

14、标识符 _at_ 地址常数其中:存储器类型 为 idata、data、xdata 等 C51能够识别的所有类型,最好不要省略。数据类型 可以用 int、long、float 等基本类型,当然也可以用数组、结构等复杂数据类型 , 本人认为一般用 unsigned int 就可以解决很多问题了。标识符 就是要定义的变量名,编程者自己决定地址常数 就是要直接操作的存储器的绝对地址,必须位于有效的存储器空间之内。注意:不能对变量进行初始化,只能是全局变量,一般不要轻易用,免得出错。举例:xdata unsigned int addr1 _at_ 0x8300;另有一种方法就是要用到一个头文件 absa

15、cc.h,也不是很难,举个例说明一下就会明白:#include XBYTE0x8300=0; /*向外部存储器(XDATA)地址x写本人强烈建议用 at,这样可能会更好些,还有一点就是不能乱用,因为有些存储器空间不能随便占用,编译器已经做其它的用了,而且有些空间单片机本身就做了很重要的作用,如果乱用,很容易出错类别:c 语言 | | 添加到搜藏 | 分享到 i 贴吧 | 浏览(64) | 评论 (0) 上一篇: C 语言嵌入式系统编程修炼之软件 . 下一篇: C 程序的优化相关文章: 51 单片机输出 PWM 的两种方法 最近读者:登录后,您就出现在这里。转自网络)关于 C51 的 XBYTE

16、工作 2009-07-14 17:38:05 阅读 196 评论 0 字号:大中小 XBYTEThe XBYTE macro accesses individual bytes in the external data memory of the 8051. You may use this macro in your programs as follows:#include /* Include Macro Definitions */.rval = XBYTE 0x0002;XBYTE 0x0002 = 57;.This example reads and writes the conte

17、nts of the byte in external data memory at address 0002h.The range of valid index values for this macro is 0-65535.http:/ keil 的 help 里 ctrl+c 来的,以前在论坛里看到过有人问如何用 c 语言实现定位存储,呵呵,当时还说不可能呢!现在在查找 using 的时候,无意中看到了 XBYTE,点中看看,居然有大发现啊!百度结果:这个主要是在用 C51 的 P0,P2 口做外部扩展时使用,其中 XBYTE 0x0002,P2 口对应于地址高位,P0 口对应于地址低

18、位。一般 P2 口用于控制信号,P0 口作为数据通道。如:P2.7 接 WR,P2.6 接 RD,P2.5 接 CS,那么就可以确定个外部 RAM 的一个地址,想往外部RAM 的一个地址写一个字节时,地址可以定为 XBYTE 0x4000,其中 WR,CS 为低,RD 为高,那就是高位的 4,当然其余的可以根据情况自己定,然后通过XBYTE 0x4000 = 57。这赋值语句,就可以把 57 写到外部 RAM 的 0x4000 处了,此地址对应一个字节。一下摘自论坛网友的问答:问:在一般的读写外部 RAM 的程序中,经常看到这样的句子:XBYTEaddress=data 写数据data=XBY

19、TEaddress 读数据但是我想问的是,为什么用了 XBYTE 后,就不用顾及其时序了呢?就是说,读写数据的时候,WR 和 RD 怎么都不用用程序去控制了呢?参考了很多读写外部 RAM 的程序,都找不到其控制 WR 和 RD 控制线的语句哪位大侠能帮忙解释一下这是为什么嘛?最好还能说说 XBYTE 具体的用法.答:外部总线,外部总线由组总线组成,数据 地址 控制,我们常常一般就叫他外部总线,既然是有组不同的信号,那么他们是怎么协调工作的呢?一般情况有特殊的外部数据访问指令如你这里讲的指令(在语言中他会编译成这个指令)在执行这个指令的时候组线是协调工作mov dptr,#1000hmov a,

20、#55hmovx dptr,a上面调语句的语言可以表示如下#define W_DATA XBYTE0x1000W_DATA=0X55;在使用外部总线的时候,数据 地址和控制信号是直接按照规定的时序输出高低电平的,所以不用你管,当然你必须要满足时序工作一下摘自网友博客文章:如何理解 #define XBYTE (unsigned char volatile xdata * 8051 特有的内存型态 code 以 MOVC A+DPTR 读取的程序内存data 可以直接存取的内部数据存储器idata 以 Mov Rn 存取的内部数据存储器bdata 可以位寻址(Bit Addressable)的内

21、部存储器xdata 以 MOVX DPTR 存取的外部数据存储器pdata 以 MOVX Rn 存取的外部数据存储器特殊资料型态 bit 一般位(bit)变量sbit 绝对寻址的位(bit)变量语法sbit my_flag = location; (location 范围从 0x00 0x7F)范例sbit EA = 0xAF;或是配合 bdata 宣告的位(bit )变量char bdata my_flags;sbit flag0 = my_flags 0;(注意 sbit 前不可以加 static)sfr 特殊功能缓存器(Special Function Register)语法sfr my

22、_sfr = location; (location 范围从 0x80 0xFF)范例sfr P0 = 0x80;指定绝对地址的变量 在单一模块内可以使用下面的语法宣告memory_space type variable_name _at_ location范例pdata char my_pdata _at_ 0x80;如果该变量必须为多个模块所使用(Global Variable)则以抽象指针(Abstract Pointer)的方式在标头档(Header File)定义较为方便。#define variable_name *(data_type *) location)范例#define

23、my_pdata *(char pdata *) 0x80)(注意 char 与 pdata 的顺序)ABSACC.H 提供了下列方便的宏(Macro)定义。 #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 in

24、t volatile code *) 0)#define DWORD (unsigned int volatile data *) 0)#define PWORD (unsigned int volatile pdata *) 0)#define XWORD (unsigned int volatile xdata *) 0)隐藏的初始化程序 80C51 在电源重置后(Power On Reset)所执行的第一个程序模块并不是使用者的主程序 main(),而是一个隐藏在 KEIL-C51 标准链接库中称为 startup.a51 的程序模块。startup.a51 的主要工作是把包含 idata、xdata、pdata 在内的内存区块清除为 0,并且初始化递归指针。接着 startup.a51 被执行的仍然是一个隐藏在 KEIL-C51 标准链接库

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。