標題: 十速單片機TM52系列實現(xiàn)掉電記憶源程序 [打印本頁]

作者: gewen9941    時間: 2019-12-18 16:49
標題: 十速單片機TM52系列實現(xiàn)掉電記憶源程序
用SRAM做掉電記憶可能存在的一些情況:
用戶在做掉電記憶時,如果程序處理不好,就有可能出現(xiàn)“模式變亂”、“時間變亂”、“顯示黑屏(死機假象)”、“按鍵無效”等情況。
如果出現(xiàn)“模式變亂”、“時間變亂”用戶還可以手動取消,但如果出現(xiàn)“顯示黑屏(死機假象)”等情況會比較麻煩,必須要等VDD電容的存電差不多完全放干才能重新工作?梢哉f這是一個致命的問題。

內(nèi)有詳細的代碼和說明,詳見附件。

單片機源程序如下:
  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   建議上電慢鐘延時一下  起到電壓穩(wěn)定作用。

  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=選擇快時鐘為系統(tǒng)時鐘源,0=慢時鐘為系統(tǒng)時鐘源
  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,否則可能出現(xiàn)查表溢出跑飛
  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;   //判斷幾個變量,判斷的個數(shù)越多約好
  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);  主循環(huán) 幾個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, 下載次數(shù): 41)



作者: world_all    時間: 2020-2-24 15:17
這個不是一般用匯編來搞么
作者: 312439374    時間: 2020-12-12 08:38
請問十速TM52系列的單片機只能通過燒錄器下載程序嗎?燒錄器哪里有便宜的賣的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1