4758866 发表于 2012-6-26 21:46:33

DS1302初始化怎么不行?

#include<reg52.h>
#include<lcd1602xs.h>
#define uchar unsigned char
#define uint unsigned int
sbit RST=P1^5;
sbit SCLK=P1^6;
sbit SDA=P1^7;
uchar dat,date;
void delayus(uchar z);
void write_ds1302(uchar);//写
uchar read_ds1302();//读
void set_DS1302(uchar com,uchar date);
void init_DS1302();
void main()
{
   init_DS1302();
   write_ds1302(0x81);
   lcddisp(0,dat);
}
void write_ds1302(uchar date)//写
{
   uchar i;
   SCLK=0;//为上升沿写数据做准备
   delayus(2);//延时等待数据稳定
   for(i=0;i<8;i++)//写8个二进制数
{
      SDA=date&0x01;//取出date的第0位,低位在前高位在后
      delayus(2);//延时等待硬件
      SCLK=1;//上升沿写入数据
      delayus(2);//延时
      SCLK=0;//重新拉低为下个脉冲做准备
      date=date>>1;//数据向右移动1位,准备写下一个位
}
}
uchar read_ds1302()//读
{
      uchar i,dat;
      delayus(2);
      for(i=0;i<8;i++)
{
      dat=dat>>1;
      if(SDA==1)
{
      dat|=0x80;//将1取出写在dat的最高位
}
      SCLK=1;//为下降沿做准备
      delayus(2);
      SCLK=0;//下降沿
      delayus(2);
}
      return dat;   
}
void set_DS1302(uchar com,uchar date)
{
   write_ds1302(com);
   write_ds1302(date);
}
void init_DS1302()//初始化
{
/*    uchar flag;
    write_ds1302(0x81);
    flag=read_ds1302();
    if(flag&0x80)
{*/
   set_DS1302(0x8e,0x0);
   set_DS1302(0x80,(((55/10)<<4)|(55%10)));
   set_DS1302(0x82,(((59/10)<<4)|(59%10)));
   set_DS1302(0x84,(((23/10)<<4)|(23%10)));
   set_DS1302(0x86,(((18/10)<<4)|(18%10)));
   set_DS1302(0x88,(((6/10)<<4)|(6%10)));
   set_DS1302(0x8c,(((9/10)<<4)|(9%10)));
   set_DS1302(0x90,0xa5);
   set_DS1302(0x8e,0x80);
//}
}
void delayus(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}

4758866 发表于 2012-6-27 12:27:13

没人帮我看看吗?

xqn2012 发表于 2012-7-30 19:31:55

看是看了,不知道你初始化有什么问题?

slzm40 发表于 2012-7-31 00:16:25

你定义的RST用哪去了。。。
页: [1]
查看完整版本: DS1302初始化怎么不行?