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

📄 myiic24.h

📁 24cxx读写子程序
💻 H
字号:
//------------ 24c01 slave address  ----------//
//------------ 1 0 1 0 A2 A1 A0 R/W ----------//
//---------- page read or write 8 byte--------//
//------------ 24c02 slave address  ----------//
//------------ 1 0 1 0 A2 A1 A0 R/W ----------//
//---------- page read or write 8 byte--------//
//------------ 24c04 slave address  ----------//
//------------ 1 0 1 0 A2 A1 P0 R/W ----------//
//--------- page read or write 16 byte--------//
//------------ 24c08 slave address  ----------//
//------------ 1 0 1 0 A2 P1 P0 R/W ----------//
//--------- page read or write 16 byte--------//
//------------ 24c16 slave address  ----------//
//------------ 1 0 1 0 P2 P1 P0 R/W ----------//
//--------- page read or write 16 byte--------//
//***** 以上读写方式同 c16 , P 为页地址 ******//
//------------ 24c32 slave address  ----------//
//------------ 1 0 1 0 A2 A1 A0 R/W ----------//
//--------- page read or write 32 byte--------//
//------------ 24c64 slave address  ----------//
//------------ 1 0 1 0 A2 A1 A0 R/W ----------//
//--------- page read or write 32 byte--------//
//------------ 24c128 slave address ----------//
//------------ 1 0 1 0 0 A1 A0 R/W  ----------//
//--------- page read or write 64 byte--------//
//------------ 24c256 slave address ----------//
//------------ 1 0 1 0 0 A1 A0 R/W  ----------//
//--------- page read or write 64 byte--------//
//------------ 24c512 slave address ----------//
//------------ 1 0 1 0 0 A1 A0 R/W  ----------//
//--------- page read or write 128 byte-------//
//* 以上读写方式同 c64 , SUB1_ADDR 为页地址 **//
#include<reg52.h>
#include<intrins.h>
#define TRUE 1
#define FALSE 0
#define PAGE_SIZE 8
#define SLAVE_WRITE 0xa0
#define SLAVE_READ 0xa1
#define SUBJECT_ADDR 0x00

sbit	SCL=P1^7;
sbit	SDA=P1^6;

unsigned char  READ_RAM[PAGE_SIZE];

void delaySend();
void delayWrite();
void iicStart();
void iicStop();
void iicAck();
void iicNack();
bit iicSend(unsigned char send_value); 
unsigned char iicReceive();
void bWriteSingle(unsigned char device_write,sub_addr,write_value);
unsigned char bReadSingle(unsigned char device_write,sub_addr);
void pWriteSingle(unsigned char device_write,sub_addr);
void pReadSingle(unsigned char device_write,sub_addr);
void bWriteDouble(unsigned char device_write,sub1_addr,sub2_addr,write_value);
unsigned char bReadDouble(unsigned char device_write,sub1_addr,sub2_addr);
void pWriteDouble(unsigned char device_write,sub1_addr,sub2_addr);
void pReadDouble(unsigned char device_write,sub1_addr,sub2_addr);

