I2C串口
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
II22CC总线扩展实验
06300720040
夏晓天电子信息科学与技术
【预习报告】
一.实验目的
掌握基于MCS-51系统的I2C总线扩展的方法
二.实验内容
1.利用MCS-51系统的P1口模拟I2C总线接口,扩展串口存储器24C16,每次存入1个数据,并反复读回,用示波器测试读回的波形。
(分别以数据AAH,55H测试)2.将MCS-51系统片内存储器的10个数据存入串口存储器24C16并读回,分别设置存入的地址为页地址+00H和页地址+07H。
读回为地址页地址+00H,将读回的
数据存放在片内存储器,并与发送数据进行比较。
三.电原理图和程序清单
8-4-1.硬件连接图:
程序清单:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
SCL EQU P1.0
SDA EQU P1.1
MRD EQU 40H
;发送部分
SNDN: LCALL START ;启动
MOV A,#0A0H ;发控制字,写
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN ;非正常应答则重新发送 MOV A,#00H ;发送地址
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN ;非正常应答则重新发送 MOV A,#0AAH ;发送数据
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN ;非正常应答则重新发送 LCALL STOP ;停止
LCALL DELAY2 ;延迟一段时间再读回;接收部分
REVN: LCALL START ;启动
MOV A,#0A0H ;发控制字,写
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,REVN ;非正常应答则重新发送 MOV A,#00H ;发送地址
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,REVN ;非正常应答则重新发送 LCALL START ;再次启动
MOV A,#0A1H ;发控制字,读
LCALL SEND ;发送
LCALL ACKS ;发送应答位
LCALL REV ;接收
MOV MRD,A ;接收的数据存放在40H LCALL NACKS ;发送非应答位
LCALL STOP ;停止
SJMP REVN ;再次接收
;启动信号传递
START:SETB SDA
NOP
SETB SCL
LCALL DELAY
CLR SDA
LCALL DELAY
CLR SCL
NOP
RET
;停止信号传递
STOP: CLR SDA
NOP
NOP
SETB SCL
LCALL DELAY
SETB SDA
LCALL DELAY
;CLR SDA
;CLR SCL
RET
;发送一个字节
SEND: MOV R0,#08H ;8位数据长度送R0
WLP: RLC A ;发送数据左移,使发送位入C JC WR1 ;判断发送为1还是0,发送1转WR1 AJMP WR0 ;发送0转WR0
WLP1: DJNZ R0,WLP ;8位是否发送完?未完转WLP
RET ;8位发送完结束
WR1: SETB SDA ;发送1程序段
NOP
SETB SCL
LCALL DELAY
CLR SCL
;CLR SDA
AJMP WLP1
WR0: CLR SDA ;发送0程序段
NOP
SETB SCL
LCALL DELAY
CLR SCL
AJMP WLP1
;接收一个字节
REV: MOV R0,#08H ;8位数据长度入R0
REV0: SETB SDA ;置VSDA为输入方式
NOP
SETB SCL ;使VSDA上数据有效
NOP
MOV C,SDA ;读入VSDA引脚状态
MOV A,R2 ;读入0程序段,由C拼装入R2中 CLR SCL ;使VSCL=0可继续接收数据位
RLC A
MOV R2,A
LCALL DELAY
DJNZ R0,REV0 ;8位是否读完?未读完转RLP
RET
;发送应答位
ACKS: CLR SDA
NOP
NOP
SETB SCL
LCALL DELAY
CLR SCL
NOP
NOP
;SETB SDA
RET
;发送非应答位
NACKS:SETB SDA
NOP
NOP
SETB SCL
LCALL DELAY
CLR SCL
NOP
NOP
;CLR SDA
RET
;检查应答位
CACK: SETB SDA ;置VSDA为输入方式
NOP
NOP
SETB SCL ;使VSDA上数据有效
CLR F0 ;预设F0=0
NOP
NOP
MOV C,SDA ;输入VSDA引脚状态
JNC CEND ;检查VSDA状态,正常应答转CEND,且F0=0 SETB F0 ;无正常应答,F0=1
CEND: NOP
CLR SCL ;子程序结束,使VSCL=0
NOP
RET
;延时
DELAY: NOP
NOP
NOP
NOP
RET
;延时2
DELAY2:MOV R6,#0FFH
DEL1: MOV R7,#0FFH
D EL2: DJNZ R7,DEL2
DJNZ R6,DEL1
RET
END
8-4-2.硬件连接图:
程序清单:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
SCL EQU P1.0
SDA EQU P1.1
MTD EQU 30H
MRD EQU 40H
MOV R0,#0AH
MOV R1,#30H
MOV A,#00H
STR: MOV @R1,A ;0~9分别存放在30H~39H INC R1
INC A
DJNZ R0,STR
;发送部分1
MOV R1,#30H
MOV R0,#0AH
SNDN1: LCALL START ;启动
MOV A,#0A0H ;发控制字,写
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN1 ;非正常应答则重新发送 MOV A,#00H ;发送地址
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN1 ;非正常应答则重新发送L1: MOV A,@R1 ;取发送数据
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN1 ;非正常应答则重新发送INC R1
DJNZ R0,L1 ;未发完10个数据则转L1 LCALL STOP ;停止
LCALL DELAY2 ;延迟一段时间再读回
;发送部分2
MOV R1,#30H
MOV R0,#0AH
SNDN2: LCALL START ;启动
MOV A,#0A0H ;发控制字,写
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN2 ;非正常应答则重新发送
MOV A,#00H ;发送地址
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN2 ;非正常应答则重新发送
L2: MOV A,@R1 ;取发送数据
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,SNDN2 ;非正常应答则重新发送INC R1
DJNZ R0,L2 ;未发完10个数据则转L1
LCALL STOP ;停止
LCALL DELAY2 ;延迟一段时间再读回
;接收部分
MOV R1,#40H
MOV R0,#14H
REVN: LCALL START ;启动
MOV A,#0A0H ;发控制字,写
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,REVN ;非正常应答则重新发送
MOV A,#00H ;发送地址
LCALL SEND ;发送
LCALL CACK ;检查应答位
JB F0,REVN ;非正常应答则重新发送
LCALL START ;再次启动
MOV A,#0A1H ;发控制字,读
LCALL SEND ;发送
LCALL ACKS ;发送应答位
L3: LCALL REV ;接收
LCALL ACKS ;发送应答位
MOV @R1,A ;接收数据存放在40H~49H INC R1
DJNZ R0,L3 ;未接收完10个数据则转L3 LCALL NACKS ;发送非应答位
LCALL STOP ;停止
HE : SJMP HE
;启动信号传递
START:SETB SDA
NOP
SETB SCL
LCALL DELAY
CLR SDA
LCALL DELAY
CLR SCL
NOP
RET
;停止信号传递
STOP: CLR SDA
NOP
NOP
SETB SCL
LCALL DELAY
SETB SDA
LCALL DELAY
;CLR SDA
;CLR SCL
RET
;发送一个字节
SEND: MOV R0,#08H ;8位数据长度送R0
WLP: RLC A ;发送数据左移,使发送位入C
JC WR1 ;判断发送为1还是0,发送1转WR1 AJMP WR0 ;发送0转WR0
WLP1: DJNZ R0,WLP ;8位是否发送完?未完转WLP
RET ;8位发送完结束
WR1: SETB SDA ;发送1程序段
NOP
SETB SCL
LCALL DELAY
CLR SCL
;CLR SDA
AJMP WLP1
WR0: CLR SDA ;发送0程序段
NOP
SETB SCL
LCALL DELAY
CLR SCL
AJMP WLP1
;接收一个字节
REV: MOV R0,#08H ;8位数据长度入R0
REV0: SETB SDA ;置VSDA为输入方式
NOP
SETB SCL ;使VSDA上数据有效
NOP
MOV C,SDA ;读入VSDA引脚状态
MOV A,R2 ;读入0程序段,由C拼装入R2中
CLR SCL ;使VSCL=0可继续接收数据位
RLC A
MOV R2,A
LCALL DELAY
DJNZ R0,REV0 ;8位是否读完?未读完转RLP
RET
;发送应答位
ACKS: CLR SDA
NOP
NOP
SETB SCL
LCALL DELAY
CLR SCL
NOP
NOP
;SETB SDA
RET
;发送非应答位
NACKS:SETB SDA
NOP
NOP
SETB SCL
LCALL DELAY
CLR SCL
NOP
NOP
;CLR SDA
RET
;检查应答位
CACK: SETB SDA ;置VSDA为输入方式
NOP
NOP
SETB SCL ;使VSDA上数据有效
CLR F0 ;预设F0=0
NOP
NOP
MOV C,SDA ;输入VSDA引脚状态
JNC CEND ;检查VSDA状态,正常应答转CEND,且F0=0 SETB F0 ;无正常应答,F0=1
CEND: NOP
CLR SCL ;子程序结束,使VSCL=0
NOP
RET
;延时
DELAY: NOP
NOP
NOP
NOP
RET
;延时2
DELAY2:MOV R6,#0FFH
DEL1: MOV R7,#0FFH
D EL2: DJNZ R7,DEL2
DJNZ R6,DEL1
RET
END
【实验报告】 一.修改后的电原理图(不需修改,见预习报告)二.修改后的程序清单:8-4-1.
(不需修改,见预习报告)
三.实验结果和数据
8-4-1.示波器测试的读回的波形:
波形分析:
由于一个读回周期比较长,所以波形分成四段才能看完整。
从启动开始分析:当SCL
为高时,SDA由高变低,启动传送。
接着发送控制字,在SCL的上升沿SDA分别是高、低、高、低、低、低、低、低,对应控制字10100000,其中最后一个0代表写。
紧接其后SCL 上升沿SDA为低,为应答位0。
接着发送地址,在SCL的上升沿SDA分别是低、低、低、低、低、低、低、低,对应地址00000000。
紧接其后SCL上升沿SDA为低,为应答位0。
然后当SCL为高时,SDA由高变低,重新启动。
接着发送控制字,在SCL的上升沿SDA分别是高、低、高、低、低、低、低、低,对应控制字10100001,其中最后一个1代表读。
紧接其后SCL上升沿SDA为低,为应答位0。
接着读回数据,在SCL的上升沿SDA分别是高、低、高、低、高、低、高、低,对应数据10101010,也就是AAH。
紧接其后SCL上升沿SDA为高,为非应答位1。
最后在SCL高期间SDA由低变高,停止传送。
8-4-2.
发送数据为00、01、02、03、04、05、06、07、08、09,从24C16页地址+00读回的10个数据存放在40H~49H单元,分别为:09、01、02、03、04、05、06、00、01、02 分析:刚开始写入24C16的10个数据是从页地址+00开始,各地址对应的数据如下表:
接着写入24C16的10个数据是从页地址+07开始,因为一页只有16个单元,所以最后一个数据09会覆盖页地址+00处的数据00。
各地址对应的数据如下表:
根据上表从页地址+00处读回的10个数据为:09、01、02、03、04、05、06、00、01、02,与实验结果一致。