标题: 为啥iic的写入和读取之间要加延时,没加延时单片机读取不正常? [打印本页]

作者: 1518419198    时间: 2021-1-4 14:07
标题: 为啥iic的写入和读取之间要加延时,没加延时单片机读取不正常?
为啥iic的写入和读取之间要加延时,没加延时读取不正常-----------------------------------------------

以下程序用郭天祥例程改的-------------------------------------

单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit  write=0;           //写24C02的标志;
sbit sda=P2^0;                        
sbit scl=P2^1;

void delay()
{ ;; }
void delay1ms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
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;
        scl=1;
        delay();
        while((sda==1)&&(i<250))i++;
        scl=0;
        delay();
}
void init()
{
        sda=1;
        delay();
        scl=1;
        delay();
}
void write_byte(uchar date)
{
        uchar i,temp;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl=0;
            delay();
                sda=CY;
                delay();
                scl=1;
                delay();
        }
        scl=0;
        delay();
        sda=1;
        delay();
}
uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay();        
                k=(k<<1)|sda;
                scl=0;
                delay();        
        }
        return k;
}
void write_add(uchar address,uchar date)
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(date);
        respons();
        stop();
}
uchar read_add(uchar address)
{
        uchar date;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();
        stop();
        return date;
}


void main()
{
    init();
        delay1ms(12);
        delay1ms(1);
        write_add(2,0xa1);
        delay1ms(1);
    P1=read_add(2);
    while(1);
}
源码用郭天祥例程改的

51hei截图20210104140116.png (234.55 KB, 下载次数: 89)

51hei截图20210104140116.png

51hei截图20210104140130.png (247.49 KB, 下载次数: 103)

51hei截图20210104140130.png

作者: cheney03    时间: 2021-1-4 17:29
需要严格根据时序图来写程序,不按时序图编写会出错。
作者: 人人学会单片机    时间: 2021-1-4 18:02

IIC协议 可以参考我的贴子的源代码 写应答和读应答是不同的
STC8单片机+DS3231+WS2812做的全彩RGB挂钟程序原理图资料
http://www.51hei.com/bbs/dpj-200965-1.html
STC8单片机+DS3231+DS18B20+74HC595的LED16x32点阵温度万年历源代码分享
http://www.51hei.com/bbs/dpj-200966-1.html






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1