第4章并行器件扩展技术4.1并行I/O口的扩展技术D414.2显示器接口技术D424.3键盘接口技术D434.4模拟量接口技术D44(一般不需要扩展并行的存储器了)4.1并行I/O口的扩展技术????4.1.1举例4.1.2总线与译码4.1.3简单I/O口扩展举例4.1.4可编程I/O口的扩展举例4.1.1举例D41_1.C??????????#include
#include#definePAXBYTE[0x7cff]#definePBXBYTE[0x7dff]#definePKXBYTE[0x7fff]voidmain(){PK=0x90;while(1){PB=PA;}}4.1.2总线与译码?1、51单片机的总线芯片一般的外部引脚:?????????并行存储器一般不需要扩展了。D7-D0:数据线,和单片机数据总线相连;A?-A0:地址线(不同的芯片,地址线的数量不一样)/RD:读允许/WR:写允许/CS:片选I/O:和外部设备相连的信号线,不同的芯片有不同的I/O线。扩展时:数据线------单片机的数据总线;读、写允许---CPU的读、写控制;I/O线---外部设备;A?-A0、片选---单片机的地址总线(系统扩展的寻址)2、译码—系统扩展的寻址?确定地址—--寻址?系统扩展的寻址是指,当单片机扩展了存储器、I/O口等外围接口芯片之后,如何确定存储器的地址空间范围和I/O口的端口地址。?◎地址是由地址线确定的。?◎低位地址线、剩余的高位地址线。?低位地址线参加片内译码,剩余的高位地址线参加片间译码。?线译码、译码器译码(1)线译码?所谓线译码是低位地址线用作I/O接口芯片的片内译码,剩余的高位地址线直接作为I/O接口芯片的片选,即一线选中。地址范围:(X为不用的地址线,设定为1)(2)译码器译码所谓译码器译码是低位地址线用作I/O接口芯片的片内译码,剩余的高位地址线接译码器的输入,译码器的输出接片选信号。3、地址的使用(绝对地址的访问)?包括片内RAM、片外RAM及I/O的访问。C51语言提供了两种比较常用的访问绝对地址的方法。?(1)绝对宏?用#include即可使用其中声明的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD,具体使用方法参考absacc.h头文件。其中:?????????CBYTE以字节形式对code区寻址;?CWORD以字形式对code区寻址;?DBYTE以字节形式对data区寻址;?DWORD以字形式对data区寻址;?XBYTE以字节形式对xdata区寻址;?XWORD以字形式对xdata区寻址;?PBYTE以字节形式对pdata区寻址;?PWORD以字形式对pdata区寻址。【例】片内RAM、片外RAM及I/O的定义示例???????????#include#definePAXBYTE[0xffec]//将PA定义为外部I/O口,地址为0xffec#defineNRAMDBYTE[0x40]/*将NRAM定义为片内RAM,地址为40H,长度为8位*/voidmain(){PA=0x3A;//将数据3AH写入地址为0xffec的外部I/O端口NRAM=0x01;//将数据01H写入片内RAM40H单元}?(2)_at_????????存储类型】数据类型变量名_at_地址号;如:dataunsignedcharx1_at_0x40;xdataunsignedintx2_at_0x2000;voidmain(){x1=0xff;x2=0x1234;}举例:将片外RAM6000开始的连续10个字节内容清零?xdataunsignedcharbuffer[10]_at_0x6000;??????voidmain(){unsignedcharindex;for(index=0;index<10;index++){buffer[index]=0;}}4.1.3简单I/O口扩展举例?例D41_2利用锁存器扩展输出口U3、U4的口地址分别为0BFFFH、7FFFH,下面给出将变量i1、i2内容通过锁存器输出程序??????????#include#include#defineU3XBYTE[0xBFFF]#defineU4XBYTE[0x7FFF]voidmain(){unsignedi1,i2;.........U3=i1;U4=i2;.......}74LS273资料:8位锁存器(D触发器)?如果在273的时钟有效时将单片机I/O引脚上的数据写入其中,则无论单片机I/O引脚上的数据如何变化,在下一个?时钟在之前,这个数据会被?“锁定”。?D7-D0:输入;Q7-Q0:输出;?CLK:时钟,在时钟的上升?沿将输入引脚的数据送到?输出端口;?MR:清除,地电平有效例D41_3使用三态门扩展输入口?U3、U4的口地址分别为0BFFFH、7FFFH,参考例D41_2可以给出将两个输入口的内容读入变量i1、i2。?i1=U3;?i2=U4;74LS244资料:8位三态门?当控制信号有效时,其输入和输出连接在一起,否则它可以看成输出引脚从连接到一起的其他电路上断开。?A0-A3:输入?Y0-Y3:输出?/OE:控制引脚,?高电平时,高阻。?(一个芯片中有两组)例41_4(将开关的状态在L上显示出来)????????#include#include#defineU3XBYTE[0x7FFF]#defineU4XBYTE[0x7FFF]voidmain(){while(1){U4=U3;}}4.1.4可编程I/O口的扩展举例?例D41_1??????????#include#include#definePAXBYTE[0x7cff]#definePBXBYTE[0x7dff]#definePKXBYTE[0x7fff]voidmain(){PK=0x90;while(1){PB=PA;}}8255A资料:(8255A是一种通用的可编程并行I/O接口芯片)?具有3个8位并行端口:PA口、PB口、PC口?3个端口分2组控制:A组控制A口和C口的上半部;B组控制B口和C口的下半部。?3种可编程工作方式:?方式0:基本输入/输出方式?方式1:选通输入/输出方式?方式2:双向总线方式(A口具有)外部引脚:?片选:/CS?读信号:/WR?写信号:/RD?端口选择:A1A0A1A000-----PA口01-----PB口10-----PC口11-----控制寄存器端口?8255有4个口地址:PA口、PB口、PC口、控制口8255A的控制字:方式控制字?如设置8255A工作于方式0,且PA口为输出、PB口为输出、PC口为输入,则控制字为:10001001B,即89H。PC口的置位/复位控制字?如:PC3置1,则控制字为:?00000111B,即07H硬件设计:?某51单片机应用系统,有一片8255A、一片74LS273、一片74LS244,试画出硬件电路,并写出各自的地址。?编程完成·:?将8255A的PA