单片机IIC总线上24c02写数据问题。

程序如下 功能为开机次数储存:
#include "reg52.h" //定义51单片机特殊功能寄存器
#include "i2c.h" //I2C总线驱动库
#include "absacc.h"
code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0xff };
unsigned char dspbuf[8] = {10,10,10,10,10,0,0,0}; //显示缓冲区
unsigned char dspcom = 0;
unsigned char reset_cnt;
void display(void);

//主函数
void main(void)
{
//开机次数存储 (最大存储值255)
unsigned char a;
reset_cnt = read_eeprom(0x00); //从AT24C02地址0x00中读取数据
reset_cnt++;
write_eeprom(0x00,reset_cnt); //向AT24C02地址0x00中写入数据

while(1)
{
display() ;
}
}

//显示函数
void display(void)
{ dspbuf[5] = reset_cnt/100;
dspbuf[6] = reset_cnt%100/10;
dspbuf[7] = reset_cnt%10;
XBYTE[0xE000] = 0xff; //消隐

XBYTE[0xC000] = (1<<dspcom);
XBYTE[0xE000] = tab[dspbuf[dspcom]]; //段码

if(++dspcom == 8){
dspcom = 0;
}
}

以下为IIC.h部分子函数

如果把写数据部分改成
for(a=4;a>0;a--)
{
write_eeprom(0x00,reset_cnt);
}
或者先写数据 再读数据
就完全正常 。
但是 先读数据(能读出来)再写就写不进去;
这是什么原因呢?
(单片机型号为STC15F61S2 )
IIC程序 ,是参照郭天祥的教程写的,只修改了软件延迟。
求老师指导。

第1个回答  2015-02-02
在器件在有它各自的址,但它们有两不同的区分方法,如:EEPROM芯片它不仅有内部地,它还有外接的几个引脚用于区分不同的EEPROM芯片,而温度传感器它的内部地址每一个都不同(出厂时就已写入)。有还有就是I2C有8位地址和10位地址两种。追问

这个我知道,首先寻址没有错,有错的话不可能读到。

第2个回答  2017-02-03
请问问题解决了吗,我和你的问题一样,程序也一样,刚开始往0x00写初始数据时是可以写的,但是读了之后再写就不写不进去了,按理说刚开始能写的话时序应该是没问题的...???为啥啊???往别的地址也是可以写的。。

单片机IIC总线上24c02写数据问题。
在器件在有它各自的址,但它们有两不同的区分方法,如:EEPROM芯片它不仅有内部地,它还有外接的几个引脚用于区分不同的EEPROM芯片,而温度传感器它的内部地址每一个都不同(出厂时就已写入)。有还有就是I2C有8位地址和10位地址两种。

51单片机 I2C 24c02的单个数据读写
单片机IIC的SDA端口在向EEPROM(24C01)发数据时,设为输出 在读取EEPROM数据的时候则设为输入。\/\/--- \/\/-程序名称: Eestart \/\/-入口参数:无 \/\/-出口参数:无 \/\/-功能说明: IIC的START信号生成 \/\/--- void Eestart(void) \/\/启动I2C总线\/\/ { SETSDA;DelayNOP(STARTNOP);SETSCL;DelayNO...

求解51单片机I2C对24c02读写汇编程序
SCL BIT P2.0 ;AT24C04的时钟线 SDA BIT P2.1 ;AT24C04的数据线 BUF EQU 30H ;数据缓存区 ;ORG 0 JMP Reset ORG 100H Reset:CALL AT24C04_WritePage ;写一页数据 CALL Delay5ms ;写一页数据需延时5ms CALL AT24C04_ReadPage ;读一页数据 JMP ;;向AT24C04写1页(16...

怎么把单片机E2PROM的24c02操作函数写成库文件以便下次调用
比如说你定义了IIC_24C02_SCL这个IO,在移植的时候,只要在初始化的地方给出这个定义的指向就可以了,无论是51的P2口还是PIC的PB口,就都可以直接用,函数本身就不需要更改了.另外需要注意的是,51的部分写法在别的单片机里或许不能用,例如位判断(发送数据时)和位置位\/清零(读取数据时),这就需要换个比...

单片机中24c02n芯片是做什么用的啊?
24C02与单片机的接口非常简单,E0,E1,E2为器件地址线,WP为写保护引脚,SCL,SDA为二线串行接口,符合I2C总线协议。在一般单片机系统中,24C02 数据受到干扰的情况是很少的,但是随着单片机抗干扰性能的变差,以及恶劣工业环境中单片机系统的应用,一些智能单片机控制系统相继出现24C02数据被冲掉的问题,而且...

51单片机 24C02程序不知道哪里出问题,求助
延时要搞长一点,IIC接口标准上可达到400K,但实际上不好实现,建议在100K以下,所以最好在50K左右就很稳定了。void delay(void){ uint i;for(i=100;i>0;i--)_nop_();}

单片机 24C02程序不能驱动 求解释!
根据时序,当写一个字节时,只有当scl为低电平才可以改变Sda的数据,即类似于有一个scl上升沿,在你的写函数之间的start函数scl为高电平,而在iic_write_sigle中sda有值后,scl一直为高,没有低,怎么可以改变数据呢!!所以在iic_write_sigle中for循环里加上scl=0;再试试看 ...

PIC单片机I2C总线小问题
IIC通讯协议里面有写很清楚。你可以找一个24C02的程序看一下。人家是怎么写的。首先发送的是写控制、接下来是地址,然后重新启动,再发送读控制,再接下来就是读了,最后结束。其中,向从机发送读写命令及地址时,要等从机的应答信号。建议调试时采用0XAA,0X55,0XF0,0X0F这类数据,通过示波器很...

单片机用IIC读写EEPROM
对iicEEPROM进行写入操作时,IC内部有个自循环写时序大约10mS(不同的芯片可能略有差异),如果在这个时序尚未结束之前,执行读操作,读出的数据只能是先前有效的写操作记录的数据,因为单步调试操作的时间远大于10mS,iic的自循环写时序已经结束,所以读出的数据是正确的。建议在写操作之后延时10mS后再...

keil怎么将数据写到eeprom
1、首先,向IIC总线器件24c02EEPROM中地址为1的存储单元中写入数据50。2、其次,重命名为EEPROM将例程文件复制到相应文件夹中打开keil。3、最后,在cubeMX配置引脚,选择output模式,keil就可以将数据写到eeprom。

相似回答