#include
#define uchar unsigned charsbit sda=P2^0;sbit scl=P2^1;//用单片机的两个I/O口模仿I2C接口uchar a;*void delay()//简略延时函数{ ;; }*void start() //开端信号 SCL在高电平期间,SDA一个下降沿则一共发动信号{ sda=1; //开释SDA总线delay();scl=1;delay();sda=0;delay();}*void stop() //中止 SCL在高电平期间,SDA一个上升沿则一共中止信号{sda=0;delay();scl=1;delay();sda=1;delay();}*void respons() //应对 SCL在高电平期间,SDA被从设备拉为低电平一共应对{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}*void init()//总线初始化 将总线都拉高一开释总线 发送发动信号前,要先初始化总线。即总有检测到总线闲暇才开端发送发动信号{sda=1;delay();scl=1;delay();}*void write_byte(uchar date) //写一个字节{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;//拉低SCL,由于只要在时钟信号为低电平期间按数据线上的凹凸电平状况才答应改变;并在此刻和上一个循环的scl=1一同构成一个上升沿delay();sda=CY;delay();scl=1;//拉高SCL,此刻SDA上的数据安稳delay();}scl=0;//拉低SCL,为下次数据传输做好预备delay();sda=1;//开释SDA总线,接下因由从设备操控,比如从设备接纳完数据后,在SCL为高时,拉低SDA作为应对信号delay();}*uchar read_byte()//读一个字节{uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据现已安稳,能够接纳啦delay(); k=(k<<1)|sda;scl=0;//拉低SCL,使发送端能够把数据放在SDA上delay(); }return k;}*void write_add(uchar address,uchar date)//恣意地址写一个字节{start();//发动write_byte(0xa0);//发送从设备地址respons();//等候从设备的呼应write_byte(address);//宣布芯片内地址respons();//等候从设备的呼应write_byte(date);//发送数据respons();//等候从设备的呼应stop();//中止}*uchar read_add(uchar address)//读取一个自己{uchar date;start();//发动write_byte(0xa0);//发送发送从设备地址 写操作respons();//等候从设备的呼应write_byte(address);//发送芯片内地址respons();//等候从设备的呼应start();//发动write_byte(0xa1);//发送发送从设备地址 读操作respons();//等候从设备的呼应date=read_byte();//获取数据stop();//中止return date;//回来数据}