1.c语言编的DS1302怎么读出和写入数据
这是汇编版的dS1302驱动程序,你可以参考一下。
PUBLIC D1302_INIT,SET1302,GET1302,WRITE,READ CODE_DS1302 SEGMENT CODE T_CLK BIT P1.0 T_IO BIT P1.1 T_RST BIT P1.2 SECOND EQU 30H MINUTE EQU 31H HOUR EQU 32H DAY EQU 33H MONTH EQU 34H WEEK EQU 35H YEAR EQU 36H RSEG CODE_DS1302 ;使用当前段 ;以下是DS1302初始化子程序D1302_INIT: CLR T_RST ;DS1302复位 CLR T_CLK NOP NOP SETB T_RST MOV R1,#80H MOV R0,#00H LCALL WRITE MOV R1,#90H MOV R0,#0ABH LCALL WRITE RET ;以下是 读 日期时间数据子程序GET1302: MOV R1,#81H LCALL READ MOV SECOND,R0 MOV R1,#83H LCALL READ MOV MINUTE,R0 MOV R1,#85H LCALL READ MOV HOUR,R0 MOV R1,#87H LCALL READ MOV DAY,R0 MOV R1,#89H LCALL READ MOV MONTH,R0 MOV R1,#8BH LCALL READ MOV WEEK,R0 MOV R1,#8DH LCALL READ MOV YEAR,R0 RET ;以下是时钟日历写操作子程序(单片机向DS1302写入初始时间)SET1302: MOV R1,#80H ;写 秒 LCALL WRITE MOV SECOND,R0 MOV R1,#82H ;写 分 LCALL WRITE MOV MINUTE,R0 MOV R1,#84H ;写 时 LCALL WRITE MOV HOUR,R0 MOV R1,#86H ;写 天 LCALL WRITE MOV DAY,R0 MOV R1,#88H ;写 月 LCALL WRITE MOV MONTH,R0 MOV R1,#8AH ;写 周 LCALL WRITE MOV WEEK,R0 MOV R1,#8CH ;写 年 LCALL WRITE MOV YEAR,R0 RET ;以下是 写 一个字节地址和数据的子程序WRITE: CLR T_CLK NOP NOP SETB T_RST NOP MOV A,R1 MOV R2,#08HWRI_01: RRC A NOP NOP CLR T_CLK NOP NOP MOV T_IO,C NOP NOP SETB T_CLK NOP NOP DJNZ R2,WRI_01 CLR T_CLK NOP NOP MOV A,R0 MOV R2,#08HWRI_02: RRC A NOP CLR T_CLK NOP NOP MOV T_IO,C NOP NOP SETB T_CLK NOP NOP DJNZ R2,WRI_02 CLR T_CLK NOP NOP CLR T_RST NOP NOP RET ;以下是从DS1302读取一字节地址中数据子程序READ: CLR T_CLK NOP NOP SETB T_RST NOP NOP MOV A,R1 MOV R2,#08HREAD_01: RRC A NOP MOV T_IO,C NOP NOP SETB T_CLK NOP NOP CLR T_CLK NOP NOP DJNZ R2,READ_01 NOP NOP SETB T_IO CLR A CLR C MOV R2,#08HREAD_02: CLR T_CLK NOP NOP MOV C,T_IO NOP NOP RRC A NOP NOP SETB T_CLK NOP NOP DJNZ R2,READ_02 MOV R0,A CLR T_RST RET END。
2.如何读出DS1302里面的时钟数据
一个例子 重点看DS1302_Read() #include
3.如何读出DS1302里面的时钟数据
一个例子 重点看DS1302_Read()#include
4.怎么读时钟芯片DS1302的时间
说明p1.2是用了非门按制RST脚,所以SETBP1.2;令=0
DS_READSETBP1.2;令=0。
CLRP1.1;令SCLK=0。
CLRP1.2;令=1,启动芯片。
LCALLDS_WSUB;写8位地址。
LCALLDS_RSUB;读出8位数据。
RET
DS_WSUBMOVR7,#08H
WL00PRRCA;A为地址字节。
MOVP1.0,C
SETBP1.1;在时钟上升沿
NOP;输入地址字节。
CLRP1.1
DJNZR7WL00P
RET
DS_RSUBSETBP1.0;为读数据作准备。
MOVR7#08H
RL00P:SETBP1.1
NOP
CLRP1.1;在第9个正脉冲的下
MOVC,P1.0;降沿开始输出数据。
RRCA;A中为读出的数据。
DJNZR7,RL00P
RET
若使用如下程序对DSl302的RAM1其内容为5AH 进行读操作
READ:MOVA#11000101B;RAM1单元的读地址。
LCAllDS_READ;调用读子程序。
则程序执行后A中的数据为2DH,显然读出的数据不正确。若再使用一条RLA指令调整后,则A中为5AH,结果才正确。由此说明:使用上述程序读出的RAM1单元中的第0位数据实为第1位数据,读出的第7位数据实为第0位数据。
经笔者仔细研究时序图和多次试验得知,问题的原因在于:对于读操作时序,在SCLK出现第8个正脉冲时,上升沿输入地址字节的最后一位数据,而在此正脉冲的下降沿就要输出数据字节的第0位数据。然而笔者的程序中是在第9个正脉冲的下降沿才误认为输出了数据字节的第0位数据,此位数据事实上是第二个下降沿输出的,故实为数据字节的第1位数据。经笔者实验:只要RST保持为高电平,如果超过8个下降沿,它们将重新从第0位输出数据位,因程序中输出的最后一位数据位,是9个下降沿输出的数据位,故实为数据字节的第0位数据位。
由此可见,单字节读操作的时序图如改为图2所示时序图,则读者较容易理解可避免发生上述编程错误。
只要将上述的DS_RSUB子程序改为如下的子程序即可解决上述问题:
DS_RSUBl:SETBP1.0;为读数据作准备
MOVR7,#08H
RL00P:CLRP1.1;SCLK第8个正脉冲的
MOVC,P1.0;下降沿开始输出数据。
RAC
SETBP1.1
DJNZR7,RL00P
RET
5.从DS1302中读出的数据用7段数码管显示程序如何编写
楼上,人家是ds1302的,呵呵,给你个参考:#include
转载请注明出处育才学习网 » 怎么理解ds1302的读数据和写数据