历史上的今天
今天是:2024年10月24日(星期四)
2019年10月24日 | 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; }
史海拾趣
|
目录 第1 章 电子仪表的优点 1.1 可靠性和耐用性 ..............................................................................................3 1.2 高精度 .......................................................................... ...… 查看全部问答> |
|
现在做了一个AD转换用Proteus仿真时就OK,但做硬件时出错!请指教! #include #include #include \"delay.h\" #define Led_1 0b11111110 #define Led_2 ...… 查看全部问答> |
|
本人新来社区,希望大家给予帮助。 问题是:现在用VHDL设计数字频率计,计数器在每个分档处该如何记数?请高手指教,如有程序更好,谢谢!… 查看全部问答> |
|
函数不能成功返回要求的32位值 hCharEvent = (HANDLE)GetWindowLong( hWnd, TEST_CHAR_EVENT ); 程序就这么一句,TEST_CHAR_EVENT 值为0,hWnd有值,不是空的。 请问可能哪里还有问题?导致失败… 查看全部问答> |
|
现在有很多操作系统的内部任务状态机制不全,直接导致了bug的产生,具体名字就不指明了。 Raw os 的内部任务状态非常健全,以下结构体定义了任务的状态机制。 enum RAW_TASK_STATUS { RAW_RDY = 0, RA ...… 查看全部问答> |




