来源:设备技术网 作者: DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 下面本文就DS1302的应用收集了相关五个实例给读者了解参考。 1 LPC2292外接实时时钟芯片DS1302的C51程序实列 /*********************************************************************/ /* 实时时钟模块 时钟芯片型号:DS1302 */ /* 关于lpc2292外接ds1302时钟芯片的驱动程序 /*********************************************************************/ sbit T_CLK = P2^7; /*实时时钟时钟线引脚 */ sbit T_IO = P1^4; /*实时时钟数据线引脚 */ sbit T_RST = P1^5; /*实时时钟复位线引脚 */ /******************************************************************** * * 名称: v_RTInputByte * 说明: * 功能: 往DS1302写入1Byte数据 * 调用: * 输入: ucDa 写入的数据 * 返回值: 无 ***********************************************************************/ void v_RTInputByte(uchar ucDa) { uchar i; ACC = ucDa; for(i=8; i>0; i--) { T_IO = ACC0; /*相当于汇编中的 RRC */ T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************************************************** * * 名称: uchar uc_RTOutputByte * 说明: * 功能: 从DS1302读取1Byte数据 * 调用: * 输入: * 返回值: ACC ***********************************************************************/ uchar uc_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); } /******************************************************************** * * 名称: v_W1302 * 说明: 先写地址,后写命令/数据 * 功能: 往DS1302写入数据 * 调用: v_RTInputByte() * 输入: ucAddr: DS1302地址, ucDa: 要写的数据 * 返回值: 无 ***********************************************************************/ void v_W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); /* 地址,命令 */ v_RTInputByte(ucDa); /* 写1Byte数据*/ T_CLK = 1; T_RST =0; } /******************************************************************** * * 名称: uc_R1302 * 说明: 先写地址,后读命令/数据 * 功能: 读取DS1302某地址的数据 * 调用: v_RTInputByte() , uc_RTOutputByte() * 输入: ucAddr: DS1302地址 * 返回值: ucDa :读取的数据 ***********************************************************************/ uchar uc_R1302(uchar ucAddr) { uchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); /* 地址,命令 */ ucDa = uc_RTOutputByte(); /* 读1Byte数据 */ T_CLK = 1; T_RST =0; return(ucDa); } /******************************************************************** * * 名称: v_BurstW1302T * 说明: 先写地址,后写数据(时钟多字节方式) * 功能: 往DS1302写入时钟数据(多字节方式) * 调用: v_RTInputByte() * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制 * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B * 返回值: 无 ***********************************************************************/ void v_BurstW1302T(uchar *pSecDa) { uchar i; v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */ for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/ { v_RTInputByte(*pSecDa);/* 写1Byte数据*/ pSecDa++; } T_CLK = 1; T_RST =0; } |