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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)的軟件復(fù)位

          51單片機(jī)的軟件復(fù)位

          作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          請(qǐng)先看最下面的程序
          這是一款針對(duì)Keil軟件的,被稱作“純軟件”復(fù)位的程序。所謂“純軟件”是指它沒有直接操作硬件以及寄存器。
          事實(shí)上如果不懂硬件和匯編也不可能有這段C程序,不管怎么樣,我們還是來看一看它的真面目:
          我們知道51 單片機(jī)
          可以把數(shù)據(jù)放在程序存儲(chǔ)器里面,也就是程序和數(shù)據(jù)沒有本質(zhì)區(qū)別,都是一些特定的數(shù)據(jù)。如果我們將一段程序,以數(shù)組數(shù)據(jù)的形式存儲(chǔ)在程序存儲(chǔ)器里面,那么是不是也可以執(zhí)行呢?答案是肯定的。
          -
          言歸正傳,先來看看這個(gè)數(shù)組數(shù)據(jù) 0xe4,0xc0,0xe0,0xc0,0xe0,0x22,中Keil的匯編窗口看出,它其實(shí)是四條匯編語(yǔ)句:
          CLR A ;編譯后為 0XE4
          PUSH ACC ;編譯后為 0XC0 0XE0
          PUSH ACC ;編譯后為 0XC0 0XE0
          RET ;函數(shù)返回 編譯后為 0X22可以看出,其實(shí)這就是51 單片機(jī) 的匯編復(fù)位指令。
          其實(shí)這里只是C復(fù)位代碼的寫法難看而已,rst是一個(gè)指向程序存儲(chǔ)器的字節(jié)指針,我們把它轉(zhuǎn)換為指向返回為空的函數(shù)的指針,返回為空的函數(shù)指針的格式為:void
          (*)(),這個(gè)表達(dá)式比較復(fù)雜因運(yùn)算符優(yōu)先級(jí)關(guān)系,用括號(hào)括號(hào)括起來,就成了(void
          (*)())rst,這樣rst就成函數(shù)指針了,再來看看求函數(shù)指針的一般格式(*p)(),把p代換成(void
          (*)())rst括起來就成了(*((void (*)())rst))(),這說將這個(gè)復(fù)位的全部面紗揭開了。
          以下為測(cè)試,驗(yàn)證程序:
          #include
          main()
          {
          unsigned char code rst[6]={0xe4,0xc0,0xe0,0xc0,0xe0,0x22};//定義一個(gè)code類型的數(shù)組,一定要為code類型
          while(1)//循環(huán)測(cè)試
          {
          TMOD=5;//測(cè)試用可以是任何語(yǔ)名
          TI=1;
          P1=0;
          P1=1;
          P2=2;
          P3=3;
          (*((void (*)())rst))();//復(fù)位
          SCON=0x50;
          }
          }


          關(guān)鍵詞: 51單片機(jī)軟件復(fù)

          評(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); })();