|
谢谢您的帮助!
是啊。正是应为ds1302是一个很常用的芯片所以我才比较郁闷为啥我的做不出来。。。
我是学生,做这个是用51做家庭安防系统的一个部分,准备参加江苏电子竞赛用的,现在整个项目就是因为这个停下来了。所以很郁闷。
自己没有示波器,也无法得知是否启震,我贴上所有1302的代码,麻烦各位朋友帮助看下。实在谢谢大家了。
另外电路上我有一点疑问,ds1302的CLK,IO,RST引脚到底要不要接上拉/下拉电阻?我的没有接,很多人说要接上拉,也有很多说要下拉,更多人说不用。
晶振是32768的,官方说不要接电容了,我就没有接,但是网上很多朋友说要接30pf的电容。我接了试试发现效果还是一样。恳请大家帮助。谢谢大家了。
/////////////////////主函数功能描述//////////////////////
/*
函数名称:ds1302
函数功能:ds1302时钟函数
入口参数:无
出口参数:无
异常记录:无
*/
///////////////////////////////////////////////////////////
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar keyboard(uchar c_break);
uchar temp1302[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
sbit TIMEDATA=P3^2;
sbit TIMECLK=P3^1;
sbit TIMERST=P3^3;
void write_ds1302(unsigned char Writeaddr,unsigned char Writedata)
{
unsigned char i;
TIMERST=0;
TIMECLK=0;
TIMERST=1;
for(i=8;i>0;i--)
{
CY=0;
Writeaddr=Writeaddr>>1;
TIMEDATA=CY;
_nop_();
TIMECLK=1;
TIMECLK=0;
}
for(i=8;i>0;i--)
{
Writedata=Writedata>>1;
TIMEDATA=Writedata&0x01;
TIMECLK=1;
_nop_(); //
TIMECLK=0;
}
TIMERST=0;
_nop_();
TIMECLK=0;
_nop_();
}
/****************************************************************************
从DS1302读出一个字节的数据
****************************************************************************/
unsigned char Read_Ds1302(unsigned char Readaddr)
{
unsigned char i;
unsigned char value=0;
uchar value1=0;
TIMERST=0;
TIMECLK=0;
TIMERST=1;
for(i=8;i>0;i--)
{
TIMECLK=0; //0
TIMEDATA=Readaddr&0x01;
_nop_(); //
TIMECLK=1;
Readaddr=Readaddr>>1;
}
for(i=8;i>0;i--)
{
if(TIMEDATA==1)
{
value=value|0x80;
}
value=value|0x00;
value=value>>1;\
TIMECLK=0;
TIMECLK=1;
}
TIMERST=0;
_nop_();
TIMECLK=0;
_nop_();
value1=value&0xf0;
value=value&0x0f;
value1>>=4;
value=value+value1*10;
return value;
}
/****************************************************************************
DS1302初始化
****************************************************************************/
void init_1302(void)
{
while(Read_Ds1302(0xcd)!=0x01)
{
TIMECLK=0;
TIMERST=1;
write_ds1302(0x8e,0x00);
write_ds1302(0x82,0x01);
write_ds1302(0x84,0x02);
write_ds1302(0x86,0x03);
write_ds1302(0x88,0x04);
write_ds1302(0x8a,0x05);
write_ds1302(0x8c,0x06);
write_ds1302(0x90,0x00);
write_ds1302(0xcc,0x01);
write_ds1302(0x80,0x01);
write_ds1302(0x8e,0x80);
if(keyboard(0)) break;
}
}
void ds1302()
{
temp1302[0]=Read_Ds1302(0x81)/10;
temp1302[1]=Read_Ds1302(0x81)%10;
temp1302[2]=Read_Ds1302(0x83)/10;
temp1302[3]=Read_Ds1302(0x83)%10;
temp1302[4]=Read_Ds1302(0x85)/10;
temp1302[5]=Read_Ds1302(0x85)%10;
temp1302[6]=Read_Ds1302(0x87)/10;
temp1302[7]=Read_Ds1302(0x87)%10;
temp1302[8]=Read_Ds1302(0x89)/10;
temp1302[9]=Read_Ds1302(0x89)%10;
temp1302[10]=Read_Ds1302(0x8d)/10;
temp1302[11]=Read_Ds1302(0x8d)%10;
} |
|