1 / 57

问题的提出

在单片机应用系统的设计中 , 往往出现 RAM, ROM 或者 I/O 口不够的情况,怎么办?. ROM 的扩展. RAM 的扩展. I/O 口的扩展. 问题的提出. 第 8 章 单片机小系统及片外扩展. 系统扩展. 1 、扩展系统是以单片机为核心进行的; 2 、扩展内容包括 ROM 、 RAM 、和 I/O 接口电路等; 3 、扩展是通过 系统总线 进行的,通过总线把各扩展部件连接起来,并进行数据、地址和信号的传送,要实现扩展首先要构造系统总线。 ( 尽可能采用串行扩展方案 ). 本章内容.

fruma
Download Presentation

问题的提出

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 在单片机应用系统的设计中,往往出现RAM, ROM或者I/O口不够的情况,怎么办? ROM的扩展 RAM的扩展 I/O口的扩展 问题的提出

  2. 第8章 单片机小系统及片外扩展

  3. 系统扩展 1、扩展系统是以单片机为核心进行的; 2、扩展内容包括ROM、RAM、和I/O接口电路等; 3、扩展是通过系统总线进行的,通过总线把各扩展部件连接起来,并进行数据、地址和信号的传送,要实现扩展首先要构造系统总线。 (尽可能采用串行扩展方案)

  4. 本章内容 • 8.1 串行扩展总线接口技术 • 8.2 并行扩展三总线的产生 • 8.3 程序存储器的扩展 • 8.4 数据存储器的扩展 • 8.5 I/O口接口扩展电路设计

  5. 8.1 串行扩展总线接口技术 • SPI串行外设接口总线:同步串行3线方式 • I2C总线:同步串行2线 • 单总线:采用单根信号线,既可作为数据输入,又可以作为输出,而且数据传输是双向的,适用于单主机系统 • CAN总线:多主竞争式的串行数据通信协议,实时,特别适合工业过程监控设备的互连,最有前途的现场总线之一 。需CAN控制器

  6. SPI串行外设接口总线 • 同步串行方式 • 需3~4条线:串行时钟线(SCK)、 主机输入/从机输出数据线MISO、 主机输出/从机输入MOSI、 从机片选线CS • 许多外设都具有SPI接口,如FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器等

  7. 89C51单片机串行扩展SPI外设接口的方法 • 用一般I/O口线模拟SPI操作 • 利用串行口实现SPI操作

  8. 用一般I/O口线模拟SPI操作 • 根据SPI串行总线的操作时序特点 ,进行软件模拟 X25F008(E2PROM)

  9. X25F008具有SPI接口,且在SCK的上升沿接收数据,在下降沿发送数据。则MCU在下降沿时接收数据。X25F008具有SPI接口,且在SCK的上升沿接收数据,在下降沿发送数据。则MCU在下降沿时接收数据。 MCU串行输入子程序SPIIN SPIIN: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位数据送R0 RET

  10. MCU串行输出子程序SPIOUT 将MCS-51单片机中R0寄存器的内容传送到X25F008的SPISI线上的程序如下: SPIOUT:SETBP1.1;使P1.1(时钟)输出为1 CLRP1.2;选择从机 MOVR1,#08H;置循环次数 MOVA,R0;8位数据送累加器ACC SPIOUT1:CLRP1.1;使P1.1(时钟)输出为0 NOP;延时 NOP RLCA;左移至累加器ACC最高位至C MOVP1.0,C;进位C送从机输入SPISI线上 SETBP1.1;使P1.1(时钟)输出为1 DJNZR1,SPIOUT1;判是否循环8次(8位数据) RET

  11. MCU串行输入/输出子程序SPIIO 将MCS-51单片机R0寄存器的内容传送到X25F008的SPI SI中,同时从X25F008的SPI SO接收8位数据的程序如下: SPIIO:SETBP1.1;使P1.1(时钟)输出为1 CLRP1.2;选择从机 MOVR1,#08H;置循环次数 MOVA,R0;8位数据送累加器ACC SPIIO1:CLRP1.1;使P1.1(时钟)输出为0 NOP;延时 NOP MOVC,P1.3;从机输出SPISO送进位C RLCA;左移至累加器ACC最高位至C MOVP1.0,C;进位C送从机输入 SETBP1.1;使P1.1(时钟)输出为1 DJNZR1,SPIIO1;判断是否循环8次(8位数据) RET

  12. X1 89C51 TXD SCLK I/O RST 32kHz RXD X2 P1.0 利用串行口实现SPI操作 串行时钟芯片HT1380与89C51接口电路

  13. 利用51单片机串口扩展SPI口的特点 • 需要通过单片机的开关量I/O口线进行芯片选择; • 当芯片未选中时,数据端口均处于高阻状态; • 与单片机交换信息时均要求单片机串行口以方式0进行; • 传输数据时的桢格式局要求先传送命令/地址,再传送数据。 因为In/Out共享一个RXD线,需先识别读/写

  14. I2C总线 • 同步串行 • 需两根信号线:数据线SDA和时钟线SCL。 • 纯软件的寻址方法(故无需片选线) • 支持多主控(multimastering) 由PHILIPS公司开发的两线式串行总线。

  15. 常用I2C外围器件 • SRAM • EPROM • ADC/DAC • RTC • I/O等 支持热插拔

  16. 单片机A 专用集成电路 液晶显示驱动器 I2C总线 A/D、D/A转换器 静态RAM或EEPROM SDA SCL 单片机B 图8-9 I2C总线典型系统示意图

  17. 总线上每一个节点都有一个固定的节点地址 • 主机发送的第一个字节为寻址字节 • 数据传输需遵循规定的传输格式

  18. I2C总线寻址字节 • 在起始信号之后,必须是器件的寻址字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作

  19. I2C总线基本操作 • I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。

  20. I2C总线在传送数据过程中典型信号 • 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 • 结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。 • 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。

  21. Vcc 具有I2C总线 接口的外设 SCL SDA 51单片机 P1.6 P1.7 51单片机与I2C总线的接口 对不带I2C接口的51单片机,若去控制总线,只需两个I/O口线,用软件模拟数据传送典型信号时序。如起始位、终止位、应答位、非应答位、发送字节、接收字节等。 数据传送模拟程序,包括: 应答位检查子程序,发送一字节子程序,接收一字节子程序,发送N字节子程序,接收N字节子程序。

  22. P210 启动 I2C总线子程序STA void I2C_Start(void)     {         /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/         SDA=1;         SCL=1;         DELAY(DELAY_TIME);         SDA=0;         DELAY(DELAY_TIME);         SCL=0;         DELAY(DELAY_TIME);     }

  23. P210 停止 I2C总线子程序STOP void I2C_Stop(void)     {         /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/         SDA=0;         SCL=1;         DELAY(DELAY_TIME);         SDA=1;         DELAY(DELAY_TIME);         SCL=0;         DELAY(DELAY_TIME);     }

  24. 发送应答位ACK  void SEND_0(void)   /* SEND ACK */     {         /*发送0,在SCL为高电平时使SDA信号为低*/         SDA=0;         SCL=1;         DELAY(DELAY_TIME);         SCL=0;         DELAY(DELAY_TIME);     }

  25. 发送非应答位MNACK  void SEND_1(void)     {         /*发送1,在SCL为高电平时使SDA信号为高*/         SDA=1;         SCL=1;         DELAY(DELAY_TIME);         SCL=0;         DELAY(DELAY_TIME);     }

  26. 应答位检查子程序CACK • bit Check_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)             return FALSE;         return TRUE;     }

  27. 从I2C总线读一个字节RDBYT char ReadI2CByte(void)     {         /*从I2C总线读一个字节*/         char b=0,i;         for(i=0;i<8;i++)         {             SDA=1;    /*释放总线*/             SCL=1;    /*接受数据*/             DELAY(10);             F0=SDA;             DELAY(10);             SCL=0;             if(F0==1)                 {                     b=b<<1;                     b=b|0x01; }             else                 b=b<<1;         }         return b;     }

  28. 向I2C总线写一个字节 void WriteI2CByte(char b)     {         /*向I2C总线写一个字节*/         char i;         for(i=0;i<8;i++)             if((b<<i)&0x80)                 SEND_1();             else                 SEND_0();     }

  29. 向24c02 (I2C EEPROM)发送一字节的模拟子程序 • void Write_One_Byte(char addr,char thedata) {           bit acktemp=1;           /*write a byte to mem*/           I2C_Start();           WriteI2CByte(0xa0);           acktemp=Check_Acknowledge();           WriteI2CByte(addr);/*address*/           acktemp=Check_Acknowledge();           WriteI2CByte(thedata);/*thedata*/           acktemp=Check_Acknowledge();           I2C_Stop(); }

  30. 读取一字节的模拟子程序 char Read_One_Byte(char addr){         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();           return mydata;          I2C_Stop();}

  31. 8.2 并行扩展三总线的产生 地址总线AB——P2,P0(373锁存器) 数据总线DB——P0 控制总线CB——ALE, , , 程序存储器 RAM,I/O

  32. 8051有片内ROM的容量:4K • 片外最大可扩展64K ROM。 • 有关的管脚:EA 可用来扩展的存储器芯片: EPROM:2716(2K*8),2732,2764,27256等 EEPROM:2816 (2K*8) ,2864,28128等 • 还要用到锁存器芯片:例74LS373。 8.3 程序存储器的扩展 片内资源

  33. 访问程序存储器的控制信号 • ALE :指示74LS373锁存低8位地址 • :用于选通片外程序存储器,接片外ROM的 引脚 • :CPU读取片内/片外程序存储器的控制信号。高电平访问片内存储器,低电平访问片外存储器。

  34. A11 A8 A7 A0 2732 O7 O0 OE CE ``` ``` P2.3 P2.0 P0.7 89C51P0.0 ALE PSEN 12根地址线 ``` ``` 8根数据线 . . . 控制线 EPROM扩展实例----在89C51单片机上扩展4KB EPROM D7 Q7 373 D0 Q0 G

  35. ALE PSEN 读外部程序存储器时序 一个机器周期 送地址 取出指令 注意:上述时序是在取指令过程中自动产生

  36. 地址范围的确定 • 取决于CE(片选)和地址线的接法,本例中CE接地。请确定地址范围 • 要求根据电路图,确定其中EPROM的地址范围。 • 注意:当同时扩展多片ROM时,可采用译码法或线选法来分别选中芯片,每个芯片分配的地址范围不同。

  37. 程序存储器扩展举例

  38. 74LS373是带三态输出的地址锁存器。三态控制端 接地,以保持输出常通,cp(G)端接8031的ALE引脚,每当ALE端的电平产生复跳变时, 74LS373锁存低8位地址线,并输出供2764使用。 • 2764是8K*8bit的EPROM,有13根地址线(A12~A0),2764的片选信号 由P2.5送出,低电平有效, 端与8031的 引脚信号相连接,当 信号有高电平变成低电平时,允许2764输出。

  39. 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

  40. 利用译码器选通存储器 接地,常有效 地址:4000H ~ 7FFFH 存储器地址线14条,容量16K 全译码,地址不重叠

  41. 当A15=0时,选通139,A14A13=00,1#01,2#10,3# 0010 0000 0000 0000-0011 1111 1111 1111 4000-5FFF 2000-3FFF 0000-1FFF

  42. 8.4 数据存储器的扩展 • 静态RAM:6116,6264,62256,62128 地址线、数据线、控制线 由CPU地址线或经译码器选通,并获得地址; 由CPU (P3.7)选通; 由CPU (P3.6)选通。 当CPU执行输入/输出指令MOVX时, 、 有效 • E2PROM:2816,2817,2864A。

  43. ALE PSEN 访问ROM,取出MOVX指令 送地址 访问RAM读/写数据 读/写外部数据存储器时序 一个机器周期 一个机器周期 RD/WR 注意:上述红色线时序是在执行MOVX 指令情况下

  44. 扩展注意的问题: • 读写控制 • 片选控制 • 地址的分配: 地址是一个范围空间

  45. A10 A8 A7 A0 6116 O7 O0 RD WR CE P2.2 P2.0 P0.7 8051 P0.0 ALE RD WR P2.7 . . RAM扩展实例----在8051单片机上扩展2K RAM D7 Q7 373 D0 G Q0

  46. 扩展存储器举例(PM,DM) 32K,A15(P 2.7)选通,地址:0000H-7FFFH

  47. 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 8.5 I/O口接口扩展电路设计 • 51单片机有4组并口P0-P3,为什么还要扩展I/O口? 常用的扩展方法有: • 简单的I/O口扩展 • 可编程I/O口芯片 • 利用串行口扩展并行口 串口工作在什么方式?

  48. 简单I/O口扩展 • 用并行口扩展I/O口 选择TTL电路或MOS电路即能组成简单的扩展I/O口。 如:用8位三态缓冲器74LS244可扩展输入口; 用8D锁存器74LS273、74LS373、74LS377 等可组成输出口。

More Related