⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.sdi

📁 proteus实例集锦
💻 SDI
字号:
,,,ACK             BIT             10H                     ;应答标志位
,,,SLA             DATA    50H                     ;器件地址字
,,,SUBA    DATA    51H                     ;器件子地址
,,,NUMBYTE DATA    52H                     ;读/写字节数
000B,,,SDA             BIT             P1.5
000B,,,SCL             BIT             P1.4            ;I2C总线定义
,,,MTD             EQU             30H                     ;发送数据缓存区首地址(30H-3FH)
,,,MRD             EQU             40H                     ;接收数据缓存区首地址(40H-4FH)
0000,21 80,,                AJMP    MAIN
,,,                ORG             80H
,,,;*********************************************************************
,,,;名称:IWRNBYTE
,,,;描述:向器件指定子地址写N个数据
,,,;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
,,,;*********************************************************************
0080,,IWRNBYTE,IWRNBYTE:
0080,AB 52,,                MOV             R3,NUMBYTE
0082,12 00 E7,,                LCALL   START           ;启动总线
0085,E5 50,,                MOV             A,SLA
0087,12 01 43,,                LCALL   WRBYTE          ;发送器件地址字
008A,12 01 2E,,                LCALL   CACK
008D,30 10 17,,                JNB             ACK,RETWRN      ;无应答则退出
0090,E5 51,,                MOV             A,SUBA          ;指定子地址
0092,12 01 43,,                LCALL   WRBYTE
0095,12 01 2E,,                LCALL   CACK
0098,79 30,,                MOV             R1,#MTD
009A,E7,WRDA,WRDA:   MOV             A,@R1
009B,12 01 43,,                LCALL   WRBYTE          ;开始写入数据
009E,12 01 2E,,                LCALL   CACK
00A1,30 10 DC,,                JNB             ACK,IWRNBYTE
00A4,09,,                INC             R1
00A5,DB F3,,                DJNZ    R3,WRDA         ;判断是否写完
00A7,12 00 FB,RETWRN,RETWRN: LCALL   STOP
00AA,22,,                RET
,,,;*********************************************************************
,,,;名称:IRDNBYTE
,,,;描述:从器件指定子地址读取N个数据
,,,;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE
,,,;*********************************************************************
00AB,,IRDNBYTE,IRDNBYTE:
00AB,AB 52,,                MOV             R3,NUMBYTE
00AD,12 00 E7,,                LCALL   START
00B0,E5 50,,                MOV             A,SLA
00B2,12 01 43,,                LCALL   WRBYTE          ;发送器件地址字
00B5,12 01 2E,,                LCALL   CACK
00B8,30 10 22,,                JNB             ACK,RETRDN
00BB,E5 51,,                MOV             A,SUBA          ;指定子地址
00BD,12 01 43,,                LCALL   WRBYTE
00C0,12 01 2E,,                LCALL   CACK
00C3,12 00 E7,,                LCALL   START           ;重新启动总线
00C6,E5 50,,                MOV             A,SLA
00C8,04,,                INC             A                       ;准备进行读操作
00C9,12 01 43,,                LCALL   WRBYTE
00CC,12 01 2E,,                LCALL   CACK
00CF,30 10 D9,,                JNB             ACK,IRDNBYTE
00D2,79 40,,                MOV             R1,#MRD
00D4,12 01 6A,RON1,RON1:   LCALL   RDBYTE          ;读操作开始
00D7,F7,,                MOV             @R1,A
00D8,DB 07,,                DJNZ    R3,SACK
00DA,12 01 1E,,                LCALL   MNACK           ;最后一字节发非应答位
00DD,12 00 FB,RETRDN,RETRDN: LCALL   STOP
00E0,22,,                RET
00E1,12 01 0E,SACK,SACK:   LCALL   MACK
00E4,09,,                INC             R1
00E5,80 ED,,                SJMP    RON1
,,,;*********************************************************************
,,,;名称:STRRT
,,,;描述:启动I2C总线子程序—发送I2C总线起始条件
,,,;*********************************************************************
00E7,D2 95,START,START:  SETB    SDA                     ;发送起始条件数据信号
00E9,00,,                NOP                                     ;起始条件建立时间大于4.7us
00EA,D2 94,,                SETB    SCL                     ;发送起始条件的时钟信号
00EC,00,,                NOP
00ED,00,,                NOP
00EE,00,,                NOP
00EF,00,,                NOP
00F0,00,,                NOP                                     ;起始条件锁定时间大于4.7us
00F1,C2 95,,                CLR     SDA                     ;发送起始信号
00F3,00,,                NOP
00F4,00,,                NOP
00F5,00,,                NOP
00F6,00,,                NOP                                     ;起始条件锁定时间大于4.7us
00F7,C2 94,,                CLR             SCL                     ;钳住I2C总线,准备发送或接收数据
00F9,00,,                NOP
00FA,22,,                RET
,,,;*********************************************************************
,,,;名称:STOP
,,,;描述:停止I2C总线子程序—发送I2C总线停止条件
,,,;*********************************************************************
00FB,C2 95,STOP,STOP:   CLR     SDA             ;发送停止条件的数据信号
00FD,00,,                NOP
00FE,00,,                NOP
00FF,D2 94,,                SETB    SCL             ;发送停止条件的时钟信号
0101,00,,                NOP
0102,00,,                NOP
0103,00,,                NOP
0104,00,,                NOP
0105,00,,                NOP                                     ;起始条件建立时间大于4.7us
0106,D2 95,,                SETB    SDA             ;发送I2C总线停止信号
0108,00,,                NOP
0109,00,,                NOP
010A,00,,                NOP
010B,00,,                NOP
010C,00,,                NOP                                     ;延迟时间大于4.7us
010D,22,,                RET
,,,;*********************************************************************
,,,;名称:MACK
,,,;描述:发送应答信号子程序
,,,;*********************************************************************
010E,C2 95,MACK,MACK:   CLR             SDA                     ;将SDA置0
0110,00,,                NOP
0111,00,,                NOP
0112,D2 94,,                SETB    SCL
0114,00,,                NOP
0115,00,,                NOP
0116,00,,                NOP
0117,00,,                NOP
0118,00,,                NOP                                     ;保持数据时间,大于4.7us
0119,C2 94,,                CLR             SCL
011B,00,,                NOP
011C,00,,                NOP
011D,22,,                RET
,,,;*********************************************************************
,,,;名称:MNACK
,,,;描述:发送非应答信号子程序
,,,;*********************************************************************
011E,D2 95,MNACK,MNACK:  SETB    SDA                     ;将SDA置1
0120,00,,                NOP
0121,00,,                NOP
0122,D2 94,,                SETB    SCL
0124,00,,                NOP
0125,00,,                NOP
0126,00,,                NOP
0127,00,,                NOP
0128,00,,                NOP
0129,C2 94,,                CLR             SCL                     ;保持数据时间,大于4.7us
012B,00,,                NOP
012C,00,,                NOP
012D,22,,                RET
,,,;*********************************************************************
,,,;名称:CACK
,,,;描述:检查应答位子程序,返回值:ACK=1时表示有应答
,,,;*********************************************************************
012E,D2 95,CACK,CACK:   SETB    SDA
0130,00,,                NOP
0131,00,,                NOP
0132,D2 94,,                SETB    SCL
0134,C2 10,,                CLR             ACK
0136,00,,                NOP
0137,00,,                NOP
0138,A2 95,,                MOV             C,SDA
013A,40 02,,                JC              CEND
013C,D2 10,,                SETB    ACK                     ;判断应答位
013E,00,CEND,CEND:   NOP
013F,C2 94,,                CLR             SCL
0141,00,,                NOP
0142,22,,                RET
,,,;*********************************************************************
,,,;名称:WRBYTE
,,,;描述:发送字节子程序,字节数据放入ACC
,,,;*********************************************************************
0143,78 08,WRBYTE,WRBYTE: MOV             R0,#08H
0145,33,WLP,WLP:    RLC             A                       ;取数据位
0146,40 06,,                JC              WRI
0148,80 12,,                SJMP    WRO                     ;判断数据位
014A,D8 F9,WLP1,WLP1:   DJNZ    R0,WLP
014C,00,,                NOP
014D,22,,                RET
014E,D2 95,WRI,WRI:    SETB    SDA                     ;发送1
0150,00,,                NOP
0151,D2 94,,                SETB    SCL
0153,00,,                NOP
0154,00,,                NOP
0155,00,,                NOP
0156,00,,                NOP
0157,00,,                NOP
0158,C2 94,,                CLR             SCL
015A,80 EE,,                SJMP    WLP1
015C,C2 95,WRO,WRO:    CLR             SDA                     ;发送0
015E,00,,                NOP
015F,D2 94,,                SETB    SCL
0161,00,,                NOP
0162,00,,                NOP
0163,00,,                NOP
0164,00,,                NOP
0165,00,,                NOP
0166,C2 94,,                CLR             SCL
0168,80 E0,,                SJMP    WLP1
,,,;*********************************************************************
,,,;名称:RDBYTE
,,,;描述:读取字节子程序,读出的数据存放在ACC
,,,;*********************************************************************
016A,78 08,RDBYTE,RDBYTE: MOV             R0,#08H
016C,D2 95,RLP,RLP:    SETB    SDA
016E,00,,                NOP
016F,D2 94,,                SETB    SCL                     ;时钟线为高,接收数据位
0171,00,,                NOP
0172,00,,                NOP
0173,A2 95,,                MOV             C,SDA           ;读取数据位
0175,EA,,                MOV             A,R2
0176,C2 94,,                CLR             SCL                     ;将SCL拉低,时间大于4.7us
0178,33,,                RLC             A                       ;进行数据位的处理
0179,FA,,                MOV             R2,A
017A,00,,                NOP
017B,00,,                NOP
017C,00,,                NOP
017D,D8 ED,,                DJNZ    R0,RLP          ;未够8位,继续读入
017F,22,,                RET
0180,7C F0,MAIN,MAIN:   MOV             R4,#0F0H        ;延时,等待其它芯片复位完成
0182,DC FE,,                DJNZ    R4,$
,,,;发送数据缓存区初始化,将16个连续字节分别赋值为00H到0FH
0184,74 00,,                MOV             A,#0
0186,78 30,,                MOV             R0,#30H
0188,F6,S1,S1:             MOV             @R0,A
0189,08,,                INC             R0
018A,04,,                INC             A
018B,B8 40 FA,,                CJNE    R0,#40H,S1
,,,;向24C01C中写数据,数据存放在24C01C中30H开始的16个字节中
018E,75 50 A0,,                MOV             SLA,#0A0H       ;24C01C地址字,写操作
0191,75 51 30,,                MOV             SUBA,#30H       ;目标地址
0194,75 52 10,,                MOV             NUMBYTE,#16     ;字节数
0197,12 00 80,,                LCALL   IWRNBYTE        ;写数据
019A,7D 14,DELAY,DELAY:  MOV             R5,#20
019C,7E F8,D1,D1:             MOV             R6,#248
019E,7F F8,D2,D2:             MOV             R7,#248
01A0,DF FE,,                DJNZ    R7,$
01A2,DE FA,,                DJNZ    R6,D2
01A4,DD F6,,                DJNZ    R5,D1
,,,;从24C01C中读数据,数据送AT89C51中40H开始的16个字节中
01A6,75 50 A0,,                MOV             SLA,#0A0H       ;24C01C地址字,伪写入操作
01A9,75 51 30,,                MOV             SUBA,#30H       ;目标地址
01AC,75 52 10,,                MOV             NUMBYTE,#16     ;字节数
01AF,12 00 AB,,                LCALL   IRDNBYTE        ;写数据
000E,,,                END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -