这几天用DS1302,程序出来之后很不理想
先贴贴程序:
void WriteByte(uchar dat)
{
uchar i;
ACC=dat;
for(i=8;i>0;i--)
{
Dat_1302=ACC0;
CLK_1302=1;
_nop_();_nop_();_nop_();
CLK_1302=0; //产生上升沿输入数据
ACC=ACC>>1;
}
}
void WriteSet1302(uchar Cmd,uchar dat)
{
RST_1302=0;
CLK_1302=0; //确保写数居前SCLK被拉低
RST_1302=1; //启动数据传输
WriteByte(Cmd);
WriteByte(dat);
RST_1302=0;
CLK_1302=1;
}
uchar ReadByte(void)
{
uchar i;
for(i=8;i>0;i--)
{
ACC7=Dat_1302;//ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿
ACC=ACC>>1;
CLK_1302=1;
CLK_1302=0;//产生下降沿输出一位数据
_nop_();_nop_();_nop_();
}
return(ACC);
}
uchar ReadSet1302(uchar Cmd)
{
uchar dat;
RST_1302=0;
CLK_1302=0; //确保写数居前SCLK被拉低
RST_1302=1; //启动数据传输
WriteByte(Cmd);
dat=ReadByte();
RST_1302=0;
CLK_1302=1;
return dat; //将读出的数据返回
}
void Init1302(void)
{
WriteSet1302(0x8e,0x00);
WriteSet1302(0x80,0x05);//初始化时分秒
WriteSet1302(0x82,0x10);
WriteSet1302(0x84,0x15);
WriteSet1302(0x90,0xab);
WriteSet1302(0x8e,0x80);
}
程序遇到的问题是读取时间时老是出错,有时候是秒的数据错了,有时候是分的数据,有时候是时间的数据
而且写进去时间后读出来的数据也有错
不知道是哪里的问题
在网上看了很多这方面的程序,感觉都没有错
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
出了问题,软硬件一定要一起处理,千万不要踢皮球!!
我想应该不是硬件的问题
因为这块板曾经有人写过程序
是可以的
而且运行很稳定
只不过那个人没有给我源代码就走了
所以我从头开始
今天弄了一整个下午
改了好多次都是数据读错
换了一块板也是一样
{
unsigned char i;
for(i=0; i<8; i++)
{
SCLK=0;
Dat_1302=SendByte&0x01; //LSB first
SendByte>>=1;
SCLK=1;
_nop_();
}
Dat_1302=1;
}
uchar ReadByte(void)
{
unsigned char i,RecvByte=0;
Dat_1302=1; //将IO口置为输入状态
for(i=0; i<8; i++)
{
SCLK=0;
RecvByte>>=1;
if( Dat_1302)
RecvByte|=0x80;
SCLK=1;
_nop_();
}
return RecvByte;
}
一周热门 更多>