各位前辈帮我看下DS1302的读写功能程序是不是错了?
时间:10-02
整理:3721RD
点击:
/***DS1302WRITEBYTE写一个字节***/
void write_byte(uchar dat)
{
uchar i;
for(i=1;i<8;i++)
{
SCK=0;
SDA=dat&0x01;//提取待写入的D0位
dat=dat>>1;//右移移位,高位补0为提取下一位数据准备
SCK=1;//拉高时钟信号,D0位数据写入
}
}
/***DS1302WRITEDATA写数据***/
void write_data(uchar addr,dat)
{
RST=0;//禁止数据传输
delayus(1);
SCK=0;//拉低时钟信号,为写操作准备上升沿
delayus(1);
RST=1;//读写操作时RST必须置高
delayus(1);
write_byte(addr);//先写地址
delayus(1);
write_byte(dat);
RST=0;//禁止数据传输
SCK=1; //释放总线
SDA=1;
}
/***DS1302READDATA读数据***/
uchar read_data(uchar addr)
{
uchar dat1,dat2,i;
RST=0;
delayus(1);
SCK=0;
delayus(1);
RST=1;
delayus(1);
write_byte(addr);
for(i=0;i<8;i++)
{
dat1=dat1>>1;
if(SDA)
dat1=dat1|0x80;
SCK=0;
SCK=1;
}
RST=0;
SCK=1;
SDA=1;
dat2=dat1/16;//BCD转16
dat2=dat2*10+dat1;
return(dat2) ;
}
void write_byte(uchar dat)
{
uchar i;
for(i=1;i<8;i++)
{
SCK=0;
SDA=dat&0x01;//提取待写入的D0位
dat=dat>>1;//右移移位,高位补0为提取下一位数据准备
SCK=1;//拉高时钟信号,D0位数据写入
}
}
/***DS1302WRITEDATA写数据***/
void write_data(uchar addr,dat)
{
RST=0;//禁止数据传输
delayus(1);
SCK=0;//拉低时钟信号,为写操作准备上升沿
delayus(1);
RST=1;//读写操作时RST必须置高
delayus(1);
write_byte(addr);//先写地址
delayus(1);
write_byte(dat);
RST=0;//禁止数据传输
SCK=1; //释放总线
SDA=1;
}
/***DS1302READDATA读数据***/
uchar read_data(uchar addr)
{
uchar dat1,dat2,i;
RST=0;
delayus(1);
SCK=0;
delayus(1);
RST=1;
delayus(1);
write_byte(addr);
for(i=0;i<8;i++)
{
dat1=dat1>>1;
if(SDA)
dat1=dat1|0x80;
SCK=0;
SCK=1;
}
RST=0;
SCK=1;
SDA=1;
dat2=dat1/16;//BCD转16
dat2=dat2*10+dat1;
return(dat2) ;
}
老师们帮忙看一下 http://wenku.baidu.com/link?url= ... xcFFu-yiE5B202oTFRa 这个是DS1302的数据手册
我自己调了很久了 不知道那里出问题了 就是实现不了功能
有时间 的老师帮忙看下 指点我一下 谢谢
1302有成熟经典的例程,对比查找下就搞惦了。