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

📄 ex7-4.sdi

📁 《单片机原理实用教程——基于Proteus虚拟仿真》一书的配套光盘
💻 SDI
字号:
,,,ACK             BIT     10H             ;应答标志位
,,,SLA             DATA    50H             ;器件地址字
,,,SUBA            DATA    51H             ;器件子地址
,,,NUMBYTE         DATA    52H             ;读/写字节数
000B,,,SDA             BIT     P1.7
000B,,,SCL             BIT     P1.6            ;I2C总线定义
,,,MTD             EQU     30H             ;发送数据缓存区首地址(30H-3FH)
,,,MRD             EQU     40H             ;接收数据缓存区首地址(40H-4FH)
,,,                ORG     0000H
0000,21 30,,                AJMP    MAIN
,,,                ORG     0030H
,,,;*********************************************************************
,,,;名称:IWRNBYTE
,,,;描述:向器件指定子地址写N个数据
,,,;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
,,,;*********************************************************************
0030,AB 52,IWRNBYTE,IWRNBYTE:       MOV     R3,NUMBYTE
0032,12 00 97,,                LCALL   START           ;启动总线
0035,E5 50,,                MOV     A,SLA
0037,12 00 F3,,                LCALL   WRBYTE          ;发送器件地址字
003A,12 00 DE,,                LCALL   CACK
003D,30 10 17,,                JNB     ACK,RETWRN      ;无应答则退出
0040,E5 51,,                MOV     A,SUBA          ;指定子地址
0042,12 00 F3,,                LCALL   WRBYTE
0045,12 00 DE,,                LCALL   CACK
0048,79 30,,                MOV     R1,#MTD
004A,E7,WRDA,WRDA:           MOV     A,@R1
004B,12 00 F3,,                LCALL   WRBYTE          ;开始写入数据
004E,12 00 DE,,                LCALL   CACK
0051,30 10 DC,,                JNB     ACK,IWRNBYTE
0054,09,,                INC     R1
0055,DB F3,,                DJNZ    R3,WRDA         ;判断是否写完
0057,12 00 AB,RETWRN,RETWRN: LCALL   STOP
005A,22,,                RET
,,,;*********************************************************************
,,,;名称:IRDNBYTE
,,,;描述:从器件指定子地址读取N个数据
,,,;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE
,,,;*********************************************************************
005B,AB 52,IRDNBYTE,IRDNBYTE:       MOV     R3,NUMBYTE
005D,12 00 97,,                LCALL   START
0060,E5 50,,                MOV     A,SLA
0062,12 00 F3,,                LCALL   WRBYTE          ;发送器件地址字
0065,12 00 DE,,                LCALL   CACK
0068,30 10 22,,                JNB     ACK,RETRDN
006B,E5 51,,                MOV     A,SUBA          ;指定子地址
006D,12 00 F3,,                LCALL   WRBYTE
0070,12 00 DE,,                LCALL   CACK
0073,12 00 97,,                LCALL   START           ;重新启动总线
0076,E5 50,,                MOV     A,SLA
0078,04,,                INC     A               ;准备进行读操作
0079,12 00 F3,,                LCALL   WRBYTE
007C,12 00 DE,,                LCALL   CACK
007F,30 10 D9,,                JNB     ACK,IRDNBYTE
0082,79 40,,                MOV     R1,#MRD
0084,12 01 1A,RON1,RON1:           LCALL   RDBYTE          ;读操作开始
0087,F7,,                MOV     @R1,A
0088,DB 07,,                DJNZ    R3,SACK
008A,12 00 CE,,                LCALL   MNACK           ;最后一字节发非应答位
008D,12 00 AB,RETRDN,RETRDN:         LCALL   STOP
0090,22,,                RET
0091,12 00 BE,SACK,SACK:           LCALL   MACK
0094,09,,                INC     R1
0095,80 ED,,                SJMP    RON1
,,,;*********************************************************************
,,,;名称:STRRT
,,,;描述:启动I2C总线子程序—发送I2C总线起始条件
,,,;*********************************************************************
0097,D2 97,START,START:          SETB    SDA             ;发送起始条件数据信号
0099,00,,                NOP                     ;起始条件建立时间大于4.7us
009A,D2 96,,                SETB    SCL             ;发送起始条件的时钟信号
009C,00,,                NOP
009D,00,,                NOP
009E,00,,                NOP
009F,00,,                NOP
00A0,00,,                NOP                     ;起始条件锁定时间大于4.7us
00A1,C2 97,,                CLR     SDA             ;发送起始信号
00A3,00,,                NOP
00A4,00,,                NOP
00A5,00,,                NOP
00A6,00,,                NOP                     ;起始条件锁定时间大于4.7us
00A7,C2 96,,                CLR     SCL             ;钳住I2C总线,准备发送或接收数据
00A9,00,,                NOP
00AA,22,,                RET
,,,;*********************************************************************
,,,;名称:STOP
,,,;描述:停止I2C总线子程序—发送I2C总线停止条件
,,,;*********************************************************************
00AB,C2 97,STOP,STOP:           CLR     SDA             ;发送停止条件的数据信号
00AD,00,,                NOP
00AE,00,,                NOP
00AF,D2 96,,                SETB    SCL             ;发送停止条件的时钟信号
00B1,00,,                NOP
00B2,00,,                NOP
00B3,00,,                NOP
00B4,00,,                NOP
00B5,00,,                NOP                     ;起始条件建立时间大于4.7us
00B6,D2 97,,                SETB    SDA             ;发送I2C总线停止信号
00B8,00,,                NOP
00B9,00,,                NOP
00BA,00,,                NOP
00BB,00,,                NOP
00BC,00,,                NOP                     ;延迟时间大于4.7us
00BD,22,,                RET
,,,;*********************************************************************
,,,;名称:MACK
,,,;描述:发送应答信号子程序
,,,;*********************************************************************
00BE,C2 97,MACK,MACK:           CLR     SDA             ;将SDA置0
00C0,00,,                NOP
00C1,00,,                NOP
00C2,D2 96,,                SETB    SCL
00C4,00,,                NOP
00C5,00,,                NOP
00C6,00,,                NOP
00C7,00,,                NOP
00C8,00,,                NOP                     ;保持数据时间,大于4.7us
00C9,C2 96,,                CLR     SCL
00CB,00,,                NOP
00CC,00,,                NOP
00CD,22,,                RET
,,,;*********************************************************************
,,,;名称:MNACK
,,,;描述:发送非应答信号子程序
,,,;*********************************************************************
00CE,D2 97,MNACK,MNACK:          SETB    SDA             ;将SDA置1
00D0,00,,                NOP
00D1,00,,                NOP
00D2,D2 96,,                SETB    SCL
00D4,00,,                NOP
00D5,00,,                NOP
00D6,00,,                NOP
00D7,00,,                NOP
00D8,00,,                NOP
00D9,C2 96,,                CLR     SCL             ;保持数据时间,大于4.7us
00DB,00,,                NOP
00DC,00,,                NOP
00DD,22,,                RET
,,,;*********************************************************************
,,,;名称:CACK
,,,;描述:检查应答位子程序,返回值:ACK=1时表示有应答
,,,;*********************************************************************
00DE,D2 97,CACK,CACK:           SETB    SDA
00E0,00,,                NOP
00E1,00,,                NOP
00E2,D2 96,,                SETB    SCL
00E4,C2 10,,                CLR     ACK
00E6,00,,                NOP
00E7,00,,                NOP
00E8,A2 97,,                MOV     C,SDA
00EA,40 02,,                JC      CEND
00EC,D2 10,,                SETB    ACK             ;判断应答位
00EE,00,CEND,CEND:           NOP
00EF,C2 96,,                CLR     SCL
00F1,00,,                NOP
00F2,22,,                RET
,,,;*********************************************************************
,,,;名称:WRBYTE
,,,;描述:发送字节子程序,字节数据放入ACC
,,,;*********************************************************************
00F3,78 08,WRBYTE,WRBYTE:         MOV     R0,#08H
00F5,33,WLP,WLP:            RLC     A               ;取数据位
00F6,40 06,,                JC      WRI
00F8,80 12,,                SJMP    WRO             ;判断数据位
00FA,D8 F9,WLP1,WLP1:           DJNZ    R0,WLP
00FC,00,,                NOP
00FD,22,,                RET
00FE,D2 97,WRI,WRI:            SETB    SDA             ;发送1
0100,00,,                NOP
0101,D2 96,,                SETB    SCL
0103,00,,                NOP
0104,00,,                NOP
0105,00,,                NOP
0106,00,,                NOP
0107,00,,                NOP
0108,C2 96,,                CLR     SCL
010A,80 EE,,                SJMP    WLP1
010C,C2 97,WRO,WRO:            CLR     SDA             ;发送0
010E,00,,                NOP
010F,D2 96,,                SETB    SCL
0111,00,,                NOP
0112,00,,                NOP
0113,00,,                NOP
0114,00,,                NOP
0115,00,,                NOP
0116,C2 96,,                CLR     SCL
0118,80 E0,,                SJMP    WLP1
,,,;*********************************************************************
,,,;名称:RDBYTE
,,,;描述:读取字节子程序,读出的数据存放在ACC
,,,;*********************************************************************
011A,78 08,RDBYTE,RDBYTE:         MOV     R0,#08H
011C,D2 97,RLP,RLP:            SETB    SDA
011E,00,,                NOP
011F,D2 96,,                SETB    SCL             ;时钟线为高,接收数据位
0121,00,,                NOP
0122,00,,                NOP
0123,A2 97,,                MOV     C,SDA           ;读取数据位
0125,EA,,                MOV     A,R2
0126,C2 96,,                CLR     SCL             ;将SCL拉低,时间大于4.7us
0128,33,,                RLC     A               ;进行数据位的处理
0129,FA,,                MOV     R2,A
012A,00,,                NOP
012B,00,,                NOP
012C,00,,                NOP
012D,D8 ED,,                DJNZ    R0,RLP          ;未够8位,继续读入
012F,22,,                RET
,,,
0130,7C F0,MAIN,MAIN:           MOV     R4,#0F0H        ;延时,等待其它芯片复位完成
0132,DC FE,,                DJNZ    R4,$
,,,;发送数据缓存区初始化,将16个连续字节分别赋值为00H到0FH
0134,74 00,,                MOV     A,#00H
0136,78 30,,                MOV     R0,#30H
0138,F6,S1,S1:             MOV     @R0,A
0139,08,,                INC     R0
013A,04,,                INC     A
013B,B8 40 FA,,                CJNE    R0,#40H,S1
,,,;向24C02C中写数据,数据存放在24C02C中50H开始的16个字节中
013E,75 50 A0,,                MOV     SLA,#0A0H       ;24C02C地址字,写操作
0141,75 51 50,,                MOV     SUBA,#50H       ;目标地址
0144,75 52 10,,                MOV     NUMBYTE,#16     ;字节数
0147,12 00 30,,                LCALL   IWRNBYTE        ;写数据
014A,7D 14,DELAY,DELAY:          MOV     R5,#20
014C,7E F8,D1,D1:             MOV     R6,#248
014E,7F F8,D2,D2:             MOV     R7,#248
0150,DF FE,,                DJNZ    R7,$
0152,DE FA,,                DJNZ    R6,D2
0154,DD F6,,                DJNZ    R5,D1
,,,;从24C04C中读数据,数据送AT89C51中40H开始的16个字节中
0156,75 50 A0,,                MOV     SLA,#0A0H       ;24C02C地址字,伪写入操作
0159,75 51 50,,                MOV     SUBA,#50H       ;目标地址
015C,75 52 10,,                MOV     NUMBYTE,#16     ;字节数
015F,12 00 5B,,                LCALL   IRDNBYTE        ;读数据
0162,80 FE,,                SJMP    $
000E,,,                END

⌨️ 快捷键说明

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