C51进行I²C通信

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kencaber/article/details/77917488

I²C(Inter IC Bus)是由 Philips 推出的数据总线协议。

#include <reg52.h>
void display(unsigned int n)
{
	unsigned char i;
	char table[]={
		0x3f,0x06,0x5b,0x4f,
		0x66,0x6d,0x7d,0x07,
		0x7f,0x6f,0x77,0x7c,
		0x39,0x5e,0x79,0x71
	};
	P2 = 0 << 2;
	P0 = table[n%10];
	for (i=0;i<25;i++);
	P0 = 0;
	P2 = 1 << 2;
	P0 = table[n/10%10];
	for (i=0;i<25;i++);
	P0 = 0;
	P2 = 2 << 2;
	P0 = table[n/100%10];
	for (i=0;i<25;i++);
	P0 = 0;
	P2 = 3 << 2;
	P0 = table[n/1000%10];
	for (i=0;i<25;i++);
	P0 = 0;
}

// IIC bus
sbit SCL=P2^1;
sbit SDA=P2^0;

// 4 keys
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;

void delay(unsigned int i)
{
	while(i--);
}

void I2cStart()
{
	SDA = 1;
	delay(5);
	SCL = 1;
	delay(5);
	SDA = 0;
	delay(5);
}

void I2cStop()
{
	SDA = 0;
	delay(5);
	SCL = 1;
	delay(5);
	SDA = 1;
}

void I2cSendByte(unsigned char n)
{
	signed char i;
	for (i=7;i>=0;i--)
	{
		SCL = 0;
		delay(5);
		SDA = 0x01 & (n>>i);
		delay(5);
		SCL = 1;
		delay(5);
	}
	SCL = 0;
	delay(5);
	SDA = 1;
	delay(5);
	SCL = 1;
	delay(5);
	while((SDA==1)&&(i++<255));
	SCL = 0;
	delay(5);
}

unsigned char I2cReadByte()
{
	unsigned char i,k;
	SCL = 0;
	delay(5);
	SDA = 1;
	delay(5);
	for (i = 0; i < 8; ++i)
	{
		SCL = 1;
		delay(5);
		k <<= 1;
		k	|= SDA;
		SCL = 0;
		delay(5);
	}
	delay(5);
	return k;
}

int main()
{
	unsigned char num=0;
	while (1)
	{
		if(k1==0)
		{
			delay(1000);
			if(k1==0)
			{
				I2cStart();
				I2cSendByte(0xa0);	// set chip
				I2cSendByte(1);		// set address 1
				I2cSendByte(num);	// set value
				I2cStop();
			}
			while(!k1);
		} else if(k2==0) {
			delay(1000);
			if(k2==0)
			{
				I2cStart();
				I2cSendByte(0xa0);	// set chip 0xa0
				I2cSendByte(1);		// set address 1
				
				I2cStart();
				I2cSendByte(0xa1);	// set chip 0xa1
				num=I2cReadByte();	// read byte
				I2cStop();
			}
			while(!k2);
		} else if(k3==0) {
			delay(1000);
			if(k3==0)
				num++;	// add 1
			while(!k3);
		} else if(k4==0) {
			delay(1000);
			if(k4==0)
				num=0;	// set 0
			while(!k4);
		}
		display(num);
	}
	return 0;
}

aaa

猜你喜欢

转载自blog.csdn.net/kencaber/article/details/77917488
C51