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

📄 i2c.c

📁 51单片机上模拟i2c传输的程序
💻 C
字号:
#include <head.h>


uchar i2c_read_byte(uchar byte_add)
{
	uchar i,a,u,v;
	v=0;

	scl=1;
	sda=1;
	delay(10);
	sda=0;//start i2c;
	delay(15);

	for(i=0;i<8;i++)//transmit the dev write add
	{
	scl=0;
	delay(5);
	sda=((0xa0>>(7-i)) & 0x01);
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);

	for(i=0;i<8;i++)//transmit the byte add
	{
	scl=0;
	delay(5);
	sda=((byte_add>>(7-i)) & 0x01);
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);

    scl=1;
	sda=1;
	delay(30);
	sda=0;//start i2c;
	delay(15);

	for(i=0;i<8;i++)//transmit the dev read add
	{
	scl=0;
	delay(5);
	sda=((0xa1>>(7-i)) & 0x01);
	delay(10);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);

	sda=1;//read the byte
	delay(10);
	for(i=0;i<8;i++)
	{
	scl=0;
	delay(10);/////maybe require to adjust the interval to let the dev clock out data
	u=sda;
	v+=u<<(7-i);	
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;
	delay(10);
	sda=0;
	delay(20);

	scl=1;//stop i2c
	delay(5);
	sda=1;

    

	return v;
}
















uchar i2c_write_byte(uchar byte_add,uchar byte_data)
{
	uchar i,a;
	
	scl=1;
	sda=1;
	delay(10);
	sda=0;//start i2c;
	delay(15);

	for(i=0;i<8;i++)//transmit the dev write add
	{
	scl=0;
	delay(5);
	sda=((0xa0>>(7-i)) & 0x01);
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);

	for(i=0;i<8;i++)//transmit the byte add
	{
	scl=0;
	delay(5);
	sda=((byte_add>>(7-i)) & 0x01);
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);



	for(i=0;i<8;i++)//transmit the byte_data
	{
	scl=0;
	delay(5);
	sda=((byte_data>>(7-i)) & 0x01);
	delay(10);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);


	delay(15);//stop the bus
	sda=0;
	delay(10);
	scl=1;
	delay(10);
	sda=1;
	delay(20);

	return 1;
}

⌨️ 快捷键说明

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