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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STC單片機外擴RAM及8255需要注意的問題

          STC單片機外擴RAM及8255需要注意的問題

          作者: 時間:2012-08-24 來源:網絡 收藏

          因為一個小小的疏忽會讓人陷入僵局(分享給用STC89C52單片機的同行們,不要再次在此類問題上浪費不必要時間):

          今晚與以往一樣,還是為那個一直解不開的問題愁眉苦腦著,其它的材料也已經搜了上百份,理論對的已經不能再對了,但是在做起來就是沒反應。以前花了10元買了一片,為了實現它的操作,搜了大量資料,終于明白原來是用到類似外擴的程序,于是慢慢的搞懂了外擴的時序以及程序,自己試寫了一個,下載進去,令我出乎意料的時,竟然一點反應也沒有,第一個懷疑的就是可能硬件設置出了問題了吧,于是重新設計了一個,繼續(xù)把程序下載進去,令我失望的還是那個結局。我不得不懷疑可能是程序出了問題了,于是到圖書館把所有用C語言編程的課本借回來,精讀了所有外擴這一塊。終于把程序搞的沒問題了,很自信的又寫了一個,下載進去,竟然還是那個結局,我又不得不懷疑難道這一塊必須用匯編才行嗎,我對匯編可是一點也不懂啊,可是看了很多資料這個程序,用匯編寫的外擴程序都有對應的C語言代碼,C語言代碼百分之百可行啊,一時陷入了僵局,一僵就是兩個月,每天開電腦的第一件事就是找資料找資料。

          最后的一個月又開始按照原來的思路重新布置了一下硬件,希望能有奇跡發(fā)生,最后還是失望,每次都想撂下這一塊但總是沒舍得,幾次試驗,最后我懷疑應該是STC89C52有問題吧,但對自己的懷疑又很快作了否定。為什么其他所有的51單片機都能實現這個功能,這個宏晶公司生產的STC就不行呢,難道有什么特殊地方嗎。一時不知所措,還是絞盡腦汁來證明這類片子確實有問題,終于想了很多方法,最能確定額問題存在的就是用DAC0832雙緩沖方式和用外部中斷的負跳變沿方式來觸發(fā)中斷并確定有高向低的電平是否的存在,猜想與試驗完全相符。

          終于確定是片子的原因,既然找不出來,以后還是不想再研究這方面的原因了,還是繼續(xù)安安穩(wěn)穩(wěn)的學我的AVR單片機吧,終于把這塊放棄了,但是每次開電腦好似習慣了這三個月的一個動作,就是到www.51hei.com找技術文檔看。今晚的一個偶然的機會看了看STC89C52的官方中文資料,一個讓人都不懂的地方,也經常被略過去的方引起了我的注意。就是在文檔的中部講到“禁止內部擴展的EXTRAM”找到了答案,原來想現在AT89C5X和STC89C5X跟以前相比的51單片機都是增強型的,里面又增加了很多寄存器單元和功能,針對STC89C52內部有EXTRAM的擴展部分,默認時寄存器的值為零,不能訪問外部64K空間,或者說訪問的時候不對此進行設置,會發(fā)生沖突。造成工作的異常。必須先對AUXR進行位定義,sfr AUXR=0x8e,然后賦值AUXR=0x02;將EXTRAM的控制位設置為1,禁止EXTRAM的訪問,以防沖突。寫完程序下載到里面一看,期待已久的奇跡終于發(fā)生了,P0和P2口作為數據地址總線是終于有數據輸出了。所謂的英特爾總線的操作終于實現了。我的用STC89C52學習單片機的同學們,以后千萬注意了不要忽視這一點,外擴設置一下寄存器,寫上“sfr AUXR=0x8e;AUXR=0x02;”這兩句。并且用這種所謂英特爾總線的方法操作外部設備程序極為簡便,同學們趕緊學學吧!



          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();