找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2164|回复: 2
收起左侧

为啥iic的写入和读取之间要加延时,没加延时单片机读取不正常?

[复制链接]
ID:589491 发表于 2021-1-4 14:07 | 显示全部楼层 |阅读模式
为啥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
51hei截图20210104140130.png
回复

使用道具 举报

ID:743654 发表于 2021-1-4 17:29 | 显示全部楼层
需要严格根据时序图来写程序,不按时序图编写会出错。
回复

使用道具 举报

ID:390416 发表于 2021-1-4 18:02 | 显示全部楼层
15 03 44 02   IIC读写 主从机信号时间关系.png
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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表