打印

DS3231程序大集合,欢迎大家来分享

[复制链接]
楼主: dirtwillfly
手机看帖
扫描二维码
随时随地手机跟帖
21
dirtwillfly|  楼主 | 2015-11-20 20:41 | 只看该作者 回帖奖励 |倒序浏览

也有国外的

使用特权

评论回复
22
dadangjia| | 2015-11-20 20:43 | 只看该作者
国外的比较贵,比卡发板都贵些。

使用特权

评论回复
23
dirtwillfly|  楼主 | 2015-11-20 20:56 | 只看该作者
dadangjia 发表于 2015-11-20 20:43
国外的比较贵,比卡发板都贵些。

是的,进口的ic都比国产的要贵不少

使用特权

评论回复
24
zhoupxa| | 2015-11-26 17:08 | 只看该作者
如此发帖,我只能......唉......

使用特权

评论回复
25
dirtwillfly|  楼主 | 2015-11-26 21:27 | 只看该作者
zhoupxa 发表于 2015-11-26 17:08
如此发帖,我只能......唉......

17楼有代码原作者提供的压缩包

使用特权

评论回复
26
51xlf| | 2015-11-30 07:39 | 只看该作者
这个帖子好长呢。

使用特权

评论回复
27
dadangjia| | 2016-4-29 17:11 | 只看该作者
dirtwillfly 发表于 2015-11-20 20:56
是的,进口的ic都比国产的要贵不少

后来发现是没有去掉写保护导致不能读取与写入的。DS1302电池拔掉后需要重新去掉写保护。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
dirtwillfly + 6 赞一个!感谢分享
28
dirtwillfly|  楼主 | 2016-4-29 20:21 | 只看该作者
dadangjia 发表于 2016-4-29 17:11
后来发现是没有去掉写保护导致不能读取与写入的。DS1302电池拔掉后需要重新去掉写保护。 ...

使用特权

评论回复
29
长的帅怪我落| | 2016-8-17 14:28 | 只看该作者
多谢分享,我就参照你们的写个dsp28335的版本出来,成了我就发这里来

使用特权

评论回复
30
dirtwillfly|  楼主 | 2016-8-17 15:56 | 只看该作者
长的帅怪我落 发表于 2016-8-17 14:28
多谢分享,我就参照你们的写个dsp28335的版本出来,成了我就发这里来

使用特权

评论回复
31
长的帅怪我落| | 2016-8-30 10:00 | 只看该作者
唉,我去,这么久了,还没搞定。。单步走没问题了,就是自己跑起来就出问题。。。唉,真**

使用特权

评论回复
32
长的帅怪我落| | 2016-9-1 09:41 | 只看该作者
不好意思啦,终于照着上面哪位大神的stm32版的改成了,至于液晶显示就没加了,需要的人自己去加吧,反正数据都在数组里面了,基本就是照抄哪个stm32的,忘大神莫怪。。。还有,公司的文件是加密的,如果我发压缩包来,你们是打不开的,所以,我就发代码了,我现在去加注释,加了就发来

使用特权

评论回复
33
长的帅怪我落| | 2016-9-1 09:45 | 只看该作者

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
//// 液晶没有加,数据已经在 dis_buf_date[]里面了,需要的自行把数据显示在对应的lcd上面就行,格式问题也应该不大,直说我懒得搞了,改这个是为了验证我的模拟的I2C有没有问题,现在没问题,我也懒得继续深究了,后续有需要我在加个显示
/*端口设置*/
#define         DS3231_SCL            GpioDataRegs.GPADAT.bit.GPIO20

#define          DS3231_SDA         GpioDataRegs.GPADAT.bit.GPIO21
#define   DS3231_SDA_IN      GpioCtrlRegs.GPADIR.bit.GPIO21



