#ifndef DS1302_H
#define DS1302_H
#include
sbit T_CLK= P1^2; /*实时时钟时钟线引脚 */
sbit T_IO = P1^3; /*实时时钟数据线引脚 */
sbit T_RST= P1^4; /*实时时钟复位线引脚 */
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;
//unsigned char gettime[8]={0};
unsigned char settime[7]={0x00,0x1f,0x14,0x16,0x07,0x07,0x07};
/*****************************************************
计时模块1302:
1 实时时钟模块 时钟芯片型号:DS1302
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
**********************************************************/
/*
void v_RTInputByte(unsigned char d)
{
unsigned char i;
ACC="d"; //将8位数据写入ACC
for(i=8;i>0;i--) //循环8次将ACC8位数据从低位到高位写入1302
{
T_IO=ACC0; //将ACC的最低位转送到IO口
T_CLK=1; //上升沿写入1位数据
T_CLK=0;
ACC="ACC">>1; //将ACC次低位变为最低位
}
}
*/
void v_RTInputByte(unsigned char ucDa)
{
unsigned char i;
ACC=ucDa;
for(i=8;i>0;i--)
{
T_IO=ACC0; //相当于汇编中的 RRC //
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
/********************************************************************
*
* 名称: unsigned char uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
/*
unsigned char uc_RTOutputByte(void)
{
unsigned char i;
for(i=8;i>0;i--)
{
ACC="ACC">>1;
ACC7=T_IO;
T_CLK=1; //时钟下降沿读1位数据
T_CLK=0;
}
return (ACC);
}
*/
unsigned char uc_RTOutputByte(void)
{
unsigned char 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(unsigned char add,unsigned char d)
{
T_RST= 0;
T_CLK=0;
T_RST= 1;
v_RTInputByte(add); //将1302的指针移到add处
v_RTInputByte(d); //往add处写入数据
T_CLK=1;
T_RST=0; //停止写数据
}
*/
void v_W1302(unsigned char ucAddr, unsigned char 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 :读取的数据
***********************************************************************/
/*
unsigned char uc_R1302(unsigned char add)
{
unsigned char d;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(add);
d="uc"_RTOutputByte();
T_CLK=1;
T_RST=0;
return (d);
}
*/
unsigned char uc_R1302(unsigned char ucAddr)
{
unsigned char 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_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*
void v_Set1302(unsigned char *time)
{
unsigned char i;
v_W1302(0x8e,0x00); //令WP=0,进行写操作
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbe); //时钟多字节写命令
for(i=8;i>0;i--)
{
v_RTInputByte(*time); //写入1byte数据
time++;
}
T_CLK=1;
T_RST=0;
}
*/
void v_Set1302(unsigned char *pSecDa)
{
unsigned char i,ten,sin;
v_W1302(0x8e,0x00); // 控制命令,WP=0,写操作?//
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbe);
for(i=8;i>0;i--)
{
sin=(*pSecDa)%10;
ten=(*pSecDa/10)*0x10;
*pSecDa=ten+sin;
v_RTInputByte(*pSecDa); // 秒 分 时 日 月 星期 年 //
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*
void v_Get1302(unsigned char *time)
{
unsigned char i;
bdata unsigned char l,h;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbf); //时钟多字节方式读取命令
for(i=8;i>0;i--)
{
*time=uc_RTOutputByte(); //读1字节数据
l=(*time)&0x0f; //l存放time的低4位,即个位
h=(*time>>4)&0x0f; //h存放time的高4位,即十位
*time=h*10+l; //时间数据以十进制形式放进time中
time++;
}
T_CLK=1;
T_RST=0;
}
*/
void v_Get1302()
{
unsigned char i,ten,sin;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbf);
for(i=0;i<7;i++)
{
ten=uc_RTOutputByte();//格式为: 秒 分 时 日 月 星期 年 //
sin=ten&0x0f;
ten=ten>>4;
settime=ten*10+sin;
}
T_CLK=1;
T_RST=0;
}
#endif
用户434290 2013-4-6 14:25
用户1431092 2007-8-15 10:20
用户52661 2007-8-14 08:08
你自己调试过了没?