/*----------5ms-delay-----------*/
void delayWrite()	//time=[(((y*3)+2+3)*d)+2]+2(调用时间)+2(返回时间)
{
	unsigned char d,y;
	for(d=0;d<100;d++)
	{ for(y=0;y<15;y++);}
}
void delaySend()
{
	_nop_();	_nop_();
}
/*---iic总线起始位----------*/
void iicStart()
{
	SDA=TRUE;
	delaySend();
	SCL=TRUE;
	delaySend();
	SDA=FALSE;
	delaySend();
	SCL=FALSE;
	delaySend();
	SDA=TRUE;
}
/*---iic总线停止位----------*/
void iicStop()
{
	SDA=FALSE;
	delaySend();
	SCL=TRUE;
	delaySend();
	SDA=TRUE;
}
//--------向IIC总线发送一应答信号---------//
void iicAck()
{
	SDA=FALSE;
	delaySend();
	SCL=TRUE;
	delaySend();
	SCL=FALSE;
	delaySend();
	SDA=TRUE;
}
//--------向IIC总线发送一非应答信号---------//
void iicNack()
{
	SDA=TRUE;
	delaySend();
	SCL=TRUE;
	delaySend();
	SCL=FALSE;
	delaySend();
}
//---------  单片机向 AT24Cxx 发送数据 返回一个应答信号----------//
bit iicSend(unsigned char send_value) 
{   
	bit bt_report;
	unsigned char count;
	unsigned char bdata bt_value; 
	bt_value=send_value;
	for(count=0;count<8;count++)
 	{ 
		SDA=bt_value & 0x80;	//串行发送数据,高位在前
		bt_value <<= 1;
		delaySend();
		SCL=TRUE;
		delaySend();
		SCL=FALSE;
		delaySend();
	}
	SDA=TRUE;
	delaySend();
	SCL=TRUE;           		//产生第九个时钟信号,
	delaySend();		//用于接收 AT24C02 发出的应答信号
	bt_report=SDA;
	delaySend();
	SCL=FALSE;
	delaySend();
	return(~bt_report);	
}
//----从IIC上接收8位数据,并将其作为一字节返回,不回送应答信号-----//
unsigned char iicReceive()
{
	bit bt_buff;
	unsigned char bdata by_report;
	unsigned char count;
	by_report=0;
	for(count=0;count<8;count++)
	{
		by_report <<= 1;
		SCL=TRUE;
		delaySend();
		bt_buff=SDA;
		delaySend();
		SCL=FALSE;
		delaySend();
		if(bt_buff)
			by_report++;
	}
	return(by_report);
}
//---------写字节数据到 24cxx (byte write)------------//
void bWriteSingle(unsigned char device_write,sub_addr,write_value)
{
	iicStart();
	iicSend(device_write);
	iicSend(sub_addr);
	iicSend(write_value);
	iicStop();
	delayWrite();
}
//-----------读字节数据从 24cxx (byte read) 并返回一字节数据------------//
unsigned char bReadSingle(unsigned char device_write,sub_addr)
{
	unsigned char by_report;
	iicStart();
	iicSend(device_write);
	iicSend(sub_addr);
	iicStart();
	iicSend(device_write+1);
	by_report=iicReceive();
	iicNack();
	iicStop();
	return(by_report);
}
//---------写字节数据到 24cxx (page write)------------//
void pWriteSingle(unsigned char device_write,sub_addr)
{
	unsigned char count;
	iicStart();
	iicSend(device_write);
	iicSend(sub_addr);
	for(count=0;count<PAGE_SIZE;count++)
	{
		iicSend(READ_RAM[count]);
	}
	iicStop();
	delayWrite();
}
//-----------读字节数据从 24cxx (page read)--------------//
void pReadSingle(unsigned char device_write,sub_addr)
{
	unsigned char count;
	iicStart();
	iicSend(device_write);
	iicSend(sub_addr);
	iicStart();
	iicSend(device_write+1);
	for(count=0;count<PAGE_SIZE;count++)
	{
		READ_RAM[count]=iicReceive();
		if(count==PAGE_SIZE-1)
			{	iicNack();	}
		else
			{	iicAck();	}
	}
	iicStop();
}	
//---------写字节数据到 24cxx (byte write)------------//
void bWriteDouble(unsigned char device_write,sub1_addr,sub2_addr,write_value)
{
	iicStart();
	iicSend(device_write);
	iicSend(sub1_addr);
	iicSend(sub2_addr);
	iicSend(write_value);
	iicStop();
	delayWrite();
}
//-----------读字节数据从 24cxx (byte read) 并返回一字节数据------------//
unsigned char bReadDouble(unsigned char device_write,sub1_addr,sub2_addr)
{
	unsigned char by_report;
	iicStart();
	iicSend(device_write);
	iicSend(sub1_addr);
	iicSend(sub2_addr);
	iicStart();
	iicSend(device_write+1);
	by_report=iicReceive();
	iicNack();
	iicStop();
	return(by_report);
}
//---------写字节数据到 24cxx (page write)------------//
void pWriteDouble(unsigned char device_write,sub1_addr,sub2_addr)
{
	unsigned char count;
	iicStart();
	iicSend(device_write);
	iicSend(sub1_addr);
	iicSend(sub2_addr);
	for(count=0;count<PAGE_SIZE;count++)
	{
		iicSend(READ_RAM[count]);
	}
	iicStop();
	delayWrite();
}
//-----------读字节数据从 24cxx (page read)--------------//
void pReadDouble(unsigned char device_write,sub1_addr,sub2_addr)
{
	unsigned char count;
	iicStart();
	iicSend(device_write);
	iicSend(sub1_addr);
	iicSend(sub2_addr);
	iicStart();
	iicSend(device_write+1);
	for(count=0;count<PAGE_SIZE;count++)
	{
		READ_RAM[count]=iicReceive();
		if(count==PAGE_SIZE-1)
			{	iicNack();	}
		else
			{	iicAck();	}
	}
	iicStop();
}	

⌨️ 快捷键说明

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