gudujiangone 发表于 2013-1-31 10:40:02

gudujiangone 发表于 2013-1-31 12:26:46

i_kkyu 发表于 2013-1-31 10:40:03

建议用仿真器和示波器跟踪一下。

gudujiangone 发表于 2013-1-31 12:32:52

i_kkyu 发表于 2013-1-31 12:34:04

观察下波形看和期望的一样不。

javabean 发表于 2013-1-31 12:39:34

把你的电路图贴出来看看,

liu_shu 发表于 2013-1-31 13:11:08

          /************ DS1302实时时钟芯片操作 **************/
//底层驱动函数
/*******************************************************************************
函数名:DS1302_w_bit()
功能:向DS1302写入一个字节数据/指令(没有RST操作)
参数:byte --- 欲写入的数据/指令内容
返回值:无
/******************************************************************************/
voidDS1302_w_bit(unchar byte)
{
   unchar i;
   for(i=0;i<8;i++)                         //8位数据计数
   {
   PORTB &= (~BIT(0));          //拉低时钟端,准备写入数据
   if(byte&0x01)                      //当前位是否是1
      {
      PORTB|=BIT(1);      //是1,拉高数据端
      }
   else                                                  
      {
      PORTB &= (~BIT(1));   //不是1而是0,拉低数据端
      }
   delayus(5);                          //延时,调整时钟和脉冲宽度
   PORTB|=BIT(0);                //时钟上升沿(DS1302采样数据)
   byte>>=1;                                  //数据右移1位,为送出新数据位做准备
   }
}
/*******************************************
函数名:DS1302_r_bit()
功能:从DS1302读出一个字节数据(没有RST操作)
参数:无
返回值:byte --- 读出的数据内容
/********************************************/
uncharDS1302_r_bit(void)
{
   unchar i,byte=0;
   DDRB &= (~BIT(1));              //将数据端口设置为输入                  
   PORTB &= (~BIT(1));              //无上拉电阻
   for(i=0;i<8;i++)                          //8位数据计数
   {
       byte>>=1;                          //保存读入的数据位
       PORTB|=BIT(0);              //时钟上升沿
       delayus(5);                          //延时,调整时钟脉冲宽度
       PORTB &= (~BIT(0));    //时钟下降沿,DS1302输出数据位
       delayus(5);                          //等待数据变化
       if(PINB&BIT(1))      //当前位是否是高电平
      {
          byte|=BIT(7);              //是高电平就将返回数据的当前位置1
      }
       else
      {
          byte &= (~BIT(7));//是低电平就将返回数据的当前位置0
      }
   }
   DDRB|=BIT(1);                      //最后将数据端口设置为输出
return byte;                                  //返回读出的数据
}
/*******************************************************************************
函数名:DS1302_write()
功能:向DS1302的某个地址写入一个字节数据
参数:addr -- 欲写入的地址
           data -- 欲写入的数据
返回值:无
/********************************************/
voidDS1302_write(unchar addr,unchar data)
{
   PORTB &= (~BIT(2));              //拉低片选端
   PORTB &= (~BIT(0));              //拉低时钟端
   delayus(5);
   PORTB|=BIT(2);                //拉高片选端
   delayus(5);                               //调整片选脉冲
   DS1302_w_bit(addr);              //写入操作命令(地址)
   delayus(5);
   PORTB &= (~BIT(0));              //拉低时钟端
   delayus(5);
   DS1302_w_bit(data);              //写入数据
   PORTB &= (~BIT(0));              //拉低时钟端
   delayus(5);                              //调整片选脉冲
   PORTB &= (~BIT(2));              //拉低片选端
}
/*******************************************
函数名:DS1302_read()
功能:从DS1302的某个地址读出一个字节数据
参数:addr -- 地址值(寄存器或RAM)
返回值:data -- 读出的数据
/********************************************/
unchar DS1302_read(unchar addr)
{
   unchar data;
   PORTB &= (~BIT(2));              //拉低片选端
   PORTB &= (~BIT(0));              //拉低时钟端
   delayus(5);
   PORTB|=BIT(2);                //拉高片选端
   delayus(5);                               //调整片选脉冲
   DS1302_w_bit(addr);              //写入操作命令(地址)
   delayus(5);
   data=DS1302_r_bit();              //读出数据
   delayus(5);
   PORTB &= (~BIT(0));      //拉低时钟端
   PORTB &= (~BIT(2));               //拉低片选端
   return data;                              //返回读出的数据
}
/*******************************************************************************
函数名:DS1302_Init()
功能:初始化DS1302芯片
参数:无
返回值:无
/******************************************************************************/
voidDS1302_Init()
{
   DS1302_write(0x8E,0x00);   //控制命令,WP位为0,允许写操作
   delayms(5);               
   DS1302_write(0x8C,0x09);   //写入年份09年
   delayms(1);
   DS1302_write(0x8A,0x06);   //写入星期5
   delayms(1);
   DS1302_write(0x88,0x10);   //写入月份10月
   delayms(1);
   DS1302_write(0x86,0x31);   //写入日期31日
   delayms(1);
   DS1302_write(0x84,0x15);   //写入小时15点
   delayms(1);
   DS1302_write(0x82,0x06);   //写入分钟06分
   delayms(1);
   DS1302_write(0x90,0xA5);   //涓流充电
   delayms(1);
   DS1302_write(0x80,0x00);   //写入秒00,开始走时
   DS1302_write(0x8E,0x80);   //控制命令,WP位为1,允许写操作
}
/*******************************************************************************
函数名:time_get()
功能:从DS1302芯片里读取时间数据
参数:无
返回值:无
/******************************************************************************/
voidtime_get()
{
   int a,b;                   //定义一下,用于数据处理
   year = DS1302_read(0x8D);//读取年份数据
   xq = DS1302_read(0x8B);    //读取星期数据
   month = DS1302_read(0x89); //读取月份数据
   day = DS1302_read(0x87);   //读取日期数据
   hour = DS1302_read(0x85);//读取小时数据
   min = DS1302_read(0x83);   //读取分钟数据
   sec = DS1302_read(0x81);   //读取秒钟数据
//BCD码转换成十进制数
//年
   a = (year&0xF0)>>4;      //转换十位
   b = year&0x0F;             //转换个位
   year = a*10+b;
//月
   a = (month&0xF0)>>4;       //转换十位
   b = month&0x0F;            //转换个位
   month = a*10+b;
//日
   a = (day&0xF0)>>4;         //转换十位
   b = day&0x0F;            //转换个位
   day = a*10+b;
//时
   a = (hour&0xF0)>>4;      //转换十位
   b = hour&0x0F;             //转换个位
   hour = a*10+b;             //汇总
//分
   a = (min&0xF0)>>4;         //转换十位
   b = min&0x0F;            //转换个位
   min = a*10+b;            //汇总
//秒
   a = (sec&0xF0)>>4;         //转换十位
   b = sec&0x0F;            //转换个位
   sec = a*10+b;            //汇总
}

