单片机与EEPROM(24c02n)的通信问题 各位大神帮忙

我直接把郭天祥教学视频中写的通信程序,下载到开发板上。单片机为STC59C52 。出现了问题 只有几个有规律的地址才能写进数去,其它地址写不进去 ,为什么
下面是源程序

#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
uchar a;
void delay()
{ ;; }
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();
}
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)
{
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();
write_add(23,0xee); //此处的23只能是7,15,23,31,39。。。
// 。。等差为8的数才能写进数值 其它地址都不行
delay1(100);
P2=read_add(23); //此处除了上面写的那些数,P2输出ee外,其它数都输出ff,为什么
while(1);
}

你把delay延时加大,比如加大为原来的10倍或100倍,然后试试。追问

还是不行,是不是与24c02有关。 我看资料说,它的内部是页存的,八位为一页。 和这个有关吗

追答

你的程序是单字节操作,与页无关。
read_byte()里面定义k时,先赋值令k=0,然后再进行8个bit的循环,看行不行。另外24c02的WP管脚没有保护起来吧?

追问

还是不行,WP脚也接着地呢

追答

我用proteus仿真了一下你的程序,用12M的晶振,最后的P2=read_add(23);改成了P3口,没啥问题,写任何地址,读回来的数据都是正常的。你是硬件仿真还是软件仿真?如果是硬件的话,是不是你的24c02芯片坏了。

追问

我在开发板上试的。不知道是不是硬件的问题,如果坏的话,为什么那些有规律的地址可以写进去。有空买个新的24c02再试试 你说的用proteus仿真,我想学一学。 哪个版本的仿真软件比较好啊,最好是那个软件的下载网站, 还有哪里有学习这款仿真软件的资料啊 谢谢

追答

用proteus吧,功能很全,绝大多数的数字芯片和模拟器件都可以仿真,比较多人用,问起来比较方便。你去搜索一下,下载一个。也可以留个email,发个给你,有六十多M。
当然了,软件仿真完了,硬件仿真还是必须的。

追问

邮箱是627855962@qq.com

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-08
?

单片机中24c02n芯片是做什么用的啊?
单片机中24c02n芯片是串行E2PROM是基于I2C-BUS 的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。因此可以用来保存一些需配置信息,例如你测温度,当温度大于某个值阀值时报警,而有时候这个阀值并不固定,有的环境报警值高点...

单片机中24c02n芯片是做什么用的啊?
单片机中24c02n芯片是串行E2PROM是基于I2C-BUS 的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。24C02与单片机的接口非常简单,E0,E1,E2为器件地址线,WP为写保护引脚,SCL,SDA为二线串行接口,符合I2C总线协议。在一般...

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

ATMEL268 24C02N SU27 D 是什么芯片啊,51单片机上面的。存储芯片
24C02,是一颗2kbit(256字节)的EEPROM。是的,它是非易失存储器。HC573,是一颗八位锁存器。CH340,是一颗USB转串的转换器。

单片机开发板怎么用?
问题一:单片机开发板上的硬件怎么使用 首先,你需要仔细看开发板的原理图。你需要把单片机插到开发板的芯片座上,芯片座的引脚会和PCB板连接,PCB板上的走线会将芯片座的引脚连接到具体硬件上。开发板上的硬件设备都是通过开发板的PCB走线连接好的,你只需要在原理图上寻找具体硬件连接到单片机的管脚关系。 目测你...

STC89C52单片机可以掉电保存数据吗?
可以,单片机中, 保存数据有两种。一种是,Volatile memory,断电後数据消失。一种是,Non-Volatile memory,断电後数据不消失。应该要确认,单晶片是否有提供"可供写入的Non-Volatile memory"。有的单片机,数据可以存放在程序储存的空间(FALSH),有的是额外提供数据储存空间如(EEPROM), 依照单片机的不同...

spii2cuart区别
6、STC的很多单片机都有SPI模块,比如STC12C5A60S2。有IIC协议的单片机较少,但很多的存储器是IIC接口比如24C02等。三种通信模式SPI、UART、I2C它们的工作原理uart:是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,uart用来主机与辅助设备通信,如汽车...

单片机有什么特征?
1、有优异的性能价格比 目前国内市场上,有些单片机的芯片只有人民币几元,加上少量外围元件,就能构成一台功能相当丰富的智能化控制装置。2、集成度高,体积小,可靠性好 单片机把各功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性与抗干扰能力。而且,...

89C52单片机的内存8K不够用了怎么办?
3.如果改用大内存的单片机芯片,那程序又不一样了吧?答:只要单片机还是51系列的,程序基本不会大变动,甚至不用变动.价格方面不要贵啊,我只会52的C程序的(我是菜鸟),所以要完全兼容的,不需要太大,再有8K或4K就OK。那又怎么办?跪求,献上我的大部分分,搞定了可以追加。内存确实不够了。。

相似回答