C51中的 xbyte的使用

发布者:CelestialSoul最新更新时间:2017-01-06 来源: eefocus关键字:C51  xbyte 手机看文章 扫描二维码
随时随地手机看文章

The 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 address 0002h.

The range of valid index values for this macro is 0-65535.

 

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

 

  上面的是在keil的help里ctrl+c来的,以前在论坛里看到过有人问如何用c语言实现定位存储,呵呵,当时还说不可能呢!现在在查找using的时候,无意中看到了XBYTE,点中看看,居然有大发现啊!

 

  百度结果:这个主要是在用C51的P0,P2口做外部扩展时使用,其中XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位。一般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的程序中,经常看到这样的句子:

  XBYTE[address]=data 写数据

  data="XBYTE"[address] 读数据

但是我想问的是,为什么用了XBYTE后,就不用顾及其时序了呢?

就是说,读写数据的时候,WR和RD怎么都不用用程序去控制了呢?

参考了很多读写外部RAM的程序,都找不到其控制WR和RD控制线的语句

哪位大侠能帮忙解释一下这是为什么嘛?

最好还能说说XBYTE具体的用法.....
答:
外部总线,

1外部总线由3组总线组成,数据 地址 控制,我们常常一般就叫他外部总线,既然是有3组不同的信号,那么他们是怎么协调工作的呢?一般情况CPU有特殊的外部数据访问指令如你这里讲51的MOVX指令(在C语言中他会编译成这个指令)在执行这个指令的时候3组线是协调工作

mov dptr,#1000h

mov a,#55h

movx @dptr,a

上面3调语句的C语言可以表示如下

#define W_DATA XBYTE[0x1000]

W_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 @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)
范例
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 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 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)

隐藏的初始化程序  
80C51 在电源重置后(Power On Reset)所执行的第一个程序模块并不是使用者的主程序  
main(),而是一个隐藏在 KEIL-C51 标准链接库中称为 startup.a51 的程序模块。
startup.a51 的主要工作是把包含 idata、xdata、pdata 在内的内存区块清除为 0,并
且初始化递归指针。接着 startup.a51 被执行的仍然是一个隐藏在 KEIL-C51 标准链接库
中称为 init.a51 的程序模块。而 init.a51 的主要工作则是初始化具有非零初始值设定的
变量。  
在完成上述的初始化程序之后,80C51 的控制权才会交给 main() 开始执行使用者的程序。
#define XBYTE ((unsigned char volatile xdata *) 0)
定义 XBYTE 为 指向 xdata 地址空间unsigned char 数据类型的指针,指针值为0
这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了

关键字:C51  xbyte 引用地址:C51中的 xbyte的使用

上一篇:实验二 8位加法器设计
下一篇:51单片机解码PPM波

推荐阅读最新更新时间:2024-03-16 15:29