liu_shu 发表于 2013-1-31 13:13:19

            /**************** 初始化端口操作 *************/
/*******************************************************************************
函数名:Port_Init()
功能:端口初始化设置
参数:无
返回值:无
/******************************************************************************/
voidPort_Init()
{
   DDRD |= BIT(2)|BIT(3)|BIT(4);//初始化液晶端口
   DDRB |= BIT(0)|BIT(1)|BIT(2);//初始化DS1302端口
   DDRD |= BIT(0);            //初始化DS1820总线端口
   DDRD &= (~BIT(7))&(~BIT(6))&(~BIT(5));
   DDRC &= (~BIT(0));         //设置按键端口为输入
}

liu_shu 发表于 2013-1-31 13:13:44

1.实时时钟芯片DS1302与MCU接口
            MCU --- DS1302
                  PB0 --- SCLK;
                  PB1 --- I/O;
                  PB2 --- REST;

gudujiangone 发表于 2013-1-31 13:47:11

gudujiangone 发表于 2013-1-31 15:33:05

gudujiangone 发表于 2013-1-31 15:43:26

i_kkyu 发表于 2013-1-31 18:51:35

gudujiangone 发表于 2013-1-31 15:43 static/image/common/back.gif
谢谢你。谢谢你的热心帮助。我鼓捣出来了。

多鼓捣鼓捣吧。

javabean 发表于 2013-1-31 21:13:43

gudujiangone 发表于 2013-1-31 13:47 static/image/common/back.gif
PORTC 5,6,7分别是SCLK,IO,RESET

我不是看不懂你的程序,我是担心你硬件连接有问题,硬件问题还不透露电路图,自己慢慢捣鼓吧……

gudujiangone 发表于 2013-2-1 09:08:00

i_kkyu 发表于 2013-2-1 09:13:10

经验都是鼓捣出来的。

天使之翼 发表于 2013-2-1 09:43:15

用protues就可以了
页: [1]
查看完整版本: 在线等啊:DS1302的写入读出问题