|
正好我小孩給51寫(xiě)了一個(gè)DS3231的頭文件,你看看READ和WRITE 兩個(gè)函數(shù),就明白IIC通訊過(guò)程了,不過(guò)寫(xiě)的風(fēng)格不好,看樣子是半抄半寫(xiě)的。
#ifndef _DS3231_H_
#define _DS3231_H_
sbit DS3231_SDA=P0^5;
sbit DS3231_SCL=P0^6;
sbit DS3231_SQW=P0^7;
bit ack;
#define DS3231_Write 0xD0
#define DS3231_Read 0xD1
#define DS3231_SECOND 0x00
#define DS3231_MINUTE 0x01
#define DS3231_HOUR 0x02
#define DS3231_WEEK 0x03
#define DS3231_DAY 0x04
#define DS3231_MONTH 0x05
#define DS3231_YEAR 0x06
#define DS3231_CONTROL 0x0E //控制寄存器
#define DS3231_STATUS 0x0F //狀態(tài)寄存器
#define DS3231_TEMPERATUREH 0x11 //溫度高字節(jié)
#define DS3231_TEMPERATUREL 0x12 //溫度低字節(jié)
void delay(uint us)
{
while (us--);
}
void Start_I2C()
{
DS3231_SDA=1;
delay(1);
DS3231_SCL=1;
delay(5);
DS3231_SDA=0;
delay(5);
DS3231_SCL=0;
delay(2);
}
void Stop_I2C()
{
DS3231_SDA=0;
delay(1);
DS3231_SCL=1;
delay(5);
DS3231_SDA=1;
delay(4);
}
void SendByte(uchar c)
{
uchar i;
for(i=0;i<8;i++)
{
if((c<<i)&0x80)
DS3231_SDA=1; //判斷發(fā)送位
else
DS3231_SDA=0;
delay(1);
DS3231_SCL=1; //置高,通知接收數(shù)據(jù)位
delay(5);
DS3231_SCL=0;
}
delay(2);
DS3231_SDA=1; //釋放總線,接收應(yīng)答信號(hào)
delay(2);
DS3231_SCL=1;
delay(3);
//我寫(xiě)的
if (DS3231_SDA==1)
ack=0;
else
ack=1; //是否接到應(yīng)答信號(hào)
DS3231_SCL=0;
delay(2);
}
uchar RcvByte()
{
uchar n=0;
uchar i,retc=0;
DS3231_SDA=1; //設(shè)為輸入方式
for(i=0;i<8;i++)
{
delay(1);
DS3231_SCL=0; //置低,準(zhǔn)備接收數(shù)據(jù)
delay(5);
DS3231_SCL=1; //使數(shù)據(jù)有效
delay(3);
retc<<=1;
if(DS3231_SDA==1)
retc+=1;
delay(2);
}
DS3231_SCL=0;
delay(2);
return(retc);
}
//我寫(xiě)的
void Ack_I2C(bit a)
{
if (a==0)
DS3231_SDA=0; //應(yīng)答或非應(yīng)答信號(hào)
else
DS3231_SDA=1;
delay(3);
DS3231_SCL=1;
delay(5);
DS3231_SCL=0;
delay(2);
}
uchar write1(uchar addr,uchar write_data)
{
Start_I2C();
SendByte(DS3231_Write);
if (!ack)
{
return 0;
}
delay(1);
SendByte(addr);
if (!ack)
{
return 0;
}
delay(1);
SendByte(write_data);
if (!ack)
{
return 0;
}
Stop_I2C();
delay(10);
return 1;
}
uchar read1()
{
uchar read_data;
Start_I2C();
SendByte(DS3231_Read);
if (!ack)
{
return 0;
}
delay(1);
read_data = RcvByte();
if (!ack)
{
return 0;
}
Ack_I2C(1);
Stop_I2C();
return read_data;
}
uchar read2(uchar add)
{
Start_I2C();
SendByte(DS3231_Write);
if (!ack)
{
return 0;
}
delay(1);
SendByte(add);
if (!ack)
{
return 0;
}
return(read1());
}
#endif
|
|