yufe 发表于 2022-3-3 22:55

关于I2c总线的编程无法实现

这是程序代码   求帮忙 指出错误!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay()
{ ; ; }
bit write=0;
sbit sda=P2^0;
sbit scl=P2^1;
void init()
{
      scl=1;
      sda=1;
}
void start()
{
      sda=1;
      delay();
      scl=1;
      delay();
      sda=0;
      delay();
}
void stop()
{
      sda=0;
      delay();
      scl=1;
      delay();
      sda=1;
      delay();
}
void respons()
{
      uchar i=0;
      scl=1;
      delay();
      while((sda==1)&&(i<255))
                i++;
      scl=0;
      delay();
}
void delay1(uint xsm)
      {
                uint i,j;
                for(i=xsm;i>0;i--)
                        for(j=110;j>0;j--);
      }
void write_byte(uchar date)
{      
          uchar i,temp;
      temp=date;
      for(i=0;i<8;i++)
      {
                temp=temp<<1;
                sda=CY;
                scl=1;
                delay();
                scl=0;
                delay();
               
      }
                scl=0;
                delay();
                sda=1;
                delay();
      
}

uchar read_byte()
{
      uchar i,k;
      for(i=0;i<8;i++)
      {
                k=(k<<1)|sda;
                delay();
                scl=1;
                delay();
                scl=0;
                delay();
               
      }
                delay();
                return k;
               
}
void main()
{      uchar a;
      init();
      start();
      write_byte(0xa0);
      respons();
      write_byte(0xaa);
      respons();
      write_byte(0xaa);
      respons();
      stop();

      delay1(100);
      start();
      write_byte(0xa0);
      respons();
      write_byte(0xaa);
      respons();
      start();
      write_byte(0xa1);
      respons();
      write_byte(0xaa);
      a=read_byte();
      a=P1;
      stop();
      while(1);      
}

wyjie 发表于 2022-3-3 22:58

**下去你一定能有所突破,老实说大部分人智力都差不多。。

dingy 发表于 2022-3-3 23:02

I2C使用的关键是时序,按技术资料的时序写没问题,范例中都有,重在调试。

xxrs 发表于 2022-3-3 23:08


a=read_byte();
      a=P1;
      stop();
      while(1);      
}
后面那句反了吧,改为P1=a;

huangchui 发表于 2022-3-3 23:11

买个便宜的逻辑分析仪,照着时序很容易调试的。

wyjie 发表于 2022-3-3 23:14

时钟线SCL高电平期间,数据线SDA的电平不能变化,否则,将被认为是一个起始信号S或终止信号P,引起出错

stly 发表于 2022-3-3 23:16

若需改变数据线SDA的电平,必须先拉低时钟线SCL电平。

dengdc 发表于 2022-3-3 23:19


启动信号通用子程序STAT
voidSTAT ( ){                     //启动信号子函数STAT
SCL=0;SDA=1;                  //时钟线低电平期间,改变SDA电平(高电平)
SCL=1;                               //时钟线发出时钟脉冲
SDA=0;                              //在时钟线高电平期间,SDA下跳变(启动信号规定动作)
SCL=0;}                            //SCL低电平复位,与SCL=1组成时钟脉冲

yszong 发表于 2022-3-3 23:21

应该是你上传的程序少了一句SCL=0,使得时序出错。

juventus9554 发表于 2022-3-3 23:23

上述程序少了4us延时,用于proteus仿真没问题,用于实例最好加4us延时吧。

pengf 发表于 2022-3-3 23:25

用逻辑分析仪,挂上,看看如何。

yufe 发表于 2022-3-3 23:27

好的,我明天去单位试一下,多谢各位大侠了哈
页: [1]
查看完整版本: 关于I2c总线的编程无法实现