找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4326|回复: 2
收起左侧

十速单片机TM52系列实现掉电记忆源程序

[复制链接]
ID:667529 发表于 2019-12-18 16:49 | 显示全部楼层 |阅读模式
用SRAM做掉电记忆可能存在的一些情况:
用户在做掉电记忆时,如果程序处理不好,就有可能出现“模式变乱”、“时间变乱”、“显示黑屏(死机假象)”、“按键无效”等情况。
如果出现“模式变乱”、“时间变乱”用户还可以手动取消,但如果出现“显示黑屏(死机假象)”等情况会比较麻烦,必须要等VDD电容的存电差不多完全放干才能重新工作。可以说这是一个致命的问题。

内有详细的代码和说明,详见附件。

单片机源程序如下:
  1. //--------------------------------------------------
  2. #include "REGtenxTM52F5274B.h"   
  3. #include "Intrins.h"


  4. #define uchar unsigned char
  5. #define ulong unsigned long
  6. #define uint unsigned int


  7. unsigned char        idata        hour,min,work_menu;
  8. unsigned int        idata        checksum;


  9.   unsigned char idata RamFlag0 _at_ 0xe0;  // 强制定义的寄存器不要用到最后0xfx   保留最后尽量多些 SRAM keil 用来做堆栈 ,至少是十几个
  10.   unsigned char idata RamFlag1 _at_ 0xe1;
  11.   unsigned char idata RamFlag2 _at_ 0xe2;
  12.   unsigned char idata RamFlag3 _at_ 0xe3;
  13.   unsigned char idata RamFlag4 _at_ 0xe4;
  14.   unsigned char idata RamFlag5 _at_ 0xe5;




  15. void SysInit(void)
  16. {
  17.        
  18. }

  19. void scan_time()
  20. {
  21.        
  22. }
  23. void scan_key()
  24. {
  25.        
  26. }





  27. //-------------------------------------------------
  28. void main(void)

  29. {       
  30.         unsigned  char idata i;
  31.        
  32.        
  33.        
  34.                 for(i=0;i<150;i++) CLRWDT=1;          // 在慢钟下延时约70MS   建议上电慢钟延时一下  起到电压稳定作用。

  35.        
  36.                 CLKPSC_H=1;
  37.                 CLKPSC_L=0;
  38.                                         //CLKCON = 0x02; 上电分频后要延时8~10个nop
  39.                 _nop_();            
  40.                 _nop_();
  41.                 _nop_();
  42.                 _nop_();     
  43.                 _nop_();
  44.                 _nop_();
  45.                 _nop_();     
  46.                 _nop_();
  47.                 FCKTYPE=0;              //0=FRC, 1=FXT
  48.                 _nop_();
  49.                 _nop_();
  50.                 _nop_();     
  51.                 _nop_();   
  52.                 SELFCK=1;               //1=选择快时钟为系统时钟源,0=慢时钟为系统时钟源
  53.                                        //切快钟后也要延时 8~10个nop
  54.                 _nop_();            
  55.                 _nop_();
  56.                 _nop_();
  57.                 _nop_();     
  58.                 _nop_();
  59.                 _nop_();
  60.                 _nop_();     
  61.                 _nop_();
  62.                 SCKTYPE=0;              //Slow Clock Type. 1=SXT, 0=SRC
  63.                 _nop_();
  64.                 _nop_();
  65.                 _nop_();
  66.                   
  67.         if( hour>23||min>59 )
  68.                 goto ram_clr;   //务必对一些寄存器卡范围,超范围就清SRAM,否则可能出现查表溢出跑飞
  69.           
  70.         if( hour+min+work_menu!=checksum )  
  71.                 goto ram_clr;        //切记 必须要对需要记忆的寄存器做校验和处理,如时间 菜单等等。不可以抱侥幸心理(因为判断的SRAM记得住,并不代表要记忆的变量也一定记得住,最方便就是计算检验和)   
  72.                                 //或者单独用一个变量 一对一备份
  73.           
  74.         //另外客户也可以对重要的变量进行单独备份,例如hour、min
  75.        
  76.         if( RamFlag1!=0x11 || RamFlag2!=0x55 || RamFlag3!=0xaa || RamFlag4!=0xf5 || RamFlag5!=0xdd )
  77.                 goto ram_clr;   //判断几个变量,判断的个数越多约好
  78.         else
  79.                 goto  no_clr_ram; //记得住  可以不清
  80.        
  81.        

  82. ram_clr:         
  83.         #pragma asm   //;程序这里只是清 IDATA 256个SRAM,用户应该默认上电把XDATA都清掉比较好 在.A51里面设定 XDATALEN 的清楚长度即可
  84.         MOV R0,#255
  85.             CLR A
  86. IDATALOOP2:           
  87.             MOV @R0,A
  88.             DJNZ R0,IDATALOOP2       
  89.         #pragma endasm


  90. no_clr_ram:   
  91.         RamFlag1=0x11;
  92.         RamFlag2=0x55;
  93.         RamFlag3=0xaa;
  94.   RamFlag4=0xf5;
  95.         RamFlag5=0xdd;  
  96.        
  97.        
  98.         SysInit();


  99.         while(1)
  100.         {                       
  101.                 //---while(!f_4ms);  主循环 几个MS扫一圈
  102.                
  103.                 scan_time();
  104.                 scan_key();
  105.                 checksum=hour+min+work_menu;  //用户比较方便就是在每一圈后面 重新计算一下checksum
  106.                        
  107.                
  108.         }       
  109. }
复制代码

所有资料51hei提供下载:
TM52掉电记忆AP NOTE.zip (597.59 KB, 下载次数: 41)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:229137 发表于 2020-2-24 15:17 | 显示全部楼层
这个不是一般用汇编来搞么
回复

使用道具 举报

ID:367875 发表于 2020-12-12 08:38 | 显示全部楼层
请问十速TM52系列的单片机只能通过烧录器下载程序吗?烧录器哪里有便宜的卖的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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