#define          LED1        GpioDataRegs.GPADAT.bit.GPIO0
#define          LED2        GpioDataRegs.GPADAT.bit.GPIO1
#define          LED3        GpioDataRegs.GPADAT.bit.GPIO2
#define          LED4        GpioDataRegs.GPADAT.bit.GPIO3
#define          LED5        GpioDataRegs.GPADAT.bit.GPIO4







#define DS3231_WriteAddress 0xD0    //器件写地址
#define DS3231_ReadAddress  0xD1    //器件读地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //时
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年
#define u8  unsigned char


//IIC所有操作函数
//void         IIC_Init(void);                        //初始化IIC的IO口
void         IIC_Start(void);                                //发送IIC开始信号
void         IIC_Stop(void);                                          //发送IIC停止信号
void         IIC_Send_Byte(u8 txd);                        //IIC发送一个字节vodi                IIC_Read_Byte(u8);                                //IIC读取一个字节
u8                IIC_Wait_Ack(void);                         //IIC等待ACK信号
void         IIC_Ack(void);                                        //IIC发送ACK信号
void         IIC_NAck(void);                                        //IIC不发送ACK信号
u8                BCD2_Hex(u8);
u8                HEX2_Bcd(u8);
void         DS3231_WriteByte(u8,u8);
u8                 DS3231_ReadCurrent(void);
u8               DS3231_ReadRandom(u8);
void         DS3231_ModifyTime(u8,u8,u8,u8,u8,u8);

void TimeDisplay(u8 Dhour,u8 Dmin,u8 Dsec);
void DateDisplay(u8 Dyear,u8 Dmonth,u8 Dday);
void TempDisplay(u8 TempH,u8 TempL);
void get_show_time(void);
void get_show_date(void);
void get_show_Temperature(void);
void configtestled(void);

u8        dis_buf_date[]={0,0,'-',0,0,' ',0,0,':',0,0,':',0,0,'\0'};
//u8        dis_buf_temp[]={0,0,'.',0,0,'\0'};
u8        txd_buf_date[];

u8 Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;
void main(void)
{
   InitSysCtrl();
configtestled();

   DINT;

DS3231_ModifyTime(16,9,1,9,21,56);//设定初始时间
   while(1)
   {
get_show_date(); //日期,年没加进去,需要的自己改
        //        DELAY_US(100);
          get_show_time();//时间
        DELAY_US(100);
   }
}
u8 BCD2_Hex(u8 val)
{
        u8 temp;
        temp = val & 0x0f;
        val>>= 4;
        val &= 0x0f;
        val *= 10;
        temp+= val;
        return temp;
}

//B转换为BCD
u8 HEX2_Bcd(u8 val)
{
        u8 i,j,k;
        i = val/10;
        j = val%10;
        k = j+(i<<4);
        return k;
}


//产生IIC起始信号
void IIC_Start(void)
{
         EALLOW;
                GpioCtrlRegs.GPADIR.bit.GPIO21=1;//输出
                 EDIS;
                DS3231_SDA=1;

                DS3231_SCL=1;

                DELAY_US(10);
                DS3231_SDA=0;
                DELAY_US(10);
                DS3231_SCL=0;


}
//产生IIC停止信号
void IIC_Stop(void)
{
  EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO21=1;// DIR 1是输出 0是输入
EDIS;
  DELAY_US(10);
  DS3231_SCL=0;
DS3231_SDA=0;
DELAY_US(10);
DS3231_SCL=1;
  DELAY_US(10);
DS3231_SDA=1;
DELAY_US(10);


}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;

