ds1302实时时钟C程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*调用: 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_WTInputByte(ucDa); /*写1Byte数据*/
T_CLK = 1;
T_RST =0;
//OE=1;
}
/*********************************************
*名称: uc_R1302
*说明:先写地址,后读数据
*功能:读取DS1302某地址的数据
{Baidu Nhomakorabea
T_IO = ACC0; //相当于汇编中的RRC
T_CLK = 1;
T_CLK = 0;
ACC =ACC>> 1;
}
}
/*****************************************
*名称: uchar uc_RTOutputByte
*说明:
*功能:从DS1302读取1Byte数据
for(i=0;i<5;i++)
for(j=0;j<255;j++)
for(k=0;k<255;k++);
}
}
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];//格式化星期
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************
*名称: v_W1302
*说明:先写地址,后写数据
*功能:往DS1302写入数据
*调用: v_RTInputByte()
*输入: ucAddr:控制字, ucDa:要写的数据
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);
*
*名称: v_Set1302
*说明:
*功能:设置初始时间
*调用: v_W1302()
*输入: pSecDa:初始时间数组首地址。
*返回值:无
****************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
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;//格式化时间分
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);//显示时间
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个字节时间数据存入数组中
*返回值:无
*********************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
//OE=0;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /*地址,命令*/
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);//格式为:秒分时日月星期年
ucAddr += 2;
}
}
/*******************************************
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" );
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;
uchar uc_R1302(uchar ucAddr);
void v_Set1302(uchar *pSecDa);
void v_Get1302(uchar ucCurtime[]);
/******************************************
*名称: v_RTInputByte
uchar getTimebuf[7];//用于存放获取的时间数据
uchar setTimebuf[7];//用于存放要设置的时间日期数据
uchar time[]={" : : "};//时间格式字符串
uchar date[]={"20 - - "};//日期格式字符串
uchar daylist[]={"SunMonTueWedThuFriSat"};//星期字符列表
*调用:
*输入:
*返回值: ACC
******************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC>>1; //相当于汇编中的RRC
ACC7 = T_IO;
*说明:
*功能:往DS1302写入1Byte数据
*调用:
*输入: ucDa写入的数据
*返回值:无
******************************************/
void v_WTInputByte(uchar ucDa)
{
uchar i;
ACC= ucDa;
for(i=8; i>0; i--)
uchar day1[]={" "};//星期格式字符串
//****************
//主函数
//****************
void Main( void )
{ uchar i,j,k;
Init1302();//初始化DS1302
LcmInit(); //初始化LCD12864
LcmClear();
}
/**********************************************
*名称: v_Get1302
*说明:
*功能:读取DS1302当前时间
*调用: uc_R1302()
*输入: ucCurtime:保存当前时间数据的数组地址
*返回值:无
***********************************************/
*名称: Init1302
*说明:
*功能:初始化DS1302
*调用:
*输入:
*返回值:无
*******************************************/
void Init1302(void)
{
v_W1302(0x8e,0x00); //控制写入WP=0
v_W1302(0x90,0xa5); //辅助电源充电命令
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 ); //清屏
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); //写年
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,写保护
/**************************/
/* ds1302实时时钟C程序*/
/**************************/
#include < reg52.h>
#define uchar unsigned char
sbit T_CLK = P1^0; /*实时时钟时钟线引脚*/
相关文档
最新文档