忘了程序在哪找的 程序可以正常使用
ADDRESS EQU 2EH;
SCL BIT P3.6; DS3231 16脚
SDA BIT P3.7; DS3231 15脚
; 30H ; 秒 #00H
; 31H ; 分 #01H
; 32H ; 时 #02H
; 33H ; 周 #03H
; 34H ; 日 #04H
; 35H ; 月 #05H
; 36H ; 年 #06H
;写入时间日期 把30H到36H内的数据写入到DS3231
LCALL SHEZHI_3231;
;读时间日期 把从DS3231读出的数据存到30H到36H
LCALL READ_3231;
;=================设置3231功能=================================
;D0H写入,D1H读出
;==============================================================
//设置时间
SHEZHI_3231:
MOV R6,#0D0H ;写入数据识别码
MOV R0,#30H ;R0作为间接寻址 存放预设时间
MOV ADDRESS,#00H;开始写入地址 从秒开始
MOV R5,#7
LCALL WRITE
RET
//写入时间
WRITE:
LCALL START
MOV A,R6
LCALL SENDA
LCALL ACK
JC WRITE
MOV A,ADDRESS
LCALL SENDA
LCALL ACK
MOV A,@R0
LCALL SENDA
LCALL ACK
LCALL STOP
INC R0
INC ADDRESS
DJNZ R5,WRITE ;减1后不为0转移,存储6位
RET
;=================3231读程序==============================
READ_3231:
MOV R0,#30H; ;R0开始存放地址
MOV ADDRESS,#00H; ;指向地址 秒
MOV R5,#7; 读七位 读到年
SS: MOV R2,#0D0H; 3231ID识别
MOV R4,#0D1H; 读3231
LCALL READ ;调用读存储器程序
INC ADDRESS
INC R0
DJNZ R5,SS
//温度
/* MOV R0,#38H ;R0开始存放地址
MOV ADDRESS,#11H ;指向温度地址
MOV R2, #0D0H;3231ID识别
MOV R4, #0D1H;读3231
LCALL READ ;调用读存储器程序 */
RET
;----------------------------------
READ: LCALL START ;启动总线
MOV A,R2 ;发送芯片识别码
LCALL SENDA
LCALL ACK ; 芯片应答
JC READ ;
MOV A,ADDRESS
LCALL SENDA
LCALL ACK
READ_A: LCALL START
MOV A,R4
LCALL SENDA
LCALL ACK
JC READ_A
RECE: LCALL RECEIVE
MOV @R0,A ;读到数据存储到@R0指定地址
LCALL ACK
LCALL STOP
RET
;-------总线启动程序---------
START: SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;-------总线停止程序---------
STOP: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
;-----------应答----------
ACK: SETB SDA
NOP
NOP
SETB SCL
JB SDA,ACK_0
CLR C
SJMP ACK_1
ACK_0: SETB C
ACK_1: NOP
NOP
CLR SCL
RET
;--------------发送8位数据---------
SENDA: MOV B,#08H
SEND_1: RlC A
MOV SDA,C
SETB SCL
NOP
NOP
CLR SCL
DJNZ B,SEND_1
RET
;--------------接收8位数据-----------
RECEIVE: MOV B,#08H
CLR A
SETB SDA
RECEIVE_1: SETB SCL
NOP
NOP
MOV C,SDA
RlC A
CLR SCL
DJNZ B,RECEIVE_1
RET
|