I2C通讯协议,调试出问题

2019-07-16 04:59发布

各位前辈,本人现在学习到I2C协议,写出的历程怎么都不能正确运行,用别人成功运行过的历程加上自己的主函数也不行。现将源程序附上,请大家指导,在此谢过了!



#include <reg52.h>

#include<intrins.h>
void delaynop()                //5us延时
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}

#define uchar unsigned char
#define uint unsigned int
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit SDA = P3^7;        
sbit SCL = P3^6;
uchar r,f,count=0;
uchar l ,m=0x00;
//
//
//
// void delay()
// {;;}
  void delay1ms(uint c)
  {
   uint e;
   for(c;c>0;c--)
   for(e=300;e>0;e--);
  }

/*
void init()
{
  SCL=1;
  delay();
  SDA=1;
  delay();
}




void start()
{
SDA=1;
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
return;

}


void stop()
{
  SDA=0;
  SCL=1;
  delay();
  SDA=1;
  delay();
  SCL=0;
  return;

}

void respons()
{
  uchar i;
  SCL=1;
  delay();
  while((SDA==1)&&(i<250))
  i++;
  SCL=0;
  delay();

}

void unrespons()
{
  uchar i;
  delay();
  while((SDA==0)&&(i<250))
  i++;
  SCL=0;
  delay();

}


void write_byte(uchar date)
{
  uchar i, temp;
  temp=date;
  for(i=0;i<8;i++)
  {
        temp=temp<<1;
        SCL=0;
        delay();
        SDA=CY;
        delay();
        SCL=1;
        delay();

   }
  SCL=0;
  delay();
  SDA=1;
  delay();
}


uchar read_byte()
{
  uchar i,k;
  SCL=0;
  delay();
  SDA=1;
  for(i=0;i<8;i++)
  {
  SCL=1;
  delay();
  k=k<<1;
  k=k|SDA;
  SCL=0;
  delay();
   }
   delay();
    r++;
   return k;
  
}

void write_add(uchar address,uchar date)
{  start();
   write_byte(0xa0);
   respons();
   write_byte(address);
   respons();
   write_byte(date);
   respons();
   stop();
   f++;

}


uchar read_add(uchar address)
{
  uchar date;
  start();
  write_byte(0xa0);
  respons();
  write_byte(address);
  respons();
  start();
  write_byte(0xa1);
  respons();
  date=read_byte();
  unrespons();
  stop();
  return date;
}  */                                //以上是自己写的


       

/*****************************************************************/
/*                                                               */                                                      
/*                        初始化函数                             */
/*                                                               */   
/*****************************************************************/
void init()                  
{
SCL=1;
delaynop();
SDA=1;
delaynop();
}

/*****************************************************************/
/*                                                               */                                                               
/*                        开始信号                               */
/*                                                               */   
/*****************************************************************/
void start()                 
{
SDA=1;
delaynop();
SCL=1;
delaynop();
SDA=0;
delaynop();
SCL=0;
}

/*****************************************************************/
/*                                                               */                                                               
/*                        停止信号                               */
/*                                                               */   
/*****************************************************************/
void stop()                               
{
SDA=0;
delaynop();
SCL=1;
delaynop();
SDA=1;
delaynop();
SDA=0;
}

/*****************************************************************/
/*                                                               */                                                               
/*                        应答信号                               */
/*                                                               */   
/*****************************************************************/
uchar reponse()                          
{
bit ack_bit;
SDA=1;
delaynop();
SCL=1;
delaynop();
ack_bit=SDA;
SCL=0;
return ack_bit;
}

/*****************************************************************/
/*                                                               */                                                               
/*                        写一个字节                             */
/*                                                               */   
/*****************************************************************/
void write_byte(uchar date)                 
{
uchar i;
SCL=0;
for(i=0;i<8;i++)
  {
        SDA=(bit)(date&0x80);
        _nop_();
        SCL=1;
        delaynop();
        SCL=0;
        date<<=1;
  }
}

/*****************************************************************/
/*                                                               */                                                               
/*                        读一个字节                             */
/*                                                               */   
/*****************************************************************/
uchar read_byte()                       
{
uchar i,date;
for(i=0;i<8;i++)
   {
    SCL=1;
           date<<=1;
        date=SDA|date;
        delaynop();
        SCL=0;
        delaynop();
   }
   return date;
}

/*****************************************************************/
/*                                                               */                                                               
/*                        指定地址写数据                         */
/*                                                               */   
/*****************************************************************/
void write_add(uchar address,uchar date)        
{
start();
write_byte(0xa0);
reponse();
write_byte(address);
reponse();
write_byte(date);
reponse();
stop();
}

/*****************************************************************/
/*                                                               */                                                               
/*                        指定地址读数据                         */
/*                                                               */   
/*****************************************************************/
uchar read_add(uchar address)                                         
{
uchar date;
start();
write_byte(0xa0);
reponse();
write_byte(address);
reponse();
start();
write_byte(0xa1);
reponse();
date=read_byte();
stop();
return date;
}                                 //这些别人写的,还用成功了,但是用在我的主函数就不行


void main()
{

init();
l=read_add(2);

while(1)
    {
    l=read_add(2);
    P2=0;
    P0=table[l];
    delay1ms(100);
    delay1ms(100);
    delay1ms(100);
        write_add(2,m);
        m=m+1;
        count++;
        if(count>10)
            {
                count=0;
             m=0;
             }
        }
}
历程.c 下载积分: 积分 -1 分
6.49 KB, 下载次数: 3, 下载积分: 积分 -1 分 源程序
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。