当前位置: 代码迷 >> 单片机 >> 51单片机 模拟IIC通讯
  详细解决方案

51单片机 模拟IIC通讯

热度:109   发布时间:2016-04-28 15:05:09.0
51单片机 模拟IIC通信
研究了一晚上了,怎么改都改不对……复制光盘的代码可以运行

自己写的就不行,但是时序什么的都和源代码一样……完全不知道怎么办了

求各位大神帮忙看看哪里出问题了

我调试过代码,貌似是response()里面的while(sda==1);

//这是IIC.h文件
#include<reg52.h>
sbit sda=P2^0;
sbit scl=P2^1;

void delay()
{;;}

void init()
{
scl=1;
delay();
sda=1;
delay();
}

void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}

void response()
{   
scl=1;
delay();
while(sda==1);
delay();
scl=0;
delay();
}

void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}

void write(unsigned char date)
{
unsigned char i,temp;
temp=date;
for(i=1;i<=8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}

unsigned char read()
{
unsigned char i,date=0;
scl=0;
delay();
sda=1;
delay();
for(i=1;i<=8;i++)
{
scl=1;
delay();
date=(date<<1)|sda;
scl=0;
delay();
}
delay();
return date;
}


//这是main函数所在文件
#include<reg52.h>
#include"IIC.h"
#include"show_num.h"
int main()
{
unsigned char x;
init();

start();
write(0xa0);
response();
write(0x02);
response();
write(14);
response();
stop();

start();    
write(0xa0);
response();
write(0x02);
response();
start();
write(0xa1);
response();
x=read();
stop();
while(1)
{                                                                                                                                                                                                                                                                                            
show_num(1,x%10,0);//显示函数已确认不会有问题
show_num(2,x/10,0);
show_num(0,10,0);
}
return 0;
}

------解决方案--------------------

    start();
    write(0xa0);
    response();
    write(0x02);
    response();
    write(14);
    response();
    stop();
 
   //这里加延时看看,加到10ms看看

    start();                                               
    write(0xa0);
    response();
    write(0x02);
    response();
    start();
    write(0xa1);
    response();
    x=read();
    stop();


另外8楼说的有道理的,你直接用别人的项目里面的优化级别可能为0,而你自己的项目可能是有默认的优化把你delay()优化没了,所以造成你的时序过快.你比较下两个项目的优化级别是不是一样.
------解决方案--------------------
引用:

    start();
    write(0xa0);
    response();
    write(0x02);
    response();
    write(14);
    response();
    stop();
 
   //这里加延时看看,加到10ms看看

    start();                                               
  相关解决方案