搜索
bottom↓
回复: 2

帮我分析一下ds1307的程序 谢谢

[复制链接]

出0入0汤圆

发表于 2005-4-18 10:57:58 | 显示全部楼层 |阅读模式
源程序如下,现在读不出来数,我怀疑可能是读数据的时候出问题了,请高手们帮我看看,时序肯定没问题,我以前在51上就用的这个,现在移植到avr上不好用了,





#include <iom16v.h>

#include <macros.h>

#include "ds1307_h.h"





#define SETDS1307CLK  PORTB|=0X80

#define CLRDS1307CLK  PORTB&=0X7F

#define SETDS1307DAT  PORTB|=0X40

#define CLRDS1307DAT  PORTB&=0XBF



void SomeNop(void);

void Start(void);

void Stop(void);

void SendAck(unsigned char k);

void Send(unsigned char dat);

unsigned char Read(void);

unsigned char Write1307(unsigned char add,unsigned char dat);

unsigned char Read1307(unsigned char add);

void Initial_DS1307(void);





/******************************** ds1307 **************************/

void SomeNop(void)

{

         NOP();

         NOP();

         NOP();

         NOP();

         NOP();

        // NOP();

        // NOP();

         

}

/***********************************************************************/



void Start(void)

{

         DDRB=0XC0;

         SETDS1307DAT;

         SETDS1307CLK;

         SomeNop();

         CLRDS1307DAT;

         SomeNop();

         CLRDS1307CLK;

         SomeNop();

}

/***********************************************************************/

void Stop(void)

{

         DDRB=0XC0;

         CLRDS1307DAT;

         SomeNop();

         SETDS1307CLK;

         SomeNop();

         SETDS1307DAT;

         SomeNop();

}

/***********************************************************************/

void SendAck(unsigned char  k)

{

         DDRB=0XC0;

         SomeNop();

         if(k==1)

                          SETDS1307DAT;

         else

                            CLRDS1307DAT;

        // SDA=k;

         SomeNop();

         SETDS1307CLK;

         SomeNop();

         SomeNop();

         SomeNop();

         CLRDS1307CLK;

}

/***********************************************************************/



void Send(unsigned char dat)

{

        //DDRB=0XC0;

        unsigned char i,temp;

          temp=dat;

        DDRB=0XC0;

          for (i=0;i<8;i++)

           {

            CLRDS1307CLK;

           // SDA=(bit)(temp&0x80);

                if(temp&0x80)

                                         SETDS1307DAT;

                else                 

                                         CLRDS1307DAT;

            temp<<=1;

            SomeNop();

            SETDS1307CLK;

            SomeNop();

            SomeNop();

           }

           CLRDS1307CLK;   

}

/***********************************************************************/

unsigned char Read(void)

{

       

        unsigned char i,dat;

          for (i=0;i<8;i++)

           {

                 DDRB=0XC0;

               

            CLRDS1307CLK;

            SomeNop();

            SETDS1307DAT;

            SomeNop();

               

                DDRB=0X80;

               

            SomeNop();

            SETDS1307CLK;

            dat<<=1;

            SomeNop();

                   SomeNop();

                if(PINB&0X40)

                        dat++;

               SomeNop();

           }

   CLRDS1307CLK;  

                  

          return (dat);

}

/***********************************************************************/

unsigned char Write1307(unsigned char add,unsigned char dat)

{

         unsigned char temp;

         temp=dat/10;

         temp<<=4;

         temp=dat%10+temp;

         

         Start();

         Send(0xD0);                         

         SendAck(0);

         Send(add);          //发地址

         SendAck(0);   

         Send(temp);     //发数据

         SendAck(1);

         Stop();

         

         return (0);

}

/***********************************************************************/

unsigned char Read1307(unsigned char add)

{

         unsigned char temp,dat;

         Start();

         Send(0xD0);

         SendAck(0);

         Send(add);

         SendAck(1);

         Stop();

         

         Start();

         Send(0xD1);

         SendAck(0);

         dat=Read();

         SendAck(1);

         Stop();       //接收结束



         temp=dat/16;

         dat=dat%16;

         dat=dat+temp*10;



        return (dat);

}

/***********************************************************************/



void Initial_DS1307(void)

{

         Write1307(0x00,23);                                //秒设定

         Write1307(0x01,59);                                  //分设定

         Write1307(0x02,11);                                  //小时设定

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2005-12-3 10:14:37 | 显示全部楼层
为什么不用M16的I2C接口呢?

出0入0汤圆

发表于 2013-5-6 13:40:21 | 显示全部楼层
此人不知道在社区不?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表