求一个ds1302时钟芯片的c程序和电路图。最好是能调节时间的。

如题所述

第1个回答  2013-04-02
电路图就自己接了,网上大把呢
#include<intrins.h>
#define Writesecond 0x80
#define Readsecond 0x81
#define Writeminute 0x82
#define Readminute 0x83
#define Writehour 0x84
#define Readhour 0x85
#define Writeday 0x86
#define Readday 0x87
#define Writemonth 0x88
#define Readmonth 0x89
#define Writeweek 0x8a
#define Readweek 0x8b
#define Writeyear 0x8c
#define Readyear 0x8d
#define Writeprotect 0x8e
#define uchar unsigned char
#define uint unsigned int
sbit DS1302_CLK=P3^3;
sbit DS1302_IO=P3^4;
sbit DS1302_RST=P3^5;
uchar bdata dsdata;
sbit dsbit=dsdata^7;
uchar time[3]={19,2,30};
uchar date[4]={12,9,19,3};
uchar Times[]="19:02:00";
uchar Dates[]="2012/05/13";

uchar num[]="0123456789";
/*************写入一字节地址/数据**********/
void DS1302_Writebyte(uchar dat)
{
uchar i,rdsdata;
rdsdata=dat;
for(i=0;i<8;i++)
{
DS1302_CLK=0;
_nop_();_nop_();_nop_();

DS1302_IO=(bit)(rdsdata&0x01); DS1302_CLK=1; //上升沿写入数据/地址
_nop_();_nop_();_nop_();

rdsdata>>=1; }
}
/***************读取一字节数据******************/
uchar DS1302_Readbyte()
{
uchar i;
for(i=0;i<8;i++)
{
dsbit=DS1302_IO;
DS1302_CLK=1;
_nop_();_nop_();_nop_();_nop_();_nop_();

dsdata>>=1;
DS1302_CLK=0; //下降沿读取数据
_nop_();_nop_();_nop_();_nop_();_nop_();

}
return dsdata;
}
/**************写入数据**********************/
void DS1302_Write(uchar addr,dat)
{
DS1302_RST=0; //置低,终止数据传递
DS1302_CLK=0; //清空时钟线
DS1302_RST=1; //置高,开始数据传递
DS1302_Writebyte(addr);
DS1302_Writebyte(dat);
DS1302_CLK=1;
DS1302_RST=0;
}
/***************读取数据****************/
uchar DS1302_Read(uchar addr)
{
uchar rdsdata,rdsdatah,rdsdatal;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302_Writebyte(addr);
rdsdata=DS1302_Readbyte();
DS1302_CLK=1;
DS1302_RST=0;
rdsdatah=rdsdata/16; //进制转换,十六进制转换为十进制
rdsdatal=rdsdata%16;
rdsdata=rdsdatah*10+rdsdatal;
return rdsdata;
}
/**************DS1302初始化***************/
void DS1302_Init(void)
{
DS1302_Write(Writeprotect,0x00);
_nop_();_nop_();_nop_();_nop_();_nop_();
DS1302_Write(Writeprotect,0x80);

unsigned char timechange(unsigned char num)//将十进制表示的时间转换为十六进制表示
{
unsigned char a;
a=num/10*6+num;
return a;
}
void DS1302_Settime(uchar tab[]) //格式:时分秒数值型数组
{
DS1302_Write(Writeprotect,0x00);
DS1302_Write(Writesecond,timechange(tab[2]));
DS1302_Write(Writeminute,timechange(tab[1]));
DS1302_Write(Writehour,timechange(tab[0]));
DS1302_Write(Writeprotect,0x80);
}
void DS1302_Setdate(uchar tab[]) //格式:年月日星期数值型数组
{
DS1302_Write(Writeprotect,0x00);
DS1302_Write(Writeday,timechange(tab[2]));
DS1302_Write(Writemonth,timechange(tab[1]));
DS1302_Write(Writeyear,timechange(tab[0]));
DS1302_Write(Writeweek,timechange(tab[3]));
DS1302_Write(Writeprotect,0x80);
}
void DS1302_Default() //载入初始时间
{
DS1302_Write(Writeprotect,0x00);
_nop_();_nop_();_nop_();_nop_();_nop_();
DS1302_Write(0x90, 0x03); //失能充电
_nop_();_nop_();_nop_();_nop_();_nop_();
DS1302_Settime(time);
DS1302_Setdate(date);
DS1302_Write(Writeprotect,0x80);
}

void Time2Times()
{
Times[0]=num[time[0]/10]; //时
Times[1]=num[time[0]%10];
Times[3]=num[time[1]/10]; //分
Times[4]=num[time[1]%10];
Times[6]=num[time[2]/10]; //秒
Times[7]=num[time[2]%10];
}
void Date2Dates()
{
Dates[2]=num[date[0]/10]; //年
Dates[3]=num[date[0]%10];
Dates[5]=num[date[1]/10]; //月
Dates[6]=num[date[1]%10];
Dates[8]=num[date[2]/10]; //日
Dates[9]=num[date[2]%10];
}
/***************获取时间***************/
void DS1302_Gettime(void) // 获得时分秒信息
{
time[0]=DS1302_Read(Readhour); //时
time[1]=DS1302_Read(Readminute); //分
time[2]=DS1302_Read(Readsecond); //秒
Time2Times();
}
/***************获取日期***************/
void DS1302_Getdate(void) // 获得年月日星期信息
{
date[2]=DS1302_Read(Readday); //日
date[1]=DS1302_Read(Readmonth); //月
date[0]=DS1302_Read(Readyear); //年
date[3]=DS1302_Read(Readweek); //星期
Date2Dates();
}本回答被提问者采纳
相似回答