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

[复制链接]
 楼主| yufe 发表于 2022-3-3 22:55 | 显示全部楼层 |阅读模式
这是程序代码   求帮忙 指出错误!
#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
void  STAT ( ){                     //启动信号子函数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 | 显示全部楼层
好的,我明天去单位试一下,多谢各位大侠了哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

10170

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部