[电工&电子] 普中科技51单片机读写24c02,IIC协议使用

[复制链接]
查看208 | 回复0 | 2024-7-20 16:17:33 | 显示全部楼层 |阅读模式
>

1、24c02电路

2、开始于结束函数

//*****************stop********************void iic_stop(){  scl=0;  sda=0;  delay4us();  scl=1;  delay4us();  sda=1;  delay(10);  }//*****************start*******************void iic_start(){  scl=1;  delay4us();  sda=1;  delay4us();  sda=0;  delay4us();  scl=0;  delay4us();}

3、延时与显示函数

//****************显示函数*******************void display(uchar shu,uchar wei){  P2=(P2&0xe3)|(wei<<2);  P0=tab[shu];  delay(2);  P0=0x00;}//****************延时函数********************void delay(uint ms){  uint i,j;  for(i=ms;i>0;i--)    for(j=123;j>0;j--);}

4、从器件应答

//********ack 从器件应答,也可以作为主控器非应答********bit iic_ack(){  bit ack;  scl=0;  delay4us();  sda=1;  delay4us();  scl=1;  delay4us();  ack=sda;  scl=0;  delay4us();  return ack; }

5、主控器件应答

//*****************m_ack 控制器应答******************void iic_mack(){  scl=0;  delay4us();  sda=1;  delay4us();  sda=0;  delay4us();  scl=1;  delay4us();  scl=0;  delay4us();  sda=1;//释放总线}

6、读写一个字节

//*************读一个byte********************uchar read_byte(){  uchar t,temp=0;  for(t=0;t<8;t++)  {       scl=1;    delay4us();    temp<<=1;//提前移位,因为放8位数据,移动7次     if(sda==1)      temp|=1;       delay4us();    scl=0;    delay4us();  }  return temp;}//************写一个byte*********************void write_byte(uchar temp){  uchar t;  for(t=0;t<8;t++)  {    if(temp&0x80)      sda=1;    else sda=0;    scl=1;    delay4us();    scl=0;    temp<<=1;    delay4us();  }}

7、写一个字节到地址add,写多个字节到add

//*************写n个数据到iic**************void iic_write_mbyte(uchar add,uchar *pdat,uchar n){  uchar t;  iic_start();  write_byte(0xa0);  iic_ack();  write_byte(add);  iic_ack();  for(t=0;t<n;t++)  {    write_byte(pdat[t]);    iic_ack();    }  iic_stop();}//*************写单个数据到iic***************void iic_write_byte(uchar add,uchar dat){  iic_start();  write_byte(0xa0);  iic_ack();  write_byte(add);  iic_ack();  write_byte(dat);  iic_ack();  iic_stop();}

8、直接读一个字节

//*************直接读iic***************uchar iic_read_byte(){  uchar temp;  iic_start();  write_byte(0xa1);  iic_ack();  temp=read_byte();  iic_ack();  iic_stop();  return temp;}

9、直接读多个字节

//*************直接顺序读n字节***************void iic_read_mbyte(uchar* pdat,uchar n){  uchar t;  iic_start();  write_byte(0xa1);  iic_ack();  for(t=0;t<n;t++)  {    pdat[t]=read_byte();    if(t<n-1)      iic_mack();    else iic_ack();  }  iic_stop();}

10、随机读一个字节

//*************随机读***************uchar iic_readom_read_byte(uchar add){  uchar temp;  iic_start();  write_byte(0xa0);  iic_ack();  write_byte(add);  iic_ack();  iic_start();  write_byte(0xa1);  iic_ack();  temp=read_byte();  iic_ack();  iic_stop();  return temp;}

11、随机读n个字节

//*************随机顺序读n字节***************void iic_readom_read_mbyte(uchar add,uchar* pdat,uchar n){  uchar t;  iic_start();  write_byte(0xa0);  iic_ack();  write_byte(add);  iic_ack();  iic_start();  write_byte(0xa1);  iic_ack();  for(t=0;t<n;t++)  {    pdat[t]=read_byte();    if(t<(n-1))      iic_mack();      else iic_ack();  //最后一次非应答  }  iic_stop();    }

12、完整程序

