1、问题的提出,在单片机应用系统的设计中,往往出现RAM, ROM或者I/O口不够的情况,怎么办?,ROM的扩展,RAM的扩展,I/O口的扩展,第8章 单片机小系统及片外扩展,系统扩展,1、扩展系统是以单片机为核心进行的;2、扩展内容包括ROM、RAM、和I/O接口电路等;3、扩展是通过系统总线进行的,通过总线把各扩展部件连接起来,并进行数据、地址和信号的传送,要实现扩展首先要构造系统总线。 (尽可能采用串行扩展方案),本章内容,8.1 串行扩展总线接口技术8.2 并行扩展三总线的产生8.3 程序存储器的扩展8.4 数据存储器的扩展8.5 I/O口接口扩展电路设计,8.1 串行扩展总线接口技术,S
2、PI串行外设接口总线:同步串行3线方式I2C总线:同步串行2线单总线:采用单根信号线,既可作为数据输入,又可以作为输出,而且数据传输是双向的,适用于单主机系统CAN总线:多主竞争式的串行数据通信协议,实时,特别适合工业过程监控设备的互连,最有前途的现场总线之一 。需CAN控制器,SPI串行外设接口总线,同步串行方式需34条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、 主机输出/从机输入MOSI、从机片选线CS许多外设都具有SPI接口,如FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器等,89C51单片机串行扩展SPI外设接口的方法,用一般I/O口线模拟SPI操作利用
3、串行口实现SPI操作,用一般I/O口线模拟SPI操作,根据SPI串行总线的操作时序特点 ,进行软件模拟,X25F008(E2PROM),MCU串行输入子程序SPIINSPIIN:SETB P1.1 ;使P1.1(时钟)输出为1 CLR P1.2 ;选择从机 MOV R1,#08H ;置循环次数SPIIN1:CLR P1.1 ;使P1.1(时钟)输出为0 NOP ;延时 NOP MOV C,P1.3 ;从机输出SPISO送进位C RLC A ;左移至累加器ACC SETB P1.1 ;使P1.1(时钟)输出为1 DJNZ R1,SPIIN1 ;判断是否循环8次(8位数据) MOV R0,A ;8
4、位数据送R0 RET,X25F008具有SPI接口,且在SCK的上升沿接收数据,在下降沿发送数据。则MCU在下降沿时接收数据。,MCU串行输出子程序SPIOUT,将MCS-51单片机中R0寄存器的内容传送到X25F008的SPISI线上的程序如下:SPIOUT:SETBP1.1;使P1.1(时钟)输出为1CLRP1.2;选择从机MOVR1,#08H;置循环次数MOVA,R0;8位数据送累加器ACCSPIOUT1:CLRP1.1;使P1.1(时钟)输出为0NOP;延时NOPRLCA;左移至累加器ACC最高位至CMOVP1.0,C;进位C送从机输入SPISI线上SETBP1.1;使P1.1(时钟)
5、输出为1DJNZR1,SPIOUT1;判是否循环8次(8位数据)RET,MCU串行输入/输出子程序SPIIO,将MCS-51单片机R0寄存器的内容传送到X25F008的SPISI中,同时从X25F008的SPISO接收8位数据的程序如下:SPIIO:SETBP1.1;使P1.1(时钟)输出为1CLRP1.2;选择从机MOVR1,#08H;置循环次数MOVA,R0;8位数据送累加器ACCSPIIO1:CLRP1.1;使P1.1(时钟)输出为0NOP;延时NOPMOVC,P1.3;从机输出SPISO送进位CRLCA;左移至累加器ACC最高位至CMOVP1.0,C;进位C送从机输入SETBP1.1;
6、使P1.1(时钟)输出为1DJNZR1,SPIIO1;判断是否循环8次(8位数据)RET,利用串行口实现SPI操作,串行时钟芯片HT1380与89C51接口电路,需要通过单片机的开关量I/O口线进行芯片选择;当芯片未选中时,数据端口均处于高阻状态;与单片机交换信息时均要求单片机串行口以方式0进行;传输数据时的桢格式局要求先传送命令/地址,再传送数据。,因为In/Out共享一个RXD线,需先识别读/写,利用51单片机串口扩展SPI口的特点,I2C总线,同步串行需两根信号线:数据线SDA和时钟线SCL。纯软件的寻址方法(故无需片选线)支持多主控(multimastering),由PHILIPS公司
7、开发的两线式串行总线。,常用I2C外围器件,SRAMEPROMADC/DACRTCI/O等支持热插拔,图8-9 I2C总线典型系统示意图,总线上每一个节点都有一个固定的节点地址主机发送的第一个字节为寻址字节数据传输需遵循规定的传输格式,I2C总线寻址字节,在起始信号之后,必须是器件的寻址字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作,I2C总线基本操作,I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发
8、送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。,I2C总线在传送数据过程中典型信号,开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。,51单片机与I2C总线的接口,对不带I2C接口的51单片机,若去控制总线,只
9、需两个I/O口线,用软件模拟数据传送典型信号时序。如起始位、终止位、应答位、非应答位、发送字节、接收字节等。数据传送模拟程序,包括: 应答位检查子程序,发送一字节子程序,接收一字节子程序,发送N字节子程序,接收N字节子程序。,P210 启动 I2C总线子程序STA,voidI2C_Start(void) /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/ SDA=1; SCL=1; DELAY(DELAY_TIME); SDA=0; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); ,P210 停止 I2C总线子程序STOP,void
10、I2C_Stop(void) /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/ SDA=0; SCL=1; DELAY(DELAY_TIME); SDA=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); ,发送应答位ACK,voidSEND_0(void)/*SENDACK*/ /*发送0,在SCL为高电平时使SDA信号为低*/ SDA=0; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); ,发送非应答位MNACK,voidSEND_1(void) /*发送1,在SCL为高电平
11、时使SDA信号为高*/ SDA=1; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); ,应答位检查子程序CACK,bitCheck_Acknowledge(void) /*发送完一个字节后检验设备的应答信号*/ SDA=1; 置SDA为输入方式SCL=1; 使SDA上数据有效 DELAY(DELAY_TIME/2); F0=SDA; DELAY(DELAY_TIME/2); SCL=0; DELAY(DELAY_TIME); if(F0=1) returnFALSE; returnTRUE; ,从I2C总线读一个字节RDBYT,charR
12、eadI2CByte(void) /*从I2C总线读一个字节*/ charb=0,i; for(i=0;i8;i+) SDA=1;/*释放总线*/ SCL=1;/*接受数据*/ DELAY(10); F0=SDA; DELAY(10); SCL=0; if(F0=1) b=b1; b=b|0x01; else b=b1; returnb; ,voidWriteI2CByte(charb) /*向I2C总线写一个字节*/ chari; for(i=0;i8;i+) if(bi) ,向I2C总线写一个字节,voidWrite_One_Byte(charaddr,charthedata) bitac
13、ktemp=1; /*writeabytetomem*/ I2C_Start(); WriteI2CByte(0xa0); acktemp=Check_Acknowledge(); WriteI2CByte(addr);/*address*/ acktemp=Check_Acknowledge(); WriteI2CByte(thedata);/*thedata*/ acktemp=Check_Acknowledge(); I2C_Stop(); ,向24c02 (I2C EEPROM) 发送一字节的模拟子程序,读取一字节的模拟子程序,char Read_One_Byte(char addr)
14、 bit acktemp=1; char mydata; /*read a byte from mem*/ I2C_Start(); WriteI2CByte(0xa0);启动总线 acktemp=Check_Acknowledge(); WriteI2CByte(addr);/*address*/ acktemp=Check_Acknowledge(); I2C_Start(); WriteI2CByte(0xa1); 重新启动总线 acktemp=Check_Acknowledge(); mydata=ReadI2CByte(); acktemp=Check_Acknowledge();
15、return mydata; I2C_Stop();,地址总线ABP2,P0(373锁存器)数据总线DBP0控制总线CBALE, , ,,程序存储器,RAM,I/O,8.2 并行扩展三总线的产生,片内资源,可用来扩展的存储器芯片:EPROM:2716(2K*8),2732,2764,27256等EEPROM:2816 (2K*8) ,2864,28128等还要用到锁存器芯片:例74LS373。,8.3 程序存储器的扩展,访问程序存储器的控制信号,ALE :指示74LS373锁存低8位地址 :用于选通片外程序存储器,接片外ROM的 引脚 :CPU读取片内/片外程序存储器的控制信号。高电平访问片内
16、存储器,低电平访问片外存储器。,EPROM扩展实例-在89C51单片机上扩展4KB EPROM,D7 Q7 373D0 Q0 G,读外部程序存储器时序,注意:上述时序是在取指令过程中自动产生,一个机器周期,送地址,取出指令,地址范围的确定,取决于CE(片选)和地址线的接法,本例中CE接地。请确定地址范围要求根据电路图,确定其中EPROM的地址范围。注意:当同时扩展多片ROM时,可采用译码法或线选法来分别选中芯片,每个芯片分配的地址范围不同。,程序存储器扩展举例,74LS373是带三态输出的地址锁存器。三态控制端 接地,以保持输出常通,cp(G)端接8031的ALE引脚,每当ALE端的电平产生复
17、跳变时, 74LS373锁存低8位地址线,并输出供2764使用。2764是8K*8bit的EPROM,有13根地址线(A12A0),2764的片选信号 由P2.5送出,低电平有效, 端与8031的 引脚信号相连接,当 信号有高电平变成低电平时,允许2764输出。,0000 0000 0000 0000-0001 1111 1111 11110100 0000 0000 0000-0101 1111 1111 11111000 0000 0000 0000-1001 1111 1111 11111100 0000 0000 0000-1101 1111 1111 1111,地址范围,P2.5,利
18、用译码器选通存储器,接地,常有效,存储器地址线14条,容量16K全译码,地址不重叠,地址:4000H 7FFFH,当A15=0时,选通139,A14A13=00,1 01,2 10,3,0010 0000 0000 0000-0011 1111 1111 1111,2000-3FFF,0000-1FFF,4000-5FFF,8.4 数据存储器的扩展,静态RAM:6116,6264,62256,62128地址线、数据线、控制线 由CPU地址线或经译码器选通,并获得地址; 由CPU (P3.7)选通; 由CPU (P3.6)选通。 当CPU执行输入/输出指令MOVX时, 、 有效E2PROM:28
19、16,2817,2864A。,读/写外部数据存储器时序,一个机器周期,一个机器周期,RD/WR,注意:上述红色线时序是在执行MOVX 指令情况下,扩展注意的问题:读写控制片选控制地址的分配: 地址是一个范围空间,RAM扩展实例-在8051单片机上扩展2K RAM,D7 Q7 373D0 G Q0,扩展存储器举例(PM,DM),32K,A15(P 2.7)选通,地址:0000H-7FFFH,常用的扩展方法有: 简单的I/O口扩展可编程I/O口芯片利用串行口扩展并行口,51单片机有4组并口P0-P3,为什么还要扩展I/O口?,8.5 I/O口接口扩展电路设计,串口工作在什么方式?,简单I/O口扩展
20、,用并行口扩展I/O口 选择TTL电路或MOS电路即能组成简单的扩展I/O口。如:用8位三态缓冲器74LS244可扩展输入口; 用8D锁存器74LS273、74LS373、74LS377 等可组成输出口。,简单I/O扩展接口,口地址的确定及编程应用,因为74LS273和74LS244都是在P2.0为0时被选通,所以二者地址都可以为FEFFH。两个芯片的地址虽然相同,但可以通过读写操作来区别编程应用如下:MOV DPTR,#0FEFFH ;指向口地址MOVX A,DPTR ;指向74LS244读入数据,检测按键MOVX DPTR,A ;指向74LS273输出数据,驱动LEDSJMP $,可编程I
21、/0芯片的使用,可编程I/O芯片是指芯片功能可由指令来确定,即需要对其编程。常用的I/O口芯片有8255和8155。,8155的结构和技术性能,在8155内部具有:(1)256字节的静态RAM(2)三个通用的输入/输出口(3)一个14位的可编程定时/计数器(4)地址锁存器和数据总线,MCS-51单片机与8155的接口与操作,片内RAM0000H00FFH,设置8155工作方式,PB PA,(A/B口方式):0输入,1输出,PC2 PC1,IEB IEA,(A/B口中断):0禁止中断,1允许中断,TM2 TM1,设置8155工作方式示例,设置A、B口为基本输出方式,C口为基本输入方式。,设置方法:MOV DPTR,#CWR ;设CWR为命令寄存器的地址。MOV A,#03H ;A、B口为基本输出方式,C口 ;为基本输入方式MOVX DPTR,A ;写控制字,NOTE:在使用8155前必须设置好工作方式,否则将无法正常工作。,