请教:AT24C02程序问题!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教:AT24C02程序问题!相关的知识,希望对你有一定的参考价值。

我程序用protues仿真出来后,P1口显示的是0x81,请问是什么原因!
我的程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar f;
sbit sda=P2^6;
sbit scl=P2^7;
void delayus()//五微秒
;;
void delayms(uint z)//一毫秒

uint x,y;
for(y=z;y>0;y--)
for(x=110;x>0;x--);

void init()//初始化

scl=1;
delayus();
sda=1;
delayus();

void start()//开始信号

scl=1;
delayus();
sda=1;
delayus();
sda=0;
delayus();

void stop()//停止信号

scl=1;
delayus();
sda=0;
delayus();
sda=1;
delayus();

void response()//应答信号

uchar a;
scl=1;
while((sda==1)&&(a<250))a++;
scl=0;
delayus();

void write_byte(uchar dat)//写一个字节

uchar b,c;
scl=0;
delayus();
sda=1;
for(b=0;b<8;b++)

c=dat&(0x80<<1);
delayus();
sda=c;
delayus();
scl=1;
delayus();
scl=0;
delayus();

scl=0;
delayus();
sda=1;

uchar read_byte()//读一个字节

uchar d,e;
scl=0;//数据可以变化
delayus();
sda=1;
delayus();
for(d=0;d<8;d++)

scl=1;//数据稳定的时候可以进行对数据的操作,但是不可以改变数据状态
delayus();
e=sda|(0x01<<d);
delayus();
scl=0;//来个脉冲把数据发送出去(低电平时数据可变)
delayus();

return e;
delayus();

/*
void write_24c02(uchar address,uchar dat)

start();
write_byte(0xa0);
response();
write_byte(address);
response();
write_byte(dat);
response();
stop();

uchar read_24c02(uchar address)

start();
write_byte(0xa0);
response();
write_byte(address);
response();
start();
write_byte(0xa1);
response();
f=read_byte();
stop();
return f;

*/
void main()

while(1)

init();

start();
write_byte(0xa0);//器件地址
response();
write_byte(3);//芯片存储的地址
response();
write_byte(0xf0);//存放的数据
response();
stop();

delayms(1000);//读写之间延时1S

start();
write_byte(0xa0);
response();
write_byte(3);
response();
start();
write_byte(0xa1);//改为读方式
response();
f=read_byte();
P1=f;//把读出来的数据赋给P1口
stop();

/*
write_24c02(3,0xf0);
delayms(10);
P1=read_24c02(3);
*/


不胜感激...........

参考技术A #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar f;
sbit sda=P3^4;
sbit scl=P3^3;
void delayus()//五微秒
;;
void delayms(uint z)//一毫秒

uint x,y;
for(y=z;y>0;y--)
for(x=110;x>0;x--);

void init()//初始化

scl=1;
delayus();
sda=1;
delayus();

void start()//开始信号

sda=1;
delayus();
scl=1;
delayus();
sda=0;
delayus();
scl=0;
delayus();


void stop()//停止信号

sda=0;
delayus();
scl=1;
delayus();
sda=1;
delayus();


/*void response()//应答信号

delayus();
scl=1;
delayus();
*/

void write_byte(uchar dat)//写一个字节
bit ack_bit;
uchar b,c;
scl=0;
delayus();
sda=1;
for(b=0;b<8;b++)

//c=dat&(0x80<<1);
c = (bit)(dat&0x80);
delayus();
sda=c;
delayus();
scl=1;
delayus();
scl=0;
delayus();
dat<<=1;
delayus();


/*下面是response();*/
sda=1;// scl=0;
delayus();
scl=1; //sda=1;
delayus();
ack_bit = sda; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 ,若送高电平,表示没有接收到,传送异常
scl = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)


uchar read_byte()//读一个字节

uchar d,e;
/* scl=0;//数据可以变化
delayus();
sda=1;
delayus();*/
for(d=0;d<8;d++)

scl=1;//数据稳定的时候可以进行对数据的操作,但是不可以改变数据状态
e<<=1;
//e=sda|(0x01<<d);
e|=(unsigned char)sda;
delayus();
scl=0;//来个脉冲把数据发送出去(低电平时数据可变)

return e;



void write_24c02(uchar address,uchar dat)

start();
write_byte(0xa0);
//response();
write_byte(address);
// response();
write_byte(dat);
// response();
stop();

uchar read_24c02(uchar address)

start();
write_byte(0xa0);
// response();
write_byte(address);
// response();
start();
write_byte(0xa1);
// response();
f=read_byte();
stop();
return f;


void main()


delayus();
write_24c02(3,0x02);
delayms(10);
P1=read_24c02(3);
while(1);
本回答被提问者采纳
参考技术B 这个你可以问你老师。

请教一个VHDL的问题

软件是ISE 6.2,VHDL
综合时遇到一个奇怪的问题
WARNING:Xst:1290 Hierarchical block <u2> is unconnected in block <uartdout>
。。。。。。。
检查RTL后发现出现警告的模块没有被综合进去,但单独综合这些没有任何问题。
检查代码后没有任何错误,也没有没使用到的signal,而且所有模块的signal是正常连接的,未出现甩线和没有驱动信号线的问题。
请问,出现这个问题可能是什么原因造成的?

那就是在你的顶层程序中没有把该子模块综合起来,你再仔细仔细检查,要不把程序发上来! 参考技术A 我也遇到同样的问题啊~~让我郁闷死了~~~跟你一样的情况~~不知道你解决了没有,如果解决了的话麻烦告诉我一声。谢谢你了~~QQ467168066

以上是关于请教:AT24C02程序问题!的主要内容,如果未能解决你的问题,请参考以下文章

Proteus仿真AT24C02数据读写+LCD1602显示

Linux驱动开发-编写(EEPROM)AT24C02驱动

51单片机AT24C02写读流水灯实例+Proteus仿真

IIC总线与AT24C02的使用

Arduino ESP8266对AT24C02模块读写操作实例

Linux驱动开发-编写(EEPROM)AT24C02驱动