刘素赋的博客

DS1302

分类:默认分类  人气:581  评论:0  时间:2009-12-13 11:44

下面DS1302程序部分,是根据网上用的非常多的一个DS1302子程序修改的:

/**************************/
/* ds1302实时时钟C程序    */
/**************************/

#include < reg52.h>
#define uchar unsigned char

sbit T_CLK = P1^0; /*实时时钟时钟线引脚 */
sbit T_IO = P1^1; /*实时时钟数据线引脚 */
sbit T_RST = P1^2; /*实时时钟复位线引脚 */

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void Init1302(void);
void v_W1302(uchar ucAddr, uchar ucDa);
uchar uc_R1302(uchar ucAddr);
void v_Set1302(uchar *pSecDa);
void v_Get1302(uchar ucCurtime[]);

/******************************************
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
******************************************/
void v_WTInputByte(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: 控制字, ucDa: 要写的数据
* 返回值: 无
*********************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
//OE=0;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
v_WTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
//OE=1;
}

/*********************************************
* 名称: uc_R1302
* 说明: 先写地址,后读数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: 控制字
* 返回值: ucDa :读取的数据
**********************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
//OE=0;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
// OE=1;
return(ucDa);
}

/***************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间数组首地址。
* 返回值: 无
****************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); // 控制命令,WP=0,允许写操作
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); //秒 分 时 日 月 星期 年
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); // 控制命令,WP=1,写保护
}

/**********************************************
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间数据的数组地址
* 返回值: 无
***********************************************/
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
      {
         ucCurtime[i] = uc_R1302(ucAddr);//格式为: 秒 分 时 日 月 星期 年
         ucAddr += 2;
      }
}

/*******************************************
* 名称: Init1302
* 说明:
* 功能: 初始化DS1302
* 调用:
* 输入:
* 返回值: 无
*******************************************/
void Init1302(void)
{
v_W1302(0x8e,0x00); //控制写入WP=0
v_W1302(0x90,0xa5); //辅助电源充电命令
v_W1302(0x80,0x00); //写秒
v_W1302(0x82,0x59); //写分
v_W1302(0x84,0x10); //写时
v_W1302(0x86,0x07); //写日
v_W1302(0x88,0x05); //写月
v_W1302(0x8a,0x04); //写星期
v_W1302(0x8c,0x09); //写年
v_W1302(0x8e,0x80); //写保护WP=1
}

下面是主程序部分DS1302main.c,将DS1302、LCD12864子程序整合在一起。

#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
extern void LcmClear( void );       //清屏
extern void LcmInit( void );        //初始化
extern void LcmPutstr( uchar row,uchar y,uchar * str ); //在设定位置显示字符串
extern void Init1302(void);//初始化DS1302
extern void v_Get1302(uchar ucCurtime[]);//获取DS1302内的7个字节时间数据存入数组中
uchar getTimebuf[7];//用于存放获取的时间数据
uchar setTimebuf[7];//用于存放要设置的时间日期数据
uchar time[]={" : : "};//时间格式字符串
uchar date[]={"20 - - "};//日期格式字符串
uchar daylist[]={"SunMonTueWedThuFriSat"};//星期字符列表
uchar day1[]={"   "};//星期格式字符串


//****************
//    主函数
//****************

void Main( void )
{ uchar i,j,k;
Init1302();//初始化DS1302
LcmInit(); //初始化LCD12864
LcmClear();
LcmPutstr( 0,28,"DS1302 TEST" );
LcmPutstr( 3,24,"");
LcmPutstr( 5,0,"BLOG:http://" );
LcmPutstr( 6,18,"hi.baidu.com/txz01" );
LcmPutstr( 7,8,"Email:TXZ001@139.com" );
while(1)
    {
      v_Get1302(getTimebuf);//获取DS1302内7个时间日期数据存入数组getTimebuf[].
      time[6]=(getTimebuf[0])/16+48;//格式化时间秒
      time[7]=(getTimebuf[0])%16+48;
      time[3]=(getTimebuf[1])/16+48;//格式化时间分
      time[4]=(getTimebuf[1])%16+48;
      time[0]=(getTimebuf[2])/16+48;//格式化时间小时
      time[1]=(getTimebuf[2])%16+48;
      date[8]=getTimebuf[3]/16+48;//格式化日期日
      date[9]=getTimebuf[3]%16+48;
      date[5]=getTimebuf[4]/16+48;//格式化日期月
      date[6]=getTimebuf[4]%16+48;
      date[2]=getTimebuf[6]/16+48;//格式化日期年
      date[3]=getTimebuf[6]%16+48;
      day1[0]=daylist[(getTimebuf[5]%10)*3];//格式化星期
      day1[1]=daylist[(getTimebuf[5]%10)*3+1];
      day1[2]=daylist[(getTimebuf[5]%10)*3+2];
   LcmPutstr( 2,0,date);//显示日期
   LcmPutstr(2,96,day1);//显示星期
   LcmPutstr( 3,36,time);//显示时间
      for(i=0;i<5;i++)
for(j=0;j<255;j++)
    for(k=0;k<255;k++);
    }
}

标签(Tag):DS1302
评论(0)
暂无评论
我来评论
(800字以内)
博客分类
最新阅读用户
es6p1ouwrd