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

📄 text1.c

📁 i2clCD仿真.rari2clCD仿真 i2clCD仿真 i2clCD仿真
💻 C
字号:
#include<AT89X52.h>
#include<intrins.h>

#define DELAY_TIME 4
#define uchar unsigned char
#define FALSE 0
#define TRUE 1

sbit SCL=P2^6;
sbit SDA=P2^7;
sbit LED1=P0^0;


void DELAY(unsigned int t)
{
  while(t--);
}

void IIC_Start(void)  //启动IIC总线,当SCL为高电平时使SDA产生一个负跳变
{
  SDA=1;
  SCL=1;
  DELAY(DELAY_TIME);
  SDA=0;
  DELAY(DELAY_TIME);
  SCL=0;
  DELAY(DELAY_TIME);
}

void IIC_Stop(void)  //终止IIC总线,当SCL为高电平时使SDA产生一个正跳变
{
  SDA=0;
  SCL=1;
  DELAY(DELAY_TIME);
  SDA=1;
  DELAY(DELAY_TIME);
  SCL=0;
  DELAY(DELAY_TIME);
}


void SEND_0(void)  //发送0,在SCL为高电平时使SDA信号为低
{
  SDA=0;
  DELAY(DELAY_TIME);
  SCL=1;
  DELAY(DELAY_TIME);
  SCL=0;

}

void SEND_1(void)  //发送1,在SCL为高电平时始SDA信号为高
{
  SDA=1;
  DELAY(DELAY_TIME);
  SCL=1;
  DELAY(DELAY_TIME);
  SCL=0;

}

void Write_Byte(uchar b) reentrant  //向IIC总线写一个字节
{
  uchar i;
  for(i=0;i<8;i++)
  if((b<<i)&0x80)
    SEND_1();
  else
    SEND_0();
}

uchar Read_Byte(void) reentrant  //从IIC总线读一个字节
{
  uchar b=0,i;
  SDA=1; //释放总线
  for(i=0;i<8;i++)
  {
    b<<=1;
    SCL=0;  DELAY(DELAY_TIME);
    SCL=1;  DELAY(DELAY_TIME);
    b|=SDA;
  }
  SCL=0;
  return b;
}

bit Check_ACK(void)  //发送完一个字节后,检验设备的应答信号
{
  uchar errtime=255;
  SDA=1;  DELAY(DELAY_TIME);
  SCL=1;  DELAY(DELAY_TIME);
  while(SDA)
  {
    errtime--;
    if(!errtime)
    {
      IIC_Stop();
      return FALSE;
    }
  }
  SCL=0;
  return TRUE;
}

bit Write_N_Bytes(uchar AddrWr,uchar AddrWord,uchar *buffer,uchar num) reentrant
{
  uchar i;
  IIC_Start();
  Write_Byte(AddrWr);
  if(!Check_ACK()) return(FALSE);
  Write_Byte(AddrWord);
  if(!Check_ACK()) return(FALSE);
  for(i=0;i<num;i++)
  {
    Write_Byte(*buffer);
    if(!Check_ACK()) return(FALSE);
    buffer++;
  }
  IIC_Stop();
  return TRUE;
}

bit Read_N_Bytes(uchar AddrWr,uchar AddrWord,uchar *buffer,uchar num) reentrant
{
  uchar i;
  IIC_Start();
  Write_Byte(AddrWr);
  if(!Check_ACK()) return FALSE;
  Write_Byte(AddrWord);
  if(!Check_ACK()) return FALSE;

  IIC_Start();
  Write_Byte(AddrWr+1);
  if(!Check_ACK()) return FALSE;
  for(i=0;i<num-1;i++)
  {
    *buffer=Read_Byte();
    SEND_0();
    buffer++;
  }
  *buffer=Read_Byte();
  SEND_1();
  IIC_Stop();
  return TRUE;
}

void Public_Delay(uchar t)
{
  uchar i,j;
  for(i=0;i<t;i++)
  for(j=0;j<250;j++);
}

void main(void)
{
  uchar r[4]={0x7F,2,3,4};
  bit t;
  uchar b[4]={0};

  t=Write_N_Bytes(0xa0,0x20,r,4);

  if(t==TRUE)
     P0=0x06;
  else
    P0=0x5b;

  Public_Delay(65500);
  Public_Delay(65500);

  t=Read_N_Bytes(0xa0,0x20,b,4);
  if(b[3]==4)//t==FALSE)
    {P0=b[0];}
  while(1)
    {  }
}

⌨️ 快捷键说明

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