我用ds1302时读出来的数据总是85,下面是读写程序,帮我看看哪里有问题,回答满意的追加分数.
/*****************************************************函数功能:向1302写一个字节数据入口参数:x********...
/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/
void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据
{
DATA=dat&0x01; //取出dat的第0位数据写入1302
delaynus(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
}
}
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数据前SCLK被拉低
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出的数据返回
}
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(Cmd); //写入命令字
dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
} 展开
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/
void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据
{
DATA=dat&0x01; //取出dat的第0位数据写入1302
delaynus(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
}
}
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数据前SCLK被拉低
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出的数据返回
}
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(Cmd); //写入命令字
dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
} 展开
2个回答
展开全部
void write_1302(unsigned char add, unsigned char dat) //写数据;
{
unsigned char i;
REST_1302();
for(i = 0; i < 8; i++)
{
SCLK = 0;
if (0x01 & (add >> i)) IO = 1;
else IO = 0;
SCLK = 1;
}
for(i = 0; i < 8; i++)
{
SCLK = 0;
if (0x01 & (dat >> i)) IO = 1;
else IO = 0;
SCLK = 1;
}
RST = 0;
}
unsigned char read_1302(unsigned char add) //读出数据;
{
unsigned char temp = 0, i;
REST_1302();
for(i = 0; i < 8; i++)
{
SCLK = 0;
if (0x01 & (add >> i)) IO = 1;
else IO = 0;
SCLK = 1;
}
for(i = 0; i < 8; i++)
{
SCLK = 1;
SCLK = 0;
if (IO) temp = (1 << i) | temp;
}
RST = 0;
return temp; //返回数据;
}
void REST_1302(void) //复位一下;
{
RST = 0;
SCLK = 0;
RST = 1;
}
看看这个:保证解决问题,改改管脚定义;其他别动就行啦,好好分析吧!!!
{
unsigned char i;
REST_1302();
for(i = 0; i < 8; i++)
{
SCLK = 0;
if (0x01 & (add >> i)) IO = 1;
else IO = 0;
SCLK = 1;
}
for(i = 0; i < 8; i++)
{
SCLK = 0;
if (0x01 & (dat >> i)) IO = 1;
else IO = 0;
SCLK = 1;
}
RST = 0;
}
unsigned char read_1302(unsigned char add) //读出数据;
{
unsigned char temp = 0, i;
REST_1302();
for(i = 0; i < 8; i++)
{
SCLK = 0;
if (0x01 & (add >> i)) IO = 1;
else IO = 0;
SCLK = 1;
}
for(i = 0; i < 8; i++)
{
SCLK = 1;
SCLK = 0;
if (IO) temp = (1 << i) | temp;
}
RST = 0;
return temp; //返回数据;
}
void REST_1302(void) //复位一下;
{
RST = 0;
SCLK = 0;
RST = 1;
}
看看这个:保证解决问题,改改管脚定义;其他别动就行啦,好好分析吧!!!
展开全部
你应该再写一个具体的主调函数,不说明你向DS1302哪个地址写入了什么数据,或从哪个地址读数据.这样才能更准确的分析,我大概看了一下,发现unsigned char Read1302(void)函数中,你只对读到的1进行了存入,而没有对读到的0进行存放.所以需作如下更改:
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2);
for(i=0;i<8;i++)
{
if(DATA) {dat=(dat>>=1)|0x80}; //读到数据1
else
dat>>=1; //读到数据0
SCLK=1;
delaynus(2);
SCLK=0;
delaynus(2);
}
return dat;
}
还有就是在读操作时,指今得或0x01(即cmd | 0x01)
你再去试一下.看看.
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2);
for(i=0;i<8;i++)
{
if(DATA) {dat=(dat>>=1)|0x80}; //读到数据1
else
dat>>=1; //读到数据0
SCLK=1;
delaynus(2);
SCLK=0;
delaynus(2);
}
return dat;
}
还有就是在读操作时,指今得或0x01(即cmd | 0x01)
你再去试一下.看看.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询