久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11541|回復: 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的例子,借用的別人的圖

        我們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。

            其實大家可以去看書上單片機外擴程序存儲器的工作時序圖,多想想這個過程,就可以很輕松的去運用他了,可以讓自己輕松很多,并且玩法有很多很多。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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)
回復

使用道具 舉報

5#
ID:242746 發表于 2019-12-8 20:15 | 只看該作者
可不可以從外部ram取指令
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九热在线观看视频 | 欧美一级免费片 | 亚洲一区二区三区免费在线观看 | 91一区二区三区在线观看 | h在线 | 国产精品久久久久久久 | 天天久久 | 在线看av网址 | 国产成人精品999在线观看 | 国产高清视频一区二区 | 国产乱码精品一区二区三区忘忧草 | 日韩免费网站 | 国产一区二区在线播放视频 | 国产欧美精品一区二区色综合 | 99re视频在线 | 国产不卡一区在线观看 | 亚洲国产一区二区三区 | 亚洲日本免费 | 久久影音先锋 | 日本高清在线一区 | 久久精品国产一区二区 | 最新中文字幕第一页视频 | 欧美一区二区在线播放 | 久久国产成人 | 国产这里只有精品 | 韩国主播午夜大尺度福利 | 操皮视频 | 国产aⅴ| 亚洲aⅴ一区二区 | 中文字幕综合 | 日韩午夜影院 | 国产成人免费在线 | 国产亚洲精品美女久久久久久久久久 | 欧美视频免费在线 | 台湾佬久久 | 欧美日韩福利 | 国产成人av免费看 | 97精品超碰一区二区三区 | 日韩在线视频免费观看 | 日本电影一区二区 | 欧美日韩综合精品 |