51单片机软件实现iic总线的工作时序所用EEPROM芯片AT24C02,实现向AT24C02中写入数据,然后将其中数据读出赋予P0口,实现流水灯的按数据亮灭,PS:附MCU图,AT24C02图于最后。嘤其鸣矣,求其友声如若不弃,加我QQ:2447104957,高山流水,共同学习!#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitsda=P2^0;sbitscl=P2^1;//mcu原理图voiddelay(){;;}//微秒延时voidinit()//初始化,释放总线各线至高电平,SCL=0时,SDA可以改变{scl=0;delay();//微秒延时sda=1;delay();scl=1;delay();}voidstart()//起始信号{scl=0;delay();sda=1;delay();scl=1;delay();sda=0;delay();sda=1;//释放数据总线}voidwrite_byte(uchardate)//字节写{uchari,temp;temp=date;//由高位一位一位的写入for(i=0;i8;i++){temp=temp1;//左移溢出到PSW寄存器CY位scl=0;//允许sda进行的变化delay();sda=CY;//进行一位一位的送入数据总线delay();scl=1;//符合读走数据总线上数据的要求delay();//稳定一段时间}scl=0;//允许sda变化,以便于接受应答信号delay();sda=1;//释放数据总线,准备接收应答信号delay();}voidresponse()//应答,可以看书page181,由接收设备发出的第九位数据,要经由sda传输给发送设备{uchari;scl=1;delay();while((sda==1)&&(i250)){i++;//等待应答有一定的时间限制,sda被拉低表示有应答,由硬件控制}scl=0;delay();}voidstop()//停止信号,scl=1,sda形成一个正跳变{scl=0;//允许sda变化delay();sda=0;//准备形成正跳变delay();scl=1;//信号有效前提1delay();sda=1;//形成正跳变delay();//信号有效前提1}voiddelay1(uintz)//毫秒级延时{uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}ucharread_byte()//带有返回值,将所读到的数据作为返回值{uchari,d;//d=0x00;//清空存储变量的空间for(i=0;i8;i++){scl=0;//允许变化,即允许传送数据,sda是serialdualdatebusdelay();scl=1;//允许读走数据delay();d=(d1)|sda;//将sda上数据放入存储变量d,也是8位ucharscl=0;delay();}returnd;/*scl=0;delay();sda=1;//释放数据总线,准备接受应答,被拉低delay();*/}voidmain(){init();//初始化//例子先写入EEPROM器件AT24C16数据,然后进行读取赋予流水灯是对应数据亮灭start();//起始信号write_byte(0xa0);/*写入EEPROM器件地址,写入分为数据,地址数据,地址又分为器件地址和内部存储地址,例如某班级某学生座位*/response();//等待应答write_byte(0x03);//内部存储地址response();write_byte(0x55);//写入真正意义上的数据response();//等待应答stop();//停止读取数据信号delay1(500);//毫秒延时//第一部分结束,写入EEPROM器件AT24C16数据start();write_byte(0xa0);//申明所读器件地址response();write_byte(0x03);//申明该器件中所要求读数据的位置response();start();write_byte(0xa1);response();P0=read_byte();//进行读数据操作后,非应答,budaixingcan,而是将返回值直接赋予变量stop();//第二部分内容;读即操作理解为,主机对器件写;告诉从机我要对你进行读操作,所以先写,后读while(1);//将程序终止于此}