不知道在哪出了问题,总之仿真时就一直都是全亮,不管写什么数据都是这样,调试时发现并没有写入地址,望各位路过的大神帮帮忙,最好能帮我找出我的问题所在,当然如果各位有其他更好的方法,希望留下仿真图与代码,在下感激不尽,唯有将分数拉高,谢谢!!!
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit scl=P2^1;
sbit sda=P2^0;
uchar a;
void delay() //短延时
{
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
}
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 NoRespons()//不应答
{
sda=1;
delay();
scl=1;
delay();
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 delay1(uchar x)//长延时
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_add(uchar address,uchar date)//将一个数据写到IIC总线的过程
{
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(); //读取数据
NoRespons(); //不应答
stop(); //停止
return date; //返回读取的数据
}
void main()
{
init();
a = read_add(2); //读取地址为2的数据
if(a>=0xff) //如果开始读出的数出错,就从0开始
a = 0x00;
P1 = a; //把读到的数赋给P1
write_add(2,0xaa); //在地址为2的地方写数据
delay1(100); //延时
P1 = read_add(2); //读
while(1);
}
啊
感谢您的回答,希望您能将你的程序与proteus结合起来,给我一个仿真图,谢谢......
追答参考下
追问弱弱的问一句,你那个查看地址的工具是什么,在哪找的啊...谢谢啊!!
追答I2C debugger在PROTEUS里面有个虚拟设备里面
感谢您的回答,不过我用了一下1M的还是没用!哎,纠结了好多天,就是不知道为什么,如果您有做好了的程序与仿真图啊之类的,麻烦您发一下,有劳了....
可以发我邮箱1057064438@qq.com,但如果可以的话,还是直接在知道里回答,以免今后有人犯跟我同样的错误,可以给别人一点启示...谢谢!!!
AT24C02写一个数据然后读取一个数据是正确的,但是当写入多个数据时,读 ...
恩,这个问题困扰了两天,终于找到原因并且顺利解决了!原因是:单片机接收应答信号(向AT24C02写数据时)和发送应答信号(AT24C02向单片机发送数据)的代码是不一样的!void ack()\/\/acknowledge (单片机接收应答信号){ uchar i;scl=1;delay();while((sda == 1)&&(i > 250))i++;scl=0;\/\/注意此...
STM32基础:IIC总线操作EEPROM存储模块AT24C02
首先,让我们理解IIC的精髓:这是一种全双工、串行通信接口,适用于低速、低功耗的设备连接。而AT24C02的引脚定义清晰明了,通过STM32的GPIO模拟IIC总线,我们可以轻松实现数据的收发。设备地址A2-A0在开发板上默认设置为0,而写保护引脚WP连接地(GND)确保了数据的安全写入。对于数据存储,AT24C02提供了两...
单片机IIC总线上24c02写数据问题。
在器件在有它各自的址,但它们有两不同的区分方法,如:EEPROM芯片它不仅有内部地,它还有外接的几个引脚用于区分不同的EEPROM芯片,而温度传感器它的内部地址每一个都不同(出厂时就已写入)。有还有就是I2C有8位地址和10位地址两种。
51单片机KEIL如何将结构数组存到24C02中~~~在线等~~~
2种方法,一是将结构体拆开,单独将里面的每个元素存入24C02,需要时候再读出来赋值给结构体中对应的元素,优点是简单,缺点是结构体一变,读写函数也得变。方法二:获取到待存结构体的首地址,由你提供的接口看24C02可以存储char格式数据,那么再将结构体地址内的数据全部按照char格式读取出来再存入24C...
单片机AT24C02存储电路的介绍,主要就是介绍2402芯片及引脚功能。_百度...
2Kbit e2prom存储器,1-A0,2-A1,3-A2 地址管脚;4-Vss 电源地;5-SDA 串行数据;6-SCL 串行时钟;7-WP 写保护;8-Vcc 电源
【STM32Cube_13】使用硬件I2C读写EEPROM(AT24C02)
编写EEPROM驱动程序,确定IIC器件地址为0xA2(读地址)和0xA3(写地址)。根据AT24C02的数据手册,编写相关的宏定义和底层函数。实现任意地址写单个字节和读单个字节的函数。使用单个函数连续写入多个字节会导致数据覆盖同一页面,需要编写写一页的格式。连续读取多个字节不受限制,直接读取即可。测试字节读写...
【蓝桥杯单片机】PCF8591和24C02综合应用-智能照明自动控制器_百度知 ...
PCF8591是拥有IIC接口的8位A\/D和D\/A转换芯片,具备4路模拟输入、1路DAC输出和一个IIC接口。其设备地址包含固定和可编程部分,通过硬件引脚A0、A1、A2设置,最后一位用于确定数据传输方向,即读\/写位。1表示读取,0表示写入。在蓝桥杯单片机板上,固定通道有01和03。IIC总线由SDA数据线和SCK时钟线组成...
用msp430模拟IIC对AT24C02进行读写操作,为什么从总线上读出的数据都是0...
直接这么问是看不出问题的,必须接示波器。首先观察是否ACK返回正常,如果不正常,那可能是延时哪个地方没做好,还得看波形,哪个地方时序有问题就改哪里。如果数据部分波形没问题,却没ACK返回,就可能是硬件问题,线接反了,或者上拉电阻阻值有问题。
为什么我用原子哥的IIC例程测试AT24C02读写不成功
我引两个IO口,VCC(3.3V)和GND,外搭的AT24C02在面包板上面测试的,我写程序控制SCL和SDA高低电平都可以(实测),不知道为什么用原子哥的测试程序想来测试下,结果读回的都是FF
AT24C02有多少个字节可以用来存数据?
AT24C02可以存储255个字节的数据。AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,即2048bit换成字节是256Byte,也就是说可以存储255个字节的数据。