hua7718534 发表于 2023-8-3 15:18:31

求助STC15W204S改用STC8G1K08A 为什么EEPROM掉电不存储的问题

以下为程序代码:#include <intrins.h>
#include <STC8G.h>
                                                         
#define uchar unsigned char
#define uintunsigned int

sbit RF                           =      P3^2;          //信号输入
sbit WE               =      P3^0;          //指示灯
sbit set               =      P3^3;          //学习键                                                         
sbit D0                        =      P5^4;          //机械手正极         
sbit D2                        =      P5^5;          //机械手负极

bit decode_ok;                  //解码成功
bit rf_ok;                  //收到有效数据
bit study;            //学习标志
bit jmnx;             //编码类型 0是2262,1是1527
uchar da1527;   //解码过程中临时数组
uchar key_d;          //遥控器按键码
uchar short_k;      //窄脉冲宽度
//uchar temp=0;                  //延时时间值S
uchar idata key_number;                //遥控器编码数组,存放10个遥控器

void delay_1ms(uint x)    //1毫秒延时
{
      uchar b,c;
      for(x;x>0;x--)
                {
                        for(b=3;b>0;b--)
                              {
                                        for(c=150;c>0;c--);
                              }
                }
}
void delay(uint ms)//
{
while(ms--)
    {
         ms++;
         ms++;
         ms--;
         ms--;
    }
}


//====================================================
/////////片内EEPROM读写驱动程序///////////////////////////
//====================================================


void IAP_Disable()         //关闭IAP
{
    //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    IAP_CONTR = 0;      //关闭IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
    IAP_TRIG = 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
    IAP_ADDRH = 0x80;
    IAP_ADDRL = 0;
}//



//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
uchar read_add(uint addr)         //读EEPROM
{
    uchar dat;
      
    IAP_CONTR = 0x80;         //打开IAP 功能, 设置Flash 操作等待时间
      IAP_TPS = 12;
    IAP_CMD = 0x01;               //IAP/ISP/EEPROM 字节读命令

    IAP_ADDRH = addr>>8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL = addr;    //设置目标单元地址的低8 位地址

    EA = 0;
    IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
      IAP_DATA = dat;
    EA = 1;
    IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                  //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    return dat;
}//------------------------------------------------------------------------------


//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void write_add(uint addr,uchar ch)         //直接写EEPROM
{
    IAP_CONTR = 0x80;         //打开 IAP 功能, 设置Flash 操作等待时间
      IAP_TPS = 12;
    IAP_CMD = 0x02;               //IAP/ISP/EEPROM 字节编程命令


    IAP_ADDRH = addr>>8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL = addr;    //设置目标单元地址的低8 位地址

    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
    EA = 0;
    IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                  //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}//------------------------------------------------------------------------------
//擦除扇区, 入口:DPTR = 扇区地址


void Sector_Erase(uint addr)         //扇区擦除
{
   IAP_CONTR = 0x80;         //打开IAP 功能, 设置Flash 操作等待时间
         IAP_TPS = 12;
   IAP_CMD = 0x03;               //IAP/ISP/EEPROM 扇区擦除命令

    IAP_ADDRH =addr>>8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL =addr;    //设置目标单元地址的低8 位地址

    EA = 0;
    IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
      IAP_Disable();
}//------------------------------------------------------------------------------


void key_buffer()                  //把遥控器码从 EEPROM 复制到DATA
{
      uchar n;

      for(n=0;n<60;n++)
                {
                   key_number=read_add(0x0000+n);                        
                }
}

void KEY_study()      //遥控器学习
{      
      uchar num_rf;
      uint d_num;
      if(study)
                {
                           rf_ok=0;
                        d_num=0;
      
                        while(!rf_ok)
                              {
                                        RF_decode();
                                        d_num++;
                                        if(d_num>50000) break;                                                                        
                              }
                        d_num=0;
                        if(rf_ok==1)
                              {

                                        num_rf=key_number;               
                                        if(num_rf>60){num_rf=0;}      //
                                        key_number=da1527;
                                        key_number=da1527;
                                        key_number=da1527;
                                        key_number=num_rf+1;

                                        Sector_Erase(0x0000);
                                        for(num_rf=0;num_rf<60;num_rf++)
                                                {
                                                      write_add(0x0000+num_rf,key_number);
                                                      
                                                }
                                        rf_ok=0;
                                        WE=1;                   //学习成功                                       
                                  }      
                              else
                                        {
                                                rf_ok=0;

                                                for(num_rf=0;num_rf<8 ;num_rf++)                   //操作超时
                                                      {
                                                                WE=!WE;
                                                                delay_1ms(100);                                                      
                                                      }                                                                                                                  
                                                 WE=1;
                                       
                                        }
                        d_num=0;
                        study=0;               
                }      

}

void system_res()//系统清零         
{
      
          Sector_Erase(0x0000);      
      write_add(0x0000,0x00);      
      key_buffer();               

}

void set_scan()          //判断学习键状态
{
   uint h=0;

while(!set)         
      {                        
                if(h>8)
                        {
                              D0=~D0;D2=~D2;
                              WE=1;
                              delay_1ms(1000);
                              WE=0;      
                              while(!set)
                                        {
                                          delay_1ms(50);
                                          h++;
                                          if(h>240)
                                                {
                                                   study=1;
                                          h=0;
                                          WE=1;
                                                      while(!set)
                                                             {
                                                       delay_1ms(50);
                                                       h++;
                                                       if(h>360)
                                                         {
                                                                     study=0;
                                                                   h=0;
                                                                   system_res();
                                                                   WE=1;
                                                                           delay_1ms(1500);
                                                                           WE=0;
                                                                           delay_1ms(1500);
                                                                           WE=1;
                                                                           delay_1ms(1500);
                                                                           WE=0;
                                                                           delay_1ms(1500);
                                                                           WE=1;
                                                                           delay_1ms(1500);
                                                                           WE=0;
                                                                   while(!set);
                                                         }
                                                         }
                                       
                                          }
                                 }
                         }
               delay_1ms(50);
                  h++;
         }                                                                              
if(study)
                {
                        KEY_study();
                }         
}

void system_start()   //上电初始化
{      
    P3=0xff;
    P3M1&=~(1<<0);
      P3M0|=(1<<0); //设置 P3.0为推挽输出
      P5M1&=~(1<<4);
      P5M0|=(1<<4); //设置 P5.4为推挽输出
    P5M1&=~(1<<5);
      P5M0|=(1<<5); //设置 P5.5为推挽输出
//P1=0xff;
      key_buffer();
      D0=0;D2=1;WE=0;
}

void main()
{

system_start();

while(1)
      {
                RF_decode();
                set_scan();

      }

}

神农鼎 发表于 2023-8-3 19:41:00

你看 STC8G的数据手册,使用上多了个寄存器,不一样的


hua7718534 发表于 2023-8-5 13:06:42

IAP_CONTR = 0x80;         //打开IAP 功能, 设置Flash 操作等待时间
         IAP_TPS = 12;
   IAP_CMD = 0x03;               //IAP/ISP/EEPROM 扇区擦除命令

这几个地方都有设置呀,是不是说烧录的时候选择应该为12M频率

hua7718534 发表于 2023-8-5 13:58:05

   IAP_TPS = 12; 这个改成11.0592M有没有方法

神农鼎 发表于 2023-8-5 15:50:21

11.0592MHz,   IAP_TPS = 11;
页: [1]
查看完整版本: 求助STC15W204S改用STC8G1K08A 为什么EEPROM掉电不存储的问题