各位前辈帮我看下DS1302的读写功能程序是不是错了?

2019-07-15 17:59发布

/***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) ;
}  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。