第 8章 80C51串行扩展技术本章要点串行扩展特点串行扩展方式分类虚拟串行扩展慨念移位寄存器串行扩展方式
80C51 I/O虚拟串行接口
I2C总线串行扩展技术
I2C总线扩展 I/O口通用器件 PCF8574
虚拟 I2C总线扩展 AT24CXX系列 E2PROM
§ 8-1 串行扩展概述一,串行扩展特点
⑴ 最大程度发挥最小系统的资源功能 。
原来由并行扩展占用的 P0口,P2口资源,直接用于 I/O口。
⑵ 简化连接线路,缩小印板面积 。
⑶ 扩展性好,可简化系统的设计 。
⑷ 串行扩展的缺点,
数据吞吐容量较小,信号传输速度较慢,但随着 CPU芯片工作频率的提高,以及串行扩展芯片功能的增强,这些缺点将逐步淡化。
1,一线制二,串行扩展方式分类一线制的典型代表为 Dallas公司推出的单总线
( 1-wire)。
2,二线制二线制的典型代表为 philips公司推出的 I2C总线
( Intel Integrated Circuit BUS)。
三线制(不包括片选线)主要有两种:
⑴ 由 Motorala公司推出的 SPI( Serial
peripheral Interface);
⑵ 由 NS公司推出的 Micro wire /PLUS。
3,三线制
SPI的时钟线是 SCK,数据线 MOSI(主发从收),MOSO(主收从发),主从器件的 MOSI和
MOSO是同名端相连。
由于该两类器件无法通过数据传输线寻址,
因此,必须由 MCU I/O线单独寻址,连到扩展器件的片选端 CS(若只扩展一片,可将扩展芯片 CS
接地)。
Micro wire /PLUS的时钟线是 SK,数据线为 SI和 SO,但 SI,SO依照主器件的数据传送方向而定,主器件的 SO与所有扩展器件数据输入端 DI
或 SI相连;主器件的 SI与所有扩展器件数据输出端 DO或 SO相连。
4,80C51 移位寄存器串行扩展
80C51的 UART(Universal Asynohronous
Receiver/Transmitter)有 4种工作方式,其中方式 0为同步移位寄存器工作方式,通过移位寄存方式,可将串行数据并行输出,也可以将并行数据串行输入。
三,虚拟串行扩展概念用通用 I/O口来模拟串行接口,构成虚拟的串行扩展接口。 只要严格控制模拟同步信号,
并满足串行同步数据传送的时序要求,就可满足串行数据传送的可靠性要求。
§ 8-2 80C51移位寄存器串行扩展技术一,移位寄存器串行扩展方式
80C51串行方式 0时,串行口作为同步移位寄存器使用。 TXD端( P3.1)
发出移位脉冲,频率为 fosc/12,RXD
端( P3.0)输入输出数据 。
1,80C51扩展并行输出口
74LS164为 串入并出 移位寄存器,其中 A,B为串行数据输入端,QA,QB,…,QH为并行数据输出端( QA为高位),CLK为同步时钟输入端,CLR为输出清 0端。若不需将输出数据清 0,则
CLR端接 Vcc。
2,80C51扩展并行输入口
74LS165为 并入串出 移位寄存器,A,B,…,H为并行输入端
( A为高位),QH为串行数据输出端,SER为串行数据输入端,
CLK为同步时钟输入端,S/L为预置控制端。 S/L=0时,锁存并行输入数据; S/L=1时,可进行串行移位操作。
80C51串行方式 0归一化子程序:
⑴ 单字节串行输出子程序
⑵ 单字节串行输入子程序
⑶ 多字节串行输出子程序
⑷ 多字节串行输入子程序二,串行方式 0归一化子程序所谓 归一化子程序,即 通用或标准化操作子程序,
将 80C51串行方式 0所有应用操作归纳成几个基本的输入输出子程序,并使这些标准子程序具有规范的入口条件和出口状态。应用时,只要设置相应的入口和出口,调用归一化子程序,就能达到串行输入输出的目的。
80C51虚拟串行 I/O口归一化子程序:
⑴ 单字节虚拟串行输出子程序
⑵ 单字节虚拟串行输入子程序
⑶ 多字节虚拟串行输出子程序
⑷ 多字节虚拟串行输入子程序三,80C51 I/O虚拟串行接口利用 80C51通用 I/O口虚拟移位寄存器工作方式实现串行扩展,只需 用任一通用 I/O口代替 RXD和 TXD,设为 VRXD和 VTXD。
四,移位寄存器串行扩展应用
80C51移位寄存器串行扩展应用,只需根据标准化的电路形式连接,设置好入口条件,然后调用串行方式 0归一化子程序或虚拟串行接口归一化子程序,即可完成扩展应用。
【 例 8-1】 电路如图 8-5所示,fosc = 12MHz,要求发光二极管从左向右依次点亮,点亮时间为 1秒,不断循环。设串行方式 0归一化子程序已存在 ROM中。
解:
PIOX1 BIT P1.0 ;定义 PIOX1
WORK,MOV A,#10000000B ;置 D7灯亮,其余暗
LOOP,CLR PIOX1 ;74LS164输出全 0,灯全暗
LCALL UART0 ;调用单字节串行输出子程序
LCALL DLY1s ;调用延时 1秒子程序 (略 )
RR A ;右移
SJMP LOOP ;
【 例 8-2】 电路如图 8-6所示,fosc=12MHz,要求每隔 10ms,检测键 K0~ K7状态,并存入内 RAM 2FH。设虚拟串行接口归一化子程序已存在 ROM中。
解,ORG 0000H ;复位地址
LJMP STAT ;转初始化程序
ORG 000BH ;T0中断入口地址
LJMP IT0 ;转 T0中断服务子程序
VRXD BIT P1.0 ;P1.0虚拟 RXD
VTXD BIT P1.1 ;P1.1虚拟 TXD
PIOX2 BIT P1.2 ;P1.2虚拟 PIOX2
ORG 0100H ;初始化程序首地址
STAT,MOV TMOD,#01H ;置 T0定时器方式 1
MOV TH0,#0D8H ;置 T0定时初值 10ms
MOV TL0,#0F0H ;
SETB TR0 ;启动 T0
SETB ET0 ;T0开中
SETB EA ;CPU开中
LJMP WORK ;转主程序并等待 T0中断
ORG 1000H ;T0中断服务子程序首地址
IT0,MOV TH0,#0D8H ;重置 T0定时初值 10ms
MOV TL0,#0F0H ;
PUSH Acc ;保护现场
PUSH PSW ;
INPUT,LCALL VUARTI ;调用虚拟串行输入子程序
MOV 2FH,A ;存键 K0~ K7状态数据
POP PSW ;恢复现场
POP Acc ;
RETI ;
1,扩展连接方式
§ 8-3 I2C总线串行扩展技术一,I2C总线串行扩展概述具有 I2C总线结构的器件,不论 SRAM,E2PROM、
ADC/DAC,I/O口或 MCU,均可通过 SDA,SCL连接
(同名端相连)。
无 I2C总线结构的器件,如 LED/LCD显示器、键盘、码盘、打印机等也可通过具有 I2C总线结构的
I/O接口电路成为串行扩展器件。
2,器件寻址方式
I2C总线器件地址 SLA格式如下:
具有 I2C总线结构的器件在器件 出厂时已经给定了器件的地址编码 。
SLA
D7 D6 D5 D4 D3 D2 D1 D0
DA3 DA2 DA1 DA0 A2 A1 A0 R/ W
器件固有地址编码 器件引脚地址 读 /写
⑴ DA3~ DA0 4位器件地址是 I2C总线器件固有的地址编码,
器件出厂时就已给定,用户不能自行设置 。
⑵ A2A1A0 3位引脚地址用于相同地址器件的识别 。若 I2C总线上挂有相同地址的器件,或同时挂有多片相同器件时,可用硬件连接方式对 3位引脚 A2A1A0接 Vcc或接地,形成地址数据。
⑶ R/W 数据传送方向 。 R/W=1时,主机接收(读);
R/W=0时,主机发送(写)。
表 8-1 常用 I2C器件地址 SLA
种类 型号 器件地址 SLA 引脚地址备注静态 RAM PCF8570/71 1010 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
PCF8570C 1011 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
E2PROM PCF8582 1010 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
AT24C02 1010 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
AT24C04 1010 A2 A1 P0 R/ W 2位数字引脚地址 A2A1
AT24C08 1010 A2 P1 P0 R/ W 1位数字引脚地址 A2
AT24C016 1010 P2 P1 P0 R/ W 无引脚地址,A2A1A0悬空处理
I/O口 PCF8574 0100 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
PCF8574A 0111 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
LED/LCD
驱动控制器
SAA 1064 0111 0 A1 A0 R/ W 2位数字引脚地址 A1A0
PCF8576 0111 0 0 A0 R/ W 1位数字引脚地址 A0
PCF8578/79 0111 1 0 A0 R/ W 1位数字引脚地址 A0
ADC/DAC PCF8951 1001 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
日历时钟 PCF8583 1010 0 0 A0 R/ W 1位数字引脚地址 A0
3,接口电气结构
I2C总线端口输出为开漏结构,总线上必须外接上拉电阻 Rp,其阻值通常可选 5~ 10KΩ 。
4,总线驱动能力由于 I2C总线器件均为 CMOS器件,总线具有足够的电流驱动能力 。
I2C总线的电容负载能力为 400 pF( 通过驱动扩展可达 4000pF) 。
I2C总线传输速率为 100Kb/s( 改进后的规范为 400 Kb/s) 。
5,I2C总线时序一次完整的数据传送过程应包括:起始 ( S),
发送寻址字节 ( SLA R/W),应答,发送数据,应答,…,发送数据,应答,终止 ( P) 。
80C51只能采用虚拟 I2C总线方式,并且只能用于单主系统,虚拟 I2C总线接口可用通用 I/O口中任一端线充任,数据线定义为 VSDA,时钟线定义为 VSCL。
二,80C51单主系统虚拟 I2C总线软件包
80C51单主系统虚拟 I2C总线软件包 VIIC可由二大类共 9个归一化子程序组成。二大类程序分别为典型信号模拟子程序 和 数据传送通用子程序 。
1,典型信号模拟子程序对于虚拟 I2C总线,有几个重复应用的典型信号,可根据 I2C总线时序要求,编制这些典型信号子程序:
⑴ 启动信号 STAT
⑵ 终止信号 STOP
⑶ 发送应答位 (A)MACK
⑷ 发送应答非位 (A)NACK
⑸ 检查应答位 CACK
2,数据传送通用子程序数据传送通用子程序是应用典型信号模拟子程序 ( 起始,终止,应答和检查应答 ) 并按 I2C总线数据传送时序要求编制的子程序 。
⑴ 发送一字节数据子程序 WR1B
⑵ 接收一字节数据子程序 RD1B
⑶ 发送 N个字节数据子程序 WRNB
⑷ 接收 N个字节数据子程序 RDNB
按照 I2C总线数据传送时序要求,一次完整的数据发送过程应包括起始( S)、发送寻址字节( SLA R/W)、应答、
发送数据、应答,…,发送数据、应答、终止( P),其格式如下:
S SLAW A data1 A data2 A …… dataN A P
其中,红色部分由主器件发送,从器件接收;黑色部分由从器件发送,主器件接收。
发送 N个字节数据子程序 WRNB
入口条件,
① 伪指令定义 NUMB,SLA,MTD单元地址;
② 发送数据字节数存内 RAM NUMB单元;
③ 发送寻址字节存内 RAM SLA单元;
④ 发送数据依次存放在首址为 MTD的内 RAM中 。
占用资源,Acc,R1,R2,R3,Cy,F0。
WRNB,MOV R3,NUMB ;取发送数据字节数 N(存在内 RAM NUMB单元 )
WRNB0:LCALL STAT ;启动 I2C总线
MOV A,SLA ;读发送寻址字节 (存在内 RAM SLA单元 )
LCALL WR1B ;发送寻址字节
LCALL CACK ;检查应答位
JB F0,WRNB0;应答不正常,返回重发
MOV R1,#MTD ;应答 (A)正常,取发送数据存储区首址
WRDA,MOV A,@R1 ;读一个字节发送数据
LCALL WR1B ;发送一个字节
LCALL CACK ;检查应答位
JB F0,WRNB ;应答不正常,返回重发
INC R1 ;应答 (A)正常,指向发送数据下一字节
DJNZ R3,WRDA ;判 N个数据发送完毕否?未完继续
LCALL STOP ;N个数据发送完毕,发送结束信号
RET ;
按照 I2C总线数据传送时序要求,接收 N个字节数据应按下列格式编程:
接收 N个字节数据子程序 RDNB
S SLAR A data1 A data2 A … dataN A P
其中,红色部分由主器件发送,从器件接收;黑色部分由从器件发送,主器件接收。
入口条件,
① 伪指令定义 NUMB,SLA,MRD地址;
② 接收数据字节数存内 RAM NUMB单元;
③ 接收寻址字节存内 RAM SLA单元 。
出口状态,接收 N个字节依次存在首址 MRD的内 RAM中。
占用资源,Acc,R1,R2,R3,Cy,F0。
RDNB,MOV R3,NUMB ;取接收数据字节数 N(存在内 RAM NUMB单元 )
RDNB0,LCALL STAT ;启动 I2C总线
MOV A,SLA ;读接收寻址字节 (存在内 RAM SLA单元 )
LCALL WR1B ;发送接收寻址字节
LCALL CACK ;检查应答位
JB F0,RDNB0 ;应答不正常,返回重新开始
RDA0,MOV R1,#MRD ;应答 (A)正常,取接收数据存储区首址
RDA1,LCALL RD1B ;接收一个字节数据
MOV @R1,A ;存一个字节数据
DJNZ R3,ACK ;判 N个数据接收完毕否?未完转发送应答位
LCALL NACK ;N个数据接收完毕,发送应答非位 (A)
LCALL STOP ;发送终止信号
RET ;子程序结束返回
ACK,LCALL MACK ;发送应答位 (A)
INC R1 ;指向下一接收数据存储单元地址
SJMP RDA1 ;转接收下一字节数据
⑴ VIIC软件包共有 9个归一化子程序组成 。
⑵ VIIC软件包仅适用单主系统即主方式下 I2C总线外围扩展 。 且应 fosc≤ 6MHz,若 fosc> 6MHz,则应相应调整
NOP指令个数,以满足 I2C总线数据传送时序要求 。
⑶ VIIC软件包可嵌入到 80C51 ROM中任一空间,作为 I2C总线扩展应用程序设计的软件支持平台 。
⑷ 在应用 VIIC软件包初始化中,应对软件包中标记符号用伪指令定义 。
⑸ VIIC软件包占用资源,F0,Cy,Acc,R1,R1,R3。 在调用 VIIC软件包之前,若涉及这些存储单元中原有数据尚需保存,应采取保护现场措施,在调用结束后恢复现场 。
3,虚拟 I2C总线软件包 VIIC小结一,I2C总线扩展 I/O口通用器件 PCF8574
§ 8-4 虚拟 I2C总线扩展 I/O口
1,引脚功能
PCF8574是一个带有中断输出的 8
位准双向 I/O口 I2C总线扩展芯片 。
A2~ A0:地址引脚;
P0~ P7,8位准双向 I/O口,驱动能力 IOL = 25mA,IOH< 300?A;
SDA,SCL,I2C总线接口;
INT:中断请求输出,低电平有效,开漏输出;
VDD,VSS:电源端,接地端;
2,电路设计
PCF8574与 80C51 I2C总线接口应用电路 。
PCF8574的器件地址是 0100,A2A1A0为引脚地址,全接地时为 000,R/W=1时,接收寻址字节 SLAR=41H =01000001B; R/W=0时,发送寻址字节 SLAW=40H =01000000B。
3,寻址字节当 PCF8574输入端 P0~ P7电平状态改变时,中断请求输出端 INT会出现低电平(滞后时间约
4?s),可触发 80C51产生中断。在对 PCF8574进行一次读写操作后,INT端撤销中断请求,复位为高电平。
4,中断请求
5,数据输入 /输出操作格式
⑴ 输出操作
S SLAW A POdata A P
⑵ 输入操作
S SLAR A PIdata A P
其中,红色部分由 80C51发送,PCF8574接收;黑色部分由 PCF8574发送,80C51接收。
二,PCF8574应用实例
【 例 8-3】 图 8-14为 PCF8574 四键四 LED应用电路,
PCF8574 P0~ P3为键信号 K0~ K3输入端,P4~ P7
为 LED控制信号 D0~ D3输出端,要求当键 K0~ K3
按下后,相应 LED D0~ D3亮,设 VIIC软件包已装入 ROM。
解:编制程序如下:
主程序:
VSDA EQU P1.0 ;定义虚拟 I2C总线数据线端口
VSCL EQU P1.1 ;定义虚拟 I2C总线时钟线端口
SLA EQU 50H ;定义发送 /接收寻址字节内 RAM存储单元为 50H
NUMB EQU 51H ;定义发送 /接收数据字节数 N内 RAM存储单元为 51H
MTD EQU 30H ;定义发送数据内 RAM存储区首地址为 30H
MRD EQU 40H ;定义接收数据内 RAM存储区首地址为 40H
WORK:MOV MTD,#0FFH ;PCF8574初始化,置 P0~ P3输入态,D0~ D3灯灭
MOV SLA,#40H ;置发送寻址字节
MOV NUMB,#1 ;置发送字节数
LCALL WRNB ;FFH写入 PCF8574
SETB EA ;CPU开中
SETB EX1 ;INT1开中
SETB IT1 ;置 INT1边沿触发方式
SJMP $ ;等待 PCF8574 P0~ P3口状态变化触发中断中断服务子程序:
VINT:MOV SLA,#41H ;置接收寻址字节
MOV NUMB,#1 ;置接收字节数
LCALL RDNB ;读 PCF8574口状态
MOV A,MRD ;读接收数据
SWAP A ;低 4位状态移至高 4位
ORL A,#0FH ;低 4位保持输入态
MOV MTD,A ;控制信号存入发送数据首地址单元
MOV SLA,#40H ;置发送寻址字节
MOV NUMB,#1 ;置发送字节数
LCALL WRNB ;输出控制信号
RETI ;
1,引脚功能
§ 8-5 虚拟 I2C总线扩展
AT24CXX系列 E2PROM
一,I2C总线 E2PROM芯片 AT24C02
SDA,SCL,I2C总线接口
A2~ A0:地址引脚
TEST:测试端,高电平有效
VDD,VSS:电源端,接地端
2,电路设计
A2 A1 A0
TEST
E2PROM的写入时间一般需要 5~ 10ms,页写缓冲器具有 SRAM性质,可快速写入,先将 CPU输入的数据暂存页写缓冲器内,然后慢慢写入 E2PROM中 。 但一次写入数据,受到该芯片页写缓冲器容量的限制,若超出容量或超出页内地址,都将导致出错 。 应将超出部分,
隔 5~ 10ms重新启动一次写操作 。
AT24C02页写缓冲器为 8B,页内地址为 000~ 111。
3,寻址字节
AT24CXX的器件地址是 1010,A2A1A0为引脚地址,
全接地时为 000。
R/W=1时,读寻址字节 SLAR =10100001B=A1H;
R/W=0时,写寻址字节 SLAW=10100000B=A0H。
4,页写缓冲器
⑴ 写操作格式
5,数据读 /写操作格式
S SLAW A SADR A data1 A data2 A …… dataN A P
⑵ 读操作格式
S SLAW A SADR A P S SLAR A data1 A data2 A … dataN A P
其中,红色 部分由 80C51发送,AT24CXX接收; 黑色部分由
AT24CXX发送,80C51接收。
写入读出单元子地址 读出操作
【 例 8-4】 按图 8-15(b),试将内 RAM 10H为首址的 8个字节数据写入
AT24C02 50H~ 57H单元中。设 VIIC软件包已装入 ROM,VSDA、
VSCL,SLA,NUMB,MTD,MRD均已按 8.3.2软件包小结中协议定义解:
二,扩展 AT24C02应用举例
VAT24W:MOV SLA,#10100000B;置写 AT24C02寻址字节
MOV NUMB,#9 ;置写入数据字节数 N+1(多一个片内子地址 )
MOV MTD,#50H ;置写 AT24C02片内子地址首址 SADR[(30H)=50H]
MOV R0,#10H ;置 8个数据原存放区首址
MOV R1,#31H ;置 8个数据串行发送存放区首址
MOV R2,#8 ;置数据个数
MOVLP,MOV A,@R0 ;将 8个数据依次移入 31H~ 38H
MOV @R1,A ;
INC R0 ;
INC R1 ;
DJNZ R2,MOVLP ;
LCALL WRNB ;发送 AT24C02片内子地址及 8个数据
RET ;
【 例 8-5】 同例 8-4,数据改为 16个,试编程。
解:
AT24W1:LCALL VAT24W ;调用写 8个数据子程序 (第 1次写 )
LCALL DLY10ms ;调用延时 10ms子程序 (略 )
AT24W2:MOV MTD,#58H ;置第 2次写 AT24C02片内首址 SADR[(30H)=58H]
MOV R0,#18H ;置第 2次写 8个数据原存放区首址
MOV R1,#31H ;置第 2次写 8个数据串行发送存放区首址
MOV R2,#8 ;置第 2次写数据个数
MOVLP2:MOV A,@R0 ;将第 2次写 8个数据依次移入 31H~ 38H
MOV @R1,A ;
INC R0 ;
INC R1 ;
DJNZ R2,MOVLP2 ;
LCALL WRNB ;第 2次写 AT24C02
RET ;
解:
AT24W3:MOV SLA,#10100000B;置写 AT24C02寻址字节
MOV NUMB,#7 ;置写入数据字节数 N+1(多一个片内子地址 )
MOV MTD,#52H ;置写 AT24C02片内子地址首址 SADR[(30H)=52H]
MOV R0,#10H ;置 6个数据原存放区首址
MOV R1,#31H ;置 6个数据串行发送时存放区首址
MOV R2,#6 ;置数据个数
MOVLP3:MOV A,@R0 ;将 6个数据依次移入 31H~ 36H
MOV @R1,A ;
INC R0 ;
INC R1 ;
DJNZ R2,MOVLP3 ;
LCALL WRNB ;发送 AT24C02片内子地址及 6个数据
LCALL DLY10ms ;调用延时 10ms子程序 (略 )
AT24W4:MOV NUMB,#3 ;置第 2次写入字节数 N+1(多一个片内子地址 )
MOV MTD,#58H ;置第 2次写 AT24C02片内首址 SADR[(30H)=58H]
MOV 31H,16H ;将后 2个数据移至发送区
MOV 32H,17H ;
LCALL WRNB ;第 2次写 2个数据
RET ;
【 例 8-6】 同例 8-4,但要求将 8个数据写入 AT24C02的 52H~ 59H。
AT24RD:MOV MTD,#50H ;置 AT24C02读出数据区首址 SADR
MOV SLA,#10100000B;置写 AT24C02寻址字节
MOV NUMB,#1 ;置写入数据字节数
LCALL WRNB ;启动并发送 AT24C02读出单元子地址 SADR
MOV SLA,#10100001B;置读 AT24C02寻址字节
MOV NUMB,#10H ;置读出字节数
LCALL RDNB ;读 16个数据 [按协议存放在 40H(首址 MRD)~ 4FH中 ]
MOVD,MOV RO,#10H ;将接收 16个数据转移至 10H~ 1FH
MOV R1,#MRD ;
MOV A,@R1 ;
MOV @RO,A ;
INC RO ;
INC R1 ;
CJNE RO,#20H,MOVD ;
RET ;
【 例 8-7】 将例 8-5写入 AT24C02 50H~ 5FH中的 16个数据读出,
存入内 RAM 10H~ 1FH,设 VIIC软件包已装入 ROM,VSDA,VSCL、
SLA,NUMB,MTD,MRD均已按 8.3.2软件包小结中协议定义。
解:
80C51 I/O虚拟串行接口
I2C总线串行扩展技术
I2C总线扩展 I/O口通用器件 PCF8574
虚拟 I2C总线扩展 AT24CXX系列 E2PROM
§ 8-1 串行扩展概述一,串行扩展特点
⑴ 最大程度发挥最小系统的资源功能 。
原来由并行扩展占用的 P0口,P2口资源,直接用于 I/O口。
⑵ 简化连接线路,缩小印板面积 。
⑶ 扩展性好,可简化系统的设计 。
⑷ 串行扩展的缺点,
数据吞吐容量较小,信号传输速度较慢,但随着 CPU芯片工作频率的提高,以及串行扩展芯片功能的增强,这些缺点将逐步淡化。
1,一线制二,串行扩展方式分类一线制的典型代表为 Dallas公司推出的单总线
( 1-wire)。
2,二线制二线制的典型代表为 philips公司推出的 I2C总线
( Intel Integrated Circuit BUS)。
三线制(不包括片选线)主要有两种:
⑴ 由 Motorala公司推出的 SPI( Serial
peripheral Interface);
⑵ 由 NS公司推出的 Micro wire /PLUS。
3,三线制
SPI的时钟线是 SCK,数据线 MOSI(主发从收),MOSO(主收从发),主从器件的 MOSI和
MOSO是同名端相连。
由于该两类器件无法通过数据传输线寻址,
因此,必须由 MCU I/O线单独寻址,连到扩展器件的片选端 CS(若只扩展一片,可将扩展芯片 CS
接地)。
Micro wire /PLUS的时钟线是 SK,数据线为 SI和 SO,但 SI,SO依照主器件的数据传送方向而定,主器件的 SO与所有扩展器件数据输入端 DI
或 SI相连;主器件的 SI与所有扩展器件数据输出端 DO或 SO相连。
4,80C51 移位寄存器串行扩展
80C51的 UART(Universal Asynohronous
Receiver/Transmitter)有 4种工作方式,其中方式 0为同步移位寄存器工作方式,通过移位寄存方式,可将串行数据并行输出,也可以将并行数据串行输入。
三,虚拟串行扩展概念用通用 I/O口来模拟串行接口,构成虚拟的串行扩展接口。 只要严格控制模拟同步信号,
并满足串行同步数据传送的时序要求,就可满足串行数据传送的可靠性要求。
§ 8-2 80C51移位寄存器串行扩展技术一,移位寄存器串行扩展方式
80C51串行方式 0时,串行口作为同步移位寄存器使用。 TXD端( P3.1)
发出移位脉冲,频率为 fosc/12,RXD
端( P3.0)输入输出数据 。
1,80C51扩展并行输出口
74LS164为 串入并出 移位寄存器,其中 A,B为串行数据输入端,QA,QB,…,QH为并行数据输出端( QA为高位),CLK为同步时钟输入端,CLR为输出清 0端。若不需将输出数据清 0,则
CLR端接 Vcc。
2,80C51扩展并行输入口
74LS165为 并入串出 移位寄存器,A,B,…,H为并行输入端
( A为高位),QH为串行数据输出端,SER为串行数据输入端,
CLK为同步时钟输入端,S/L为预置控制端。 S/L=0时,锁存并行输入数据; S/L=1时,可进行串行移位操作。
80C51串行方式 0归一化子程序:
⑴ 单字节串行输出子程序
⑵ 单字节串行输入子程序
⑶ 多字节串行输出子程序
⑷ 多字节串行输入子程序二,串行方式 0归一化子程序所谓 归一化子程序,即 通用或标准化操作子程序,
将 80C51串行方式 0所有应用操作归纳成几个基本的输入输出子程序,并使这些标准子程序具有规范的入口条件和出口状态。应用时,只要设置相应的入口和出口,调用归一化子程序,就能达到串行输入输出的目的。
80C51虚拟串行 I/O口归一化子程序:
⑴ 单字节虚拟串行输出子程序
⑵ 单字节虚拟串行输入子程序
⑶ 多字节虚拟串行输出子程序
⑷ 多字节虚拟串行输入子程序三,80C51 I/O虚拟串行接口利用 80C51通用 I/O口虚拟移位寄存器工作方式实现串行扩展,只需 用任一通用 I/O口代替 RXD和 TXD,设为 VRXD和 VTXD。
四,移位寄存器串行扩展应用
80C51移位寄存器串行扩展应用,只需根据标准化的电路形式连接,设置好入口条件,然后调用串行方式 0归一化子程序或虚拟串行接口归一化子程序,即可完成扩展应用。
【 例 8-1】 电路如图 8-5所示,fosc = 12MHz,要求发光二极管从左向右依次点亮,点亮时间为 1秒,不断循环。设串行方式 0归一化子程序已存在 ROM中。
解:
PIOX1 BIT P1.0 ;定义 PIOX1
WORK,MOV A,#10000000B ;置 D7灯亮,其余暗
LOOP,CLR PIOX1 ;74LS164输出全 0,灯全暗
LCALL UART0 ;调用单字节串行输出子程序
LCALL DLY1s ;调用延时 1秒子程序 (略 )
RR A ;右移
SJMP LOOP ;
【 例 8-2】 电路如图 8-6所示,fosc=12MHz,要求每隔 10ms,检测键 K0~ K7状态,并存入内 RAM 2FH。设虚拟串行接口归一化子程序已存在 ROM中。
解,ORG 0000H ;复位地址
LJMP STAT ;转初始化程序
ORG 000BH ;T0中断入口地址
LJMP IT0 ;转 T0中断服务子程序
VRXD BIT P1.0 ;P1.0虚拟 RXD
VTXD BIT P1.1 ;P1.1虚拟 TXD
PIOX2 BIT P1.2 ;P1.2虚拟 PIOX2
ORG 0100H ;初始化程序首地址
STAT,MOV TMOD,#01H ;置 T0定时器方式 1
MOV TH0,#0D8H ;置 T0定时初值 10ms
MOV TL0,#0F0H ;
SETB TR0 ;启动 T0
SETB ET0 ;T0开中
SETB EA ;CPU开中
LJMP WORK ;转主程序并等待 T0中断
ORG 1000H ;T0中断服务子程序首地址
IT0,MOV TH0,#0D8H ;重置 T0定时初值 10ms
MOV TL0,#0F0H ;
PUSH Acc ;保护现场
PUSH PSW ;
INPUT,LCALL VUARTI ;调用虚拟串行输入子程序
MOV 2FH,A ;存键 K0~ K7状态数据
POP PSW ;恢复现场
POP Acc ;
RETI ;
1,扩展连接方式
§ 8-3 I2C总线串行扩展技术一,I2C总线串行扩展概述具有 I2C总线结构的器件,不论 SRAM,E2PROM、
ADC/DAC,I/O口或 MCU,均可通过 SDA,SCL连接
(同名端相连)。
无 I2C总线结构的器件,如 LED/LCD显示器、键盘、码盘、打印机等也可通过具有 I2C总线结构的
I/O接口电路成为串行扩展器件。
2,器件寻址方式
I2C总线器件地址 SLA格式如下:
具有 I2C总线结构的器件在器件 出厂时已经给定了器件的地址编码 。
SLA
D7 D6 D5 D4 D3 D2 D1 D0
DA3 DA2 DA1 DA0 A2 A1 A0 R/ W
器件固有地址编码 器件引脚地址 读 /写
⑴ DA3~ DA0 4位器件地址是 I2C总线器件固有的地址编码,
器件出厂时就已给定,用户不能自行设置 。
⑵ A2A1A0 3位引脚地址用于相同地址器件的识别 。若 I2C总线上挂有相同地址的器件,或同时挂有多片相同器件时,可用硬件连接方式对 3位引脚 A2A1A0接 Vcc或接地,形成地址数据。
⑶ R/W 数据传送方向 。 R/W=1时,主机接收(读);
R/W=0时,主机发送(写)。
表 8-1 常用 I2C器件地址 SLA
种类 型号 器件地址 SLA 引脚地址备注静态 RAM PCF8570/71 1010 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
PCF8570C 1011 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
E2PROM PCF8582 1010 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
AT24C02 1010 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
AT24C04 1010 A2 A1 P0 R/ W 2位数字引脚地址 A2A1
AT24C08 1010 A2 P1 P0 R/ W 1位数字引脚地址 A2
AT24C016 1010 P2 P1 P0 R/ W 无引脚地址,A2A1A0悬空处理
I/O口 PCF8574 0100 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
PCF8574A 0111 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
LED/LCD
驱动控制器
SAA 1064 0111 0 A1 A0 R/ W 2位数字引脚地址 A1A0
PCF8576 0111 0 0 A0 R/ W 1位数字引脚地址 A0
PCF8578/79 0111 1 0 A0 R/ W 1位数字引脚地址 A0
ADC/DAC PCF8951 1001 A2 A1 A0 R/ W 3位数字引脚地址 A2A1A0
日历时钟 PCF8583 1010 0 0 A0 R/ W 1位数字引脚地址 A0
3,接口电气结构
I2C总线端口输出为开漏结构,总线上必须外接上拉电阻 Rp,其阻值通常可选 5~ 10KΩ 。
4,总线驱动能力由于 I2C总线器件均为 CMOS器件,总线具有足够的电流驱动能力 。
I2C总线的电容负载能力为 400 pF( 通过驱动扩展可达 4000pF) 。
I2C总线传输速率为 100Kb/s( 改进后的规范为 400 Kb/s) 。
5,I2C总线时序一次完整的数据传送过程应包括:起始 ( S),
发送寻址字节 ( SLA R/W),应答,发送数据,应答,…,发送数据,应答,终止 ( P) 。
80C51只能采用虚拟 I2C总线方式,并且只能用于单主系统,虚拟 I2C总线接口可用通用 I/O口中任一端线充任,数据线定义为 VSDA,时钟线定义为 VSCL。
二,80C51单主系统虚拟 I2C总线软件包
80C51单主系统虚拟 I2C总线软件包 VIIC可由二大类共 9个归一化子程序组成。二大类程序分别为典型信号模拟子程序 和 数据传送通用子程序 。
1,典型信号模拟子程序对于虚拟 I2C总线,有几个重复应用的典型信号,可根据 I2C总线时序要求,编制这些典型信号子程序:
⑴ 启动信号 STAT
⑵ 终止信号 STOP
⑶ 发送应答位 (A)MACK
⑷ 发送应答非位 (A)NACK
⑸ 检查应答位 CACK
2,数据传送通用子程序数据传送通用子程序是应用典型信号模拟子程序 ( 起始,终止,应答和检查应答 ) 并按 I2C总线数据传送时序要求编制的子程序 。
⑴ 发送一字节数据子程序 WR1B
⑵ 接收一字节数据子程序 RD1B
⑶ 发送 N个字节数据子程序 WRNB
⑷ 接收 N个字节数据子程序 RDNB
按照 I2C总线数据传送时序要求,一次完整的数据发送过程应包括起始( S)、发送寻址字节( SLA R/W)、应答、
发送数据、应答,…,发送数据、应答、终止( P),其格式如下:
S SLAW A data1 A data2 A …… dataN A P
其中,红色部分由主器件发送,从器件接收;黑色部分由从器件发送,主器件接收。
发送 N个字节数据子程序 WRNB
入口条件,
① 伪指令定义 NUMB,SLA,MTD单元地址;
② 发送数据字节数存内 RAM NUMB单元;
③ 发送寻址字节存内 RAM SLA单元;
④ 发送数据依次存放在首址为 MTD的内 RAM中 。
占用资源,Acc,R1,R2,R3,Cy,F0。
WRNB,MOV R3,NUMB ;取发送数据字节数 N(存在内 RAM NUMB单元 )
WRNB0:LCALL STAT ;启动 I2C总线
MOV A,SLA ;读发送寻址字节 (存在内 RAM SLA单元 )
LCALL WR1B ;发送寻址字节
LCALL CACK ;检查应答位
JB F0,WRNB0;应答不正常,返回重发
MOV R1,#MTD ;应答 (A)正常,取发送数据存储区首址
WRDA,MOV A,@R1 ;读一个字节发送数据
LCALL WR1B ;发送一个字节
LCALL CACK ;检查应答位
JB F0,WRNB ;应答不正常,返回重发
INC R1 ;应答 (A)正常,指向发送数据下一字节
DJNZ R3,WRDA ;判 N个数据发送完毕否?未完继续
LCALL STOP ;N个数据发送完毕,发送结束信号
RET ;
按照 I2C总线数据传送时序要求,接收 N个字节数据应按下列格式编程:
接收 N个字节数据子程序 RDNB
S SLAR A data1 A data2 A … dataN A P
其中,红色部分由主器件发送,从器件接收;黑色部分由从器件发送,主器件接收。
入口条件,
① 伪指令定义 NUMB,SLA,MRD地址;
② 接收数据字节数存内 RAM NUMB单元;
③ 接收寻址字节存内 RAM SLA单元 。
出口状态,接收 N个字节依次存在首址 MRD的内 RAM中。
占用资源,Acc,R1,R2,R3,Cy,F0。
RDNB,MOV R3,NUMB ;取接收数据字节数 N(存在内 RAM NUMB单元 )
RDNB0,LCALL STAT ;启动 I2C总线
MOV A,SLA ;读接收寻址字节 (存在内 RAM SLA单元 )
LCALL WR1B ;发送接收寻址字节
LCALL CACK ;检查应答位
JB F0,RDNB0 ;应答不正常,返回重新开始
RDA0,MOV R1,#MRD ;应答 (A)正常,取接收数据存储区首址
RDA1,LCALL RD1B ;接收一个字节数据
MOV @R1,A ;存一个字节数据
DJNZ R3,ACK ;判 N个数据接收完毕否?未完转发送应答位
LCALL NACK ;N个数据接收完毕,发送应答非位 (A)
LCALL STOP ;发送终止信号
RET ;子程序结束返回
ACK,LCALL MACK ;发送应答位 (A)
INC R1 ;指向下一接收数据存储单元地址
SJMP RDA1 ;转接收下一字节数据
⑴ VIIC软件包共有 9个归一化子程序组成 。
⑵ VIIC软件包仅适用单主系统即主方式下 I2C总线外围扩展 。 且应 fosc≤ 6MHz,若 fosc> 6MHz,则应相应调整
NOP指令个数,以满足 I2C总线数据传送时序要求 。
⑶ VIIC软件包可嵌入到 80C51 ROM中任一空间,作为 I2C总线扩展应用程序设计的软件支持平台 。
⑷ 在应用 VIIC软件包初始化中,应对软件包中标记符号用伪指令定义 。
⑸ VIIC软件包占用资源,F0,Cy,Acc,R1,R1,R3。 在调用 VIIC软件包之前,若涉及这些存储单元中原有数据尚需保存,应采取保护现场措施,在调用结束后恢复现场 。
3,虚拟 I2C总线软件包 VIIC小结一,I2C总线扩展 I/O口通用器件 PCF8574
§ 8-4 虚拟 I2C总线扩展 I/O口
1,引脚功能
PCF8574是一个带有中断输出的 8
位准双向 I/O口 I2C总线扩展芯片 。
A2~ A0:地址引脚;
P0~ P7,8位准双向 I/O口,驱动能力 IOL = 25mA,IOH< 300?A;
SDA,SCL,I2C总线接口;
INT:中断请求输出,低电平有效,开漏输出;
VDD,VSS:电源端,接地端;
2,电路设计
PCF8574与 80C51 I2C总线接口应用电路 。
PCF8574的器件地址是 0100,A2A1A0为引脚地址,全接地时为 000,R/W=1时,接收寻址字节 SLAR=41H =01000001B; R/W=0时,发送寻址字节 SLAW=40H =01000000B。
3,寻址字节当 PCF8574输入端 P0~ P7电平状态改变时,中断请求输出端 INT会出现低电平(滞后时间约
4?s),可触发 80C51产生中断。在对 PCF8574进行一次读写操作后,INT端撤销中断请求,复位为高电平。
4,中断请求
5,数据输入 /输出操作格式
⑴ 输出操作
S SLAW A POdata A P
⑵ 输入操作
S SLAR A PIdata A P
其中,红色部分由 80C51发送,PCF8574接收;黑色部分由 PCF8574发送,80C51接收。
二,PCF8574应用实例
【 例 8-3】 图 8-14为 PCF8574 四键四 LED应用电路,
PCF8574 P0~ P3为键信号 K0~ K3输入端,P4~ P7
为 LED控制信号 D0~ D3输出端,要求当键 K0~ K3
按下后,相应 LED D0~ D3亮,设 VIIC软件包已装入 ROM。
解:编制程序如下:
主程序:
VSDA EQU P1.0 ;定义虚拟 I2C总线数据线端口
VSCL EQU P1.1 ;定义虚拟 I2C总线时钟线端口
SLA EQU 50H ;定义发送 /接收寻址字节内 RAM存储单元为 50H
NUMB EQU 51H ;定义发送 /接收数据字节数 N内 RAM存储单元为 51H
MTD EQU 30H ;定义发送数据内 RAM存储区首地址为 30H
MRD EQU 40H ;定义接收数据内 RAM存储区首地址为 40H
WORK:MOV MTD,#0FFH ;PCF8574初始化,置 P0~ P3输入态,D0~ D3灯灭
MOV SLA,#40H ;置发送寻址字节
MOV NUMB,#1 ;置发送字节数
LCALL WRNB ;FFH写入 PCF8574
SETB EA ;CPU开中
SETB EX1 ;INT1开中
SETB IT1 ;置 INT1边沿触发方式
SJMP $ ;等待 PCF8574 P0~ P3口状态变化触发中断中断服务子程序:
VINT:MOV SLA,#41H ;置接收寻址字节
MOV NUMB,#1 ;置接收字节数
LCALL RDNB ;读 PCF8574口状态
MOV A,MRD ;读接收数据
SWAP A ;低 4位状态移至高 4位
ORL A,#0FH ;低 4位保持输入态
MOV MTD,A ;控制信号存入发送数据首地址单元
MOV SLA,#40H ;置发送寻址字节
MOV NUMB,#1 ;置发送字节数
LCALL WRNB ;输出控制信号
RETI ;
1,引脚功能
§ 8-5 虚拟 I2C总线扩展
AT24CXX系列 E2PROM
一,I2C总线 E2PROM芯片 AT24C02
SDA,SCL,I2C总线接口
A2~ A0:地址引脚
TEST:测试端,高电平有效
VDD,VSS:电源端,接地端
2,电路设计
A2 A1 A0
TEST
E2PROM的写入时间一般需要 5~ 10ms,页写缓冲器具有 SRAM性质,可快速写入,先将 CPU输入的数据暂存页写缓冲器内,然后慢慢写入 E2PROM中 。 但一次写入数据,受到该芯片页写缓冲器容量的限制,若超出容量或超出页内地址,都将导致出错 。 应将超出部分,
隔 5~ 10ms重新启动一次写操作 。
AT24C02页写缓冲器为 8B,页内地址为 000~ 111。
3,寻址字节
AT24CXX的器件地址是 1010,A2A1A0为引脚地址,
全接地时为 000。
R/W=1时,读寻址字节 SLAR =10100001B=A1H;
R/W=0时,写寻址字节 SLAW=10100000B=A0H。
4,页写缓冲器
⑴ 写操作格式
5,数据读 /写操作格式
S SLAW A SADR A data1 A data2 A …… dataN A P
⑵ 读操作格式
S SLAW A SADR A P S SLAR A data1 A data2 A … dataN A P
其中,红色 部分由 80C51发送,AT24CXX接收; 黑色部分由
AT24CXX发送,80C51接收。
写入读出单元子地址 读出操作
【 例 8-4】 按图 8-15(b),试将内 RAM 10H为首址的 8个字节数据写入
AT24C02 50H~ 57H单元中。设 VIIC软件包已装入 ROM,VSDA、
VSCL,SLA,NUMB,MTD,MRD均已按 8.3.2软件包小结中协议定义解:
二,扩展 AT24C02应用举例
VAT24W:MOV SLA,#10100000B;置写 AT24C02寻址字节
MOV NUMB,#9 ;置写入数据字节数 N+1(多一个片内子地址 )
MOV MTD,#50H ;置写 AT24C02片内子地址首址 SADR[(30H)=50H]
MOV R0,#10H ;置 8个数据原存放区首址
MOV R1,#31H ;置 8个数据串行发送存放区首址
MOV R2,#8 ;置数据个数
MOVLP,MOV A,@R0 ;将 8个数据依次移入 31H~ 38H
MOV @R1,A ;
INC R0 ;
INC R1 ;
DJNZ R2,MOVLP ;
LCALL WRNB ;发送 AT24C02片内子地址及 8个数据
RET ;
【 例 8-5】 同例 8-4,数据改为 16个,试编程。
解:
AT24W1:LCALL VAT24W ;调用写 8个数据子程序 (第 1次写 )
LCALL DLY10ms ;调用延时 10ms子程序 (略 )
AT24W2:MOV MTD,#58H ;置第 2次写 AT24C02片内首址 SADR[(30H)=58H]
MOV R0,#18H ;置第 2次写 8个数据原存放区首址
MOV R1,#31H ;置第 2次写 8个数据串行发送存放区首址
MOV R2,#8 ;置第 2次写数据个数
MOVLP2:MOV A,@R0 ;将第 2次写 8个数据依次移入 31H~ 38H
MOV @R1,A ;
INC R0 ;
INC R1 ;
DJNZ R2,MOVLP2 ;
LCALL WRNB ;第 2次写 AT24C02
RET ;
解:
AT24W3:MOV SLA,#10100000B;置写 AT24C02寻址字节
MOV NUMB,#7 ;置写入数据字节数 N+1(多一个片内子地址 )
MOV MTD,#52H ;置写 AT24C02片内子地址首址 SADR[(30H)=52H]
MOV R0,#10H ;置 6个数据原存放区首址
MOV R1,#31H ;置 6个数据串行发送时存放区首址
MOV R2,#6 ;置数据个数
MOVLP3:MOV A,@R0 ;将 6个数据依次移入 31H~ 36H
MOV @R1,A ;
INC R0 ;
INC R1 ;
DJNZ R2,MOVLP3 ;
LCALL WRNB ;发送 AT24C02片内子地址及 6个数据
LCALL DLY10ms ;调用延时 10ms子程序 (略 )
AT24W4:MOV NUMB,#3 ;置第 2次写入字节数 N+1(多一个片内子地址 )
MOV MTD,#58H ;置第 2次写 AT24C02片内首址 SADR[(30H)=58H]
MOV 31H,16H ;将后 2个数据移至发送区
MOV 32H,17H ;
LCALL WRNB ;第 2次写 2个数据
RET ;
【 例 8-6】 同例 8-4,但要求将 8个数据写入 AT24C02的 52H~ 59H。
AT24RD:MOV MTD,#50H ;置 AT24C02读出数据区首址 SADR
MOV SLA,#10100000B;置写 AT24C02寻址字节
MOV NUMB,#1 ;置写入数据字节数
LCALL WRNB ;启动并发送 AT24C02读出单元子地址 SADR
MOV SLA,#10100001B;置读 AT24C02寻址字节
MOV NUMB,#10H ;置读出字节数
LCALL RDNB ;读 16个数据 [按协议存放在 40H(首址 MRD)~ 4FH中 ]
MOVD,MOV RO,#10H ;将接收 16个数据转移至 10H~ 1FH
MOV R1,#MRD ;
MOV A,@R1 ;
MOV @RO,A ;
INC RO ;
INC R1 ;
CJNE RO,#20H,MOVD ;
RET ;
【 例 8-7】 将例 8-5写入 AT24C02 50H~ 5FH中的 16个数据读出,
存入内 RAM 10H~ 1FH,设 VIIC软件包已装入 ROM,VSDA,VSCL、
SLA,NUMB,MTD,MRD均已按 8.3.2软件包小结中协议定义。
解: