設計微型計算機最小系統,實現跑馬燈的模擬顯示功能。具體要求為: ( 1 )、 輸入設備三個啟動按鈕、一個停止按鈕,輸出設備為八個跑馬燈; ( 2 )、 三個啟動按鈕對應三種跑馬燈顯示效果,按下任意一個啟動按鈕,跑馬燈顯示對應的效果,按下停止按鈕則跑馬燈全部熄滅。 由上分析可知,我們的硬件的電路需要另行搭建,電路中需包含四個按鈕和八個跑馬燈以及相關芯片,既有輸入設備又有輸出設備,經過分析可以使用芯片 8255A 來實現輸入與輸出,再加上鎖存地址芯片 74LS273 、譯碼芯片 74LS154 以及相關門電路即可構成本設計的硬件電路基礎。進一步分析最終決定用 8255A 的 A 口作為輸出去控制跑馬燈, B 口作為按鈕信號輸入, CPU 通過接收輸入信號從而發出對應命令去控制 8255A 芯片 A 口輸出,從而 A 口輸出相應電平控制跑馬燈有規律的亮滅。連接好硬件電路后的主要任務就是編寫相應程序,通過程序去控制和調度硬件電路的輸入與輸出。 1.2 系統連接圖設計 8255A 是一種通過可編程并行 I/O 接口芯片。廣泛用于幾乎所有系列的微機系統中 , 8255A 具有三個帶鎖存或緩沖的數據端口 , 可與外設并行進行數據交換 , 8255A 有多種操作方式 , 通用性較強 , 可為 CPU 與外設之間提供輸入 / 輸出通道。 8255A 和各端口內具有中斷控制邏輯 , 在外設與 CPU 之間可用中斷方式進行信息交換 , 使用條件傳輸方式時可用 “ 聯絡 ” 線進行控制。在本次設計中 , 我們運用 8255A 為 CPU 與外設之間提供輸入輸出輸出通道來實現對跑馬燈花樣變換的控制。 8086 微處理器,選擇最小工作模式,所有的總線控制信號均由 8086 產生; 8086CPU 的 地址 \ 數據總線 AD15-AD0 和地址 \ 狀態總線 A16/S3-A19/S6 是復用 的,必須通過地址鎖存器把地址總線和數據總線分離。 跑馬燈硬件電路如圖 1 所示。電路包括 8 個 LED 彩燈、三片 74LS273 、一片 74LS154 、一片 8086CPU 、一片 8255A 以及若干導線和電阻。用 LED 可以觀測在不同按鍵輸入下,跑馬燈花樣的變化效果。 如圖 1 所示我們利用啟動按鈕作為輸入信號,通過 8255A 端口擴展芯片,調節輸出端口的電平變化,來控制共陽極的 LED 燈的亮與滅,實現跑馬燈不同的花樣變化。 圖 圖1 跑馬燈硬件電路圖
1.2.1 鎖存控制電路 鎖存控制電路電路如圖 2 所示,在微控制器單元( MCU )中,寄存器是十分重要的資源。寄存器的主要作用是快速寄存算術邏輯運算單元( ALU )運算過程中的數據,其鎖存功能利用 74LS273 來實現, 74LS273 是一種帶清除功能的 8D 觸發器, 1D~8D 為數據輸入端, 1Q~8Q 為數據輸出端,正脈沖觸發,低電平清除,常用作數據鎖存器,地址鎖存器。 D0~D7 :輸入, Q0~Q7 :輸出; 第一腳 WR :主清除端,低電平觸發,即當為低電平時,芯片被清除,輸出全為 0 (低電平); CP ( CLK ):觸發端,上升沿觸發,即當 CP 從低到高電平時, D0~D7 的數據通過芯片,為 0 時將數據鎖存, D0~D7 的數據不變。 CPU 向外部發出地址鎖存允許信號,從而使 74LS273 鎖存地址信號,在通過 譯碼芯片 74LS154 控制接口芯片 8255A ,在此系統中充當一個橋梁的作用。這部分電路將相應信號傳送給 8255A 的 A0 、 A1 和 CS 片選,進而 CPU 開始控制 8255A 從而驅動發光二極管顯示不同的樣式。 
圖 2 鎖存控制電路 1.2.2 可編程并行通信接口芯片 8255A
芯片 8255A 有三種工作方式,他們分別是方式 0 、方式 1 、方式 2 ,電路如圖 3 所示。 方式 0 為簡單 I/O ,查詢方式,端口 A 、端口 B 、端口 C 均可使用; 方式 1 為選通 I/O ,中斷方式,端口 A 、端口 B 可以使用,選通的輸入 / 輸出方式; 方式 2 為雙向 I/O ,中斷方式,只有端口 A 可以使用,雙向的傳輸方式。 方式 0 也叫基本輸入 / 輸出方式。一種方式,不需要應答聯絡信號,端 口 A 、端口 B 和端口 C 的高 4 位及低 4 位都可以作為輸入或輸出端口。方式 0 的應用 場合有無條件傳送和查詢傳送 2 種; 故根據我們系統設計的要求,綜上可知,選擇 8255A 為工作方式 0 , A 口作為輸出、 B 口作為輸入。 8255A 的 3 種基本工作方式由方式控制字來決定, D7 = 1 (特征位)表明是設定方式選擇控制字; D7=0 ,則表示是端口 C 按位置位 / 復位控制字。端口 C 分成高 4 位 (PC7 ~ PC4) 和低 4 位 (PC3 ~ PC0) ,可分別設置成輸入端口或輸出端口;端口 C 的高 4 位與端口 A 配合組成 A 組,端口 C 的低 4 位與端口 B 配合組成 B 組。 綜上可得此系統需要滿足 A 端口為輸出,輸出數據給到 8 個 LED 彩燈;端口 B 為輸入,需要檢測按鍵的輸入情況。 圖 3 芯片 8255A 接口電路
1.3 算法說明 本程序涉及芯片 8255A 的初始化,因此首先需要確定端口地址, CPU 向 8255A 送出方式控制字,進而 8255A 的 A 口作為輸出、 B 口作為輸入;定義控制 LED 燈的相應數據段,由于需要 LED 亮后持續一段時間這就需要一個相應的延時程序片段,需要確定 B 口那個按鈕開關按下,這就需要一個掃描 B 口開關按下的子程序,從而 CPU 發出相應控制等操作給 A 口送出相應電平, LED 顯示相應的亮滅。 因此,主要要點就是找對端口地址,這個是程序能夠運行的必需品,通過分析硬件線路可以正確找到 A 口、 B 口以及控制口的地址。
2 程序流程圖設計及其說明
主程序流程圖如圖 4 所 示: 
圖 4 主程序流程圖 檢測按鍵延時控制 LED 子程序流程圖如圖 5 所示 : 
圖 5 子程序流程圖
3 關鍵程序段落說明
3.1 數據段定義 - dseg segment
- num dw 0
- data1 db 0FEh,0FDh,0FBh,0F7h,0EFh,0DFh,0BFh,7Fh
- data2 db 7Fh,0BFh,0DFh,0EFh,0F7h,0FBh,0FDh,0FEh
- data3 db 7Eh,0BDh,0DBh,0E7h,0E7h,0DBh,0BDh,7Eh
- dseg ends
- 三種燈光變幻組合為:
- 第一種為 L1→L2→L3→L4→L5→L6→L7→L8 ;
- 第二種為 L8→L7→L6→L5→L4→L3→L2→L1 ;
- 第三種為 L1L8→L2L7→L3L6→L4L5→L3L6→L2L7→L1L8 。
- dw 為燈光循環的控制次數。
-
- 3.2 程序初始化
-
- cseg segment para public 'code'
- assume ss:sseg,cs:cseg,ds:dseg
- start:
- mov ax,dseg
- mov ds,ax
- 初始化程序。
- 3.3 芯片初始化
- mov dx,0206h ; 取 8255A 的控制端口的地址
- mov al,82h ; 初始化 8255A 的 A 口為輸出模式, B 口為輸入模式
- out dx,al
- 82h 即為 10000010b ,也就是說將 A 口定義在方式 0 下并且作為輸出, B 口定義在方式 0 下并且作為輸入,因此這個方式控制字不是唯一的,其通用形式為 1000X01X , C 口沒有定義故可以為任意二進制數。
- mov dx,0200h ; 取 8255 的端口 A 的地址
- mov al,0FFh ; 使 8255 的 PA0-PA7 全為 1
- out dx,al
- 上邊這個程序段是往外送數據置 LED 亮滅的。
- mov dx,0202h ; 取 8255 的端口 B 的地址
- in al,dx ; 檢測 B 口輸入信號
- 這個是將 B 口開關閉合信息讀回來的,從而發出相應控制命令。
-
- 3.4 初始 LED 亮滅狀態
-
- mov dx,0200h ; 取 8255 的端口 A 的地址
- mov al,0FFh ; 使 8255 的 PA0-PA7 全為 1
- out dx,al ; 使所有的燈 LED 全滅
- 電路上電工作后首先要使所有的 LED 燈全滅,防止對后面的顯示造成影響。
-
- 3.5 檢測按鍵開關子程序
-
- ledflash proc ; 檢測開關閉合 , 以便確定哪種閃爍方式
- mov dx,0202h ; 取 8255A 的端口 B 的地址
- in al,dx ; 檢測 B 口輸入信號
- choice1:
- cmp al,0feh
- jne choice2
- mov si,offset data1 ; 置第一種燈光變幻組合
- jmp here
- choice2:
- cmp al,0fdh
- jne choice3
- mov si,offset data2 ; 置第二種燈光變幻組合
- jmp here
- choice3:
- cmp al,0fbh
- jne choice4
- mov si,offset data3 ; 置第三種燈光變幻組合
- jmp here
- choice4: ; 每盞燈亮完檢測開關,如果停止開關沒有按下跳到 choice5 ,如果停止開關按下燈全滅
- cmp al,0f7h
- jne choice5
- jmp exut
- choice5:
- cmp num,0h; 檢測 num 是否為 0 ,若為 0 掃描開關,若不為 0 繼續執行
- jne here
- jmp ledflash
- here:
- mov bx,num
- mov al,[si+bx]
- mov dx,0200h ; 取 8255 的端口 A 的地址
- out dx,al ; 輸出加電數據到端口 A
- inc num ; 改變數字變量的值
- cmp num,09h
- je exit
- mov cx,005fh
- dl4: mov bx,00ffh
- dl3: dec bx
- jnz dl3
- dec cx
- jnz dl4
- jmp ledflash
- exit:
- mov num,0
- ret
- ledflash endp
- 檢測到開關閉合置相應燈光變換。
- 3.6 延時程序片段
- mov cx,04c9h
- dl4: mov bx,04c9h
- dl3: dec bx
- jnz dl3
- dec cx
- jnz dl4
- 通過雙層循環從而實現軟件延時,延時計算公式為 ((cx)*(bx))/f , f 為 CPU 的頻率, CPU 頻率為 1500kHz ,可以計算得到程序大致延時為 1s 。
- 3.7 燈光變換控制
- here:
- mov bx,num
- mov al,[si+bx]
- mov dx,0200h ; 取 8255 的端口 A 的地址
- out dx,al ; 輸出加電數據到端口 A
- inc num ; 改變數字變量的值
- cmp num,09h
- je exit
- 通過指針移動,逐個選中相應的數據置相應的燈光變換,共八種即一輪 LED 顯示完成。
復制代碼
4 程序調試說明
( 1 )、內存空間分配,匯編語言的重要特點之一是能夠直接利用機器指令或者偽指令為數據或者代碼程序分配內存空間, 86 系列(如 8086 微處理器)的存儲器結構是分段的,有代碼段,數據段,堆棧段或附加段,在程序設計時要充分考慮分段結構,要執行的程序段應設在當前段(活動段)中;分配內存空間:直接在 proteus 里面將 8086CPU 的 internal memory size 設置成一個足夠用的空間大小,如 0x1000 ,默認的空間大小是 0x00000 ,如不改則仿真不成功。 程序在運行時所需要的工作單元應盡可能的設在 CPU 寄存器中,這樣存取速度快,而且操作方便;在此系統源程序中都采用 8086CPU 的全部通用寄存器:累加器 AX ,基數寄存器 BX ,基數寄存器 CX ,數據寄存器 DX ;和堆棧指針寄存器 SI 。 ( 2 )、 unknow 1-byte opcode at B900:7056! 61 [SPICE]error-- -too many iterations without convergence 在仿真過程中,出現以上兩行的錯誤,太多的迭代沒有收斂性,和某個匯編語言在編碼過程中的地址不正確,經過排查程序去除無用代碼, proteus 不再報錯。 ( 3 )、 8255A 隱藏引腳問題,需要設置芯片 Hidden Pins 里的 GND 改為 VSS , VCC 改為 VDD 。 ( 4 )、 程序一開始是將延時環節作為一個獨立子程序,運行過程中由于部分情況下不滿足題設,故將延時子程序改為程序段落寫到檢測按鍵的子程序中問題得以解決。
5 結果記錄及分析

