原创 24C256/51单片机

2007-8-11 17:28 4198 7 8 分类: MCU/ 嵌入式

#include "<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />24c02.h" sbit SDA="P1"^3;                            //I2C总线数据


sbit SCL="P1"^2;                            //I2C总线时钟


void delay(void)      //延时子程序


{


 unsigned char i;


 for(i=0;i<1;i++);


}



//**************************************   将一个字节保存到EEROM   *****************************************


unsigned char Write_a_EEPROM_data(unsigned char device_addr,unsigned char data_addr,unsigned char w_data)


{


 unsigned char i,Device_Addr;


 //if(NO_2401)return 0xFF;


 delay();


 SDA=0;                          //产生一个起始位    


 delay();


 Device_Addr=device_addr;        //EEROM的地址暂存


 for(i=0;i<7;i++)                //输出设备地址


  {


   SCL=0;


   delay();


   SDA=device_addr&0x80;         //SDA上输出一位数据,高位在前


   device_addr<<=1;


   delay();


   SCL=1;


   delay();


  }


 SCL=0;


 delay();


 SDA=0;                          //SDA上输出0,表示写操作


 delay();


 SCL=1;


 delay();


 SCL=0;


 delay();


 SDA=1;                          //释放SDA线


 delay();


 SCL=1;


 delay();


 if(SDA){return 1;}               //如果设备未响应,则返回出错代码1


 for(i=0;i<8;i++)                //输出数据地址


  {


   SCL=0;


   delay();


   SDA=data_addr&0x80;           //SDA上输出一位数据,高位在前


   data_addr<<=1;      


   delay();


   SCL=1;


   delay();


   delay();


  } 


 SCL=0;


 delay();


 SDA=1;                          //释放SDA线


 delay();


 SCL=1;


 delay();


 if(SDA){return 2;}             //如果设备未响应,则返回出错代码2


 for(i=0;i<8;i++)                //输出要写入的数据


  {


   SCL=0;


   delay();


   SDA=w_data&0x80;               //SDA上输出一位数据,高位在前


   w_data<<=1;


   delay();


   SCL=1;


   delay();


  } 


 SCL=0;


 delay();


 SDA=1;                          //释放SDA线


 delay();


 SCL=1;


 delay();


 if(SDA){return 3;}               //如果设备未响应,则返回出错代码3


 SCL=0;


 delay();


 SDA=0;


 delay();


 SCL=1;


 delay();


 SDA=1;                         //产生一个停止位,停止操作


 for(i=0;i<250;i++)             //等待数据写入


  {


   delay();


  }


 for(i=0;i<250;i++)delay();


 return 0;                     //正确写入,返回0


}


//****************************************************************************************



//*********************************   EEROM中读取一个字节   *****************************


unsigned int Read_a_EEPROM_data(unsigned char device_addr,unsigned char data_addr)


{


 unsigned char i,r_data,Device_Addr;


 SDA=0;                          //产生一个起始位    


 delay();


 Device_Addr=device_addr;        //EEROM的地址暂存


 for(i=0;i<7;i++)                //输出设备地址


  {


   SCL=0;


   delay();


   SDA=device_addr&0x80;         //SDA上输出一位数据,高位在前


   device_addr<<=1;


   delay();


   SCL=1;


   delay();


  }


 SCL=0;


 delay();


 SDA=0;                    //SDA上输出0,表示写操作


 delay();


 SCL=1;


 delay();


 SCL=0;


 delay();


 SDA=1;                    //释放SDA线


 delay();


 SCL=1;


 delay();


 if(SDA) return 0x0100;   //如果设备未响应,则返回出错代码0x0100


 for(i=0;i<8;i++)         //输出数据地址


  {


   SCL=0;


   delay();


   SDA=data_addr&0x80;    //SDA上输出一位数据,高位在前


   data_addr<<=1;      


   delay();


   SCL=1;


   delay();


   delay();


  } 


 SCL=0;


 delay();


 SDA=1;                     //释放SDA线


 delay();


 SCL=1;


 delay();


 if(SDA) return 0x0200;     //如果设备未响应,则返回出错代码0x0200


 SCL=0;


 delay();


 SDA=1;


 delay();


 SCL=1;


 delay();


 SDA=0;                      //产生一个重启动位


 delay();


 device_addr=Device_Addr;    //EEROM的地址


 for(i=0;i<7;i++)            //输出设备地址,一个7位的地址


  {


   SCL=0;


   delay();


   SDA=device_addr&0x80;     //SDA上输出一位数据,高位在前


   device_addr<<=1;


   delay();


   SCL=1;


   delay();


  }


 SCL=0;


 delay();


 SDA=1;                     //SDA上输出1,表示读操作


 delay();


 SCL=1;


 delay();


 SCL=0;


 delay();


 SDA=1;                     //释放SDA线


 delay();


 SCL=1;


 delay();


 if(SDA) return 0x0300;    //如果设备未响应,则返回出错代码0x0300


 for(i=0;i<8;i++)          //EEROM中读出数据


  {


   SCL=0;


   delay();


   r_data<<=1;


   delay();


   SCL=1;


   if(SDA)r_data=r_data|0x01;   //保存一位数据


   delay();


  } 


 SCL=0;


 delay();


 SDA=1;                        //SDA高电平,表示停止读出


 delay();


 SCL=1;


 delay();


 SCL=0;


 delay();


 SDA=0;


 delay();


 SCL=1;


 delay();


 SDA=1;                         //产生一个停止位,停止读操作


 return r_data;                 //返回数据


}


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户98155 2007-9-21 11:46

xiexie
相关推荐阅读
用户1431092 2008-05-13 23:30
USB转串口(CH340)原理图及PCB
(CH340)原理图及PCBCH340,CH341,CH375中文资料有兴趣的下啊!共同分享!...
用户1431092 2008-05-12 12:51
C++ 串行通信控件
(串行通信控件代码)在C++ builder中做一个串行通信控件,实现与单片机的串行通信,希望对你有用,共同分享下。附在C++ builder中生成exe文件并释放后可在没安装C++ builder的...
用户1431092 2008-05-12 12:40
超声波测距电路及测试程序
超声波测距程序超声波测距电路...
用户1431092 2008-04-10 23:53
红外脉搏测量电路(附输出波形图)
 自己调试过的一个红外脉搏测量电路,红外型号是TIR2001对管 共同分享下...
用户1431092 2008-03-22 16:18
一些电子基础知识
学过了,温习下...
用户1431092 2008-03-22 16:14
C与汇编混合编程
C51与汇编混合编程详解 来源:全民业务网 作者:不详C51和汇编混合编程(1)-C语言中嵌入汇编 1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM; Assemble...
我要评论
1
7
关闭 站长推荐上一条 /3 下一条