×
单片机 > 单片机程序设计 > 详情

DS3231模块配合stc89c52程序与原理图

发布时间:2020-06-17 发布时间:
|

这一阶段一直在学习宋雪松老师的书,感觉写的很棒,在普中开发板上写了DS1302的时钟(虽然很渣,自带的时钟芯片还有问题),心血来潮买了个时钟模块DS2321,买来不会用卖家提供的是Arduino的程序,源程序网上很多,但总想自己写,看了半天的DS2321时序图恍然大悟——这不是IIC时序么,赶紧把之前写的IIC文件拿过来,写了个下载进去,时钟不动,检查了一下是器件地址多加了<<1,改完走的一溜一溜的,程序名字是DS1302,因为是从1302改过来的,名字懒得改,并不是挂羊头卖狗肉可以放心食用

实物图

 

单片机源程序如下:

#include

#include

typedef unsigned int u16;

typedef unsigned char u8;


struct sTime

{

        u16 year;

        u8 mon;

        u8 day;

        u8 hour;

        u8 min;

        u8 sec;

        u8 week;

};


extern void I2CStar();

extern void I2CStop();

extern bit I2CWrite(u16 dat);

extern u8 I2CReadNAK();

extern u8 I2CReadACK();


void DS1302Read(u8 *buf,u8 addr,u8 len)                        //读EEPROM中duo字节

{

        do{

                I2CStar();

                if(I2CWrite(0xD0))

                {

                        break;

                }

                I2CStop();

          }while(1);

        I2CWrite(addr);

        I2CStar();

        I2CWrite((0xD0)|0x01);  //寻址,读操作

        while(len>1)

        {

                *buf++=I2CReadACK();

                len--;

        }

        *buf=I2CReadNAK();                   //读一个字节

        I2CStop();

}


void DS1302Write(u8 *buf,u8 addr,u8 len)

{

        while(len>0)

        {        

                do{

                        I2CStar();

                        if(I2CWrite(0xD0))

                        {

                                break;

                        }

                        I2CStop();

                  }while(1);


                I2CWrite(addr);

                while(len>0)

                {

                        I2CWrite(*buf++);

                        len--;

                        addr++;

                        if((addr&0x07)==0)

                        {

                                break;

                        }

                }

                I2CStop();

        }

}


void GetRealTime(struct sTime *time)

{

         u8 buf[8];

         

         DS1302Read(buf,0x00,7);


         time->year=buf[6]+0x2000;

         time->mon=buf[5];

         time->day=buf[4];

         time->week=buf[3];

         time->hour=buf[2];

         time->min=buf[1];

         time->sec=buf[0];


}


void SetRealTime(struct sTime *time)

{

         u8 buf[8];


         buf[7]=0;

         buf[6]=time->year;

         buf[5]=time->mon;

         buf[4]=time->day;

……………………




关键字:DS3231模块  stc89c52  DS1302 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于单片机的医院护理呼叫对讲系统设计