微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机驱动I2C(24C02)汇编语言程序

51单片机驱动I2C(24C02)汇编语言程序

时间:11-28 来源:互联网 点击:
;程序说明:将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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top