求一个ds1302时钟芯片的c程序和电路图。最好是能调节时间的。
提问者:rhjf38872013-09-14 00:00
最佳答案
电路图就自己接了,网上大把呢
#include
#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();
}
回答者:Tomy4921892016-09-14 00:00
DS 5相关问题
-
仅供参考,不懂再问我,哈哈……
--------------------------------------------------------------
#include
#include
提问者:y2787121422013-04-28
-
/*******************************************************************************
文件:DS1302.C
环境:编译为ICC A
提问者:zncwtb2013-10-13
-
摘 要:介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS130
提问者:pengjiamnq2016-03-24
-
1、存储和读取的时间的内容应为BCD码。write_1302(0x8c,0x11);maioh=(miao&0x7f)>>4;……
2、建议上电后,ce=0;clk=0;延时一会儿再操作1302。或者多写两次撤销写保护
提问者:hikqbwgjp2013-09-06
-
说明p1.2是用了非门按制RST脚,所以SETBP1.2;令=0
DS_READ?SETBP1.2;令=0。
CLRP1.1;令SCLK=0。
CLRP1.2;令=1,启动芯片。
提问者:s55353942013-08-03
-
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit SCK=P3^
提问者:baobao4221252013-09-04
- DS 5热门车型
- DS 5同品牌车系
- 上市新车
- 即将上市新车