51单片机STC89C52 iic

SCL BIT P2.1 
SDA BIT P2.0
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
MOV SP,#30H
MOV P1,#0FFH ;灭LED
MOV R6,#2 ;R6保存AT24C02内部待写地址,用于传递参数
MOV R7,#55H ;R7保存待写数据,用于传递参数
LCALL iic_Write ;调用写函数,将R7的数据写入AT24C02 R6所指地址
LCALL DELAY10MS ;延时
MOV R6,#2 ;R6保存AT24C02内部待读地址,用于给读函数传递参数
LCALL iic_Read ;调用读函数
MOV A,R7 ;将保存在R7内的读取到的数据,送给累加器
CJNE A,#55H,MAINA0  ;比较读回的数据是否跟写入的一致
MOV P1,#0FH ;数据一致高4位LED亮
SJMP $
MAINA0:
MOV P1,#0F0H ;数据不一致低4位LED亮
MAINA1:
SJMP $

iic_Write: ;IIC写函数,参数R6:地址,参数R7:数据
PUSH ACC 
CLR SCL	;START信号
SETB SDA
SETB SCL
CLR SDA
MOV A,#0A0H ;器件地址,写方向
MOV R0,#08H
IIC1:
CLR SCL ;SDA只能在SCL为低电平时可变
RLC A
JC IIC0
CLR SDA
SJMP IIC2
IIC0:
SETB SDA
IIC2:
SETB SCL ;上升沿到来,AT24C02将SDA数据锁存
DJNZ R0,IIC1
CLR SCL ;允许SDA变化,等待ACK
SETB SDA ;释放SDA,以检测ACK
JB SDA,$ ;等待ACK
SETB SCL 
MOV A,R6 ;内部地址,写方向
MOV R0,#8
IIC3:
CLR SCL
RLC A
JC IIC4
CLR SDA
SJMP IIC5
IIC4:
SETB SDA
IIC5:
SETB SCL
DJNZ R0,IIC3
CLR SCL ;检测ACK
SETB SDA
JB SDA,$
SETB SCL
MOV A,R7 ;数据,写方向
MOV R0,#8
IIC6:
CLR SCL
RLC A
JC IIC7
CLR SDA
SJMP IIC8
IIC7:
SETB SDA
IIC8:
SETB SCL
DJNZ R0,IIC6
CLR SCL	;检测ACK
SETB SDA
JB SDA,$
SETB SCL
CLR SCL	;STOP信号
CLR SDA 
SETB SCL
SETB SDA
POP ACC
RET

iic_Read: ;IIC读函数,参数R6:地址
PUSH ACC
CLR SCL ;START信号
SETB SDA
SETB SCL
CLR SDA
MOV A,#0A0H ;器件地址,写方向 
MOV R0,#8
IIC10:
CLR SCL
RLC A
JC IIC00
CLR SDA
SJMP IIC20
IIC00:
SETB SDA
IIC20:
SETB SCL
DJNZ R0,IIC10
CLR SCL ;检测ACK
SETB SDA
JB SDA,$
SETB SCL
MOV A,R6 ;内部地址,写方向
MOV R0,#8
IIC30:
CLR SCL
RLC A
JC IIC40
CLR SDA
SJMP IIC50
IIC40:
SETB SDA
IIC50:
SETB SCL
DJNZ R0,IIC30
CLR SCL ;检测ACK
SETB SDA
JB SDA,$
SETB SCL 
CLR SCL
SETB SDA ;重新发起始信号
SETB SCL
CLR SDA
MOV A,#0A1H ;器件地址,读方向 
MOV R0,#8
IIC11:
CLR SCL
RLC A
JC IIC01
CLR SDA
SJMP IIC21
IIC01:
SETB SDA
IIC21:
SETB SCL
DJNZ R0,IIC11
CLR SCL ;检测ACK
SETB SDA
JB SDA,$
SETB SCL  
MOV R0,#8
IICA2:
CLR SCL ;开始读数据
SETB SDA
SETB SCL
NOP
JB SDA,IICA0
CLR C
SJMP IICA1
IICA0:
SETB C
IICA1:
RLC A
DJNZ R0,IICA2
MOV R7,A ;保存读取数据
CLR SCL ;STOP信号
CLR SDA
SETB SCL
SETB SDA
POP ACC
RET

DELAY10MS:    ;延时 
SETB RS0
MOV R1,#10
DELAY1:
MOV R0,#250
DELAY0:
NOP
NOP 
DJNZ R0,DELAY0
DJNZ R1,DELAY1
CLR RS0
RET

DELAY4S:    ;延时 
SETB RS1
MOV R3,#02H
DELAY30:
MOV R2,#04H
DELAY20:
MOV R1,#250
DELAY10:
MOV R0,#250
DELAY00:
NOP
NOP 
DJNZ R0,DELAY00
DJNZ R1,DELAY10
DJNZ R2,DELAY20
DJNZ R3,DELAY30
CLR RS1
RET

END


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章