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

📄 i2c.asm

📁 51 单片机支持i2c电路和源程序
💻 ASM
字号:
;程序说明:将MPU内部的55h~~~58h中的内容由外部中断0经I2C总线写到24c02中,然后由外部中断1将所写的内容读到
;MPU内部数据存储器60H~~63H

SCL EQU P1.1 
SDA EQU P1.0 
org 0000h
jmp begin
org 0003H
ljmp write
org 0013H
ljmp read

;主程序
begin:
mov 55H,#41H
mov 56h,#42h
MOV 57h,#43H
MOV 58H,#44H
mov tcon,#0
setb ex0
setb ex1
setb ea
main:
nop
jmp main

;**********************************************************
;读24C02的数据的程序
read:    
ACALL START ;开始信号
MOV A,#0A0H ;发从机的地址
ACALL SEND ;发送控制字
ACALL ACKI;接收应答
JC OUTEND ;不响应,转结束
MOV A,#00H;设置要读取从器件的片内地址
ACALL SEND
ACALL ACKI
JC OUTEND
ACALL START ;开始信号
ORL A,#0A1H;设置控制字,准备接收
ACALL SEND ;发送控制字
ACALL ACKI
JC OUTEND
MOV R2,#4 ;准备接收数据的字节数
MOV R1,#60H ;接收字节存放在主器件中的地址60H
IN0:
ACALL REV ;接收一个字节
ACALL ACKO;主机向24C02发送应答信号
MOV @R1,A ;把接收到数据存放到存储单元中
INC R1
DEC R2
CJNE R2,#1,IN0 ;判断是否为最后一个接收字节
ACALL REV ;接收最后一个字节
ACALL ACKN;
MOV @R1,A ;把接收到数据存放到存储单元中
OUTEND:
ACALL STOP ;停止信号
jnb p3.3,$
reti


;**********************************************************
;写24C02的数据的程序
write:
LCALL START ;开始信号
MOV A,#0A0H ;定控制字,准备发送
ACALL SEND ;发送控制字
ACALL ACKI ;接收应答
JC WRITEEND ;从器件不响应,转结束
MOV A,#00H ;设置从器件片内地址
ACALL SEND ;发送片内地址
ACALL ACKI
JC WRITEEND
MOV R2,#4;设置发送字节数
MOV R1,#55H ;主器件中要发送数据的头地址
OUT1:
MOV A,@R1
ACALL SEND;发送数据
ACALL ACKI;
JC WRITEEND
INC R1
DJNZ R2,OUT1 ;发送未结束,继续发送
WRITEEND:
ACALL STOP ;停止信号
jnb p3.2,$;防止再次中断
reti
;********************************************************
;********************
;I2C模拟程序
;开始信号
START:
CLR SCL 
SETB SDA
ACALL DELAY  
SETB SCL
ACALL DELAY 
CLR SDA 
ACALL DELAY  
CLR SCL 
RET 
; 停止信号:
 STOP:CLR SCL 
 CLR SDA 
 ACALL DELAY 
 SETB SCL 
 ACALL DELAY 
 SETB SDA 
 ACALL DELAY 
 RET 
; 接收一个字节
 REV: MOV R0,#08H 
 REV0: SETB SCL 
 LCALL DELAY
 MOV C,SDA
 RLC A 
 CLR SCL 
 LCALL DELAY
 DJNZ R0,REV0 
 RET 
;发送一个字节 
SEND:
MOV R0,#08H 
CLR SCL 
SEND0:
RLC A  
MOV SDA,C  
SETB SCL  
ACALL DELAY 
CLR SCL 
DJNZ R0,SEND0
SETB SDA 
RET 
;接收一个应答位:
ACKI:
SETB SCL  
ACALL DELAY  
MOV C,SDA 
CLR SCL 
RET 
; 发送一个接收应答位
 ACKO:
 CLR SDA
 ACALL DELAY
 SETB SCL
  ACALL DELAY
 CLR SCL
  ACALL DELAY
 SETB SDA
  ACALL DELAY
 RET 
 ;发送一个非接收接收应答位
 ACKN:
 SETB SDA
 ACALL DELAY
 SETB SCL
 ACALL DELAY
 CLR SCL
 ACALL DELAY
DELAY:
NOP
NOP
NOP
RET

end

⌨️ 快捷键说明

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