这一阶段一直在学习宋雪松老师的书,感觉写的很棒,在普中开发板上写了DS1302的时钟(虽然很渣,自带的时钟芯片还有问题),心血来潮买了个时钟模块DS2321,买来不会用卖家提供的是Arduino的程序,源程序网上很多,但总想自己写,看了半天的DS2321时序图恍然大悟——这不是IIC时序么,赶紧把之前写的IIC文件拿过来,写了个下载进去,时钟不动,检查了一下是器件地址多加了<<1,改完走的一溜一溜的,程序名字是DS1302,因为是从1302改过来的,名字懒得改,并不是挂羊头卖狗肉可以放心食用
实物图
单片机源程序如下:
#include
#include
typedef unsigned int u16;
typedef unsigned char u8;
struct sTime
{
u16 year;
u8 mon;
u8 day;
u8 hour;
u8 min;
u8 sec;
u8 week;
};
extern void I2CStar();
extern void I2CStop();
extern bit I2CWrite(u16 dat);
extern u8 I2CReadNAK();
extern u8 I2CReadACK();
void DS1302Read(u8 *buf,u8 addr,u8 len) //读EEPROM中duo字节
{
do{
I2CStar();
if(I2CWrite(0xD0))
{
break;
}
I2CStop();
}while(1);
I2CWrite(addr);
I2CStar();
I2CWrite((0xD0)|0x01); //寻址,读操作
while(len>1)
{
*buf++=I2CReadACK();
len--;
}
*buf=I2CReadNAK(); //读一个字节
I2CStop();
}
void DS1302Write(u8 *buf,u8 addr,u8 len)
{
while(len>0)
{
do{
I2CStar();
if(I2CWrite(0xD0))
{
break;
}
I2CStop();
}while(1);
I2CWrite(addr);
while(len>0)
{
I2CWrite(*buf++);
len--;
addr++;
if((addr&0x07)==0)
{
break;
}
}
I2CStop();
}
}
void GetRealTime(struct sTime *time)
{
u8 buf[8];
DS1302Read(buf,0x00,7);
time->year=buf[6]+0x2000;
time->mon=buf[5];
time->day=buf[4];
time->week=buf[3];
time->hour=buf[2];
time->min=buf[1];
time->sec=buf[0];
}
void SetRealTime(struct sTime *time)
{
u8 buf[8];
buf[7]=0;
buf[6]=time->year;
buf[5]=time->mon;
buf[4]=time->day;
……………………
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』