搜索
bottom↓
回复: 9

哪位大哥给发个DS1307时钟芯片的程序!小弟感激不尽!!

[复制链接]

出0入0汤圆

发表于 2006-9-25 13:31:14 | 显示全部楼层 |阅读模式
正在搞DS1307时钟芯片的编程!!谁能帮助以下小弟。发个程序参考下!!

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

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

出0入0汤圆

发表于 2006-9-25 14:29:27 | 显示全部楼层
楼主,DS1307和DS1302有什么区别么?

出0入0汤圆

发表于 2006-9-25 15:33:42 | 显示全部楼层
DS1307 :I2C实时时钟

DS1302 :类似SPI



印象中好像芯艺的教程里面有DS1307的代码

出0入0汤圆

发表于 2006-10-2 12:33:27 | 显示全部楼层
这是芯艺的教程里的程序

点击此处下载armok01130754.rar

出0入0汤圆

发表于 2006-10-8 01:26:18 | 显示全部楼层
这是本人写的ICC程序,可以在LCD1602上显示日期时间,可以作为参考(里边有仿真文件)!

DS1307_LCD1602

出0入0汤圆

 楼主| 发表于 2006-10-8 09:02:23 | 显示全部楼层
真的十分感谢大家的热情,在次感谢!我要好好学学。

出0入0汤圆

 楼主| 发表于 2006-10-8 15:34:47 | 显示全部楼层
#include"twi.h"

#include"ds1307.h"

#include"delay.h"



char g_aTimeBuf[7];//日历/时钟BCD格式缓冲区

char g_aTimeBin[7];//时钟/日历二进制格式缓冲区



/*************DS1307操作**************开始**************/

//对DS1307内存连续的写操作

unsigned char rtc_write(unsigned char addr,unsigned char *buf,unsigned char len)

{

        unsigned char i;

       

        twi_start();

        delay_nms(10);

        twi_writebyte(DS1307_ADDR|TW_WRITE);

        delay_nms(10);

        twi_writebyte(addr);//write address

        delay_nms(10);

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

        {

                twi_writebyte(buf);

                delay_nms(10);

                }

        twi_stop();

        return 0;

}



//对DS1307内存连续的读操作

unsigned char rtc_read(unsigned char addr,unsigned char *buf,unsigned char len)

{

        unsigned char i;

       

        rtc_write(addr,0,0);    //set address

       

        delay_nms(10);

       

        twi_start();

        delay_nms(10);

        twi_writebyte(DS1307_ADDR|TW_READ);

        for(i=0;i<len-1;i++)

        {

           twi_readbyte(buf+i,TW_ACK);

           delay_nms(10);

        }

        twi_readbyte(buf+i,TW_NACK);

        delay_nms(10);

        twi_stop();

        return 0;

}

/*************DS1307操作**************结束**************/





/*************接口部分****************开始**************/

//更新或读取DS1307日历/时间数据

unsigned char RtcUpdateData(unsigned char direction)

{

        unsigned char ret;

        if(direction)               //读

                ret=rtc_read(0,g_aTimeBuf,7);

        else                               //写

                ret=rtc_write(0,g_aTimeBuf,7);       



        return ret;

}

//读DS1307用户RAM

unsigned char RtcReadRAM(unsigned char addr,unsigned char *buf,unsigned char len)

{

        addr+=8;

        return rtc_read(addr,buf,len);

}

//写DS1307用户RAM

unsigned char RtcWriteRAM(unsigned char addr,unsigned char *buf,unsigned char len)

{

        addr+=8;

        return rtc_write(addr,buf,len);

}



unsigned char byte_bintobcd(unsigned char bin)

{

        unsigned char ret;

        bin&=0x7f;

        bin%=100;

        ret=bin/10;

        ret <<=4;

        ret|=bin%10;

        return ret;

}

unsigned char byte_bcdtobin(unsigned char bcd)

{

        unsigned char ret;

        ret=bcd & 0x0f;

        ret+=(bcd>>4)*10;

        return ret;               

}



//将二进制格式缓冲区(g_aTimeBin)内容转换成BCD格式后保存到BCD格式缓冲区(g_aTimeBuf)

void RtcBinToBCD(void)

{

        unsigned char i;

        g_aTimeBin[0]&=0x7f;

        g_aTimeBin[1]&=0x7f;



        g_aTimeBin[2]&=0x3f;

   



        g_aTimeBin[3]&=0x07;

       



        g_aTimeBin[4]&=0x3f;

        g_aTimeBin[5]&=0x1f;       

        g_aTimeBin[6]&=0xff;

       

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

                g_aTimeBuf=byte_bintobcd(g_aTimeBin);

}



//将BCD格式缓冲区(g_aTimeBuf)内容转换成二进制格式后保存到二进制格式缓冲区(g_aTimeBin)

void RtcBCDToBin(void)

{

        unsigned char i;

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

                g_aTimeBin=byte_bcdtobin(g_aTimeBuf);

}



//写DS1307配置字节

void RtcSetSQWOutput(unsigned char en,unsigned char level)

{

        //en:方波输出允许 TRUE 有效 level:如果输出禁止 OUT口的逻辑电平

        unsigned char c=0;

        if(en)        //enable

           c=0x10;

        else        //disable

        {

           if(level)

                  c=0x80;

        }

        rtc_write(7,&c,1);

}

/*************接口部分***************结束**************/







1: 程序中涉及很多次这两个语句: twi_writebyte(DS1307_ADDR|TW_WRITE);

                             twi_writebyte(DS1307_ADDR|TW_READ);

    请问能给解释下吗?



2: 还有就是程序中涉及很多类似子程序比如return TW_STATUS;和 TWI_Wait();等等

    而这些在这之前有没有声明和定义啊。为什么它会被识别啊?请教帮忙!!




-----此内容被avr521于2006-10-08,15:50:25编辑过

出0入0汤圆

 楼主| 发表于 2006-10-8 19:41:44 | 显示全部楼层
冰晶石,这是你的程序,小弟以上没太看懂,能否给予解释?

出0入0汤圆

发表于 2011-11-28 08:47:41 | 显示全部楼层
http://adf.ly/4116/pic-lesson-i2c-module

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 09:14

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

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