找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4021|回复: 3
打印 上一主题 下一主题
收起左侧

求助STC8A8K64S4A12单片机写EEPROM,重启后读EEPROM数据错误

[复制链接]
跳转到指定楼层
楼主
ID:343304 发表于 2020-2-21 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内部晶振22.1184M,想实现启动计数器,保存在EEPROM中(0x0000和0x0001中),测试数据初始值为605,通过szx变量保存,使用了共同体切分两字节。
首次运行带赋值时,TB灯亮,证明变量szx是正常的610以下值(应该为604).再重新写入程序后(去除赋值部分,直接读取EEPROM)TB灯灭,证明数值有错误,请问程序中哪个部分出了问题呢?难道还没写进EEPROM?



#define WT_24M 0x81    //EEPROM 24M晶振延时

sbit RR = P2^1;
sbit GG = P2^2;
sbit BB = P2^3;

sbit TA = P2^4;      
sbit TB = P2^5;      
sbit TC = P2^6;


unsigned int szx;        //EEPROM的计数器变量

void IapIdle()             //EEPROM 结束复位
{
  IAP_CONTR = 0;     //EEPROM 关闭IAP功能
  IAP_CMD = 0;                  //EEPROM 清除命令寄存器
  IAP_TRIG = 0;                  //EEPROM 清除触发寄存器
  IAP_ADDRH = 0x80;         //EEPROM 将地址设置到非IAP区域
  IAP_ADDRL = 0;         //EEPROM
}





char IapRead(unsigned int addr) //EEPROM 读取EEPROM数据 返回整个IapRead函数
{

  unsigned char dat;  

  IAP_CONTR = WT_24M;  //EEPROM 设定延时
  IAP_CMD = 1;                   //EEPROM 设定1读取命令
  IAP_ADDRL = addr;           //EEPROM 指定要读取的低地址
  IAP_ADDRH = addr>>8; //EEPROM 指定要读取的高地址
  IAP_TRIG = 0x5a;           //EEPROM 执行的触发命令
  IAP_TRIG = 0xa5;           //EEPROM 执行的触发命令
  _nop_();
  dat = IAP_DATA;           //EEPROM 读取IAP赋值
  IapIdle();                   //EEPROM 关闭IAP功能

  return  dat;                   //EEPROM 返回整个IapRead函数
}



void IapProgram(unsigned int addr, unsigned char dat)         //EEPROM 把addr地址的资料写成dat的内
{
  IAP_CONTR = WT_24M;  //EEPROM 设定延时
  IAP_CMD = 2;                   //EEPROM 设定2写命令
  IAP_ADDRL = addr;           //EEPROM 指定要写的低地址
  IAP_ADDRH = addr>>8; //EEPROM 指定要写的高地址
  IAP_DATA = dat;           //EEPROM 写IAP数据
  IAP_TRIG = 0x5a;           //EEPROM 执行的触发命令
  IAP_TRIG = 0xa5;           //EEPROM 执行的触发命令
  _nop_();
  IapIdle();                   //EEPROM 关闭IAP功能
}


void IapErase(unsigned int addr)          //EEPROM 擦除EEPROM数据     
{
  IAP_CONTR = WT_24M;  //EEPROM 设定延时
  IAP_CMD = 3;                   //EEPROM 设定3擦除命令
  IAP_ADDRL = addr;           //EEPROM 指定要擦除的低地址
  IAP_ADDRH = addr>>8; //EEPROM 指定要擦除的高地址
  IAP_TRIG = 0x5a;           //EEPROM 执行的触发命令
  IAP_TRIG = 0xa5;           //EEPROM 执行的触发命令
  _nop_();
  IapIdle();                   //EEPROM 关闭IAP功能
}



void main()
{

  union hecheng                         //EEPROM 定义一个共同体
   {
    unsigned char qw[2];        //EEPROM qw有2个char           加入了unsigned
        unsigned int er;                  //EEPROM er是无字符整型
   }hc;                                  //EEPROM 共同体名称为hc




  hc.qw[0]=IapRead(0x0000);         //EEPROM  读0x0000到hc[0]
  hc.qw[1]=IapRead(0x0001);         //EEPROM  读0x0002到hc[1]

  szx = hc.er;
//  szx = 605;    //首次编译预赋值,保存在EEPROM中,下次重新编译去除,并且不清除EEPROM中数据


  if(szx <= 585)
   {
    TC = 0x0;                                //EEPROM R38(LED)
        while(1);                                //EEPROM 判断次数为,停止操作
   }

  szx--;
  hc.er = szx;


   IapErase(0x0000);                         //EEPROM  先擦除0x0000扇区
   IapProgram(0x0000,hc.qw[0]);         //EEPROM  写hc[0]到0x0000
   IapProgram(0x0001,hc.qw[1]);         //EEPROM  写hc[1]到0x0002

  hc.qw[0]=IapRead(0x0000);         //EEPROM  读0x0000到hc[0]
  hc.qw[1]=IapRead(0x0001);         //EEPROM  读0x0002到hc[1]

  if(szx == hc.er)
   {
    TA = 0x0;                                //EEPROM R34(LED)   }

  if(szx >= 610)
   {
    TB = 0x0;                                //EEPROM R36(LED)   }

}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-2-21 23:06 | 只看该作者
STC单片机空白EEPROM的寄存器都是0xFF,上电读EEPROM的数据不在特定范围就认为是首次上电,写初始数据到EEPROM。以后上电读EEPROM的数据在特定范围就不会改写。这样就不必分两次下载程序。
楼主这个程序好像写入的数据虽然是605,但最终得到的数据是未必是604。因为main()内没有约束,执行完跳出后再入,直到满足if(szx <= 585)条件程序才会停留在while(1);。
回复

使用道具 举报

板凳
ID:343304 发表于 2020-2-22 09:03 | 只看该作者
wulin 发表于 2020-2-21 23:06
STC单片机空白EEPROM的寄存器都是0xFF,上电读EEPROM的数据不在特定范围就认为是首次上电,写初始数据到EEP ...

很好的建议,已经使用,并且程序通过了~谢谢你!
回复

使用道具 举报

地板
ID:537245 发表于 2021-7-30 16:26 | 只看该作者
wulin 发表于 2020-2-21 23:06
STC单片机空白EEPROM的寄存器都是0xFF,上电读EEPROM的数据不在特定范围就认为是首次上电,写初始数据到EEP ...

感谢,看了一下就明白了,刚开始一直下载2次,第二次下载后读数据总是不对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表