欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11890|回復: 4
收起左側

51單片機外擴RAM,ROM操作

[復制鏈接]
ID:366951 發表于 2018-7-7 17:38 | 顯示全部樓層 |閱讀模式
這是51單片機內置的功能,可以讓我們少寫很多時序,讓代碼變的整潔好看。

      這里先拓展點小知識:RAM,ROM的區別,地址數據總線,控制總線。

                1.RAM是一種掉電會丟失數據的可讀可寫的存儲器。//其實題目上寫的是外擴ram,但很多時候我們很少來外擴ram,          都是外擴各種外圍器件,比如ADC,DAC,等等等

                2.ROM是掉電不丟失,只讀的存儲器。

                3.51單片機P0口是低8地址和數據總線復用。P2口是高8位地址總線。

              4.數據總線是用來傳輸數據的,地址總線是用來選擇地址的,51單片機地址總線是16根,也就是外擴最大內存為    2^16=64K;

                5.控制總線就是單片機發出的各種控制信號線,比如讀寫時序產生WR/RD,低8位地址鎖存信號線ALE等...

        然后我們進入正題。如果是學過單片機原理的小伙伴們應該知道這兩個操作指令 MOVX,MOVC,如果用我們用匯編寫外擴RAM、ROM,就是用這兩個操作指令,當出現這兩個操作指令的時候,單片機的相關引腳就會產生對應的時序,這樣我們把相關外擴器件與之相連的時候,就不用去管時序的問題了。

                MOVX  A,@DPTR    //讀外擴ram,產生讀時序,由WR/p3.6產生

                MOVX  @DPTR,A    //寫外擴ram,產生寫時序,由RD/p3.7產生

                MOVC  A,@DPTR    //讀外擴rom,產生讀時序,由PSEN產生

                我這里這介紹RAM的讀寫。當我們發出一條MOVX指令的時候,先發出16位地址,產生控制時序,然后在寫(讀)數據,這個時候,我們低8位地址總線就與數據總線沖突了(因為都是用的P0口),使用如果我們要時候低8位地址去限定的時候,就可以就一個鎖存器,來鎖存低8位地址(這個時候要用到鎖存信號引腳ALE),再比如我們外圍器件不多的時候,或者外擴ram不超過2^8=256B的時候,完全可以不管低8位。

                然后就是我們讀寫控制線都有效時序都是由高到低,當數據讀寫完后,在變為高電平,你們要注意自己控制的外圍器件的時序,看要不要加非門處理一下讀寫時序,比如控制LCD1602的時候。

                我們大致了解了這個控制過程(想詳細了解的建議去看書,單片機原理),我們在開發的過程中很少用匯編寫項目,下面我們就來看看C語言的寫法。

                首先我們來看一看下面的關鍵字:                 

                        code   以MOVC @A+DPTR 讀取的程序內存

                        data   可以直接存取的內部數據存儲器

                        idata   以 MOV@Rn 存取的內部數據存儲器

                        bdata   可以位尋址(BitAddressable)的內部存儲器

                        xdata   以MOVX @DPTR 存取的外部數據存儲器

                        pdata   以MOVX @Rn 存取的外部數據存儲器

                我們一般都只用到 xdata,我們在頭文件<absacc.h>中可以看到這樣一個定義

                 #define XBYTE ((unsigned char voalite xdata*)0)

                這樣一個宏定義,這個宏定義我按我自己的理解去演示一遍,

                當我們用XBYTE[0X1000]=1;

                想當于  MOV @DPTR,1000H

                            MOV  A,#1

                            MOVX @DPTR,A

                把1寫到外部ram地址位0x1000中,如果是 i=XBYTE[0X1000];這就是讀了,意思是差不多的。

                 這個地址0x1000,就是通過地址總線發出去的,P0發送0x00也就是低8位,P2發送0x10也就是高8位,發送地址后,控制線發出對應的控制時序,ALE發送鎖存,WR發出一個下降沿,這個時候在通過數據總線P0發送1出去。WR在復位到高電平。這就是大概流程。

          當我們不是外擴ram的時候 XBYTE[]中的地址應該怎么去填呢,我們來舉的DAC0832的例子,借用的別人的圖
20180314211646764.png
        我們0832是在片選CS為低的時候,給WR低電平就可以工作了。

         上圖我們可以明顯體會到用外擴ram這種編程方法的便利,以及節省很多資源了(用i/o直接操作的話,不加額外的器件,連接兩個DAC起碼要16個引腳)。

          當我們想讓dac0832(1)工作,但片2不工作,就要讓P2.7=0,P2.6=0,P2.5=1。是不是這樣的。

          所以我們片1的地址高3位就出來了,其余的地址都影響不到它,所以我們稱為地址無關位,我們任意填什么都可以,為了方便,我就填0。那么片1的地址  是不是就是XBYTE[0X2000] (001 0 0000 0000 0000),是不是就是這樣的,

           同理片2的就為 XBYTE[0X8000] (100 0 0000 0000 0000) 。

            當我們寫 XBYTE[0x2000]=0xff;這句話,是不是就啟動了dac0832,并寫入了0xff。

            其實大家可以去看書上單片機外擴程序存儲器的工作時序圖,多想想這個過程,就可以很輕松的去運用他了,可以讓自己輕松很多,并且玩法有很多很多。
回復

使用道具 舉報

ID:546698 發表于 2019-6-1 20:24 | 顯示全部樓層
謝謝。               
回復

使用道具 舉報

ID:237723 發表于 2019-6-2 08:12 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:273087 發表于 2019-7-10 14:58 | 顯示全部樓層
可以參考一下這款 VTI7064LSMxx.pdf (1.18 MB, 下載次數: 25)
回復

使用道具 舉報

ID:242746 發表于 2019-12-8 20:15 | 顯示全部樓層
可不可以從外部ram取指令
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表