实时时钟芯片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; }
上一篇:ATMEGA168+L298控制电机正反转的代码与Proteus仿真
下一篇:自制AVR控制1W变频器
推荐阅读最新更新时间:2024-11-05 16:31
设计资源 培训 开发板 精华推荐
- 暑期加油站:零起点带你学遍单片机
- 泰科电子工业事业部邀您云逛展 ——打破时间、空间的限制,TE Connectivity 线上工博会为您带来沉浸式VR观展体验
- 开学季!解锁奇楼去充电,玩转幸运大抽奖~抽不中再抽
- ADI公司再生能源—能源储存解决方案
- ADI有奖下载活动之18 ADI双光束分光光度计演示系统和解决方案
- 有奖直播|安森美图像传感器,助力汽车、机器视觉和人工智能领域发展
- 了解并观看是德科技汽车电子、物联网(IOT)精彩专题,下载技术文章送好礼!
- 学习Altera《SoC FPGA:体系结构重要吗?》文章,答题赢好礼!
- VISHAY工业电源主题月 幸运闯关赢大奖!
- 【EEWORLD中秋国庆专辑】你身边的电子牛人秀