C51单片机在电机转速测量仿真系统中的设计
单片机电机转速测量系统仿真系统采用单片机中T1计数器对转速脉冲进行计数。定时器T1 工作于外部事件计数方式,对转速脉冲计数; T0 工作于定时器方式。每到1 s 读1 次计数值,此值即为脉冲信号的频率,根据式( 1) 可计算出电机的转速。转速检测装置的软件系统主要包括: 测速主程序、数据处理子程序和显示子程序。单片机上电后,系统进入准备状态。首先进行初始化,然后读取脉冲数据进行运算,将转速显示在LCD上。需要这款仿真及C语言程序的爱好者可从文章配图左上角网址上了解。 该单片机电机转速测量系统仿真仿真采用测频法“M法”测量电机转速。即在一定测量时间T内,测量脉冲发生器(替代输入脉冲)产生的脉冲数m1来测量转速,计算式如下:n=
[单片机]
<font color='red'>C51</font>单片机在电机转速测量仿真系统中的设计
C51单片机中断定义
C51函数声明对ANSI C作了扩展,具体包括: 1. 中断函数声明: 中断声明方法如下: void serial_ISR () interrupt 4 { /* ISR */ } 为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。 /* define not used interrupt, so generate IRET in their entrance */ void extern0_ISR() interrupt 0{} /* not used */ void timer0_ISR () interrupt 1{} /* not used */ void extern1_ISR()
[单片机]
51单片机读写max186的c51程序
//ad转换子程序 //返回的是12位的int型数据 //max186通道ch0对应的是0,它是max186第1脚 //max186通道ch1对应的是1,它是max186第2脚 //max186通道ch2对应的是2,它是max186第3脚 //max186通道ch3对应的是3,它是max186第4脚 //max186通道ch4对应的是4,它是max186第5脚 //max186通道ch5对应的是5,它是max186第6脚 //max186通道ch6对应的是6,它是max186第7脚 //max186通道ch7对应的是7,它是max186第8脚 //比如:int ch3; // ch3=ad186(3); //ch3就是从max
[单片机]
51单片机读写max186的<font color='red'>c51</font>程序
技巧 2 -- 单片机 C51 & A51 编程要点总结
C51: 1、头文件:#include reg52.h (我用的是 STC 89C54RD+) 2、预定义:sbit LED = P1^0  // 定义 P1 口的 0 位为 LED   注: P1^0 这个写法,与 A51 不同(A51 是 P1.0),P1 是一组端口,端口号范围 0~7   注2:sbit 用于定义 SFR(特殊功能寄存器)的位变量,上例中 LED 作为 全局变量 进行定义   注3:以下写法是错误的:     sbit code table = {P1^0, P1^1, P1^2, P1^3};  // 想用 table 指定不同的引脚,但这么做会报错     sbit table = {P1^0
[单片机]
浅谈单片机的按键去抖问题
简介:本文是我用C51语言写的一个按键去抖程序,大家定会问为什么要去抖呢,说到这里,我要说下去现在去抖的方法有几种,去抖有两种方式,一种是硬件去抖,一种是软件去抖,硬件去抖是加一个电容就可以了,这要加大成本,和电路的复杂性。我们在开发C51的时候一般最常用的是软件去抖。下面看这个矩阵键盘的去抖程序吧。 #include reg52.h #include intrins.h #define uchar unsigned char sfr KeyPort=0x90;//#define KeyPort P1 -----行在P1口低四位 sbit Key_C1=P1^4; //第1列接P1.4 sbit Key_C2=P1^5;
[单片机]
C51单片机串口工作的四种方式总结
方式0:同步移位寄存器输入输出方式 1. 利用移位寄存器实现串行/并行的转换(功能) 2. 波特率:fosc/12 3. RXD(P3.0)----用于串行数据的输入和输出 TXD(P3.1)----充当输出的移位时钟 4. 数据大小:8位 5. 方式0发送: ○ 串口接口移位寄存器(74HC164),主要用于扩展并行输出口 ○ 用单片机本身的3根线换取了8根线的作用 ○ 串行接口将8位数据从SBUF中取出 ○ TXD引脚上输出同步移位脉冲 ○ 以fosc/12的波特率从RXD端串行输出到移位寄存器 ○ 发完后TI置1,向CPU请求中断 6. 7. 8. 方式0接收: ○ 串口接口移位寄存器(74HC1
[单片机]
<font color='red'>C51</font>单片机串口工作的四种方式总结
Keil C51与单片机开发入门
第一步:安装开发工具 之前照着书上,下载的是Keil 4(MDK),遇到各种问题,无法安装STC系列的产品。冷静下来想想,换了个思路,重新下载了开发工具,keil C51。常规的下载链接: https://www.keil.com/download/product/ , 选择C51. 如果没法下载,本文最后另外有链接。 安装完之后,需要注册,打开keil, 选择File - Liscense Management, 复制 CID,在注册工具中,输入这个CID, 点击“Generate ,把生成的序号复制到“Liscense Management 窗体中的New Liscense ID Code对话框中,然后点击”A
[单片机]
Keil <font color='red'>C51</font>与单片机开发入门
基于C51单片机的MP3播放器设计
0 引言 便携式MP3播放器作为一种集音频播放、数据存储为一身的数码产品,其功能结构为电子设计人员所津津乐道。MP3是MPEG一1音频III(1ayerIII)的简称。MPEG一1音频(ISO/IECll 172—3)是目前普遍应用的音频压缩标准,其中层III的算法最为复杂,但压缩比最大,效果也最好,在低码率的条件下基本能达到CD的音质效果。MP3标准用尽可能低的码流实现CD音质的声音而不会产生数据损失。如果对于一段声音不进行压缩的话,那么每存储一秒钟的立体声CD音质音乐必须用1.4Mbit,这是个十分大的开销。通过运用MPEG音频标准的压缩技术,我们可以把存储空间压缩到原来的1/12而不会降低声音的音质。即使使用1/24的压
[单片机]
基于<font color='red'>C51</font>单片机的MP3播放器设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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