51管脚及xbyte和at关键字.doc_第1页
51管脚及xbyte和at关键字.doc_第2页
51管脚及xbyte和at关键字.doc_第3页
51管脚及xbyte和at关键字.doc_第4页
51管脚及xbyte和at关键字.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

地址使能锁存信号在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。当访问外部存储器时,ALE作为锁存扩展地址的低8位字节的控制信号。当访问外部数据存储器时,ALE以十二分之一振荡频率输出正脉冲,同时这个引脚也是EPROM编程时的编程脉冲输入端。但是这个引脚还有一个非常有用的功能往往被很多人给忽视了,那就是当非访问外部数据存储器时,ALE以六分之一振荡频率固定输出正脉冲, 8051一个机器周期=6个状态周期=12个振荡周期,若采用6MHz的晶体振荡器,则ALE会发出1MHz的固定的正脉冲。因此它可以用来做外部时钟或定时。如果我们把这个功能应用与实际,可能给我们的设计带来简化,降低生产成本。ALE脚是在使用MOVX、MOVC指令时才会变成有效(这些指令都使用到外部RAM或ROM的地址。这些指令都有一个特点:地址和数据分时出现在P0口)。使用写程序时,要使用它有效,可用访问内部RAM地址的方法。如:uVariable=*(char *)0x12C),把0x12C地址的内容给uVariable变量。这个过程有效的脚为ALE、RD。这个信号线的信号生成是MCU硬件电路实现的,不可以人工控制。 在某些内置TOM的MCU里,可以关闭ALE信号输出,以降低EMIP1端口:通用I0端口,准双向静态口P0端口由于输出有三态功能,输入前,端口线已处于高阻态,无需先写入l后再作读操作单片机复位后,各个端口已自动地被写入了1,此时,可直接作输入操作。如果在应用端口的过程中,已向P1一P3端口线输出过0,则再要输入时,必须先写1后再读引脚,才能得到正确的信息。此外,随输入指令的不同,H端口也有读锁存器与读引脚之分。P1端口是8031单片机中唯一仅有的单功能IO端口,并且没有特定的专用功能,输出信号锁存在引脚上,故又称为通用静态口。因此P2端口是动态的IO端口。输出数据虽被锁存,但不是稳定地出现在端口线上。P2端口的主要特点包括:不能输出静态的数据;自身输出外部程序存储器的高8位地址;执行MOVX指令时,还输出外部RAM的高位地址,故称P2端口为动态地址端口。使P3端品各线处于第二功能的条件是:1串行I/O处于运行状态(RXD,TXD);2打开了处部中断(INT0,INT1);3定时器/计数器处于外部计数状态(T0,T1)4执行读写外部RAM的指令(RD,WR)在应用中,如不设定P3端口各位的第二功能(WR,RD信叼的产生不用设置),则P3端口线自动处于第一功能状态,也就是静态IO端口的工作状态。在更多的场合是根据应用的需要,把几条端口线设置为第二功能,而另外几条端口线处于第一功能运行状态。在这种情况下,不宜对P3端口作字节操作,需采用位操作的形式。端口的负载能力和输入输出操作:P0端口能驱动8个LSTTL负载。如需增加负载能力,可在P0总线上增加总线驱动器。P1,P2,P3端口各能驱动4个LSTTL负载。串行端口:MCS-51系列单片机片内有一个串行IO端口,通过引脚RXD(P30)和TXD(P31)可与外设电路进行全双工的串行异步通信。1串行端口的基本特点8031单片机的串行端口有4种基本工作方式,通过编程设置,可以使其工作在任一方式,以满足不同应用场合的需要。其中,方式0主要用于外接移位寄存器,以扩展单片机的IO电路;方式1多用于双机之间或与外设电路的通信;方式2,3除有方式l的功能外,还可用作多机通信,以构成分布式多微机系统。串行端口有两个控制寄存器,用来设置工作方式、发送或接收的状态、特征位、数据传送的波特率(每秒传送的位数)以及作为中断标志等。串行端口有一个数据寄存器SBUF(在特殊功能寄存器中的字节地址为99H),该寄存器为发送和接收所共同。发送时,只写不读;接收时,只读不写。在一定条件下,向阳UF写入数据就启动了发送过程;读SBUf就启动了接收过程。串行通信的波特率可以程控设定。在不同工作方式中,由时钟振荡频率的分频值或由定时器Tl的定时溢出时间确定,使用十分方便灵活。2串行端口的工作方式方式08位移位寄存器输入输出方式。多用于外接移位寄存器以扩展IO端口。波特率固定为fosc/12。其中,fosc为时钟频率。在方式0中,串行端口作为输出时,只要向串行缓冲器SBUF写入一字节数据后,串行端口就把此8位数据以等的波特率,从RXD引脚逐位输出(从低位到高位);此时,TXD输出频率为fosc/12的同步移位脉冲。数据发送前,仅管不使用中断,中断标志TI还必须清零,8位数据发送完后,TI自动置1。如要再发送,必须用软件将TI清零。串行端口作为输入时,RXD为数据输入端,TXD仍为同步信号输出端,输出频率为fosc/12的同步移位脉冲,使外部数据逐位移入RxD。当接收到8位数据(一帧)后,中断标志RI自动置。如果再接收,必须用软件先将RI清零。2串行端口的工作方式方式08位移位寄存器输入输出方式。多用于外接移位寄存器以扩展IO端口。波特率固定为fosc/12。其中,fosc为时钟频率。在方式0中,串行端口作为输出时,只要向串行缓冲器SBUF写入一字节数据后,串行端口就把此8位数据以等的波特率,从RXD引脚逐位输出(从低位到高位);此时,TXD输出频率为fosc/12的同步移位脉冲。数据发送前,仅管不使用中断,中断标志TI还必须清零,8位数据发送完后,TI自动置1。如要再发送,必须用软件将TI清零。串行端口作为输入时,RXD为数据输入端,TXD仍为同步信号输出端,输出频率为fosc/12的同步移位脉冲,使外部数据逐位移入RxD。当接收到8位数据(一帧)后,中断标志RI自动置。如果再接收,必须用软件先将RI清零。(转自网络)关于C51的XBYTE工作 2009-07-14 17:38:05 阅读504 评论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 absacc.h /* 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 上面的是在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的程序中,经常看到这样的句子: 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 标准链接库中称为 init.a51 的程序模块。而 init.a51 的主要工作则是初始化具有非零初始值设定的变量。 在完成上述的初始化程序之后,80C51 的控制权才会交给 main() 开始执行使用者的程序。#define XBYTE (unsigned char volatile xdata *) 0)定义 XBYTE 为 指向 xdata 地址空间unsigned char 数据类型的指针,指针值为0这样,可以直接用XBYTE0xnnnn或*(XBYTE+0xnnnn)访问外部RAM了本文来自CSDN博客,转载请标明出处:/xb_crazyman/archive/2008/10/15/3081731.aspx 知道的:问:请大家看下面这段程序# define ADCOM XBYTE 0xff7c /* 使A0=0 ,R/C=0, CS=0 */# define ADLO XBYTE 0xff7f /* 使 R/C =1,A0=1, CS=0 */# define ADHI XBYTE 0xff7d /* 使R/C=1,A0=0,CS =0 */本人一直理解是ADCOM是一个指针,指针指向的地址为0xff7c,完事可以通过对ADCOM的操作来更改地址0xff7c内变量的值,但是为何同时在宏定义后,相应的注释里会是同时初始化某值的作用呢? 问题补充:那在问下像0xff7c这些地址,是应该怎样和外部电路相配合呢?是说地址可以随便写么?答:XBYTE定义的是外部地址,这样才能和接到你的IO口上的器件通信关于你的不充问题:你把0xff7c展开成二进制形式就全明白了,0xff7c的二进制是:1111,1111,0111,1100再结合后面的注释可知外部电路管脚的对应关系为:CSP1.7A0P1.1R/CP1.0用XBYTE定义的目的是将外部电路不同的功能编程不同的地址而已这样就可以在程序里面通过直接对地址附置,就能使外部电路实现需要的功能,这样做还有一个好处就是在编译的时候会产生 MOVX 指令,这样可以操作WR和RD引脚,以实现特定的功能至于用XBYTE定义的地址是多少就得根据实际的外围电路的连接来确定,不是随便写的 keil xbyte cbyte 等宏以及 _at_2010-08-07 09:57以下皆节选自官网:/support/man/docs/c51/c51_ap_at.htmThe _at_ keyword allows you to specify the address for uninitialized variables in your C source files. The following example demonstrates how to locate several different variable types using the _at_ keyword.struct link struct link idata *next; char code *test;struct link idata list _at_ 0x40; /* list at idata 0x40 */char xdata text256 _at_ 0xE000; /* array at xdata 0xE000 */int xdata i1 _at_ 0x8000; /* int at xdata 0x8000 */char far ftext256 _at_ 0x02E000; /* array at xdata 0x03E000 */void main ( void ) link.next = (void *) 0; i1 = 0x1234; text 0 = a; ftext0 = f;Refer to Absolute Variable Location for more information about the _at_ keyword.NoteWith Dallas Contiguous Mode it is impossible to locate arrays above 0x7F0000. If you use the _at_ keyword to declare a variable that accesses an XDATA peripheral, you may require the volatile keyword to ensure that the C compiler does not optimize out necessary memory accesses. When the _at_ keyword is used to locate far variables, the most significant byte of the specified address is converted into a memory type byte to determine the location of the object. /support/man/docs/c51/c51_xbyte.htmThe 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 */.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.51单片?/strongC语言学习笔记4?/strongkeil C51绝对地址访问在利用keil进行8051单片编程的时,常常需要进行绝对地址进行访问.特别是对硬件操作,如DA AD 采样 ,LCD 液晶操作,打印操作.等等.C51提供了三种访问绝对地址的方法: 1. 绝对宏: 在程序中,用“includeabsacc.h”即可使用其中定义的宏来访问绝对地址,包括: CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 具体使用可看一看absacc.h便知 例如?/p includeabsacc.h#define ADstart XBYTE0x8000 /总线方式访问AD#define ADL XBYTE0x8000#define ADH XBYTE0x8001 rval=CBYTE0x0002;指向程序存贮器的0002h地址 rval=XWORD 0x0002;指向外RAM?004h地址 2. _at_关键字直接在数据定义后加上_at_ const即可,但是注意: (1)绝对变量不能被初使化?(2)bit型函数及变量不能用_at_指定?例如?idata struct link list _at_ 0x40;指定list结构?0h开始?xdata char text25b _at_0xE000;指定text数组?E000H开?提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h?3. 连接定位控制 此法是利用连接控制指令code xdata pdata data bdata?ldquo;?rdquo;地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论?(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 volat

温馨提示

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

评论

0/150

提交评论