智能车制作
标题:
XS128的EEPROM
[打印本页]
作者:
Tom_xuan
时间:
2010-7-11 21:11
标题:
XS128的EEPROM
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit scl=P2^1; //24c16 SCL
sbit sda=P2^0; //24c16 SDA
void x24c16_init() //24c16初始化子程序
{
scl=1;
sda=1;
}
void start() //启动I2C总线
{
sda=1;
scl=1;
sda=0;
scl=0;
}
void stop() //停止I2C总线
{
sda=0;
scl=1;
sda=1;
scl=0;
}
void writex(uchar j) //写一个字节
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
scl=0;
sda=j&0x80;
scl=1;
j<<=1;
}
scl=0;
}
uchar readx() //读一个字节
{
uchar i,x=0;
scl=0;
sda=1; //释放sda总线
for (i=0;i<8;i++)
{
scl=1;
x=x<<1;
if (sda==1) x=x|0x01;
//while(1)
scl=0;
}
return(x);
}
bit Check_ACK(void) //发送完一个字节后,检验设备的应答信号
{
sda=1;
scl=1;
if(sda==1){scl=0; return(1);}
else {scl=0; return 0;}
}
void MasterAck() //主机发送应答信号
{
sda=1;
scl=0;
sda=0;
scl=1;
scl=0;
sda=1;//ACK发送完毕,释放总线
}
void x24c16_write(uchar add,uchar x) //写单个字节
{
do{
start();//重起IIC
writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
}while(Check_ACK());//检查应答 =1,表示无确认,再次发送
writex(add);//2408内部地址
Check_ACK();
writex(x);//向寻到的内部地址写数据
Check_ACK();
stop();//停止IIC
}
uchar x24c16_read(uchar add) //读单个字节
{
uchar i;
do{
start();//重起IIC
writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
}while(Check_ACK());//检查应答 =1,表示无确认,再次发送
writex(add);//设置内部地址
Check_ACK();//检查应答
do{
start();//重起总线
writex(0xa1);//器件寻址并设置为读
}while(Check_ACK());//检查应答
i=readx();//读数据
Check_ACK();
stop();//停止IIC
return(i);
}
void x24c16_Nread(uchar add,uint n,uchar *buff) //读多个字节
{
uchar m;
do{
start();//重起IIC
writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
}while(Check_ACK());//检查应答 =1,表示无确认,再次发送
writex(add);//设置内部地址
Check_ACK();//检查应答
do{
start();//重起总线
writex(0xa1);//器件寻址并设置为读
}while(Check_ACK());//检查应答
for(m=0;m<n;m++)
{
buff[m]=readx();//读数据
if(m!=n-1) MasterAck();//主机发送应答
}
stop();//停止IIC
}
void x24c16_Nwrite(uchar add,uint n,uchar *buff)//写多个字节
{
uint i;
do{
start();//重起IIC
writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
}while(Check_ACK());//检查应答 =1,表示无确认,再次发送
writex(add);//2408内部地址
Check_ACK();
for(i=0;i<n;i++)
{
writex(buff[i]);//向寻到的内部地址写数据
Check_ACK();
}
stop();//停止IIC
}
////////////////////////////////////////////////////
void delay (uchar t)
{
uchar m;
for(;t>0;t--)
for(m=255;m>0;m--)
;
}
void main ()
{
uchar n;
uchar shuju_in;
// uchar shuju_out;
uchar addr=0x00;
uchar shu[]={1,2,4,8,16,32,64,128};
uchar a[8];
shuju_in=0x00;
if((P3&0x04)==0)
{
while(1)
{
x24c16_Nread(addr,8,a);
for(n=0;n<=7;n++)
{
P0=a[n];
delay(255);
delay(255);
delay(255);
delay(255);
}
}
}
else
{
while(1)
{
x24c16_Nwrite(addr,8,shu);
P0=0xfe;
delay(255);
delay(255);
delay(255);
delay(255);
}
}
}
/*while(1) //单字节读写
{
x24c16_write(addr,shuju_in);
;;;
shuju_out=x24c16_read(addr);
P1=shuju_out;
delay(255);
shuju_in++;
}*/
/*while(1) //N字节读写
{
x24c16_Nwrite(addr,8,shu);
;;;
x24c16_Nread(addr,8,a);
for(n=0;n<=7;n++)
{
P0=a[n];
delay(255);
delay(255);
}
}*/
复制代码
有用eeprom的吗?我用51单片机的直接修改一下咋都不行。请高手指点指点。以上是我的51单片机程序。
作者:
GhostStalker
时间:
2010-7-15 13:45
用XS128片内的 DataFlash呗~8KB不用外接了...
具体看 DataSheet或者 用EP生成 bean
作者:
hdfreejz
时间:
2010-11-6 22:12
好好看看资料了
作者:
happygirl
时间:
2011-5-2 21:59
xs128中没有EEPROM的,是用D_FLASH 代替它,所以移植51的程序是不行的。我正在研究,可以讨论
作者:
Rblyun027
时间:
2011-7-25 00:14
回复
4#
happygirl
话说弄出来没???
作者:
NUM师弟
时间:
2013-9-15 19:35
I2C端口一会输入一会而输出,谁能给个权威的??
作者:
萍^_^家安
时间:
2013-12-23 21:06
GhostStalker 发表于 2010-7-15 13:45
用XS128片内的 DataFlash呗~8KB不用外接了...
具体看 DataSheet或者 用EP生成 bean
请教一下,为什么我的掉电不保存数据呢,能指教下吗
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2