<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于STC單片機(jī)EEPROM的應(yīng)用總結(jié)

          關(guān)于STC單片機(jī)EEPROM的應(yīng)用總結(jié)

          作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
          大建議:
          1、同一次修改的數(shù)據(jù)放在同一個(gè)扇區(qū)中不是同一次修改的數(shù)據(jù)放在另外的扇區(qū)就不須讀出保護(hù)。
          2、如果一個(gè)扇區(qū)只用一個(gè)字節(jié),那就是真正的EEPROM,STC單片機(jī)的Dataflash比外部EEPROM要快很多讀一個(gè)字節(jié)/編程一個(gè)字節(jié)大概是2個(gè)時(shí)鐘/55微秒。
          3、如果在一個(gè)扇區(qū)中存放了大量的數(shù)據(jù),某次只需要修改其中的一個(gè)字節(jié)或一部分字節(jié)時(shí),則另外的不需要修改的數(shù)據(jù)須先讀出放在STC單片機(jī)的RAM中,然后擦除整個(gè)扇區(qū),再將需要保留的數(shù)據(jù)和需修改的數(shù)據(jù)按字節(jié)逐字節(jié)寫回該扇區(qū)中(只有字節(jié)寫命令,無(wú)連續(xù)字節(jié)寫命令)。這時(shí)每個(gè)扇區(qū)使用的字節(jié)數(shù)是使用的越少越方便(不需要讀出一大堆需保留數(shù)據(jù))。
          常見(jiàn)問(wèn)題:
          1、IAP指令完成后,地址是否會(huì)自動(dòng)” 加1”或“減1”?
          不會(huì)
          2、送5A和A5觸發(fā)之后下一次IAP命令是否還需要送5A和A5觸發(fā)?
          是,一定要。
          STC12C5201AD/PWM單片機(jī)內(nèi)部EEPROM地址表

          第一扇區(qū)
          第二扇區(qū)
          第三扇區(qū)
          第四扇區(qū)
          每個(gè)扇區(qū)
          512字節(jié)
          建議同一次修改的數(shù)據(jù)放在同一個(gè)扇區(qū),不是同一次修改的數(shù)據(jù)放在不同的扇區(qū),不必用滿,當(dāng)然也可以用滿。
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          0000h
          1FFH
          200H
          3FFH
          400H
          5FFH
          600H
          7FFH
          第五扇區(qū)
          第六扇區(qū)
          第七扇區(qū)
          第八扇區(qū)
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          800H
          9FFH
          A00H
          BFFH
          C00H
          DFFH
          E00H
          FFFH
          第九扇區(qū)
          第十扇區(qū)
          第十一扇區(qū)
          第十二扇區(qū)
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          起始地址
          結(jié)束地址
          1000H
          11FFH
          1200H
          13FFH
          1400H
          15FFH
          1600H
          17FFH

          下面就舉一個(gè)例子來(lái)說(shuō)明一下EEPROM的應(yīng)用
          程序功能:
          三個(gè)按鍵分別是,開(kāi)關(guān)、增大、減小。通過(guò)7段數(shù)碼管將鍵值顯示出來(lái)(1-9)。
          并將開(kāi)關(guān)鍵關(guān)閉前的鍵值保存在EEPROM中,系統(tǒng)再次上電時(shí)顯示上次關(guān)閉前的鍵值。
          #include//頭文件
          #include”intrins.h”
          /******宏定義*************/
          #define uintunsigned int//用unsigned int 代替unsigned int
          #define ucharunsigned char//用uchar 替代unsigned char
          /*********位定義**************/
          sbit SW=P3^2;//開(kāi)關(guān)
          sbit INC=P3^3;//增大按鍵
          sbit DEC=P3^4;//減小按鍵
          sbitDATA=P1^5;//595數(shù)據(jù)流
          sbitSHIFT=P1^6;//595移位寄存器
          sbitSTORAGE=P1^7;//595存儲(chǔ)寄存器
          sbitBEEP=P1^4;//蜂鳴器
          /數(shù)碼管顯示代碼
          uchar codenum[]={0x01,0xf3,0x89,0xa1,0xb2,0xa4,0x84,0xf1,0x80,0x20} ; //0-9代碼
          //變量聲明
          bit kai=0,biaozhi=0;
          uchar MA,dat;
          /*定義與EEPROM相關(guān)的特殊功能寄存器*/
          sfrIAP_DATA=0XC2;//FLASH data register
          sfrIAP_ADDRH=0XC3;//FLASH address high
          sfrIAP_ADDRL=0XC4;//FLASH address low
          sfrIAP_CMD=0XC5;//FLASH command register
          sfrIAP_TRIG=0XC6;//FLSH command trigger
          sfrIAP_CONTR=0XC7;//flashcontrol register
          /*定義IAP/ISP/EEPROM命令*/
          #define CMD_IDLE0//stand_by
          #define CMD_READ1//byte_read
          #defineCMD_PROGRAM 2//byte_program
          #defineCMD_ERASE 3//sector_erase
          /*定義與EEPROM相關(guān)的寄存器 */
          //#defineENABLE_IAP0X80 //if sysclk<30MHz
          //#defineENABLE_IAP0X81 //if sysclk<24MHz
          //#defineENABLE_IAP0X82 //if sysclk<20MHz
          #defineENABLE_IAP0X83 //if sysclk<12MHz//定義控制寄存器
          //#defineENABLE_IAP0X84 //if sysclk<6MHz
          //#defineENABLE_IAP0X85 //if sysclk<3MHz
          //#define ENABLE_IAP 0X86//if sysclk<2MHz
          //#defineENABLE_IAP0X87 //if sysclk<1MHz
          /*定義EEPROM 的起始地址*/
          #defineIAP_ADDRESS 0X0000
          /****初始化函數(shù)**********/
          Void iapidle()
          {
          IAP_CONTR=0;//關(guān)閉IAP功能
          IAP_CMD=0;//CMD寄存器初始化
          IAP_TRIG=0;//清空觸發(fā)寄存器
          IAP_ADDRH=0X80;//數(shù)據(jù)指針指向非EEPROM區(qū)
          IAP_ADDRL=0;//CLEAR IAP address to preventmisuse
          }
          /*讀EEPROM的一個(gè)字節(jié)地址的內(nèi)容
          輸入:地址
          輸出:EEPROM字節(jié)數(shù)據(jù)
          */
          uchar iapreadbyte(uint addr)
          {
          IAP_CONTR=ENABLE_IAP;//設(shè)置IAP控制寄存器
          IAP_CMD=CMD_READ;//設(shè)置IAP的命令寄存器為讀狀態(tài)
          IAP_ADDRL=addr;//設(shè)置EERPROM的低8位地址
          IAP_ADDRH=addr>>8;
          IAP_TRIG=0X5A;
          IAP_TRIG=0XA5;
          _nop_();
          dat=IAP_DATA;
          iapidle();
          return dat;
          }
          /*寫一個(gè)字節(jié)的IAP/ISP/EEPROM空間
          輸入: 字節(jié)地址
          要寫入的數(shù)據(jù)
          Void iapprogrambyte(uint addr,uchar dat)
          {
          IAP_CONTR=ENABLE_IAP;//打開(kāi)IAP功能并設(shè)置等待時(shí)間
          IAP_CMD=CMD_PROGRAM;//設(shè)置寫命令
          IAP_ADDRL=addr;//設(shè)置字節(jié)地址低8位
          IAP_ADDRH=addr>>8;//設(shè)置字節(jié)地址的高8位
          IAP_DATA=dat;//寫內(nèi)容
          IAP_TRIG=0X5A;//發(fā)送觸發(fā)命令1
          IAP_TRIG=0XA5;//發(fā)送觸發(fā)命令2
          _nop_();//等待直到寫操作完成
          Iapidle();
          }
          /*扇區(qū)擦除
          輸入:地址
          Void iaperasesector(uint addr)
          {
          IAP_CONTR=ENABLE_IAP;//開(kāi)IAP功能并設(shè)置等待時(shí)間
          IAP_CMD=CMD_ERASE;//設(shè)置擦除命令
          IAP_ADDRL=addr;
          IAP_ADDRH=addr>>8;
          IAP_TRIG=0x5a;
          IAP_TRIG=0XA5;
          _nop_();
          Iapidle();
          }
          /********寫595函數(shù)*******************/
          void write_595(uchar x)
          {
          uchar j;
          for(j=0;j<8;j++)
          {
          x=x<<1;
          SHIFT=0;
          _nop_();
          _nop_();
          _nop_();
          DATA=CY;
          SHIFT=1;
          _nop_();
          _nop_();
          _nop_();
          SHIFT=0;
          }

          關(guān)鍵詞: STC單片機(jī)EEPRO

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();