u8 ds1302_read_byte(u8 addr) { u8 i=0; u8 temp=0; u8 value=0; DS1302_RST=0; _nop_(); DS1302_CLK=0;//CLK低电平 _nop_(); DS1302_RST=1;//RST由低到高变化 _nop_(); for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位 { DS1302_IO=addr&0x01; addr>>=1; DS1302_CLK=1; _nop_(); DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据 _nop_(); } for(i=0;i<8;i++)//循环8次,每次读1位,先读低位再读高位 { temp=DS1302_IO; value=(temp<<7)|(value>>1);//先将value右移1位,然后temp左移7位,最后或运算 DS1302_CLK=1; _nop_(); DS1302_CLK=0; _nop_(); } // DS1302_RST=0;//RST拉低,当DS1302与DS18B20同时使用时,注释掉该调语句 _nop_(); DS1302_CLK=1;//对于实物中,P3.4口没有外接上拉电阻的,此处代码需要添加,使数据口有一个上升沿脉冲。 _nop_(); DS1302_IO = 0; _nop_(); DS1302_IO = 1; _nop_(); return value; }
时间: 2023-06-20 20:08:30 浏览: 123
DS1302读写程序
这是一个读取 DS1302 实时时钟芯片中指定地址数据的函数。函数接收一个 u8 类型的地址参数 addr,然后通过控制 DS1302 芯片的 RST、CLK、IO 引脚,依次将 addr 的 8 位数据写入 DS1302 芯片中,再读取 DS1302 芯片中对应地址的数据,并返回读取到的数据。
具体实现为:先将 RST 引脚拉低,再将 CLK 引脚拉低,然后将 RST 引脚拉高,产生上升沿。接着,循环 8 次,每次将 addr 的最低位写入 IO 引脚,然后将 addr 右移一位,依次写入剩余 7 位数据。每次写入时,先将 CLK 引脚拉高,产生上升沿,然后再将 CLK 引脚拉低,产生下降沿,从而将数据写入 DS1302 芯片中。
写入完成后,再循环 8 次,每次从 IO 引脚读取 1 位数据,然后将读取到的数据左移 1 位,再将上次读取到的数据右移 1 位,最后将两次数据进行或运算,即可将读取到的 8 位数据组合成一个字节。
最后,对于实物中,需要在函数最后添加一些调节语句,以产生上升沿脉冲,从而保证数据口有一个上升沿脉冲。
阅读全文