Download presentation
Presentation is loading. Please wait.
1
单片机原理及应用 (C语言版) 第8章 单片机系统扩展
主 编:周国运 本章制作:赵天翔 中国水利水电出版社
2
第8章 单片机系统扩展 目 录 8.1 扩展并行三总线 8.2 扩展简单并行输入/输出口 8.3 扩展并行数据存储器
第8章 单片机系统扩展 目 录 8.1 扩展并行三总线 8.2 扩展简单并行输入/输出口 8.3 扩展并行数据存储器 8.4 串行扩展总线接口技术
3
第8章 单片机系统扩展 本章主要介绍了MCS-51单片机系统扩展的方法。通过扩展并行三总线来进行并行总线接口扩展;通过UART或I/O口模拟几种串行通信的特点来进行串行总线接口扩展。
4
8.1 扩展并行三总线 主要内容 片外三总线结构 MCS-51系统扩展的实现 总线驱动
5
8.1.1 片外三总线结构 通常,微机的CPU外部都有单独的并行地址总线、数据总线、控制总线。
片外三总线结构 通常,微机的CPU外部都有单独的并行地址总线、数据总线、控制总线。 MCS-51单片机由于引脚的限制,数据总线和地址总线是复用的。 地址需要锁存:为了能把复用的数据总线和地址总线分离出来以便同外部的芯片正确的连接,需要在单片机的外部增加地址锁存器,从而构成与一般CPU相类似的三总线结构,如图8-1所示。
6
图8-1 89C52扩展的三总线 A8~A15 P2 地址总线 ALE 地址 A0~A7 锁存器 P0 D0~D7 数据总线 89C52
片外三总线结构 A8~A15 P2 地址总线 ALE 地址 锁存器 A0~A7 P0 D0~D7 数据总线 89C52 PSEN 控制总线 WR RD 图 C52扩展的三总线
7
地址锁存器74HC573与单片机P0口连接,扩展地址总线,如图8-2所示。
片外三总线结构 地址锁存器74HC573与单片机P0口连接,扩展地址总线,如图8-2所示。 ALE P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 LE OE 8D 8Q 7D 7Q 6D 6Q 5D 5Q 4D 4Q 3D 3Q 2D 2Q 1D 1Q A7 A6 A5 A4 A3 A2 A1 A0 89C52 74HC573 图8-2 地址总线扩展电路
8
74HC573是有输出三态门的电平允许8位锁存器。引脚信号如下: OE:输出允许端,为0时芯片有效。
片外三总线结构 74HC573简介 74HC573是有输出三态门的电平允许8位锁存器。引脚信号如下: OE:输出允许端,为0时芯片有效。 LE:锁存控制端,高电平时,锁存器的数据输出端Q的状态,与数据输入端D相同,即锁存器是透明的;当LE端从高电平返回到低电平时(下降沿后),输入端的数据就被锁存在锁存器中,数据输入端D的变化不再影响Q端。
9
地址总线(Address Bus,AB)用于传送单片机送出的地址信号,以便进行存储器单元和I/O端口的选择。
片外三总线结构 一、地址总线 地址总线(Address Bus,AB)用于传送单片机送出的地址信号,以便进行存储器单元和I/O端口的选择。 地址总线是单向的,只能由单片机向外发送信息。 地址总线的数目决定了可直接访问的存储单元的数目。
10
三、控制总线 二、数据总线 数据总线(Data Bus,DB)用于单片机与存储器或I/O端口之间的数据传送。
片外三总线结构 二、数据总线 数据总线(Data Bus,DB)用于单片机与存储器或I/O端口之间的数据传送。 一般数据总线的位数与CPU的字长一致,MCS-51单片机的数据总线是8位的。 数据总线是双向的,可以进行两个方向的数据传送。 三、控制总线 控制总线(Control Bus,CB)是单片机发出的以控制片外ROM、RAM和I/O口读/写操作的一组控制线。
11
8.1.2 MCS-51系统扩展的实现 一、以P0口作低8位地址及8位数据的复用总线 复用,即一段时间内作两种或两种以上用途。
在这里指P0口在每个CPU周期的前半个周期输出低8位地址,由地址锁存器锁存,然后由地址锁存器代替P0口输出低8位地址。后半个周期进行8位数据的输入输出。
12
二、以P2口作为高8位的地址总线 P0口的低8位地址加上P2的高8位地址就可以形成16位的地址总线,达到64KB的寻址能力。
MCS-51系统扩展的实现 二、以P2口作为高8位的地址总线 P0口的低8位地址加上P2的高8位地址就可以形成16位的地址总线,达到64KB的寻址能力。 实际应用中,往往不需要扩展那么多地址,扩展多少用多少口线,剩余的口线仍可作一般I/O口来使用。
13
三、控制信号线 ALE:地址锁存信号,用以实现对低8位地址的锁存。 PSEN:片外程序存储器读选通信号。
MCS-51系统扩展的实现 三、控制信号线 ALE:地址锁存信号,用以实现对低8位地址的锁存。 PSEN:片外程序存储器读选通信号。 EA:程序存储器选择信号。为低电平时,访问外部程序存储器;为高电平时,访问内部程序存储器。 WR:片外数据存储器写选通信号。 RD:片外数据存储器读选通信号。
14
总线驱动 总线驱动的原因:在单片机应用系统中,扩展的三总线上挂接很多负载,如存储器、并行接口、A/D接口、显示接口等,但总线接口的负载能力有限,因此常常需要通过连接总线驱动器进行总线驱动。
15
总线驱动器的作用:对于单片机的I/O口只相当于增加了一个TTL负载,因此驱动器除了对后级电路驱动外,还能对负载的波动变化起隔离作用。
总线驱动 总线驱动器的作用:对于单片机的I/O口只相当于增加了一个TTL负载,因此驱动器除了对后级电路驱动外,还能对负载的波动变化起隔离作用。 在对TTL负载驱动时,只需考虑驱动电流的大小。 在对MOS负载驱动时,MOS负载的输入电流很小,更多地要考虑对分布电容的电流驱动。
16
系统总线中地址总线是单向的,因此驱动器可以选用单向的,如74LS244,还带有三态控制,能实现总线缓冲和隔离。
总线驱动 总线驱动器的选择: 系统总线中地址总线是单向的,因此驱动器可以选用单向的,如74LS244,还带有三态控制,能实现总线缓冲和隔离。 数据总线是双向的,其驱动器也要选用双向的,如74LS245。74LS245也是三态的,有一个方向控制端DIR。DIR=1时输出(An→Bn),DIR=0时输入(An←Bn)。
17
8.2 扩展简单并行输入/输出口 89C52有P0~P3四组I/O口,但是在某些特定的场合,可能会出现I/O口不够用的情况。这时就需要通过扩展来增加I/O口的数量以满足使用的需要。 在很多应用系统中,采用74系列TTL电路或4000系列MOS电路芯片,扩展并行数据输入输出。
18
8.2 扩展简单并行输入/输出口 例1 在图8-4中,当P2.0=0,WR=1,RD=0时,通过74HC244(扩展输入)读入按键状态,当P2.0=0,WR=0,RD=1时,通过74HC573(扩展输出)根据按键状态驱动发光二极管发光。 74HC244、74HC573的操作地址设为0xfeff。
19
图8-4 简单I/O接口扩展 +5V 74HC573 74HC244 + + 8.2 扩展简单并行输入/输出口 P0.0 D0 Q0
8.2 扩展简单并行输入/输出口 74HC573 +5V P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 89C52 WR P2.0 RD D Q0 D Q1 D Q2 D Q3 D Q4 D Q5 D Q6 D Q7 LE VCC 74HC244 Q D0 Q D1 Q D2 Q D3 Q D4 Q D5 Q D6 Q D7 G + + 图8-4 简单I/O接口扩展
20
C语言程序清单: #include <reg52.h> void main() { unsigned char data tmp1, tmp2=0; unsigned char xdata *pt1; pt1=0xfeff; //给指针赋地址值0xfeff while(1) //循环 { tmp1=*pt1; //从74HC244输入数据 if (tmp1!=tmp2) //判断输入改变时, { *pt1 =tmp1; //从74HC573输出数据 tmp2=tmp1; } } }
21
汇编语言程序清单: MOV 30H,#00H ;设一初值 MOV DPTR,#0FEFFH ;设端口地址 LOOP:
8.2 扩展简单并行输入/输出口 汇编语言程序清单: MOV 30H,#00H ;设一初值 MOV DPTR,#0FEFFH ;设端口地址 LOOP: MOVX ;从244读键盘新值 CJNE A, 30H, NEXT ;与上次值比较 SJMP LOOP ;相等再读键盘值 NEXT: MOV 30H,A ;保存新键盘值 ;从573输出键盘值 SJMP LOOP ;继续读取键盘值
22
8.3 扩展并行数据存储器 主要内容 扩展存储器概述 数据存储器的扩展
23
数据存储器即随机存取存储器(Random Access Memory,RAM),用于存放可随时修改的数据信息。
8.3 扩展并行数据存储器 数据存储器即随机存取存储器(Random Access Memory,RAM),用于存放可随时修改的数据信息。 单片机使用的主要是静态RAM。 MCS-51系列单片机片外数据存储器的空间可达64KB,而片内数据存储器的空间只有128B或256B。如果片内的数据存储器不够用时,则需进行数据存储器的扩展。
24
8.3.1 扩展存储器概述 存储器扩展的核心问题是存储器的编址问题。所谓编址就是给存储单元分配地址。
扩展存储器概述 存储器扩展的核心问题是存储器的编址问题。所谓编址就是给存储单元分配地址。 由于存储器通常由多个芯片组成,为此存储器的编址分为两个层次: 即存储器芯片的选择和存储器芯片内部存储单元的选择。
25
扩展存储器概述 一、地址线的译码 存储器芯片的选择有两种方法:线选法和译码法。 1、线选法。所谓线选法,就是直接以系统的地址线作为存储器芯片的片选信号,为此只需把用到的地址线与存储器芯片的片选端直接相连即可。 2、译码法。所谓译码法,就是使用地址译码器对系统的片外地址进行译码,以其译码输出作为存储器芯片的片选信号。译码法又分为完全译码和部分译码两种。
26
(1)完全译码。地址译码器使用了全部地址线,地址与存储单元一一对应,也就是1个存储单元只占用1个唯一的地址。
扩展存储器概述 (1)完全译码。地址译码器使用了全部地址线,地址与存储单元一一对应,也就是1个存储单元只占用1个唯一的地址。 (2)部分译码。地址译码器仅使用了部分地址线,地址与存储单元不是一一对应,而是1个存储单元占用了几个地址。
27
扩展存储器概述 芯片译码地址:在设计地址译码器电路时,常采用地址译码关系图。所谓地址译码关系图,就是一种用简单的符号来表示全部地址译码关系的示意图,如图8-5所示。 译码地址线 与存储器连接的地址线 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 1 × 图8-5 地址译码关系图
28
二、扩展存储器所需芯片数目的确定 若所选存储器芯片字长与单片机字长一致,则只需扩展容量。所需芯片数目按下式确定: 芯片数目= 系统扩展容量
扩展存储器概述 二、扩展存储器所需芯片数目的确定 若所选存储器芯片字长与单片机字长一致,则只需扩展容量。所需芯片数目按下式确定: 芯片数目= 系统扩展容量 存储器芯片容量 若所选存储器芯片字长与单片机字长不一致,则不仅需扩展容量,还需字扩展。所需芯片数目按下式确定: 芯片数目= × 系统扩展容量 存储器芯片容量 系统字长 存储器芯片字长
29
三、3—8译码器74LS138 3—8译码器74LS138为一种常用的地址译码器芯片。
扩展存储器概述 三、3—8译码器74LS138 3—8译码器74LS138为一种常用的地址译码器芯片。 其中,G1、G2A、G2B为控制端。只有当G1为“1”,且G2A、G2B均为“0”时,译码器才能进行译码输出。否则译码器的8个输出端全为高阻状态。 译码输入端与输出端之间的译码关系如表8-1所示。
30
扩展存储器概述 表 LS138的译码关系 CBA编码 000 001 010 011 100 101 110 111 输出有效位
31
8.3.2 数据存储器的扩展 一、常用静态RAM芯片 二、扩展数据存储器举例
数据存储器的扩展 一、常用静态RAM芯片 常见的静态RAM芯片有6264(8K×8位)、62256(32K×8位)、628128(128K×8位)等。 二、扩展数据存储器举例 例8-2 采用6264芯片在89C52片外扩展24KB数据存储器,如图8-8所示。
32
解:根据公式可得 芯片数目= =3片 图8-8 6264扩展24KB数据存储器 24KB 8KB A8~A12 D0~D7 A0~A7
数据存储器的扩展 A8~A12 P2.0~P2.4 P0 ALE P2.5 P2.6 P2.7 WE RD D0~D7 74HC573 D Q LE A0~A7 A0~A12 6264 CE WE OE A0~A12 6264 CE WE OE A0~A12 6264 CE WE OE 74LS138 A Y0 B Y1 C Y2 图 扩展24KB数据存储器 解:根据公式可得 芯片数目= =3片 24KB 8KB
33
8.4 串行扩展总线接口技术 主要内容 常用的串行总线接口简介 I2C总线 SPI串行外设接口总线
34
串行扩展总线技术是新一代单片机技术发展的一个显著特点。
8.4 串行扩展总线接口技术 串行扩展总线技术是新一代单片机技术发展的一个显著特点。 相对于并行总线接口,串行总线接口有着占用I/O口线少(一般3~4根),编程相对简单,易于实现用户系统软硬件的模块化、标准化等优点。 随着串行总线接口技术(SPI、I2C等)和各种串行接口芯片的发展,串行总线接口技术越来越受到人们的推崇。
35
一、I2C(Inter Integrated Circuit)
常用的串行总线接口简介 一、I2C(Inter Integrated Circuit) I2C总线是Philips公司推出的芯片间串行传输总线。 I2C总线是二线制,采用器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有简单灵活的扩展方法。
36
二、SPI 三、Microware SPI总线是Motorola公司提出的一种同步串行外设接口。
常用的串行总线接口简介 二、SPI SPI总线是Motorola公司提出的一种同步串行外设接口。 SPI总线是三线制,可直接与多种标准外围器件直接接口。 三、Microware Microware总线是NS公司提出的串行同步双工通信接口。 Microware总线是三线制,由一根数据输出(SO)线、一根数据输入(SI)线和一根时钟(SK)线组成。
37
四、单总线(1-wire) 单总线及应用: 1-wire总线是Dallas公司研制开发的一种协议,主要用于便携式仪表和现场监控系统。
常用的串行总线接口简介 四、单总线(1-wire) 单总线及应用: 1-wire总线是Dallas公司研制开发的一种协议,主要用于便携式仪表和现场监控系统。 单总线结构:是利用一根线实现双向通信,由一个总线主节点、一个或多个从节点组成系统,通过一根信号线对从芯片进行数据的读取。
38
常用的串行总线接口简介 五、USB(Universal Serial Bus) USB总线及应用:USB总线是Compaq、Intel、Microsoft、NEC等公司联合制定的一种计算机串行通信协议。 USB总线的主要优点:比较于其他传统接口的一个优势是即插即用的实现,即插即用(Plug-and-Play)也称为热插拔(Hot Plugging)
39
CAN总线的主要优点:在由CAN总线构成的单一网络中,理论上可以挂接无数个节点。
常用的串行总线接口简介 六、CAN(Controller Area Network) CAN总线及应用: CAN总线是德国Bosch公司最先提出的多主机局域网总线,是国际上应用最广泛的现场总线之一。 CAN总线的主要优点:在由CAN总线构成的单一网络中,理论上可以挂接无数个节点。
40
8.4.2 I2C总线 一、I2C总线的特点 I2C总线最主要的优点是其简单性和有效性。
I2C总线的其它优点:它支持多主控(Multimastering),其中任何能够进行发送和接收的设备(节点)都可以成为主控器。
41
I2C总线的主控器:一个主控器能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控器。如图8-9所示。
单片机A A/D、D/A 转换器 专用集成 电路 静态RAM 或ROM LCD 显示器 单片机B SDA SCL 图8-9 典型I2C总线系统示意图
42
多主方式:通过硬件和软件的仲裁,主控器取得总线控制权。
I2C总线 I2C总线支持多主和主从两种工作模式 多主方式:通过硬件和软件的仲裁,主控器取得总线控制权。 主从方式:从器件地址包括器件编号地址和引脚地址两部分,器件编号地址由I2C总线委员会分配,引脚地址由外界电平的高低决定。 器件内部子地址:当器件内部有连续的子地址空间时,对这些空间进行连续读写,子地址会自动加1。
43
CPU发出的控制信号:分为地址码和控制量两部分。 地址码:用来选址,即接通需要控制的电路,确定控制的种类。
I2C总线 CPU发出的控制信号:分为地址码和控制量两部分。 地址码:用来选址,即接通需要控制的电路,确定控制的种类。 控制量:决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
44
二、I2C总线的时序 I2C总线的信号:I2C总线在传送数据过程中共有三种类型信号,分别是:开始信号、结束信号和应答信号。 I2C总线
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
45
如图8-10所示,为I2C总线的一般时序。即起始信号、结束信号、允许数据线改变的条件等。
SDA SCL 开始信号允许数据变化 允许数据变化 允许数据变化 结束信号 图8-10 I2C总线的时序
46
三、I2C总线的数据传输过程 数据传输时,主机先发送启动信号和时钟信号,随后发送寻址字节来寻址被控器件,并规定数据传送方向。
寻址字节由7位从机地址(D7~D1)和1位方向位(D0,读0/写1)组成。 从机地址包括器件编号地址和引脚地址两部分。
47
I2C总线器件的7位从器件(机)地址: 8.4.2 I2C总线 DA3 DA2 DA1 DA0 A2 A1 A0 器件识别码
如:RTC 1101 允许在公用的I2C总线 EEPROM 1010 上同时接8个同类器件 R/
48
对从接收器:在寻址字节之后,主控发送器通过SDA线向从接收器发送数据,数据发送完毕后发送终止信号,以结束传送过程。
I2C总线 从机对地址的响应:当主机发送寻址字节时,总线上所有器件都将其中的高7位地址与自己的比较,若相同,则该器件根据读/写位确定是从发送器还是从接收器。 对从接收器:在寻址字节之后,主控发送器通过SDA线向从接收器发送数据,数据发送完毕后发送终止信号,以结束传送过程。 对从发送器:在寻址字节之后,主控接收器通过SDA线接收被控发送器的发送数据。
49
每传输一位数据,都有一个时钟脉冲相对应。时钟脉冲不必是周期性的,它的时钟间隔可以不同。
I2C总线 每传输一位数据,都有一个时钟脉冲相对应。时钟脉冲不必是周期性的,它的时钟间隔可以不同。 I2C总线的备用状态(“非忙”状态):SDA和SCL都为“1”;只有当总线处于“非忙”状态时,数据传输才能被初始化。 I2C总线的关闭状态:SCL箝位在低电平。 I2C总线上传输的数据和地址字节均为8位,且高位在前,低位在后。
50
SCL的“线与”特性:任一器件的SCL为低电平时,便时时钟线SCL变低,SDA上数据就被停止传送。
I2C总线 数据线SDA上的一般情况:I2C总线以开始信号为启动信号;接着传输的是地址和数据字节,数据字节是没有限制的;每个字节后必须跟随一个应答位(0);全部数据传输完毕后,以结束信号结尾。 SCL的“线与”特性:任一器件的SCL为低电平时,便时时钟线SCL变低,SDA上数据就被停止传送。
51
I2C总线 接收器的应答:正常应答位为0;当接收器接收到一个字节后无法立即接收下一个字节时,便向SCL线输出低电平而箝住SCL(SCL=0),迫使SDA线处于等待状态。 被控器箝住SCL线为低电平,使主控发送器处于等待状态的情况:如图8-11中的A处,当接收器在A点接收完主控器发来的一个字节时,需要处理接收中断而无法继续接收,则被控器便可箝住SCL线为低电平,使主控发送器处于等待状态,直到被控器处理完接收中断后,再释放SCL线。
52
图8-11 I2C总线的数据传送字节格式 8.4.2 I2C总线 SDA 方向位 发送器等待 MSB 从地址 数据 R/W 来自接收器
响应信号 来自接收器 响应信号 SCL ACK A ACK P/S S 若传送多个字节则重复 停止信号 开始信号 重复开始信号 图8-11 I2C总线的数据传送字节格式
53
(1)应答信号的发送时刻:数据传输时,发送器每发完一个字节,都要求接收方发回一个应答信号(0)。
I2C总线 关于应答信号: (1)应答信号的发送时刻:数据传输时,发送器每发完一个字节,都要求接收方发回一个应答信号(0)。 (2)应答信号的过程:发送时钟仍由主控器在SCL上产生。主控发送器必须在被控接收器发送应答信号前,预先释放对SDA线的控制(SDA=1),以便主控器对SDA线上应答信号的检测。
54
正常应答:主控器发送时,被控器接收完每个字节需发回应答信号“0”,主控器据此进行下一字节的发送。
I2C总线 正常应答:主控器发送时,被控器接收完每个字节需发回应答信号“0”,主控器据此进行下一字节的发送。 异常应答:如果被控器由于某种原因无法继续接收SDA上数据时,可向SDA输出一个非应答信号(1),主控器据此便产生一个Stop来终止SDA线上的数据传输。 主控器接收时也应给被控器发应答信号。 主控器接收时的结束应答:当主控器要结束传输时,必须给被控器发一个非应答信号“1”,令被控器释放SDA线,以便主控器发送Stop信号来结束数据的传输,如图8-12所示。
55
图8-12 I2C总线的应答信号 8.4.2 I2C总线 发送器 数据输出 接收器 数据输入 主控器 时钟线 起始信号 释放总线保持高电平
不应答 A 应答 A 应答时钟脉冲 S MSB 2 8 9 1 图8-12 I2C总线的应答信号
56
I2C总线 四、I2C的数据格式 1、主控器写数据 主机写数据过程:整个过程均为主机发送,从机接收,数据的方向位R/W=0。应答位ACK由从机发送,当主机产生结束信号后,数据传输停止。格式如下:
57
S为开始信号,P为结束信号,A为应答信号, 为非应答信号,
I2C总线 S A Data 1 Data 2 … Data n-1 Data n P SLA A/ S为开始信号,P为结束信号,A为应答信号, 为非应答信号, SLA 为寻址字节(写),Data 1~Data n为被传送的n个数据。 为主控器发送,被控器接收。 为被控器发送,主控器接收。
58
I2C总线 2、主控器读数据 主机读数据过程:寻址字节为主机发送、从机接收,方向位R/W=1,n个数据字节均为从机发送、主机接收。主机接收完全部数据后发非应答位(1),表明读操作结束。格式如下: S SLA R A Data 1 Data 2 … Data n-1 Data n P SLA R为寻址字节读。
59
I2C总线 3、主控器读/写数据 改变传送方向的数据传输过程:由于读/写方向有变化,开始信号和寻址字节都会重复一次,但读/写方向(R/W)相反。格式如下: S SLA R A Data 1 Data 2 … Data n Sr DATA 1 DATA2 DATA n-1 DATA n P SLA A/ Sr为重复开始信号,Data 1~Data n为主控器的读数据,DATA 1~DATA n为主控器的写数据。
60
I2C总线 三、I2C总线的应用 带有I2C接口的单片机:Cygnal的 C8051 F0XX系列,Philips的P87LPC7XX系列,Microchip的PIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I2C接口。 图8-13为I2C总线外围扩展示意图。
61
图8-13 I2C总线外围扩展示意图 8.4.2 I2C总线 LED 显示器 LED驱动 控制器 SDA SCL LCD 显示器 LCD驱动
键盘 I/O SDA SCL 打印机 I/O SDA SCL VCC MCU SDA SCL SCL SDA SRAM SCL SDA E2PROM SCL SDA ADC/DAC SCL SDA RTC SCL SDA DTMF 图8-13 I2C总线外围扩展示意图
62
RTC实时时钟,DTMF双音多频编码解码器。
I2C总线 RTC实时时钟,DTMF双音多频编码解码器。 例 C52模拟I2C。如图8-14所示。 VCC 89C52 P1.0 P1.1 I2C器件 SCL SDA 10KΩ×2 图 C51模拟I2C
63
#include <reg52.h> #include <intrins.h> //有位操作、空操作等
I2C总线 C语言程序清单: #include <reg52.h> #include <intrins.h> //有位操作、空操作等 sbit scl=0x90; //P1.0的地址 sbit sda=0x91; //P1.1的地址 void start(void) //发送开始信号 { sda=1; scl=1; _nop_(); //延时 _nop_(); sda=0; _nop_(); _nop_(); scl=0; }
64
void stop(void) //发送结束信号 { sda=0; scl=1; _nop_(); //延时 _nop_(); sda=1;
I2C总线 void stop(void) //发送结束信号 { sda=0; scl=1; _nop_(); //延时 _nop_(); sda=1; scl=0; }
65
if(sda!=0) //判断是否有应答 return sda; //若非应答返回"sda" scl=0;
I2C总线 bit tack(void) //检查应答 { sda=1; //准备接收 scl=1; _nop_(); if(sda!=0) //判断是否有应答 return sda; //若非应答返回"sda" scl=0; }
66
void txbyt(unsigned char txdat) //字节发送 { unsigned int i;
I2C总线 void txbyt(unsigned char txdat) //字节发送 { unsigned int i; for(i=0;i<8;i++) //一个字节8次按位循环发送 { if(txdat&0x80) sda=1; //取最高位,是1发送1 else sda=0; //是0发送0 scl=1; //保持数据有效 _nop_(); scl=0; //准备改变数据 sda=0; txdat=txdat<<1; //左移准备取次高位 }
67
unsigned char rxbyt(void) //字节接收
I2C总线 unsigned char rxbyt(void) //字节接收 { unsigned char rxdat=0; //接收数据存于rxdat unsigned int i; for(i=0;i<8;i++) { sda=1; //开始接收 scl=1; if(sda&1) rxdat+=1; else rxdat+=0; rxdat=rxdat<<1; scl=0; //应答 } return rxdat; //返回接收到的数据
68
NOP ;NOP的数目由时钟频率确定 NOP ;此处用NOP来延时 CLR SDA NOP CLR SCL RET
I2C总线 汇编语言程序清单: SCL EQU P1.0 SDA EQU P1.1 ;发送开始信号 START: SETB SDA SETB SCL NOP ;NOP的数目由时钟频率确定 NOP ;此处用NOP来延时 CLR SDA NOP CLR SCL RET
69
;结束信号 STOP: CLR SDA SETB SCL NOP NOP SETB SDA NOP CLR SDA CLR SCL RET
I2C总线 ;结束信号 STOP: CLR SDA SETB SCL NOP NOP SETB SDA NOP CLR SDA CLR SCL RET
70
;应答位检查 TACK: SETB SDA SETB SCL NOP NOP CLR 30H ;正常标志 MOV C,SDA
I2C总线 ;应答位检查 TACK: SETB SDA SETB SCL NOP NOP CLR H ;正常标志 MOV C,SDA JNC TEND ; 正常应答转移 SETB H TEND: CLR SCL RET
71
;发送子程序 TXBYT: MOV R4,#08H ;数据长度为8位 TX0: RLC A ; 发送位送入CY
I2C总线 ;发送子程序 TXBYT: MOV R4,#08H ;数据长度为8位 TX0: RLC A ; 发送位送入CY JC TX1 ;CY位为1转到TX1 CLR SDA ;置为低电平,发送0 SETB SCL NOP CLR SCL ; 高电平保持数据稳定 DJNZ R4,TX0 RET
72
TX1: SETB SDA SETB SCL NOP CLR SCL ; 脉冲变为低电平改变数据 CLR SDA DJNZ R4,TX0
I2C总线 TX1: SETB SDA SETB SCL NOP CLR SCL ; 脉冲变为低电平改变数据 CLR SDA DJNZ R4,TX0 RET
73
;字节接收子程序 RXBYT: MOV R4,#08H RX0: SETB SDA SETB SCL
I2C总线 ;字节接收子程序 RXBYT: MOV R4,#08H RX0: SETB SDA SETB SCL MOV C,SDA ;读入SDA引脚状态 MOV A,R5 ;数据位储存在R5 RLC A MOV R5,A CLR SCL DJNZ R4,RX0 RET
74
SPI串行外设接口总线 SPI(Serial Peripheral Interface,串行外围设备接口):是Motorola公司推出的一种同步串行通信方式,是一种三线同步总线。 SPI的特点:因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。图8-15为SPI总线典型结构。
75
图8-15 SPI总线系统典型结构示意图 8.4.3 SPI串行外设接口总线 SCK MOSI MISO MCU(主) I/O SCK
CS SCK MOSI MISO 外围器件 CS SCK MOSI MISO 外围器件 CS SCK MOSI MISO 外围器件 CS 图8-15 SPI总线系统典型结构示意图
76
一、用一般I/O口线模拟扩展SPI外设接口
串行时钟线(SCK,同步脉冲) 主机输入/从机输出数据线(MISO,高位在前) 主机输出/从机输入数据线(MOSI,高位在前) 从机选择线 一、用一般I/O口线模拟扩展SPI外设接口 用P1.0模拟MCU的数据输出端(MOSI) 用P1.1模拟SPI的SCK输出端(SCK) 用P1.2模拟SPI的从机选择端(CS) 用P1.3模拟SPI的数据输入端(MISO)
77
MCU输出1位SCK时钟的低电平,使接口芯片串行左移,1位数据输入至89C52的P1.3;
SPI串行外设接口总线 单片机模拟1位数据输入/输出的过程如下: MCU输出1位SCK时钟的低电平,使接口芯片串行左移,1位数据输入至89C52的P1.3; 再置P1.1为1,使89C52从P1.0输出1位数据至串行接口芯片…… 依次循环8次,完成1次通过SPI传输1个字节的操作。 在一个CLK中,下降沿输出,上升沿输入,或反之。
78
例8-4 如图8-16所示,MCU串行输入子程序SPIIN,从2814 (E2PROM)的SPISO线上接收1字节数据并放入寄存器R7中。
3 7 4 MCM2814 VCC 图 C52与MCM2814的硬件连接图
79
C语言程序清单: #inclued <reg52.h> #include <intrins.h>
SPI串行外设接口总线 C语言程序清单: #inclued <reg52.h> #include <intrins.h> sbit sck=0x91; //P1.1的地址 sbit ss=0x92; //P1.2的地址 sbit miso=0x93; //P1.3的地址 sbit mosi=0x90; //P1.0的地址 unsigned char spiin(void) //接收子程序 { unsigned int i; unsigned char tmp=0; //接收到数据暂存于tmp sck=1; //准备开始 ss=0; //置片选信号
80
else tmp+=0; tmp=tmp<<1; sck=1; } return tmp; //接收完,返回数据
SPI串行外设接口总线 for(i=0;i<8;i++) { sck=0; _nop_(); if(miso&1) tmp+=1; else tmp+=0; tmp=tmp<<1; sck=1; } return tmp; //接收完,返回数据
81
汇编语言程序清单: SPIIN: SETB P1.1 CLR P1.2 MOV R1,#08H SPIN1: CLR P1.1 NOP
MOV C,P1.3 ;从机输出送C RLC A ;左移至累加器ACC SETB P1.1 DJNZ R1,SPIN1 MOV R7,A RET
82
例8-5 MCU串行输出子程序SPIOUT,将89C52中R7寄存器的内容传送到2814的SPISI线上。
#inclued <reg52.h> #include <intrins.h> sbit sck=0x91; //P1.1的地址 sbit ss=0x92; //P1.2的地址 sbit miso=0x93; //P1.3的地址 sbit mosi=0x90; //P1.0的地址
83
if(tmp&0x80) mosi=1; //判位发送 else mosi=0; tmp=tmp<<1; //左移准备取次高位
SPI串行外设接口总线 void spiout(unsigned char tmp) //发送子程序 { unsigned int i; sck=1; ss=0; for(i=0;i<8;i++) { sck=0; _nop_(); _nop_(); if(tmp&0x80) mosi=1; //判位发送 else mosi=0; tmp=tmp<<1; //左移准备取次高位 }
84
汇编语言程序清单: SPIOUT: SETB P1.1 CLR P1.2 MOV R1,#08H MOV A,R7
SPIOT1: CLR P NOP NOP RLC A MOV P1.0,C ;左移ACC最高位至C SETB P1.1 ;进位C送SPISI线上 DJNZ R1,SPIOT1 RET
85
SPI串行外设接口总线 例8-6 MCU串行输入/输出子程序SPIIO,将89C52中R7的内容传送到2814的SPISI线上,同时从2814的SPISO接收1字节数据存入R0中。 同时收发程序: #inclued <reg52.h> #include <intrins.h> sbit sck=0x91; //P1.1的地址 sbit ss=0x92; //P1.2的地址 sbit miso=0x93; //P1.3的地址 sbit mosi=0x90; //P1.0的地址
86
unsigned char spiio(unsigned char ttmp) { unsigned int i;
unsigned char rtmp=0; //接收暂存于rtmp sck=1; ss=0; for(i=0;i<8;i++) //循环接收8位 sck=0; _nop_();
87
if(ttmp&0x80) //判位发送 mosi=1; else mosi=0; if(miso&1) //判位接收 rtmp+=1;
SPI串行外设接口总线 if(ttmp&0x80) //判位发送 mosi=1; else mosi=0; if(miso&1) //判位接收 rtmp+=1; else rtmp+=0; rtmp=rtmp<<1; sck=1; ttmp=ttmp<<1; } return rtmp;
88
汇编语言程序清单: SPIIO: SETB P1.1 CLR P1,2 MOV R1,#08H ;设置计数器 MOV A,R7
SPIO1: CLR P NOP ;延时 NOP MOV C,P1.3 RLC A MOV P1.0,C SETB P1.1 DJNZ R1,SPIO1 MOV R0,A RET
89
SPI串行外设接口总线 二、利用89C52串口方式0实现SPI操作 如图8-17所示,利用89C52串行口方式0与串行时钟芯片HT1380连接实现SPI操作,适用于对绝对时钟要求较高的场合。 TXD RXD P1.0 89C52 SCLK I/O RST HT1380 X1 X2 图 C52与串行时钟芯片HT1380连接图
90
利用89C52串行口方式0与串行LED显示接口MAX7219实现SPI操作。 MAX7219可驱动8个LED显示器,如图8-18所示。
TXD RXD P1.0 89C52 SCLK I/O Load MAX7219 … 图 C52与串行LED显示接口连接图
91
TXD作为移位时钟,RXD作为串行数据I/O端,Load作为芯片选择端。 当Load低电平时,对7219进行读/写操作;
SPI串行外设接口总线 单片机与MAX7219交换信息过程: TXD作为移位时钟,RXD作为串行数据I/O端,Load作为芯片选择端。 当Load低电平时,对7219进行读/写操作; 当Load为高电平时, 7219处于高阻状态。
92
本章小结 本章首先介绍了并行三总线以及并行三总线的扩展方法。 然后讨论了如何通过并行三总线来扩展简单的并行输入/输出口和扩展并行数据存储器。
最后介绍了几种常见的串行接口总线扩展技术,重点讨论了I2C和SPI串行总线,并通过实例介绍了在无相应接口的单片机上,如何模拟I2C和SPI串行接口,以及具体的实现程序。
93
思考题与习题 1.假定一个存储器有4096个存储单元,其首地址为0,则末地址为多少? 2.6根地址线和11根地址线各可选多少个地址?
3.用2K×4位的数据存储器芯片扩展4K×8位的数据存储器需要多少片?地址总线是多少位?画出连线图。 4.用两片74HC573芯片扩展89C52的P1端口实现6位发光二极管的开关控制和点亮。
94
5.用2K×8位的数据存储器芯片扩展64K×8位的数据存储器需要多少根地址线? 6.I2C和SPI各有什么特点?
思考题与习题 5.用2K×8位的数据存储器芯片扩展64K×8位的数据存储器需要多少根地址线? 6.I2C和SPI各有什么特点? 7.用P1口模拟SPI从外部先发送从片内RAM中30H开始的10个字节,再接收30个字节存放在40H开始的片内RAM中。引脚自定义。 8.用P1口模拟I2C从外部接收一组数据,遇到“$”结束。引脚自定义。
Similar presentations