找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1845|回复: 7
打印 上一主题 下一主题
收起左侧

关于51单片机模拟iic读写at24c256问题

[复制链接]
跳转到指定楼层
楼主
ID:589491 发表于 2021-2-17 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在网上找到了一个24c64的程序(不确定能用),看到内存地址相关的是先发送地址高8位,在发送地址低8位,我的24c256也是这样写的,但是不可以读和写(用外部烧录器读取没变化,写入单片机读不出来),11.0592晶振,stc89c516RD+单片机,WP接地,a0,a1,a2接地,SCL接P01,SDA接P02,因GND不够用,将WP接P24并置低电平

下面是我的单片机程序,求大佬指点一下

#include <reg52.h>
#include <intrins.h>
#define ui unsigned int
#define uc unsigned char

sbit IIC_SCL = P0^1;
sbit IIC_SDA = P0^2;
sbit IIC_WP  = P2^4;

void delay0(){;;}

void IIC_start(){
        IIC_SDA = 1;
        delay0();
        IIC_SCL = 1;
        delay0();
        IIC_SDA = 0;
        delay0();
}

void IIC_stop(){
    IIC_SDA = 0;
    delay0();
    IIC_SCL = 1;
    delay0();
    IIC_SDA = 1;
    delay0();
}

void IIC_ACK(){
    uc i;
    IIC_SCL = 1;
    delay0();
    while((IIC_SDA == 1) && (i < 250)) i++;
    IIC_SCL = 0;
    delay0();
}

void IIC_Init(){
    IIC_SDA = 1;
    delay0();
    IIC_SCL = 1;
    delay0();
}

void IIC_WR_byte(uc dat){
    uc i;
    for(i = 0;i < 8;i ++){
        dat <<= 1;
        IIC_SCL = 0;
        delay0();
        IIC_SDA = CY;
        delay0();
        IIC_SCL = 1;
        delay0();
    }
    IIC_SCL = 0;
    delay0();
    IIC_SDA = 1;
    delay0();
}

uc IIC_RD_byte(){
    uc i,dat;
    IIC_SCL = 0;
    delay0();
    IIC_SDA = 1;
    delay0();
    for(i = 0;i < 8;i ++){
        IIC_SCL = 1;
        delay0();
        dat = (dat << 1) | IIC_SDA;
        delay0();
    }
    return dat;
}


void IIC_WR_ADD_256(uc add1,add2,dat){
        IIC_start();
        IIC_WR_byte(0xa0);
        IIC_ACK();
        IIC_WR_byte(add1);
        IIC_WR_byte(add2);
        IIC_ACK();
        IIC_WR_byte(dat);
        IIC_stop();

}

uc IIC_RD_ADD_256(uc add1,add2){
        uc dat;
        IIC_start();
        IIC_WR_byte(0xa0);
        IIC_ACK();
        IIC_WR_byte(add1);
        IIC_WR_byte(add2);
        IIC_ACK();
        IIC_start();
        IIC_WR_byte(0xa1);
        IIC_ACK();
        dat = IIC_RD_byte();
        IIC_stop();
        return dat;
}

void main(){
        IIC_WP = 0;
        IIC_Init();
        IIC_WR_ADD_256(0x10,0x10,0xf0);
        P0 = IIC_RD_ADD_256(0x00,0x01);
        
        while(1);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:654028 发表于 2021-2-18 10:44 | 只看该作者
要延时啊
回复

使用道具 举报

板凳
ID:141497 发表于 2021-2-18 10:51 | 只看该作者
楼主可以找IC的规格书看一下,首先要保证I2C协议正确,其次要注意IC读写时序和方式,一步步的查找问题,最后解决问题。
回复

使用道具 举报

地板
ID:373388 发表于 2021-2-18 11:04 | 只看该作者
1,写完要等待写周期完成才能读出来
2,发地址高位后,也需要等待应答位
3,读数时,发完读指令,需要向EEPROM发送应答位,表示单片机准备好接受,而不是等待应答位
4,以上都改好了还不行的话,就用示波器查波形是否正确。
回复

使用道具 举报

5#
ID:112099 发表于 2021-2-19 11:29 | 只看该作者
        IIC_WR_byte(add1);         IIC_WR_byte(add2);之间好像还要加个IIC_ACK();,dat = IIC_RD_byte();后面好像还要加个非应答;最好还是用示波器抓下波形看时序对不对
回复

使用道具 举报

6#
ID:592807 发表于 2021-2-20 13:44 | 只看该作者
IIC通讯地址呢?
回复

使用道具 举报

7#
ID:299193 发表于 2021-2-20 21:54 | 只看该作者
xhaity 回答是正确的,你地址1和地址2之间没有应答,写完之后没有延时5~10毫秒
回复

使用道具 举报

8#
ID:883031 发表于 2021-2-21 11:43 | 只看该作者
主要是时序配合的问题,配合不好是不行的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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