XBYTE的用法说明与8255A基本使用方法.doc_第1页
XBYTE的用法说明与8255A基本使用方法.doc_第2页
XBYTE的用法说明与8255A基本使用方法.doc_第3页
XBYTE的用法说明与8255A基本使用方法.doc_第4页
XBYTE的用法说明与8255A基本使用方法.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

今天主要给大家介绍8255A使用方法和XBYTE8255这个芯片属于可编程芯片,简单说明这个芯片工作原理就是通过设定A1, A0的值选择D0D7数据口与PA,PB,PC哪个端口相连通(还有和控制寄存器相连接),8255A的使用步骤:第一是先设置控制寄存器,第二就可以对各口进行操作(读或写),接下面我们通过一个简单的程序来向大家介绍(我的一贯风格是你们自己到网上查资料自己看,具体实例会在本群里面有,所以你以前没有看过8255的可能看懂我写这篇帖子恐怕有点困难! 所以欢迎喜欢单片机和爱学习的人加入该群来一起学习单片机我QQ群:单片机C语言编程实例,群号:102015958).#include#include/绝对地址处理头文件,包含XBYTE,用XBYTE来定义扩展的IO端口及外部RAM单元地址, 用XBYTE定义的目的是将外部电路不同的功能编程不同的地址而已这样就可以在程序里面通过直接对地址附置,就能使外部电路实现需要的功能,这样做还有一个好处就是在编译的时候会产生 MOVX 指令,这样可以操作WR和RD引脚(像我这个实验图2中,的WR和WD分别接各自对应的WR和WD,所以在执行读写的时候是有单片机自动完成时序控制的),以实现特定的功能,至于用XBYTE定义的地址是多少就得根据实际的外围电路的连接来确定,不是随便写的.#define uchar unsigned char/宏定义#define uint unsigned int /宏定义#define PA XBYTE0xfcff/定义PA端口,为什么这样写呢,我后面会有详细的介绍,有还是不懂的请在帖子下方留言,直接问我我不回回答的!#define PB XBYTE0xfdff/定义PB端口#define PC XBYTE0xfeff/定义PC端口#define PD XBYTE0xffff/定义设置寄存器端口sbit A0=P20;/定义8255端口地址引脚A0sbit A1=P21;/定义8255端口地址引脚A1sbit dat=P0;/8255的D0D7的数据口void delay(uint ms) /1ms延时 uint i,j; for(i=ms;i0;i-) for(j=244;j0;j-);void main()PD=0x80;/方式控制字,端口ABC都工作于方式0,基本输入输出PA=0x55;PB=0xaa;PC=0x55;while(1)PA=PA;/按位取反,如果这句写成PA=!PA会怎么样?还是和PA=PA效果一样的吗?自己动手试下PB=PB;/按位取反PC=PC;/按位取反delay(120);/延时图1图2#define PB XBYTE0xfdff/定义PB端口#define PC XBYTE0xfeff/定义PC端口#define PD XBYTE0xffff/定义设置寄存器端口我到现在还没有说到底为什么这样写,首先还是申明这不是乱写的,从图2连接图可知,CS已经是是使能状态,所以就拿0xfdff为例吧,先展开1111,1101,1111,1111.他们是分别与单片机的P2口和P0口对应的(因为P0 P2的第二功能就是外扩展存储器的地址分别代表A0,A1A15共16位地址,216=65536bit/1K=64KB,故最大寻址为64KB),在这里所有的无关位都设为1(也可以设为0,也可以设为X,X代表0和1),也就是保证A1与A0为01即可.同理PC为11,故写成了e.下面的我都是从网上复制过来的,要是不好可别骂我哦!当然看不懂还是可以问我.XBYTE是一个地址指针(可当成一个数组名或数组的首地址),它在文件absacc.h中由系统定义,指向外部RAM(包括I/O口)的0000H单元,XBYTE后面的中括号的0xfdff是指数组首地址0000H的偏移地址,即用XBYTE0xfdff可访问偏移地址为0xfdff的I/O端口。 这个主要是在用C51的P0,P2口做外部扩展时使用,其中XBYTE 0xfdff,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处了,此地址对应一个字节。XBYTE 的作用,可以用来定义绝对地址,是P0口和P2口的,其中P2口对应的是高位,P0口对应的是低位 如 XBYTE0x1234 = 0x56; 则等价于 mov dptr,#1234h mov dptr,#56hXBYTE的使用收藏 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 address 0002h.The range of valid index values for this macro is 0-65535./support/man/docs/c51/c51_xbyte.htm 百度结果:这个主要是在用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为高,(WR,CS,RD都是低电平有效)那就是高位的4,当然其余的可以根据情况自己定,然后通过XBYTE 0x4000 = 57。这赋值语句,就可以把57写到外部RAM的0x4000处了,此地址对应一个字节。 一下摘自论坛网友的问答:问:在一般的读写外部RAM的程序中,经常看到这样的句子: XBYTEaddress=data 写数据 data=XBYTEaddress 读数据但是我想问的是,为什么用了XBYTE后,就不用顾及其时序了呢?就是说,读写数据的时候,WR和RD怎么都不用用程序去控制了呢?参考了很多读写外部RAM的程序,都找不到其控制WR和RD控制线的语句哪位大侠能帮忙解释一下这是为什么嘛?最好还能说说XBYTE具体的用法.答:外部总线,外部总线由组总线组成,数据地址控制,我们常常一般就叫他外部总线,既然是有组不同的信号,那么他们是怎么协调工作的呢?一般情况有特殊的外部数据访问指令如你这里讲的指令(在语言中他会编译成这个指令)在执行这个指令的时候组线是协调工作mov dptr,#1000hmov a,#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)的内部存储器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 标准链接库

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论