时钟芯片DS1302 的keil c程序 ;********************************************************************* ; 公司名称: ; 模块名称:DS1302.a51 ; 功能:实时时钟模块时钟芯片型号:DS1302 ; 说明:(修改版) ; 程序设计:zhaojunjie ; 设计时间:2002.05.04 ; 版 本 号:20020504 ;*********************************************************************/ T_CLK Bit P2.7 ;实时时钟时钟线引脚 T_IOBit P1.4 ;实时时钟数据线引脚 T_RST Bit P1.5 ;实时时钟复位线引脚 ;********************************************************** ;子程序名:Set1302 ;功能:设置DS1302 初始时间,并启动计时。 ;说明: ;调用:RTInputByte ;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续) ;出口参数:无 ;影响资源:A B R0 R1 R4 R7 ;设计:zhaojunjie日期:2002-03-19 ;修改:日期: ;********************************************************** Set1302: CLR T_RST CLR T_CLK SETB T_RST MOV B,#8EH ;控制寄存器 LCALL RTInputByte MOV B,#00H ;写操作前WP=0 LCALL RTInputByte SETB T_CLK CLR T_RST MOV R0,#Second MOV R7,#7 ;秒 分 时 日 月 星期 年 MOV R1,#80H ;秒写地址 S13021: CLR T_RST CLR T_CLK SETB T_RST MOV B,R1 ;写秒 分 时 日 月 星期 年 地址 LCALL RTInputByte MOV A,@R0 ;写秒数据 MOV B,A LCALL RTInputByte INC R0 INC R1 INC R1 SETB T_CLK CLR T_RST DJNZ R7,S13021 CLR T_RST CLR T_CLK SETB T_RST MOV B,#8EH ;控制寄存器 LCALL RTInputByte MOV B,#80H ;控制,WP=1,写保护 LCALL RTInputByte SETB T_CLK CLR T_RST RET ;********************************************************** ;子程序名:Get1302 ;功能:从DS1302 读时间 ;说明: ;调用:RTInputByte,RTOutputByte ;入口参数:时间保存在:Second,Minute,Hour,Day,Month,Week.YearL ;出口参数:无 ;影响资源:A B R0 R1 R4 R7 ;设计:zhaojunjie日期:2002-03-19 ;修改:日期: ;********************************************************** Get1302: MOV R0,#Second MOV R7,#7 MOV R1,#81H ;秒地址 G13021: CLR T_RST CLR T_CLK SETB T_RST MOV B,R1 ;秒 分 时 日 月 星期 年 地址 LCALL RTInputByte LCALL RTOutputByte MOV @R0,A ;秒 INC R0 INC R1 INC R1 SETB T_CLK CLR T_RST DJNZ R7,G13021 RET ;********************************************************** ;功能:写1302一字节(内部子程序) ;********************************************************** RTInputByte: MOV R4,#8 Inbit1: MOV A,B RRC A MOV B,A MOV T_IO,C SETB T_CLK CLR T_CLK DJNZ R4,Inbit1 RET ;********************************************************** ;功能:读1302一字节(内部子程序) ;********************************************************** RTOutputByte: MOV R4,#8 Outbit1:MOV C,T_IO RRC A SETB T_CLK CLR T_CLK DJNZ R4,Outbit1 RET
/********************************************************************* 公司名称: 模块名称:DS1302.c 功能:实时时钟模块时钟芯片型号:DS1302 说明: 程序设计:zhaojunjie 设计时间:2002.03.02 版 本 号: 20020302 *********************************************************************/ #include sbitT_CLK = P2 ^ 7; /*实时时钟时钟线引脚 */ sbitT_IO = P1 ^ 4; /*实时时钟数据线引脚 */ sbitT_RST = P1 ^ 5; /*实时时钟复位线引脚 */ sbitACC0 = ACC ^ 0; sbitACC7 = ACC ^ 7; voidRTInputByte(uchar);/* 输入 1Byte */ ucharRTOutputByte(void);/* 输出?1Byte */ voidW1302(uchar, uchar); ucharR1302(uchar); voidSet1302(uchar *);/* 设置时间 */ voidBcd2asc(uchar, uchar *); voidGet1302(uchar curtime[]); /* 读取1302当前时间 */ /******************************************************************** 函 数 名:RTInputByte() 功能:实时时钟写入一字节 说明:往DS1302写入1Byte数据 (内部函数) 入口参数:d 写入的数据 返 回 值:无 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ void RTInputByte(uchar d) { uchar i; ACC = d; for (i = 8; i > 0; i--) { T_IO = ACC0;/*相当于汇编中的 RRC */ T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************************************************** 函 数 名:RTOutputByte() 功能:实时时钟读取一字节 说明:从DS1302读取1Byte数据 (内部函数) 入口参数:无 返 回 值:ACC 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ uchar RTOutputByte(void) { uchar i; for (i = 8; i > 0; i--) { ACC = ACC >> 1; /*相当于汇编中的 RRC */ ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return (ACC); } /******************************************************************** 函 数 名:W1302() 功能:往DS1302写入数据 说明:先写地址,后写命令/数据 (内部函数) 调用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址, ucData: 要写的数据 返 回 值:无 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ void W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(ucAddr);/* 地址,命令 */ RTInputByte(ucDa);/* 写1Byte数据*/ T_CLK = 1; T_RST = 0; } /******************************************************************** 函 数 名:R1302() 功能:读取DS1302某地址的数据 说明:先写地址,后读命令/数据 (内部函数) 调用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址 返 回 值:ucData :读取的数据 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ uchar R1302(uchar ucAddr) { uchar ucData; T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(ucAddr);/* 地址,命令 */ ucData = RTOutputByte();/* 读1Byte数据 */ T_CLK = 1; T_RST = 0; return (ucData); } /******************************************************************** 函 数 名:BurstW1302T() 功能:往DS1302写入时钟数据(多字节方式) 说明:先写地址,后写命令/数据 调用:RTInputByte() 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制 8Byte (BCD码)1B 1B 1B 1B 1B1B1B 1B 返 回 值:无 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ void BurstW1302T(uchar *pWClock) { uchar i; W1302(0x8e, 0x00); /* 控制命令,WP=0,写操作?*/ T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(0xbe);/* 0xbe:时钟多字节写命令 */ for (i = 8; i > 0; i--) { /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/ RTInputByte(*pWClock); /* 写1Byte数据*/ pWClock++; } T_CLK = 1; T_RST = 0; } /******************************************************************** 函 数 名:BurstR1302T() 功能:读取DS1302时钟数据 说明:先写地址/命令,后读数据(时钟多字节方式) 调用:RTInputByte() , RTOutputByte() 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年 7Byte (BCD码)1B 1B 1B 1B 1B1B1B 返 回 值:无 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ void BurstR1302T(uchar *pRClock) { uchar i; T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(0xbf);/* 0xbf:时钟多字节读命令 */ for (i = 8; i > 0; i--) { *pRClock = RTOutputByte();/* 读1Byte数据 */ pRClock++; } T_CLK = 1; T_RST = 0; } /******************************************************************** 函 数 名:BurstW1302R() 功能:往DS1302寄存器数写入数据(多字节方式) 说明:先写地址,后写数据(寄存器多字节方式) 调用:RTInputByte() 入口参数:pWReg: 寄存器数据地址 返 回 值:无 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ void BurstW1302R(uchar *pWReg) { uchar i; W1302(0x8e, 0x00); /* 控制命令,WP=0,写操作*/ T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(0xfe);/* 0xbe:时钟多字节写命令 */ for (i = 31; i > 0; i--) { /* 31Byte 寄存器数据 */ RTInputByte(*pWReg);/* 写1Byte数据*/ pWReg++; } T_CLK = 1; T_RST = 0; } /******************************************************************** 函 数 名:BurstR1302R() 功能:读取DS1302寄存器数据 说明:先写地址,后读命令/数据(寄存器多字节方式) 调用:RTInputByte() , RTOutputByte() 入口参数:pRReg: 寄存器数据地址 返 回 值:无 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ void BurstR1302R(uchar *pRReg) { uchar i; T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(0xff);/* 0xff:时钟多字节读命令 */ for (i = 31; i > 0; i--) { /*31Byte 寄存器数据 */ *pRReg = RTOutputByte();/* 读1Byte数据 */ pRReg++; } T_CLK = 1; T_RST = 0; } /******************************************************************** 函 数 名:Set1302() 功能:设置初始时间 说明:先写地址,后读命令/数据(寄存器多字节方式) 调用:W1302() 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年 7Byte (BCD码)1B 1B 1B 1B 1B1B1B 返 回 值:无 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ void Set1302(uchar *pClock) { uchar i; uchar ucAddr = 0x80; W1302(0x8e, 0x00); /* 控制命令,WP=0,写操作?*/ for (i = 7; i > 0; i--) { W1302(ucAddr, *pClock); /* 秒 分 时 日 月 星期 年 */ pClock++; ucAddr += 2; } W1302(0x8e, 0x80); /* 控制命令,WP=1,写保护?*/ } /******************************************************************** 函 数 名:Get1302() 功能:读取DS1302当前时间 说明: 调用:R1302() 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 7Byte (BCD码)1B 1B 1B 1B 1B1B1B 返 回 值:无 设计:zhaojunjie日期:2002-03-19 修改:日期: ***********************************************************************/ void Get1302(uchar ucCurtime[]) { uchar i; uchar ucAddr = 0x81; for (i = 0; i < 7; i++) { ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr += 2; } } /*//////////////////////////////////////////////////////////////////////*/ //(jyh.h头文件) #defineucharunsigned char #defineuintunsigned int #definebyteunsigned char #definewordunsigned int extern voidSet1302(uchar *);/* 设置时间 */ extern voidGet1302(uchar curtime[]);/* 读取1302当前时间 */ extern voidBcd2asc(uchar, uchar *);