我們(men) 可以說程序存儲(chu) 器的裏麵存放的是單片機的靈魂,它就是工作程序。小的可能隻有1KB(最多隻能裝1024條8位數據,因為(wei) 實際指令還有許多2字節、3字節指令,所以它還裝不下1024條指令)大的也有128KB的。這些8位數據要麽(me) 在工廠裏做摸子光刻進去,要麽(me) 一次性的燒寫(xie) 進去,要麽(me) ……用編程器這個(ge) 特殊工具把調試成功的機器碼裝載進去,或者像AVR單片機那樣自己花幾塊錢做一條下載線,把電腦裏這些東(dong) 西灌進去(或許是AVR最吸引人之處),它一旦進駐電腦的程序存儲(chu) 器中,除了借助上述裝置便不能自由改寫(xie) ,在單片機運行時,隻是從(cong) 其中讀出指令或固定的數據,所以給程序存儲(chu) 器一個(ge) “隻讀存儲(chu) 器”的別名,簡寫(xie) 為(wei) ROM,包括用編程器寫(xie) 紫外線擦除內(nei) 容的EPROM.用電擦除的EEPROM和現在新興(xing) 的FLASH ROM;一次性寫(xie) 入的ROM僅(jin) 用於(yu) 電路和程序固定的批量產(chan) 品中,實際工作起來,都是一樣的。
在實際的使用中,單片機運行時為(wei) 了定位ROM中的數據,其實每個(ge) 8位存儲(chu) 單元都有一個(ge) 固定的“地址”,通常用16進數表示:例如對於(yu) 一個(ge) 所謂4K的ROM,地址從(cong) 0000H到0FFFH,(即是從(cong) 0000,0001…4095),單片機運行時從(cong) 哪個(ge) 地址取數據,完全由程序本身決(jue) 定,並不要我們(men) 幹預。記住,給單片機一通電,它經過一個(ge) 短暫的複位過程,立即轉向ROM的最低地址0000H,在這裏麵放置的往往是一條“跳轉”指令,它從(cong) 這裏一步跳到另一個(ge) 地址:程序的真正起始地址,例如51機的0080H.難道ROM中就隻有指令不能來點別的?ROM是程序存儲(chu) 器,除了指令外還包括運行程序必須的某些固定數據。假如,我們(men) 要求在單片機的某口上輸出00H到FFH(255)按正弦半波變化的數值,每秒10000次,那如果硬要它按照公式一個(ge) 個(ge) 計算,對於(yu) 它來說未免力不從(cong) 心,可是我們(men) 可以把預先計算好的數值存入ROM中,到時候直接取出。
提到數據存儲(chu) 器,它其實是個(ge) 可以隨時存取數據的一塊存儲(chu) 器,也就是可以讀(取)也可以寫(xie) (存)的存儲(chu) 器,簡稱RAM.現在的單片機裏麵使用的RAM屬於(yu) 靜態RAM或SRAM,這個(ge) 和電腦用的內(nei) 存條有所不同,隻要你把數據寫(xie) 入SRAM後,隻要不斷電,或者不清除掉,這個(ge) 數據就一直保存在那裏,電腦是用的動態RAM,要不斷給它加刷新脈衝(chong) 才能保存數據。因為(wei) 單片機處理的信息量比電腦小很多,所以它帶的RAM也比較少:從(cong) 完全不帶、帶128、256、……1K、2K到4K,比ROM少多了。因為(wei) 實際上RAM隻是作為(wei) 數據臨(lin) 時存放的地方,除非進行圖像處理需要存放大量的數據外,一般對於(yu) 執行較簡單任務的單片機,有這麽(me) 多也夠用,如果實在不夠用也隻能采取外加SRAM如6116、6264等等來擴展。為(wei) 了對RAM單元存取8位二進數,當然也的和ROM一樣用“地址”來標示它的具體(ti) 位置假如某單片機有1K(1024)RAM,它的地址也是從(cong) 0000到1024,或16進數的0000H到03FFH可見和ROM的地址是一樣的,不會(hui) 混淆不清?不會(hui) ,因為(wei) 讀ROM是由單片機的程序指針或轉移指令或查表指令進行,而這些指令是不會(hui) 進入RAM區的,讀寫(xie) RAM是另外的數據傳(chuan) 送指令,也不會(hui) 進入ROM區,這點也是和電腦不同之處,後者程序和數據都在內(nei) 存條裏麵,地址不同,如果竄位了就會(hui) 造成不可預見後果。單片機的這種存儲(chu) 器結構也稱為(wei) 哈佛結構。
在這裏本文中要說到的RAM,其在單片機裏的用途主要是存放臨(lin) 時數據,例如用單片機測溫,每秒測1次,顯示1分鍾的平均值(1分鍾更新一次);我們(men) 先通過傳(chuan) 感器,放大電路,A/D轉換,把溫度這個(ge) 模擬量轉變為(wei) 成比例的二進數,然後每秒鍾1次把數字量通過輸入口順序存入到單片機的RAM中,然後對他們(men) 進行兩(liang) 兩(liang) 求和再平均的計算(題外話:要單片機進行“除法”運算比較麻煩,例外的是除以2,4,8……卻非常簡單。運用“右移”指令1、2、3次便可)最後的數值顯示出來,然後把這60個(ge) 存儲(chu) 單元統統寫(xie) 0清除舊數據,下次又如此這般地循環進行。另外在單片機裏麵還有若幹寄存器,數量不多但是作用很大,除了暫存數據,還可以交換、加工、傳(chuan) 遞等等,以及隨時紀錄單片機當前處於(yu) 什麽(me) 狀態,輸入輸出口,也是作為(wei) 特殊功能的寄存器存在,具體(ti) 各有不同,就不是隨便說說可以搞清楚的,要看有關(guan) 書(shu) 籍了。