EALLOW;
       GpioCtrlRegs.GPADIR.bit.GPIO21=0;// DIR 1是输出 0是输入
       EDIS;

       DS3231_SDA=1;
       DELAY_US(5);
        DS3231_SCL=1;
        DELAY_US(5);

                while (GpioDataRegs.GPADAT.bit.GPIO21 == 1)
        {
                ucErrTime++;
                if(ucErrTime>100)
                {
                        IIC_Stop();
                        return 1;
                }
        }

        DS3231_SCL=0;//时钟输出0
        return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
          DS3231_SCL=0;
          EALLOW;
               GpioCtrlRegs.GPADIR.bit.GPIO21=1;// DIR 1是输出 0是输入
               EDIS;
               DS3231_SDA=0;
                DELAY_US(10);
        DS3231_SCL=1;
         DELAY_US(10);
        DS3231_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{
          DS3231_SCL=0;
          EALLOW;
                       GpioCtrlRegs.GPADIR.bit.GPIO21=1;// DIR 1是输出 0是输入
                       EDIS;
                       DS3231_SDA=1;
                        DELAY_US(10);
             DS3231_SCL=1;
         DELAY_US(10);
        DS3231_SCL=0;
       }

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
    u8 t;
               EALLOW;
                          GpioCtrlRegs.GPADIR.bit.GPIO21=1;// DIR 1是输出 0是输入
                          EDIS;
                     DS3231_SCL=0;//拉低时钟开始数据传输

    for(t=0;t<8;t++)
{
  DS3231_SDA=(txd&0x80)>>7;
              txd<<=1;

                       DELAY_US(10);
                DS3231_SCL=1;
                 DELAY_US(10);
                DS3231_SCL=0;

                 DELAY_US(10);
    }
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
unsigned char IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        EALLOW;
        GpioCtrlRegs.GPADIR.bit.GPIO21=0;// DIR 1是输出 0是输入
        EDIS;
    for(i=0;i<8;i++ )
        {
            DS3231_SCL=0;
         DELAY_US(10);
        DS3231_SCL=1;
        receive<<=1;
        if(GpioDataRegs.GPADAT.bit.GPIO21==1)
                receive++;
         DELAY_US(10);
    }
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK
    return receive;
}
//指定地址写数据/命令
void DS3231_WriteByte(u8 addr,u8 dat)
        {
         IIC_Start();
         IIC_Send_Byte(DS3231_WriteAddress);
         IIC_Wait_Ack();
         IIC_Send_Byte(addr);
         IIC_Wait_Ack();
         IIC_Send_Byte(dat);
         IIC_Wait_Ack();
         IIC_Stop();
        }
u8 DS3231_ReadCurrent(void)
        {
         u8 read_dat;
         IIC_Start();
         IIC_Send_Byte(DS3231_ReadAddress);
         IIC_Wait_Ack();
         read_dat=IIC_Read_Byte(0);

         IIC_Stop();
         return read_dat;
        }

u8 DS3231_ReadRandom(u8 random_addr)
        {
         IIC_Start();

       IIC_Send_Byte(DS3231_WriteAddress);
         IIC_Wait_Ack();
     IIC_Send_Byte(random_addr);
     IIC_Wait_Ack();
  //   LED1=~LED1;
      DELAY_US(1000);
     return (DS3231_ReadCurrent());
        }

void DS3231_ModifyTime(u8 yea,u8 mon,u8 day,u8 hou,u8 min,u8 sec)
        {
                 u8 temp=0;
           temp=HEX2_Bcd(yea);
                DS3231_WriteByte(DS3231_YEAR,temp);                //修改年

                temp=HEX2_Bcd(mon);
                DS3231_WriteByte(DS3231_MONTH,temp);        //修改月

                temp=HEX2_Bcd(day);
                DS3231_WriteByte(DS3231_DAY,temp);                //修改日

                temp=HEX2_Bcd(hou);
                DS3231_WriteByte(DS3231_HOUR,temp);                //修改时

                temp=HEX2_Bcd(min);
                DS3231_WriteByte(DS3231_MINUTE,temp);        //修改分

                temp=HEX2_Bcd(sec);
                DS3231_WriteByte(DS3231_SECOND,temp);        //修改秒
        }
