打印

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

[复制链接]
323|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yufe|  楼主 | 2019-11-16 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是程序代码   求帮忙 指出错误!
#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);        
}

使用特权

评论回复
沙发
zhanglli| | 2019-11-16 16:51 | 只看该作者
**下去你一定能有所突破,老实说大部分人智力都差不多。。

使用特权

评论回复
板凳
llia| | 2019-11-16 16:53 | 只看该作者

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

使用特权

评论回复
地板
langgq| | 2019-11-16 16:57 | 只看该作者
a=read_byte();
        a=P1;
        stop();
        while(1);        
}
后面那句反了吧,改为P1=a;

使用特权

评论回复
5
zhanglli| | 2019-11-16 17:01 | 只看该作者

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

使用特权

评论回复
6
guoyt| | 2019-11-16 17:03 | 只看该作者
时钟线SCL高电平期间,数据线SDA的电平不能变化,否则,将被认为是一个起始信号S或终止信号P,引起出错

使用特权

评论回复
7
lium| | 2019-11-16 17:06 | 只看该作者
若需改变数据线SDA的电平,必须先拉低时钟线SCL电平。

使用特权

评论回复
8
xxrs| | 2019-11-16 17:06 | 只看该作者


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





使用特权

评论回复
9
llia| | 2019-11-16 17:11 | 只看该作者
应该是你上传的程序少了一句SCL=0,使得时序出错。

使用特权

评论回复
10
langgq| | 2019-11-16 17:17 | 只看该作者
上述程序少了4us延时,用于proteus仿真没问题,用于实例最好加4us延时吧。

使用特权

评论回复
11
yufe|  楼主 | 2019-11-16 17:20 | 只看该作者
好的,我明天去单位试一下,多谢各位大侠了哈,结贴了先        

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

10170

帖子

1

粉丝