51管脚及xbyte和at关键字

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bdata 可以位寻址(Bit Addressable)的内部存储器
xdata 以 MOVX @DPTR 存取的外部数据存储器
pdata 以 MOVX @Rn 存取的外部数据存储器
特殊资料型态
bit 一般位(bit)变量
sbit 绝对寻址的位(bit)变量
XBYTE [0x4000] = 57。这赋值语句,就可以把57写到外部RAM的0x4000处了,此地址对应一个字节。
一下摘自论坛网友的问答:
问:
在一般的读写外部RAM的程序中,经常看到这样的句子:
XBYTE[address]=data 写数据
data=XBYTE[address] 读数据
当访问外部存储器时,ALE作为锁存扩展地址的低8位字节的控制信号。当访问外部数据存储器时,ALE以十二分之一振荡频率输出正脉冲,同时这个引脚也是EPROM编程时的编程脉冲输入端。
但是这个引脚还有一个非常有用的功能往往被很多人给忽视了,那就是当非访问外部数据存储器时,ALE以六分之一振荡频率固定输出正脉冲, 8051一个机器周期=6个状态周期=12个振荡周期,若采用6MHz的晶体振荡器,则ALE会发出1MHz的固定的正脉冲。因此它可以用来做外部时钟或定时。如果我们把这个功能应用与实际,可能给我们做外部扩展时使用,其中XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道。
如:P2.7接WR,P2.6接RD,P2.5接CS,那么就可以确定个外部RAM的一个地址,想往外部RAM的一个地址写一个字节时,地址可以定为XBYTE [0x4000],其中WR,CS为低,RD为高,那就是高位的4,当然其余的可以根据情况自己定,然后通过
ALE脚是在使用MOVX、MOVC指令时才会变成有效(这些指令都使用到外部RAM或ROM的地址。这些指令都有一个特点:地址和数据分时出现在P0口)。使用C写程序时,要使用它有效,可用访问内部RAM地址的方法。如:uVariable=*((char *)0x12C),把0x12C地址的内容给uVariable变量。这个过程有效的脚为ALE、RD。
端口的负载能力和输入/输出操作:
P0端口能驱动8个LSTTL负载。如需增加负载能力,可在P0总线上增加总线驱动器。P1,P2,P3端口各能驱动4个LSTTL负载。
串行端口:
MCS-51系列单片机片内有一个串行I/O端口,通过引脚RXD(P3.0)和TXD(P3.1)可与外设电路进行全双工的串行异步通信。
串行通信的波特率可以程控设定。在不同工作方式中,由时钟振荡频率的分频值或由定时器Tl的定时溢出时间确定,使用十分方便灵活。
2.串行端口的工作方式
①方式0
8位移位寄存器输入/输出方式。多用于外接移位寄存器以扩展I/O端口。波特率固定为fosc/12。其中,fosc为时钟频率。
在方式0中,串行端口作为输出时,只要向串行缓冲器SBUF写入一字节数据后,串行端口就把此8位数据以等的波特率,从RXD引脚逐位输出(从低位到高位);此时,TXD输出频率为fosc/12的同步移位脉冲。数据发送前,仅管不使用中断,中断标志TI还必须清零,8位数据发送完后,TI自动置1。如要再发送,必须用软件将TI清零。
1外部总线由3组总线组成,数据 地址 控制,我们常常一般就叫他外部总线,既然是有3组不同的信号,那么他们是怎么协调工作的呢?一般情况CPU有特殊的外部数据访问指令如你这里讲51的MOVX指令(在C语言中他会编译成这个指令)在执行这个指令的时候3组线是协调工作
mov dptr,#1000h
mov a,#55h
使P3端品各线处于第二功能的条件是:
1\串行I/O处于运行状态(RXD,TXD);
2\打开了处部中断(INT0,INT1);
3\定时器/计数器处于外部计数状态(T0,T1)
4\执行读写外部RAM的指令(RD,WR)
在应用中,如不设定P3端口各位的第二功能(WR,RD信叼的产生不用设置),则P3端口线自动处于第一功能状态,也就是静态I/O端口的工作状态。在更多的场合是根据应用的需要,把几条端口线设置为第二功能,而另外几条端口线处于第一功能运行状态。在这种情况下,不宜对P3端口作字节操作,需采用位操作的形式。
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 <absacc.h> /* Include Macro Definitions */
Pl端口是803l单片机中唯一仅有的单功能I/O端口,并且没有特定的专用功能,输出信号锁存在引脚上,故又称为通用静态口。
因此P2端口是动态的I/O端口。输出数据虽被锁存,但不是稳定地出现在端口线上。
P2端口的主要特点包括:
①不能输出静态的数据;
②自身输出外部程序存储器的高8位地址;
②执行MOVX指令时,还输出外部RAM的高位地址,故称P2端口为动态地址端口。
1.串行端口的基本特点
8031单片机的串行端口有4种基本工作方式,通过编程设置,可以使其工作在任一方式,以满足不同应用场合的需要。其中,方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;方式1多用于双机之间或与外设电路的通信;方式2,3除有方式l的功能外,还可用作多机通信,以构成分布式多微机系统。
串行端口作为输入时,RXD为数据输入端,TXD仍为同步信号输出端,输出频率为fosc/12的同步移位脉冲,使外部数据逐位移入RxD。当接收到8位数据(一帧)后,中断标志RI自动置。如果再接收,必须用软件先将RI清零。
2.串行端口的工作方式
①方式0
8位移位寄存器输入/输出方式。多用于外接移位寄存器以扩展I/O端口。波特率固定为fosc/12。其中,fosc为时钟频率。
串行端口有两个控制寄存器,用来设置工作方式、发送或接收的状态、特征位、数据传送的波特率(每秒传送的位数)以及作为中断标志等。
串行端口有一个数据寄存器SBUF(在特殊功能寄存器中的字节地址为99H),该寄存器为发送和接收所共同。发送时,只写不读;接收时,只读不写。在一定条件下,向阳UF写入数据就启动了发送过程;读SBUf就启动了接收过程。
串行端口作为输入时,RXD为数据输入端,TXD仍为同步信号输出端,输出频率为fosc/12的同步移位脉冲,使外部数据逐位移入RxD。当接收到8位数据(一帧)后,中断标志RI自动置。如果再接收,必须用软件先将RI清零。
(转自网络)关于C51的XBYTE工作 2009-07-14 17:38:05 阅读504 评论0 字号:大中小 订阅
.
.
.
rval = XBYTE [0x0002];
XBYTE [0x0002] = 57;
.
.
.This example reads and writes the contents of the byte in external data memory at address 0002h.
语法
sbit my_flag = location; (location 范围从 0x00 ~ 0x7F)
范例
sbit EA = 0xAF;
或是配合 bdata 宣告的位(bit)变量
char bdata my_flags;
sbit flag0 = my_flags ^ 0;
这个信号线的信号生成是MCU硬件电路实现的,不可以人工控制。
在某些内置TOM的MCU里,可以关闭ALE信号输出,以降低EMI
P1端口:通用I/0端口,准双向静态口
P0端口由于输出有三态功能,输入前,端口线已处于高阻态,无需先写入l后再作读操作
单片机复位后,各个端口已自动地被写入了1,此时,可直接作输入操作。如果在应用端口的过程中,已向P1一P3端口线输出过0,则再要输入时,必须先写1后再读引脚,才能得到正确的信息。此外,随输入指令的不同,H端口也有读锁存器与读引脚之分。
The range of valid index values for this macro is 0-65535.
/support/man/docs/c51/c51_xbyte.htm
上面的是在keil的help里ctrl+c来的,以前在论坛里看到过有人问如何用c语言实现定位存储,呵呵,当时还说不可能呢!现在在查找using的时候,无意中看到了XBYTE,点中看看,居然有大发现啊!
但是我想问的是,为什么用了XBYTE后,就不用顾及其时序了呢?
就是说,读写数据的时候,WR和RD怎么都不用用程序去控制了呢?
参考了很多读写外部RAM的程序,都找不到其控为什么嘛?
最好还能说说XBYTE具体的用法.....
答:
外部总线,
指定绝对地址的变量
在单一模块内可以使用下面的语法宣告
[memory_space] type variable_name _at_ location
范例
pdata char my_pdata _at_ 0x80;
如果该变量必须为多个模块所使用(Global Variable)则以
地址使能锁存信号
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
movx @dptr,a
上面3调语句的C语言可以表示如下
#define W_DATA XBYTE[0x1000]
W_DATA=0X55;
在使用外部总线的时候,数据 地址和控制信号是直接按照规定的时序输出高低电平的,所以不用你管,当然你必须要满足时序工作
一下摘自网友博客文章:
抽象指针(Abstract Pointer)的方式在标头档(Header File)定义较为方便。
#define variable_name *((data_type *) location)
如何理解#define XBYTE ((unsigned char volatile xdata *
8051 特有的内存型态
code 以 MOVC @A+DPTR 读取的程序内存
data 可以直接存取的内部数据存储器
idata 以 Mov @Rn 存取的内部数据存储器
在方式0中,串行端口作为输出时,只要向串行缓冲器SBUF写入一字节数据后,串行端口就把此8位数据以等的波特率,从RXD引脚逐位输出(从低位到高位);此时,TXD输出频率为fosc/12的同步移位脉冲。数据发送前,仅管不使用中断,中断标志TI还必须清零,8位数据发送完后,TI自动置1。如要再发送,必须用软件将TI清零。
(注意 sbit 前不可以加 static)
sfr 特殊功能缓存器(Special Function Register)
语法
sfr my_sfr = location; (location 范围从 0x80 ~ 0xFF)
范例
sfr P0 = 0x80;
相关文档
最新文档