void TimeDisplay(u8 Dhour,u8 Dmin,u8 Dsec)
        {
                dis_buf_date[6]=Dhour/10 +0x30;        // 时十位
                dis_buf_date[7]=Dhour%10 +0x30;        // 时个位
                dis_buf_date[9]=Dmin/10 +0x30;         // 分十位 153745625
                dis_buf_date[10]=Dmin%10+0x30;         // 分个位
                dis_buf_date[12]=Dsec/10+0x30;         // 秒十位
                dis_buf_date[13]=Dsec%10+0x30;         // 秒个位
        }
void DateDisplay(u8 Dyear,u8 Dmonth,u8 Dday)
        {
                dis_buf_date[0]=Dmonth/10 +0x30;       // 月十位
                dis_buf_date[1]=Dmonth%10+0x30;       // 月个位
                dis_buf_date[3]=Dday /10+0x30;         // 天十位
                dis_buf_date[4]=Dday %10+0x30;         // 天个位
        }

void get_show_time(void)
        {
                u8 Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;

                Stemp1=DS3231_ReadRandom(DS3231_SECOND);  //秒
                Stemp2=BCD2_Hex(Stemp1);
                Mtemp1=DS3231_ReadRandom(DS3231_MINUTE);  //分
                Mtemp2=BCD2_Hex(Mtemp1);
               Htemp1=DS3231_ReadRandom(DS3231_HOUR);    //时 24小时制
              Htemp2=BCD2_Hex(Htemp1);

                TimeDisplay(Htemp2,Mtemp2,Stemp2);

        }
void get_show_date(void)
        {
                u8 Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;
                Dtemp1=DS3231_ReadRandom(DS3231_DAY);         //日
                Dtemp2=BCD2_Hex(Dtemp1);
                Mtemp1=DS3231_ReadRandom(DS3231_MONTH);       //月
                Mtemp2=BCD2_Hex(Mtemp1);
                Ytemp1=DS3231_ReadRandom(DS3231_YEAR);        //年

                Ytemp2=BCD2_Hex(Ytemp1);
                DateDisplay(Ytemp2,Mtemp2,Dtemp2);

        }


void configtestled(void)
{
        EALLOW;

   GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0; // GPIO0复用为GPIO功能
  GpioCtrlRegs.GPADIR.bit.GPIO21 = 1;  // GPIO0设置为输出

   GpioCtrlRegs.GPAMUX2.bit.GPIO20 =0; // GPIO1 = GPIO1
  GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;  // G 88401854
/*

  GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0复用为GPIO功能
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;  // GPIO0设置为输出
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1
    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO0复用为GPIO功能
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;  // GPIO0设置为输出
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO1 = GPIO1
    GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; // GPIO1 = GPIO1
    GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO1 = GPIO1
       GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;

*/
   EDIS;
}
//===========================================================================
// No more.
//===========================================================================


使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
dirtwillfly + 10 很给力!
34
dirtwillfly|  楼主 | 2016-9-1 16:18 | 只看该作者
长的帅怪我落 发表于 2016-9-1 09:45
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" ...

不错不错

使用特权

评论回复
35
naypt| | 2016-12-2 12:06 | 只看该作者
太感谢你们 的分享

使用特权

评论回复
36
jimmhu| | 2016-12-5 23:00 | 只看该作者
没有工程文件吗?

使用特权

评论回复
37
jimmhu| | 2016-12-5 23:01 | 只看该作者
这些代码太多了,不能弄成工程吗?

使用特权

评论回复
38
uptown| | 2016-12-6 22:26 | 只看该作者
没有相关的工程文件吗?

使用特权

评论回复
39
uptown| | 2016-12-6 22:30 | 只看该作者
DS3231比1302效果怎么样?

使用特权

评论回复
40
zhangjiwen| | 2017-6-18 10:00 | 只看该作者
长的帅怪我落 发表于 2016-9-1 09:41
不好意思啦,终于照着上面哪位大神的stm32版的改成了,至于液晶显示就没加了,需要的人自己去加吧,反正数 ...

你的程序我用了一下,有点问题,你能把显示屏的程序加上吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则