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

📄 tsem0108llib.c

📁 實現利用8051單片機透過軟體I2C驅動TSEM0108L感測器之程式庫
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <io.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOLEAN;

#define FALSE 0;
#define TRUE 1;

//	Configure Slave Address to 160d 
#define I2C_DATA_R 0xA1
#define I2C_DATA_W 0xA0

sbit TSEM_SCL     = P2^0;    
sbit TSEM_SDA     = P2^1;     

/*
	Pulls SCL High, returns a  1 if successful else 0
*/
bit TSEM_I2CSCLHigh()
{
	BYTE cnt;

	TSEM_SCL = 1;
	for(cnt = 8;cnt > 0;cnt--)
		if(TSEM_SCL) return 1;
	return 0;
}

bit TSEM_I2CStart()
{
	TSEM_SDA = 0;
	_nop_();
	_nop_();
	TSEM_SCL = 0;
	return 1;
}

bit TSEM_I2CStop()
{
	TSEM_SCL = 1;
	_nop_();
	_nop_();
	TSEM_SDA = 1;
	return 1;
}


/*
	Returns a 1 if byte is successfully sent with Ack, else
	return zero, if either SCL is not clockable or no ack from
	I2C Device
*/
bit TSEM_I2CSend(BYTE SendData)
{
	BYTE mask;

	/*
		Strobe first 8 bit of data with
		MSB first to I2C bus
	*/
	mask = 0x80;
	do
	{
		TSEM_SDA = ((SendData & mask) != 0);
		mask = mask >> 1;
		if(TSEM_I2CSCLHigh() == 0) return 0;
		TSEM_SCL = 0;
	}while(mask);

	/*
		Check for number 9 acknowledgement bit 
		from I2C Device
	*/
	TSEM_SDA =1 ;
	_nop_();
	_nop_();
	if(TSEM_I2CSCLHigh() == 0) return 0;
	if(TSEM_SDA == 0)
	{
		//	Device has acknowledged
		_nop_();
		TSEM_SCL = 0;
		return 1;
	};
	return 0;
}

bit TSEM_I2CReceive(BYTE *pReceiveData,bit Ack)
{
	BYTE i,mask;
	TSEM_SDA = 1;
	mask = 0x80;
	i = 0;
	_nop_();
	do
	{
		if(TSEM_I2CSCLHigh() == 0) return 0;
		_nop_();
		if(TSEM_SDA) i = i | mask;
		TSEM_SCL = 0 ;
		_nop_();
		mask = mask >> 1;
	}while(mask);

	if(Ack)
		TSEM_SDA = 1;
	else
		TSEM_SDA = 0;
	if(TSEM_I2CSCLHigh() == 0) return 0;
	_nop_();
	*pReceiveData = i;
	TSEM_SCL = 0;
	return 1;
}

void Wr_command(BYTE cCommand)
{
	TSEM_I2CStart(); //Single Master, ignores bus contention
	if (TSEM_I2CSend(I2C_COMMAND_W))
	{
		TSEM_I2cSend(cCommand);
		TSEM_I2cStop();
	}
	else
	{
		TSEM_SCL = 1;
		TSEM_SDA = 1;
	}
}

void Rd_Ndata(BYTE *POINTER,BYTE N)
{
	BYTE count;
	bit ReceiveAck ;

	TSEM_I2CStart(); //Single Master, ignores bus contention
	if (TSEM_I2CSend(I2C_DATA_R))
	{
		for(count = 0;count < N;count++)
		{
			ReceiveAck = (count == (N - 1));
			TSEM_I2CReceive(POINTER + count, ReceiveAck);
		}
	}
	TSEM_I2CStop();
}

/*
	Read ambient temperature and object temperature pixel 1 - 8
*/
BOOLEAN Read_Temperatures(WORD* uiAmbTemp,WORD uiObjTemp[]) 
{
	#define swap(ptr1,ptr2,idx1,idx2) (*((ptr1) + (idx1)) = (ptr2[idx2]);	\ 
										*((ptr1) + (idx2)) = (ptr2[idx1]);)
	
	BYTE cCommand; 
	BYTE cReceivedByte[18];
	BYTE* pByte;

	cCommand = 7;       // Command: Read temperatures (7) 

	/* 
		Write command to I2C-Slave 
		cCommand: Command to read I2C-Slave-EEPROM (7) 
	*/
	Wr_command(cCommand); 

	/*
		Receive ambient temperature and object temperature from I2C-Slave
	*/ 
	Rd_Ndata(cReceivedByte, 18);

	pByte = (BYTE *)uiAmbTemp;
	swap(pByte, cReceivedByte, 0, 1);

	pByte = (BYTE *)uiObjTemp;
	swap(pByte, cReceivedByte, 2, 3);
	swap(pByte, cReceivedByte, 4, 5);
	swap(pByte, cReceivedByte, 6, 7);
	swap(pByte, cReceivedByte, 8, 9);
	swap(pByte, cReceivedByte, 10, 11);
	swap(pByte, cReceivedByte, 12, 13);
	swap(pByte, cReceivedByte, 14, 15);
	swap(pByte, cReceivedByte, 16, 17);

	// Return from function 
	return TRUE; 
} 

⌨️ 快捷键说明

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