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; }