STC内部EEPROM读写不运行,单片机型号为STC12C5a08S2,晶振为3.6864M,跪求高手指点,如果调通另外附上100
子程序如下:sfrWDT_CONTR=0Xe1;//这边有的资料是0xc1,也试过sfrisp_data=0xe2;sfrisp_addrh=0xe3;sfrisp_ad...
子程序如下:
sfr WDT_CONTR=0Xe1;//这边有的资料是0xc1,也试过
sfr isp_data=0xe2;
sfr isp_addrh=0xe3;
sfr isp_addrl=0xe4;
sfr isp_cmd=0xe5;
sfr isp_trig=0xe6;
sfr isp_contr=0xe7;
void eeprom_eares(unsigned int addres)//扇区擦除。
{
unsigned i;
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x04;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x03; //扇区命命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
void eeprom_write(unsigned int addres,unsigned char write_data)//写数据。
{
unsigned char i;
isp_data=write_data; //要写入的数据。
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x04;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x02; //写命令
isp_trig=0x46; //触发//有资料说是0x5A。也试过
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
unsigned char eeprom_read(unsigned int addres)
{
unsigned char i,z;
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x04;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x01; //写命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
z=isp_data;
return(z);
}
void read()
{
unsigned char i=0;
unsigned char j=0;
unsigned int addres;
// unsigned char write_data;
for(i=0;i++;i<5)
for(j=0;j++;j<6)
{
addres=addr+i*10+j;
tab_disp[i][j]=eeprom_read(addres);
WDT_CONTR=0X35;
}
}
void stor()
{
unsigned char i=0;
unsigned char j=0;
unsigned int addres;
unsigned char write_data;
for(i=0;i++;i<5)
for(j=0;j++;j<6)
{
addres=addr+i*10+j;
write_data=tab_disp[i][j];
eeprom_eares( addres);
eeprom_write( addres, write_data);
WDT_CONTR=0X35;
}
}
现象就是根本不读写 展开
sfr WDT_CONTR=0Xe1;//这边有的资料是0xc1,也试过
sfr isp_data=0xe2;
sfr isp_addrh=0xe3;
sfr isp_addrl=0xe4;
sfr isp_cmd=0xe5;
sfr isp_trig=0xe6;
sfr isp_contr=0xe7;
void eeprom_eares(unsigned int addres)//扇区擦除。
{
unsigned i;
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x04;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x03; //扇区命命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
void eeprom_write(unsigned int addres,unsigned char write_data)//写数据。
{
unsigned char i;
isp_data=write_data; //要写入的数据。
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x04;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x02; //写命令
isp_trig=0x46; //触发//有资料说是0x5A。也试过
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
unsigned char eeprom_read(unsigned int addres)
{
unsigned char i,z;
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x04;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x01; //写命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
z=isp_data;
return(z);
}
void read()
{
unsigned char i=0;
unsigned char j=0;
unsigned int addres;
// unsigned char write_data;
for(i=0;i++;i<5)
for(j=0;j++;j<6)
{
addres=addr+i*10+j;
tab_disp[i][j]=eeprom_read(addres);
WDT_CONTR=0X35;
}
}
void stor()
{
unsigned char i=0;
unsigned char j=0;
unsigned int addres;
unsigned char write_data;
for(i=0;i++;i<5)
for(j=0;j++;j<6)
{
addres=addr+i*10+j;
write_data=tab_disp[i][j];
eeprom_eares( addres);
eeprom_write( addres, write_data);
WDT_CONTR=0X35;
}
}
现象就是根本不读写 展开
3个回答
展开全部
宏晶科技网站下载的STC12C5A32AD的PDF文档上有eeprom操作的完整C语言例子,你仔细对比一下就可以了, isp_trig=0x46; //触发//有资料说是0x5A。也试过
isp_trig=0xb9; //触发启动。
什么叫试过?本来就该写为 isp_trig=0x5a; isp_trig=0xa5; 的,你那是STC12C5620系列的eeprom的写法,addres=addr+i*10+j;地址是在同一个扇区的话,那你的写法就同楼上说的,重复代码部分怎么不写成子函数呢,读写擦除这三个函数就按他们文档的就可以了,具体的eeprom的操作只要记得写之前擦除,数据每个扇区尽量放一个就万事大吉,同一扇区放很多数据,记得擦除之前先读到RAM,然后再同新数据一起写进新扇区就好了,
isp_trig=0xb9; //触发启动。
什么叫试过?本来就该写为 isp_trig=0x5a; isp_trig=0xa5; 的,你那是STC12C5620系列的eeprom的写法,addres=addr+i*10+j;地址是在同一个扇区的话,那你的写法就同楼上说的,重复代码部分怎么不写成子函数呢,读写擦除这三个函数就按他们文档的就可以了,具体的eeprom的操作只要记得写之前擦除,数据每个扇区尽量放一个就万事大吉,同一扇区放很多数据,记得擦除之前先读到RAM,然后再同新数据一起写进新扇区就好了,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void stor()
这函数里的eeprom_eares( addres);
eeprom_write( addres, write_data);
这有问题,写之前只需要擦除需要操作的山区就行,不用每次都擦,你看下数据手册,它的擦除是擦扇区不是擦字节,按你的程序,只能写进去最后一个字节数据
这函数里的eeprom_eares( addres);
eeprom_write( addres, write_data);
这有问题,写之前只需要擦除需要操作的山区就行,不用每次都擦,你看下数据手册,它的擦除是擦扇区不是擦字节,按你的程序,只能写进去最后一个字节数据
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询