⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic._c

📁 AVR单片机对DS3231的读写操作源代码
💻 _C
字号:
#include <iom16v.h>
#include <macros.h>
#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 Write24c02_OneByte(unsigned char addr,unsigned char ddata);
unsigned char Read24c02_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 Write24c02_OneByte(unsigned char addr,unsigned char ddata)
{

    Start();
	SendData(0xa0);//器件寻址
	SendData(addr);//存储器寻址
	SendData(ddata);//写入数据
	Stop();
	DelayMs(2000);
}
///////////////////////////////
//从addr读一个数据
unsigned char Read24c02_OneByte(unsigned char addr)
{
    uchar temp;
    Start();
	SendData(0xa0);//器件寻址
	SendData(addr);//存储器寻址
	Start();
    SendData(0xa1);   //设置读
	temp = ReceiveData();//读取数据
	Stop();
	DelayMs(2000);
	return temp;    

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -