打印
[疑难问答]

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

[复制链接]
675|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
androidbus|  楼主 | 2017-4-22 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

这是程序代码   求帮忙 指出错误!
#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);        
}
沙发
litengg| | 2017-4-22 11:00 | 只看该作者
**下去你一定能有所突破,老实说大部分人智力都差不多。。

使用特权

评论回复
板凳
qiangweii| | 2017-4-22 11:03 | 只看该作者

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

使用特权

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

使用特权

评论回复
5
xia00| | 2017-4-22 11:09 | 只看该作者
买个便宜的逻辑分析仪,照着时序很容易调试的。  

使用特权

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

使用特权

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

使用特权

评论回复
8
boy1990| | 2017-4-22 11:20 | 只看该作者
启动信号通用子程序STAT
void  STAT ( ){                     //启动信号子函数STAT
  SCL=0;SDA=1;                  //时钟线低电平期间,改变SDA电平(高电平)
  SCL=1;                               //时钟线发出时钟脉冲
  SDA=0;                              //在时钟线高电平期间,SDA下跳变(启动信号规定动作)
  SCL=0;}                            //SCL低电平复位,与SCL=1组成时钟脉冲

使用特权

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

使用特权

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

使用特权

评论回复
11
kk5004| | 2017-5-4 10:55 | 只看该作者
你好,我這邊是 希特電子(深圳)有限公司, 是中國大陸笙泉MCU的代理商  有需要解決的技術問題可以 加我 QQ 328626444 詳細聊聊,   潘,R

使用特权

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

本版积分规则

181

主题

1597

帖子

3

粉丝