//司新生00//2024.6.17#include <REGX51.H>#include <intrins.h>#define uchar unsigned char#define uint  unsigned intuchar tab[]={0x3f,0x06,0x5b,0x4f,       0x66,0x6d,0x7d,0x07,       0x7f,0x6f,0x77,0x7c,       0x39,0x5e,0x79,0x71,0x40};//显示0~9 A-F的值#define delay4us()  _nop_();_nop_();_nop_();_nop_()void delay(uint ms);void display(uchar shu,uchar wei);void iic_start();void iic_stop();bit iic_ack();void iic_mack();void write_byte(uchar temp);uchar read_byte();void iic_write_byte(uchar add,uchar dat);uchar iic_read_byte();uchar iic_readom_read_byte(uchar add);void iic_write_mbyte(uchar add,uchar *pdat,uchar n);void iic_readom_read_mbyte(uchar add,uchar* pdat,uchar n);void iic_read_mbyte(uchar* pdat,uchar n);sbit scl=P2^1;sbit sda=P2^0;void main(){    uchar a,b;  uchar c[8],d[8];  iic_write_mbyte(0,tab,8);//从0地址开始写8个字节  iic_write_byte(0,0x75);//在0地址写一个字节  b=iic_readom_read_byte(0);//读0地址的数据  a=iic_read_byte();//直接读数据,地址是上一次读写数据的下一个地址1  iic_read_mbyte(d,8);//直接读8个数据,开始地址是上一次读写的下一个地址2  iic_readom_read_mbyte(0,c,8);//从0地址开始读8个数据    while(1)  {        display(a/16,7);    display(a%16,6);    display(c[7]/16,3);    display(c[7]%16,2);    display(b/16,5);    display(b%16,4);    display(d[7]/16,1);    display(d[7]%16,0);  }}//*************直接顺序读n字节***************void iic_read_mbyte(uchar* pdat,uchar n){  uchar t;  iic_start();  write_byte(0xa1);  iic_ack();  for(t=0;t<n;t++)  {    pdat[t]=read_byte();    if(t<n-1)      iic_mack();    else iic_ack();  }  iic_stop();}//*************随机顺序读n字节***************void iic_readom_read_mbyte(uchar add,uchar* pdat,uchar n){  uchar t;  iic_start();  write_byte(0xa0);  iic_ack();  write_byte(add);  iic_ack();  iic_start();  write_byte(0xa1);  iic_ack();  for(t=0;t<n;t++)  {    pdat[t]=read_byte();    if(t<(n-1))      iic_mack();      else iic_ack();  //最后一次非应答  }  iic_stop();    }//*************随机读***************uchar iic_readom_read_byte(uchar add){  uchar temp;  iic_start();  write_byte(0xa0);  iic_ack();  write_byte(add);  iic_ack();  iic_start();  write_byte(0xa1);  iic_ack();  temp=read_byte();  iic_ack();  iic_stop();  return temp;}//*************直接读iic***************uchar iic_read_byte(){  uchar temp;  iic_start();  write_byte(0xa1);  iic_ack();  temp=read_byte();  iic_ack();  iic_stop();  return temp;}//*************写n个数据到iic**************void iic_write_mbyte(uchar add,uchar *pdat,uchar n){  uchar t;  iic_start();  write_byte(0xa0);  iic_ack();  write_byte(add);  iic_ack();  for(t=0;t<n;t++)  {    write_byte(pdat[t]);    iic_ack();    }  iic_stop();}//*************写单个数据到iic***************void iic_write_byte(uchar add,uchar dat){  iic_start();  write_byte(0xa0);  iic_ack();  write_byte(add);  iic_ack();  write_byte(dat);  iic_ack();  iic_stop();}//*************读一个byte********************uchar read_byte(){  uchar t,temp=0;  for(t=0;t<8;t++)  {       scl=1;    delay4us();    temp<<=1;//提前移位,因为放8位数据,移动7次     if(sda==1)      temp|=1;       delay4us();    scl=0;    delay4us();  }  return temp;}//************写一个byte*********************void write_byte(uchar temp){  uchar t;  for(t=0;t<8;t++)  {    if(temp&0x80)      sda=1;    else sda=0;    scl=1;    delay4us();    scl=0;    temp<<=1;    delay4us();  }} //*****************m_ack 控制器应答******************void iic_mack(){  scl=0;  delay4us();  sda=1;  delay4us();  sda=0;  delay4us();  scl=1;  delay4us();  scl=0;  delay4us();  sda=1;//释放总线}//********ack 从器件应答,也可以作为主控器非应答********bit iic_ack(){  bit ack;  scl=0;  delay4us();  sda=1;  delay4us();  scl=1;  delay4us();  ack=sda;  scl=0;  delay4us();  return ack; }//*****************stop********************void iic_stop(){  scl=0;  sda=0;  delay4us();  scl=1;  delay4us();  sda=1;  delay(10);  }//*****************start*******************void iic_start(){  scl=1;  delay4us();  sda=1;  delay4us();  sda=0;  delay4us();  scl=0;  delay4us();}//****************显示函数*******************void display(uchar shu,uchar wei){  P2=(P2&0xe3)|(wei<<2);  P0=tab[shu];  delay(2);  P0=0x00;}//****************延时函数********************void delay(uint ms){  uint i,j;  for(i=ms;i>0;i--)    for(j=123;j>0;j--);}


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则