请教:AT24C02程序问题!

请教:AT24C02程序问题!,第1张

#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=zy>0y--)

for(x=110x>0x--)

}

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=0b<8b++)

{

//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=0d<8d++)

{

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)

}

1、安装VSpeedSetup.exe软件,安装USB_DRIVER驱动软件,将电脑和编程器连接,装载芯片,芯片方向口和并消编程器提示方向口一致。

2、然后找到软件快捷图标,打开软件。

3、来到软件冲稿先进行芯片选择,点击“选择器件”。

4、使用的EEPROM是,Atmel公司的“AT24C512C-SSHD-T”,这里选择“AT24C512(SOIC8)”单击“确定”。散蔽孝

5、如果是使用一个烧写座的话这里选择“1 PCS”,单击“OK”,如果是两个的话选择“2 PCS”单击OK之后可能会有个d窗,单击“关闭”关掉d窗。

6、在“AT24C512C”文件夹找到“AT24C512C.bin”文件,选择文件,点击“打开”加载文件即可。

只要会写入和读出即可,写入时先发一个字节为写命令(最低位是读写命令其余7位可做为高7位地址),再发一个低8位地址,然后再发要写入的数据 读出时先发一个字节为写命令(同样含高7位地址),再发一肢粗个低段郑8位地址,然后再发一次读命令,即可读出数据. 对于24C02 高7位地址的前4位内部已规定为1010 另3位为器件上三根地址线的地址 若全接地,则为000,因此读此器件的命令即为0xa1 写此器件的命令即为0xa0 低8位刚好寻址内部256字节地址空间 下面给出单字节写入和读出的程序

/////////24C02读写驱动程序////////////////////

void delay1(unsigned char x)//24C02比较慢,要延时等待

{ unsigned int i

for(i=0i<xi++)

}

void flash()//短延时

{ }

void x24c08_init() //24c02初始化子程序

{scl=1flash()sda=1flash()}

void start()//启动I2C总线

{sda=1flash()scl=1flash()sda=0flash()scl=0flash()}

void stop() //停止I2C总线

{sda=0flash()scl=1flash()sda=1flash()}

void writex(unsigned char j) //写一个字节

{ unsigned char i,temp

temp=j

for (i=0i<8i++)

{temp=temp<<1scl=0flash()sda=CYflash()scl=1flash()}

scl=0flash()sda=1flash()

}

unsigned char readx() //读一个字节

{

unsigned char i,j,k=0

scl=0flash()sda=1

for (i=0i<8i++)

{ flash()scl=1flash()

if (sda==1) j=1

else j=0

k=(k<<1)|j

scl=0}

flash()return(k)

}

void clock() //I2C总线时钟

{

unsigned char i=0

scl=1flash()

while ((sda==1)&&(i<255))i++

scl=0flash()

}

////////从24c02的地址address中读取一个字节数据/////

unsigned char x24c02_read(unsigned char address)

//address 要读的存储单元地址

{

unsigned char i

start()writex(0xa0)//写入器件地址

clock()writex(address)) //写入读取的内部存储单元地址

clock()start()

writex(0xa1)clock() //再向此历燃镇器件写入读命令

i=readx()stop() //获得数据

delay1(10)

return(i)

}

//////向24c02的address地址中写入一字节数据info/////

void x24c02_write(unsigned char address,unsigned char info)//写入时要有地址和数据2个参数

{

EA=0

start()writex(0xa0)

clock()writex(address)

clock()writex(info)

clock()stop()

EA=1

delay1(50)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12485306.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存