(预习报告)一、实验目的掌握基于MCS-51系统的总线扩展的方法二、实验内容1.利用MCS-51系统的P1口模拟总线接口,扩展串口存储器24C16,每次存入1个数据,并反复读回,用示波器测试读回的波形。
(分别以数据AAH,55H测试)2.将MCS-51系统片内存储器的10个数据存入串口存储器24C16并读回,分别设置存入的地址为页地址+00H和页地址+07H。
读回为地址页地址+00H,将读回的数据存放在片内存储器,并与发送数据进行比较。
三、硬件原理图只需将24C16的SCL与P1.1相连,SDA与P1.0相连即可。
24C16资料:四、程序清单8-4-1ACK BIT 10H ;应答位判断标志SDA BIT P1.0 ;数据线SCL BIT P1.1 ;时钟线ORG 0030HSEND: LCALL START ;启动MOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送 MOV A,#30H ;写入的地址为#30HLCALL WRBYTE ;发送地址LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送 MOV A,#0AAH ;写入的数据位#0AAHLCALL WRBYTE ;发送数据LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送 LCALL STOP ;停止LCALL DELAY ;发送与接收之间加入一段延时READ: LCALL START ;启动MOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动MOV A,#30H ;读的地址为#30HLCALL WRBYTE ;发送读地址LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动 LCALL START ;重新启动MOV A,#0A1H ;控制字节为#0A1HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动 LCALL RDBYTE ;从24C16的地址30H读回数据 MOV 40H,A ;把数据存入内部存储器40H LCALL MNACK ;发送无效应答LCALL STOP ;停止AJMP READ ;循环读回数据DELAY: MOV R5,#10HD1: MOV R6,#0FFHD2: MOV R7,#0FFHDJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET;发送单字节子程序,字节数据放入ACC WRBYTE:MOV R0,#08HWLP: RLC A ;移出ACC.7到CYJC WR1 ;若CY为1,发送'1'SJMP WR0 ;若CY为0,发送'0'WLP1: DJNZ R0,WLP ;已发送8位二进制数,返回RETWR1: SETB SDA ;发送1NOPSETB SCLNOPNOPNOPNOPCLR SCLAJMP WLP1WR0: CLR SDA ;发送0NOPSETB SCLNOPNOPNOPNOPCLR SCLSJMP WLP1;读取字节子程序,读出的数据存放在ACCRDBYTE:MOV R0,#08HRLP: SETB SDANOPSETB SCL ;时钟线为高,接收数据位NOPNOPMOV C,SDA ;读取数据位MOV A,R2CLR SCL ;将SCL拉低,时间大于4.7usRLC A ;进行数据位的处理MOV R2,ANOPNOPNOPDJNZ R0,RLP ;未够8位,继续读入RET;启动I2C总线子程序START: SETB SDANOPSETB SCL ;发送起始条件的时钟信号NOPNOPNOPNOPNOP ;起始条件锁定时间大于4.7usCLR SDA ;发送起始信号NOPNOPNOPNOP ;起始条件锁定时间大于4.7usCLR SCL ;钳住I2C总线,准备发送或接收数据 NOPRET;停止I2C总线子程序STOP: CLR SDANOPNOPSETB SCL ;发送停止条件的时钟信号NOPNOPNOPNOPNOP ;起始条件建立时间大于4.7us SETB SDA ;发送I2C总线停止信号NOPNOPNOPNOPNOP ;延迟时间大于4.7usRET;发送无效应答信号子程序MNACK: SETB SDANOPNOPSETB SCLNOPNOPNOPNOPNOPCLR SCL ;保持数据时间,大于4.7us NOPNOPRET;接收应答位子程序, ACK=1时表示正常应答CACK: SETB SDANOPNOPSETB SCLCLR ACKNOPNOPMOV C,SDAJC CEND ;判断应答位SETB ACKCEND: NOPCLR SCLNOPRETEND8-4-2、ACK BIT 10H ;应答位判断标志SDA BIT P1.0 ;数据线SCL BIT P1.1 ;时钟线ORG 0030HMAIN: MOV R0,#0AH ;发送数据缓存区初始化MOV R1,#30H ;将30H开始的10个地址分别赋值为00H到09H MOV A,#00HW1: MOV @R1,AINC R1INC ADJNZ R0,W1SEND: MOV R1,#30H ;数据内存地址为30HMOV R2,#0AH ;发送10个数据LCALL START ;启动MOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送MOV A,#00H ;写入的页地址为+00HLCALL WRBYTE ;发送地址LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送S1: MOV A,@R1 ;发送数据LCALL WRBYTELCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送INC R1DJNZ R2,S1 ;发送10个数据,写入地址自动加1LCALL STOP ;停止LCALL DELAY ;两次发送之间加入一段延时SEND1: MOV R1,#30H ;数据内存地址为30HMOV R2,#0AH ;发送10个数据LCALL STARTMOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTELCALL CACKJNB ACK,SEND1 ;收到无效应答,重新发送MOV A,#07H ;写入的页地址为+07HLCALL WRBYTELCALL CACKJNB ACK,SEND1S2: MOV A,@R1LCALL WRBYTELCALL CACKJNB ACK,SEND1INC R1DJNZ R2,S2LCALL STOPLCALL DELAY ;发送与接收之间加入一段延时READ: MOV R3,#14H ;从24C16读回20个数据MOV R1,#40H ;存入40H开始的内部存储器LCALL START ;启动MOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动MOV A,#00H ;读回的页地址为+00HLCALL WRBYTE ;发送读地址LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动LCALL START ;重新启动MOV A,#0A1H ;控制字节为#0A1HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动E2: LCALL RDBYTE ;从24C16读回数据LCALL MACK ;发送应答MOV @R1,A ;读回数据存入内部存储器INC R1DJNZ R3,E2 ;读20个数据LCALL MNACK ;发送无效应答LCALL STOP ;停止HE: AJMP HE;子程序;启动I2C总线START: SETB SDANOPNOPSETB SCL ;发送起始条件的时钟信号NOPNOPNOPNOPNOP ;起始条件锁定时间大于4.7usCLR SDA ;发送起始信号NOPNOPNOPNOP ;起始条件锁定时间大于4.7usCLR SCL ;钳住I2C总线,准备发送或接收数据NOPNOPRET;停止I2C总线STOP: CLR SDANOPNOPSETB SCL ;发送停止条件的时钟信号NOPNOPNOPNOPNOP ;起始条件建立时间大于4.7us SETB SDA ;发送I2C总线停止信号NOPNOPNOPNOPNOP ;延迟时间大于4.7usRET;延时DELAY: MOV R5,#0FHD1: MOV R6,#32HD2: MOV R7,#64HDJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET;发送单字节子程序,字节数据放入ACCWRBYTE:MOV R0,#08HWLP: RLC A ;移出ACC.7到CYJC WR1 ;若CY为1,发送‘1’SJMP WR0 ;若CY为0,发送‘0’WLP1: DJNZ R0,WLP ;已发送8位二进制数,返回RETWR1: SETB SDA ;发送1NOPSETB SCLNOPNOPNOPNOPCLR SCLAJMP WLP1WR0: CLR SDA ;发送0NOPSETB SCLNOPNOPNOPNOPCLR SCLSJMP WLP1;读取字节子程序,读出的数据存放在ACCRDBYTE:MOV R0,#08H ;共读8位RLP: SETB SDANOPSETB SCL ;时钟线为高,接收数据位NOPNOPMOV C,SDA ;读取数据位MOV A,R2CLR SCL ;将SCL拉低,时间大于4.7us RLC A ;进行数据位的处理MOV R2,ANOPNOPNOPDJNZ R0,RLP ;未够8位,继续读入RET;发送应答信号子程序MACK: CLR SDANOPNOPSETB SCLNOPNOPNOPNOPNOP ;保持数据时间,大于4.7usCLR SCLNOPNOPRET;发送无效应答信号子程序MNACK: SETB SDANOPNOPSETB SCLNOPNOPNOPNOPNOPCLR SCL ;保持数据时间,大于4.7us NOPNOPRET;接收应答位子程序, ACK=1时表示正常应答CACK: SETB SDANOPNOPSETB SCLCLR ACKNOPNOPMOV C,SDAJC CEND ;判断应答位SETB ACK ;正常CEND: NOPCLR SCLNOPRETEND(实验报告)一、硬件原理图拿到24C16后发现需要查看一下引脚的连法,于是上网查了24C16的datasheet:其中A0,A1,A2,GND都接地,VCC+5V。