24c02.c

来自「用于设备工作时间监控的下位机源码」· C语言 代码 · 共 236 行

C
236
字号

#include <reg51.h>

sbit	DataClk			= P1^0;
sbit	DataBit			= P1^1;

extern unsigned short AT24C02DelayTime;
unsigned short TempAT24C02DelayTime;

void RxWrite24C02StartBit()
{
	DataClk = 0;
	DataBit = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);
	
	DataBit = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);
}

void RxWrite24C02StopBit()
{
	DataClk = 0;
	DataBit = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataBit = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataBit = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);
}

void RxWrite24C02BitOne()
{
	DataClk = 0;
	DataBit = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataBit = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);
}

void RxWrite24C02BitZero()
{
	DataClk = 0;
	DataBit = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataBit = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);
}

unsigned char RxRead24C02OneBit()
{
	DataClk = 0;
	DataBit = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	if (DataBit == 0){
		DataClk = 0;
		TempAT24C02DelayTime=AT24C02DelayTime;
		while(TempAT24C02DelayTime==AT24C02DelayTime);

		DataBit = 0;
		TempAT24C02DelayTime=AT24C02DelayTime;
		while(TempAT24C02DelayTime==AT24C02DelayTime);
		return 0;
	}
	else{
		DataClk = 0;
		TempAT24C02DelayTime=AT24C02DelayTime;
		while(TempAT24C02DelayTime==AT24C02DelayTime);

		DataBit = 0;
		TempAT24C02DelayTime=AT24C02DelayTime;
		while(TempAT24C02DelayTime==AT24C02DelayTime);
		return 1;
	}
}

void RxRead24C02Ack()
{
	DataClk = 0;
	DataBit = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 1;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataClk = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);

	DataBit = 0;
	TempAT24C02DelayTime=AT24C02DelayTime;
	while(TempAT24C02DelayTime==AT24C02DelayTime);
}

unsigned char RxRead24C02OneByte(unsigned char Address)
{
	unsigned char	usLoop, TempChar;

	// Write Start 1010 000 0/Write
	RxWrite24C02StartBit();
	RxWrite24C02BitOne();
	RxWrite24C02BitZero();
	RxWrite24C02BitOne();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxRead24C02Ack();

	// Write Data Address
	for (usLoop=0; usLoop<8; usLoop++){
		if (((Address << usLoop) & (0x80)) == 0x00)
			RxWrite24C02BitZero();
		else
			RxWrite24C02BitOne();
	}
	RxRead24C02Ack();

	// Write Start 1010 000 1/Read
	RxWrite24C02StartBit();
	RxWrite24C02BitOne();
	RxWrite24C02BitZero();
	RxWrite24C02BitOne();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitOne();
	RxRead24C02Ack();

	TempChar = 0;
	for (usLoop=0; usLoop<8; usLoop++){
		TempChar = TempChar << 1;
		if (RxRead24C02OneBit()!=0)
			TempChar = TempChar | 1;
	}
	RxWrite24C02StopBit();
	return TempChar;
}


void RxWrite24C02OneByte(unsigned char TempAddress, unsigned char TempData)
{
	unsigned char	usLoop;

	// Write Start 1010 000 0/Write
	RxWrite24C02StartBit();
	RxWrite24C02BitOne();
	RxWrite24C02BitZero();
	RxWrite24C02BitOne();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxWrite24C02BitZero();
	RxRead24C02Ack();

	// Write Data Address
	for (usLoop=0; usLoop<8; usLoop++){
		if (((TempAddress << usLoop) & (0x80)) == 0x00)
			RxWrite24C02BitZero();
		else
			RxWrite24C02BitOne();
	}
	RxRead24C02Ack();

	// Write Data
	for (usLoop=0; usLoop<8; usLoop++){
		if (((TempData << usLoop) & (0x80)) == 0x00)
			RxWrite24C02BitZero();
		else
			RxWrite24C02BitOne();
	}
	RxRead24C02Ack();
	RxWrite24C02StopBit();

	//wait 12 ms
	TempAT24C02DelayTime=AT24C02DelayTime;
	TempAT24C02DelayTime=TempAT24C02DelayTime+12;
	while(TempAT24C02DelayTime!=AT24C02DelayTime);
}

⌨️ 快捷键说明

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