#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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)