DS1302不走,一直显示写入的时间,刚开始显示写入时间,但马上秒显示就一直165。
#ifndef_DS1302_H__#define_DS1302_H__#include<intrins.h>//DS1302管脚定义sbitT_IO=P2^1;//位定...
#ifndef _DS1302_H__
#define _DS1302_H__
#include <intrins.h>
//DS1302管脚定义
sbit T_IO=P2^1; //位定义1302芯片的接口,数据输出端定义在P2.5引脚
sbit T_RST=P2^2; //位定义1302芯片的接口,复位端口定义在P2.6引脚
sbit T_CLK=P2^0; //位定义1302芯片的接口,时钟输出端口定义在P2.4引脚
//变量定义声明
unsigned char TableDs1302[7]={55,59,23,4,3,5,11}; //初始化时时间日期设置
//秒 分 时 日月 星期 年
//函数定义声明
void Write1302(unsigned char ); //向1302写一个字节数据
void WriteSet1302(unsigned char ,unsigned char );//根据命令字,向1302写一个字节数据
unsigned char Read1302(void);//从1302读一个字节数据
unsigned char ReadSet1302(unsigned char Cmd);//根据命令字从1302读取一个字节数据
void InitDS1302(void);//初始化1302
void GetTime(void);//获取1302的时间
void Delay2us() //@24.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 9;
while (--i);
}
void Write1302(unsigned char dat)
{
unsigned char i;
T_CLK=0;
Delay2us();
for(i=0;i<8;i++)
{
T_IO=dat&0x01;
Delay2us();
T_CLK=1;
Delay2us();
T_CLK=0;
dat>>=1;
}
}
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
T_RST=0;
T_CLK=0;
T_RST=1;
Delay2us();
Write1302(Cmd);
Write1302((dat/10<<4)|(dat%10));
T_CLK=1;
T_RST=0;
}
unsigned char Read1302(void)
{
unsigned char i,dat;
Delay2us();
for(i=0;i<8;i++)
{
dat>>=1;
if(T_IO==1)
dat|=0x80;
T_CLK=1;
Delay2us();
T_CLK=0;
Delay2us();
}
return dat;
}
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char temp,dat1,dat2;
T_RST=0;
T_CLK=0;
T_RST=1;
Write1302(Cmd);
temp=Read1302();
T_CLK=1;
T_RST=0;
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return (temp);
}
void InitDS1302(void)
{
unsigned char i,add;
add=0x80;
WriteSet1302(0x8e,0x00);
for(i=0;i<7;i++)
{
WriteSet1302(add,TableDs1302[i]);
add+=2;
}
WriteSet1302(0x90,0xa6);
WriteSet1302(0x8e,0x80);
}
void GetTime()
{
unsigned char i,add=0x81;
WriteSet1302(0x8e,0x00);
for(i=0;i<7;i++)
{
TableDs1302[i]=ReadSet1302(add);
add+=2;
}
WriteSet1302(0x8e,0x80);
}
#endif 展开
#define _DS1302_H__
#include <intrins.h>
//DS1302管脚定义
sbit T_IO=P2^1; //位定义1302芯片的接口,数据输出端定义在P2.5引脚
sbit T_RST=P2^2; //位定义1302芯片的接口,复位端口定义在P2.6引脚
sbit T_CLK=P2^0; //位定义1302芯片的接口,时钟输出端口定义在P2.4引脚
//变量定义声明
unsigned char TableDs1302[7]={55,59,23,4,3,5,11}; //初始化时时间日期设置
//秒 分 时 日月 星期 年
//函数定义声明
void Write1302(unsigned char ); //向1302写一个字节数据
void WriteSet1302(unsigned char ,unsigned char );//根据命令字,向1302写一个字节数据
unsigned char Read1302(void);//从1302读一个字节数据
unsigned char ReadSet1302(unsigned char Cmd);//根据命令字从1302读取一个字节数据
void InitDS1302(void);//初始化1302
void GetTime(void);//获取1302的时间
void Delay2us() //@24.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 9;
while (--i);
}
void Write1302(unsigned char dat)
{
unsigned char i;
T_CLK=0;
Delay2us();
for(i=0;i<8;i++)
{
T_IO=dat&0x01;
Delay2us();
T_CLK=1;
Delay2us();
T_CLK=0;
dat>>=1;
}
}
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
T_RST=0;
T_CLK=0;
T_RST=1;
Delay2us();
Write1302(Cmd);
Write1302((dat/10<<4)|(dat%10));
T_CLK=1;
T_RST=0;
}
unsigned char Read1302(void)
{
unsigned char i,dat;
Delay2us();
for(i=0;i<8;i++)
{
dat>>=1;
if(T_IO==1)
dat|=0x80;
T_CLK=1;
Delay2us();
T_CLK=0;
Delay2us();
}
return dat;
}
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char temp,dat1,dat2;
T_RST=0;
T_CLK=0;
T_RST=1;
Write1302(Cmd);
temp=Read1302();
T_CLK=1;
T_RST=0;
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return (temp);
}
void InitDS1302(void)
{
unsigned char i,add;
add=0x80;
WriteSet1302(0x8e,0x00);
for(i=0;i<7;i++)
{
WriteSet1302(add,TableDs1302[i]);
add+=2;
}
WriteSet1302(0x90,0xa6);
WriteSet1302(0x8e,0x80);
}
void GetTime()
{
unsigned char i,add=0x81;
WriteSet1302(0x8e,0x00);
for(i=0;i<7;i++)
{
TableDs1302[i]=ReadSet1302(add);
add+=2;
}
WriteSet1302(0x8e,0x80);
}
#endif 展开
2个回答
展开全部
先自查一下写入形式对不对...
ds1302是bcd码的
ds1302是bcd码的
追问
谢谢,因为没上拉,以为在P2上不用上拉·······上拉之后解决
追答
你不是用51吗,51有些时候不上拉也能正常工作。
在这点上,有一个原因就是线路的长度,本身单片机内部的上拉能力就较弱,如果编程时通讯速度较快,那么当线路稍长,寄生电容就会导致问题。
所以建议还是10K上拉稳妥一点,线路很长请看示波器。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
全部分类
追问
已经完成了····虽然不知道你说了啥,但还是谢谢·····
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询