单片机
返回首页

avr单片机读写时钟芯片DS3231程序(通过测试)

2019-10-24 来源:51hei

实时时钟芯片DS3231,该款芯片是目前世界上精度最高的集成,也是业内最先推出、采用简单音叉晶体和集成电路即可提供±2分钟/年时间保持精度的芯片。


//程序由AT24C系列的读写程序改写而来,不同点只在于器件地址的不同

#include

#include

#define uchar unsigned char

#define uint  unsigned int

void DelayUs(uchar i);

void CLK(uchar PD);//设置SCL的电平

void IO(uchar PD);//设置IO的电平

void SetIO(uchar i);//设置IO为输入输出

//IIC读写函数供外部main函数调用

void WriteDs3231_OneByte(unsigned char addr,unsigned char ddata);

unsigned char ReadDs3231_OneByte(unsigned char addr);

void DelayMs(uchar i)

{

uint count;

for(;i!=0;i--)for(count=100;count!=0;count--);

}

//设置SCL的电平

void CLK(uchar PD)

{if(PD==1) PORTD|=0x08;//SCL置1

else       PORTD&=~0x08;//SCL置0

}

//设置IO的电平

void IO(uchar PD)

{if(PD==1) PORTD|=0x04;//IO置1

else       PORTD&=~0x04;//IO置0

}

/////////////////////////////////

//IIC

//*******************Start条件****************//

void Start(void)

{

CLK(0);DelayMs(2);

IO(1); DelayMs(2);

CLK(1);DelayMs(2);

IO(0); DelayMs(2);

CLK(0);DelayMs(2);

}

//*******************Stop条件****************//

void Stop(void)

{

CLK(0);  DelayMs(2);

IO(0);   DelayMs(2);

CLK(1);  DelayMs(2);

IO(1);   DelayMs(2);

CLK(0);  DelayMs(2);

}

//********************发送数据************//

void SendData(uchar Xdata)  

{uchar count;

for(count=0;count!=8;count++)

  {

  CLK(0); DelayMs(2);

  if(Xdata&0x80)

   IO(1);

  else

   IO(0);

  DelayMs(2);

  CLK(1); DelayMs(2);

  Xdata<<=1;

}

//以下把SDA置1释放总线

CLK(0);DelayMs(2);

CLK(1);DelayMs(2);

CLK(0);DelayMs(2);

}

/////////////接收数据///////////////////

uchar  ReceiveData(void)  

{

uchar count;

uchar temp;

uchar value=0;

DDRD&=~0x04;//设置为输入

  for(count=0;count!=8;count++)

  {

  value<<=1;

  CLK(1); DelayMs(2);

  temp=PIND;//读引脚

  if((temp&0x04)==0x04) value++;

  DelayMs(2);

  CLK(0); DelayMs(2);

}

DDRD|=0x04;//设置为输出

//以下输出NOACK

CLK(0);DelayMs(2);

IO(1);DelayMs(2);

CLK(1);DelayMs(2);

CLK(0);DelayMs(2);

return value;

}

//////////////以下供main调用/////////////////

//向addr写一个数据

void WriteDs3231_OneByte(unsigned char addr,unsigned char ddata)

{

    Start();

SendData(0xd0);//器件寻址

SendData(addr);//存储器寻址

SendData(ddata);//写入数据

Stop();

DelayMs(2000);

}

///////////////////////////////

//从addr读一个数据

unsigned char ReadDs3231_OneByte(unsigned char addr)

{

    uchar temp;

    Start();

SendData(0xd0);//器件寻址

SendData(addr);//存储器寻址

Start();

    SendData(0xd1);   //设置读

temp = ReceiveData();//读取数据

Stop();

DelayMs(2000);

return temp;    

}



进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章