第一種燈光變換效果: L1→L2→L3→L4→L5→L6→L7→L8 ,如圖 6 所示。


圖 6 LED 第一種變換效果
第二種燈光變換效果: L8→L7→L6→L5→L4→L3→L2→L1 ; 第一種變換效果反向即為第二種效果。 
第三種燈光變換效果: L1L8→L2L7→L3L6→L4L5→L3L6→L2L7→L1L8 ,如圖 7 所示。
 
圖 7 LED 第三種變換效果 心得體會 通過本次設計,學到了很多使用的東西,使我受益匪淺,將課堂上所學的知識運用到實際,體會到了理論與實際聯系的重要性,同時進一步學習了 PROTEUS 這款軟件。 第一,在做這次設計的一開始可以說是難度重重,接口電路設計出了問題,一開始由于電路沒有加入鎖存器,導致地址和數據沖突,從而電路不能正常工作,最后在電路里加入了鎖存器 74LS273 和譯碼器 74LS154 后解決了地址和數據沖突的問題。 第二,由于對軟件 PROTEUS 運用不是很熟練,導致一些問題,比如說分配內存空間:直接在 proteus 里面將 8086CPU 的 internal memory size 設置成一個足夠用的空間大小,如 0x1000 ,默認的空間大小是 0x00000 ,如不改則仿真不能成功。還有在運行期間 PROTEUS 仿真報錯,由于不太懂報錯信息就一步加大了設計的難度,還有一些其他小細節上的問題,可以說是細節決定成敗。 第三,由于匯編語言運用的不太熟練,對程序反復進行修改,發現匯編語言由于語句在程序中放置的位置不同也會是不同的效果,對匯編語言有了進一步的認識。
|