第一篇:微機原理課設
微機應用系統設計與綜合專業班級學生姓名學生學號指導老師實驗課程設計
——信號發生器功能程序設計
第一章
設計課題概述
本學期開設的《微型計算機原理與接口技術》理論課程是一門專業基礎課程,1.1 課程設計目的
它的主要內容包括微型計算機體系結構、8086 微處理器和指令系統、匯編語言設計以及微型計算機各個組成部分介紹等內容。要求學生對微機原理中的基本概念有較深入的了解,能夠系統地掌握微型計算機的結構、8086 微處理器和指令系統、匯編語言程序設計方法、微機系統的接口電路設計及編程方法等,并具有綜合運用所學知識分析問題和解決問題的能力。
《微機應用系統設計與綜合實驗(實踐)》課程設計,讓學生對微機系統有一個較全面的理解,掌握常規的芯片使用方法、掌握簡單的微型計算機應用系統軟硬件的設計方法,對典型數字接口電路的應用技術有一個較深入的掌握,并對應用系統進行硬件原理和軟件編程進行分析、設計和調試,達到基本掌握簡單微型計算機應用系統軟硬件的設計方法,提高項目開發能力的目的。課程中要求學生根據課程設計指導書來選擇課題,并且獨立完成課題,寫出課程設計說明書,畫出電路原理圖,說明工作原理,畫出電路板圖,編寫程序以及程序流程圖。
針對《信號發生器功能程序設計》這一課題,主要涉及到硬件的連接(主要用到芯片有:8086CPU,DAC0832,8255,74LS273,74LS138,運放等)以及數碼管,鍵盤矩陣硬件,示波器等連接原理圖,程序的編寫(主要涉及到顯示波形,數碼管顯示以及通過小鍵盤來對波形進行選擇控制)以及各個子程序或程序段的程序流程等,通過課程設計不僅可以鍛煉學生在微機應用方面的實際工作能力,將所學轉化為所用,更是一個鍛煉解決實際問題能力的很好機會。
1.2 課程設計要求
(1)、分別用C語言和匯編語言編程完成硬件接口功能設計;(2)、硬件電路基于80x86微機的接口電路;
(3)、程序功能要求:小鍵盤給定、數碼管(屏幕)顯示,并產生對應信號波形(D/A)輸出(信號波形包括正弦波、三角波、方波、鋸齒波)、輸出信號波形幅度、頻率可調。(注意:按鍵數量應盡量少)。
? 實現技術指標
(1)、完全用小鍵盤控制各波形間的切換和頻率和幅值的調節以及退出。(2)、實現正弦波、三角波、方波和鋸齒波信號的產生。(3)、數碼管同步顯示當前工作波形的頻率和幅值。(4)、實現頻率的1到5倍可調。(5)、實現幅值的1到5倍可調。
? 使用說明
(1)、小鍵盤第一列對應0-3,第二列對應4—7。
(2)、開始選擇0—3分別對應方波,三角波,鋸齒波,正弦波。同時數碼管會顯示當前波形的幅值和頻率。
(3)、有波形產生以后,再調節幅值和頻率。0對應增大頻率,1對應減小頻率,2對應減小幅值,3對應增大幅值。
(4)、頻率和幅值可以實現1到5倍可調,同時數碼管會顯示當前波形的幅值和頻率的倍數(1~5)。
(5)、任何時候4都對應退出,回到最開始的選擇波形狀態,數碼管歸零。
第二章 設計思想和實施方案
2.1功能分析
2.1.1波形產生
由于要由數字信號轉換為模擬信號來產生波形,因此要由D/A轉換芯片DAC0832來完成此項任務。通過匯編語言編寫各個波形子程序,由于要顯示波形,所以每輸出一個值,都要進行一定時間的延時,掃描沒有按鍵按下后再輸出下一個值,直到形成一個周期的代碼。利用循環,就可產生連續波形代碼,再通過8255輸出給DAC0832,將數字量轉換成模擬量輸出,即可得各種波形。具體方案在后面有分析。
2.1.2波形切換
波形的選擇和調節由小鍵盤控制。第一列從上到下編碼為0,1,2,3,分別對應方波、三角波、鋸齒波、正弦波。第二列第一個鍵的鍵值為4,對應退出波形,可以重新選擇波形,實現波形切換。當沒有輸出波形的時候,也就是輸出為零,選擇0到3就會進入相應的波形子程序。進入波形子程序以后,每一個點輸出之前都會調用掃描子程序,判斷是否有鍵按下,有則跳轉到相應的程序斷去執行,無則繼續。由于小鍵盤掃描在程序總是存在的,因此可隨時進行波形間的切換。
2.1.3 數碼管顯示
數碼管同步顯示當前波形的幅值和頻率。硬件上由8086將數據輸出給8255,8255再將輸出送給數碼管的A~Dp,顯示相應字符。軟件上定義一個緩沖區存放波形的幅值和頻率,顯示數碼管時,利用緩沖區的數值查找數碼管鍵值表再輸出對應數值。循環輸出波形時也循環輸出緩沖區內容對應的值,就可以同步顯示波形的幅值和頻率。利用小鍵盤掃描得到的鍵值進行判斷,對緩沖區內的幅值頻率進行相應的改變,使數碼管能顯示不同的幅值和頻率。
2.1.4小鍵盤控制
使用實驗箱上4×4鍵盤,可以實現切換波形,調頻、調幅和退出波形的控制功能。Protues內的鍵盤矩陣掃描時輪流選通一行,然后從端口處讀取列數據,如果有按鍵則讀取的數據肯定有一位為0,經過取反后,盡有一位為1,然后再根據選取的列和讀取的行值,確定按的是哪一個鍵,然后將鍵值編碼保存在一個名為keyass的存儲單元里。當有鍵按下時,從keyass內取出鍵值進行判斷,就能轉入相應的子程序進行控制,并且鍵盤掃描、獲取鍵值等子程序也能夠很好的嵌入在其他程序中,方便調用。
2.1.5有極調頻
改變波形子程序中的各個數據輸出時間,即延時,就可改變整個波形的頻率。延時越短頻率越高。定義三個緩沖區來存放延時,其中一個存放初始值3,一個存放當前波形的延時,還有一個作為中間暫存用。產生波形以后,取出延時初值存入中間暫存緩沖區,再掃描鍵盤:0對應減小延時,1對應增大延時,無鍵則不改變延時。對暫存區的數值進行相應操作后,將最后的值存入名為tiaopin的緩沖區內作為當前波形的延時。
2.1.6有極調幅
和有級調頻類似,有極調幅也是定義三個緩沖區,功能和有極調頻類似。幅值緩沖區存放的是輸出點的值的放大倍數,調節放大倍數也就使幅值改變了。產生波形以后,取出倍數初值存入中間暫存緩沖區,再掃描鍵盤:2對應減小倍數,3對應增大倍數,無鍵則不改變倍數。對暫存區的數值進行相應操作后,將最后的值存入名為tiaofu的緩沖區內作為當前波形的幅值放大倍數。
2.1.6開始結束
用小鍵盤第二列第一個也就是4來結束波形,無論在什么時候只在小鍵盤掃描到了4鍵,它就會無條件跳出程序,返回起始狀態,等待選擇波形,同時數碼管顯示零。
2.2所用芯片功能簡介
2.2.1 8086功能簡介
8086 CPU是由總線接口部件BIU和執行部件EU這兩大部分構成。總線接口部件BIU是8086 CPU在存儲器和I/O設備之間的接口部件,負責對全部引腳的操作,即8086對存儲器和I/O設備的所有操作都是由BIU完成的。所有對外部總線的操作都必須有正確的地址和適當的控制信號,BIU中的各部件主要是圍繞這個目標設計的。它提供了16位雙向數據總線、20位地址總線和若干條控制總線。
其具體任務是:負責從內存單元中預取指令,并將它們送到指令隊列緩沖器暫存。CPU執行指令時,總線接口單元要配合執行單元,從指定的內存單元或I/O端口中取出數據傳送給執行單元,或者把執行單元的處理結果傳送到指定的內存單元或I/O端口中。
執行單元EU中包含1個16位的運算器ALU、8個16位的寄存器、1個16位標志寄存器FR、1個運算暫存器和執行單元的控制電路。這個單元進行所有指令的解釋和執行,同時管理上述有關的寄存器。EU對指令的執行是從取指令操作碼開始的,它從總線接口單元的指令隊列緩沖器中每次取一個字節。如果指令隊列緩沖器中是空的,那么EU就要等待BIU通過外部總線從存儲器中取得指令并送到EU,通過譯碼電路分析,發出相應控制命令,控制ALU數據總線中數據的流向。
管腳圖如下:
2.2.2 8255A功能簡介
8255A具有24條輸入/輸出引腳、可編程的通用并行輸入/輸出接口電路。它是一片使用單一+5V電源的40腳雙列直插式大規模集成電路。8255A的通用性強,使用靈活,通過它CPU可直接與外設相連。
8255A在使用前要寫入一個方式控制字,選擇A、B、C三個端口各自的工作方式,共有三種。方式0 :基本的輸入輸出方式,即無須聯絡就可以直接進行的 I/O方式。其中A、B、C口的高四位或低四位可分別設置成輸入或輸出;方式1 :選通I/O,此時接口和外圍設備需聯絡信號進行協調,只有A口和B口可以工作在方式1,此時C口的某些線被規定為A口或B口與外圍設備的聯絡信號,余下的線只有基本的I/O功能,即只工作在方式0;方式2: 雙向I/O方式,只有A口可以工作在這種方式,該I/O線即可輸入又可輸出,此時C口有5條線被規定為A口和外圍設備的雙向聯絡線,C口剩下的三條線可作為B口方式1的聯絡線,也可以和B口一起方式0的I/O線。
管腳圖如下:
2.2.3 DAC0832功能簡介
DAC0832是采用CMOS工藝制成的單片電流輸出型8位數 / 模轉換器。它由倒T型R-2R電阻網絡、模擬開關、運算放大器和參考電壓VREF四大部分組成。電路有極好的溫度跟隨性,使用了COMS電流開關和控制邏輯而獲得低功耗、低輸出的泄漏電流誤差。集成電路內有兩級輸入寄存器,使DAC0832芯片具備雙緩沖、單緩沖和直通三種輸入方式,以便適于各種電路的需要.DAC0832有8個輸入端(其中每個輸入端是8位二進制數的一位),有一個模擬輸出端。輸入可有2的8次方,即256個不同的二進制組態,輸出為256個電壓之一,即輸出電壓不是整個電壓范圍內任意值,而只能是256個可能值。
D/A轉換結果采用電流形式輸出。若需要相應的模擬電壓信號,可通過一個高輸入阻抗的線性運算放大器實現。運放的反饋電阻可通過RFB端引用片內固有電阻,也可外接。DAC0832邏輯輸入滿足TTL電平,可直接與TTL電路或微機電路連接。
DAC0832的管腳圖如下:
2.2.4 74LS273功能簡介
地址鎖存器就是一個暫存器,它根據控制信號的狀態,將總線上地址代碼暫存起來。8086/8088數據和地址總線采用分時復用操作方法,即用同一總線既傳輸數據又傳輸地址。當微處理器與存儲器交換信號時,首先由CPU發出存儲器地址,同時發出允許鎖存信號ALE給鎖存器,當鎖存器接到該信號后將地址/數據總線上的地址鎖存在總線上,隨后才能傳輸數據。
地址鎖存器74LS273是帶清除端的八D觸發器,只有清除端為高電平時才具有鎖存功能,鎖存控制端為11腳CLK,在上升沿鎖存。8086的ALE端輸出的鎖存控制信號必須經反相器后才能連到74LS273的CLK端,以滿足CLK在上升沿鎖存的要求。74LS273的引腳1D~8D為數據輸入端,1Q~8Q為數據輸出端,WR:主清除端,低電平觸發,即當為低電平時,芯片被清除,輸出全為0。CP(CLK):觸發端,上升沿觸發,即當CP從低到高電平時,D0~D7的數據通過芯片,為0時將數據鎖存,D0~D7的數據不變。由于8086有20位物理地址,所以需要用3片74LS273級聯。
74LS273的管腳圖如右:
2.3 實施方案
2.3.1系統總體設計方案
該設計包括硬件設計和軟件設計兩部分。
1.硬件上要求以8086CPU為核心進行電路設計。完全用小鍵盤對波形進行控制。小鍵盤作為產生波形、波形切換、調節頻率,調節幅值、退出波形的控制端口。8255A芯片完成對小鍵盤掃描,獲取鍵值編碼以及輸出到數碼管。通過DAC0832將數字量轉換成模擬量輸出,再由轉換電路將電流輸出轉換為電壓輸出產生各種波形,通過虛擬示波器顯示出波形。由于8255A的A,B,C端口都已使用,所以采用鍵盤控制進行幅值和頻率的有極調節。
2.軟件方面要設計方波,三角波,鋸齒波,正弦波何時產生,如何產生,何時退出,并且還要設計如何通過對按鍵的判斷,對頻率和幅值進行調節。
方波比較簡單,先掃描鍵盤,無鍵按下時輸出零,保持一個延時,再掃描鍵盤,無鍵按下時輸出20H的倍數,該倍數就是我定義的幅值,再延時,循環該周期就可得到方波。如果有鍵按下就會轉入相應子程序。
三角波分為兩段,因它的上升斜坡和下降斜坡都是線性關系,所以只要由數字量的增減來控制就可以了。產生上升斜坡時讓輸出值從零開始逐漸遞增,其上升的最大值是30乘以放大倍數,相反,產生下降斜坡時,讓輸出值從最大值逐漸遞減到零。為簡單起見,這里采用的是查表法,在數據段定義了三角波函數表,規律如上。其幅值由放大倍數控制,頻率是由輸出點之間的延時來控制。
鋸齒波截取三角波的上升斜坡部分,到達最大值后就跳回最低值0,方法與三角波相同,也采用查表法。先定義了鋸齒波的函數表,輸出時只要按著函數表一個一個往下輸出,當顯示到最大值即一個周期內的最后一個值再將指針指向表的首地址就開始了新的周期。其幅值由放大倍數控制,頻率是由輸出點之間的延時來控制。
正弦波也是用的查表法。該方法的優點是速度快,但在精度高的情況下要求的存儲器容量也要增大,所以此種方法應用在對精度要求不高的場合。本程序中制造了一張正弦數字量表,即查函數表得到的值轉換成十進制數填表。一個周期內,采樣點越多,精度越高,本實驗中采樣點為40點/周期。正弦數字量表中的值為參考值,對于不同幅值的正弦波可以通過把表中的每個值乘以相同的倍數得到,其頻率由改變輸出點之間的延時來實現。
頻率和幅值的調節由每個點的延時和幅值的放大倍數決定。在各個波形輸出之前,先讀取頻率和幅值的初值,若要增加(減小)頻率,則使延時減(加)1;若要增大(減小)幅值,則使原幅值基礎值得放大倍數加(減)1。然后再將改變后的幅值頻率送給原波形進行輸出,同時,幅值和頻率的值作為偏移量查找數碼管顯示表,然后送給對應的數碼管顯示。
2.3.2系統設計方框圖
第三章 典型程序模塊及編程技巧分析
3.1鍵盤掃描模塊
小鍵盤工作原理:
(1)初始化8255的工作方式:A,B口作為輸出,C口低四位作為輸入。矩陣的X1~X4接到輸出端口PA0-PA3上,用程序控制4條行線的輸出。4條列線Y1~Y4連接到輸入端口C的PC0-PC3。用讀指令讀取C口狀態時,可讀取鍵盤的列號。
(2)在無鍵按下的時候,由于接到+5V上的上拉電阻的作用,列線被置成高電平。壓下某一個鍵所在的行線和列線接通。這時,如果向被壓下的鍵所在的行線上輸出一個低電平信號,則對應的列線也呈現低電平。當從C口讀取列線信號時,便能檢測到該列線上的低電平。
(3)掃描鍵盤時,A口輸出全0,讀C口,取低四位再取反,若為0則無鍵輸入,若不為零則轉獲取鍵值子程序。獲取鍵值時,對X1到X4輪流選中,即輪流輸出0。先把第一行賦0,讀C口檢測是不是第一行,不是再繼續第二行,沒有的話總共循環4次跳出循環,這樣根據選中的行和讀入的列狀態中低電平的位置,便能確定哪個鍵被按下了。檢測到按鍵后,對壓下的鍵進行編碼,將該鍵的行列信號轉化成16進制碼,將鍵值存入緩沖區,以便以后利用進行判斷比較。接著繼續掃描按鍵,等待按鍵釋放。
具體的實現如下:
CCSCAN掃描按鍵是否有鍵按下: CCSCAN PROC
NEAR
;掃描是否有按鍵閉合子程序
MOV
AL,00H
MOV
DX,MY8255_A;將4列全選通,X1~X4置0
OUT
DX,AL
MOV
DX,MY8255_C
IN
AL,DX
;讀Y1~Y4
NOT
AL
AND
AL,0FH
;取出Y1~Y4的反值
RET
CCSCAN ENDP
如果有按鍵,就獲取按鍵碼的功能,4×4鍵盤的編碼, 從上到下,從左到右,依次編碼為0~F, 如果有按鍵, 則轉入到按鍵處理子程序模塊執行, 如果沒有,則返回主程序循環。具體的實現代碼如下:
GETKEY1 PROC
NEAR
;獲取鍵值子程序
CALL
DIS
;顯示刷新
CALL
DALLY
;延時
CALL
DALLY
;延時
CALL
CLEAR
;清屏
CALL
JNZ
JMP
GETKEY2: MOV
MOV
COLUM: MOV
MOV
OUT
MOV
IN
L1: TEST
JNZ
MOV
JMP
L2: TEST
JNZ
MOV
JMP
L3: TEST
JNZ
MOV
JMP
L4: TEST
JNZ
MOV
KCODE: ADD
CCSCAN
;再次掃描按鍵
GETKEY2
;有鍵按下則跳置GETKEY2 BEGIN1
;否則跳回開始繼續循環
CH,0FEH
CL,00H
;設置當前檢測的是第幾列
AL,CH
;選取一列,將X1~X4中一個置0
DX,MY8255_A DX,AL
DX,MY8255_C;讀Y1~Y4,用于判斷哪一行按鍵閉合 AL,DX
AL,01H
;是否為第1行 L2
;不是則繼續判斷
AL,00H
;設置第1行第1列的對應的鍵值
KCODE
AL,02H
;是否為第2行 L3
;不是則繼續判斷
AL,04H
;設置第2行第1列的對應的鍵值
KCODE
AL,04H
;是否為第3行 L4
;不是則繼續判斷
AL,08H
;設置第3行第1列的對應的鍵值
KCODE
AL,08H
;是否為第4行 NEXT
;不是則繼續判斷
AL,0CH
;設置第4行第1列的對應的鍵值
AL,CL
;將第1列的值加上當前列數,確定按鍵值
CALL
PUTBUF
;保存按鍵值
PUSH
AX
KON: CALL
DIS
;顯示刷新
CALL
CLEAR
;清屏
CALL
CCSCAN
;掃描按鍵,判斷按鍵是否彈起
JNZ
KON
;未彈起則繼續循環等待彈起
POP
AX
NEXT: INC
CL
;當前檢測的列數遞增
MOV
AL,CH
TEST
AL,08H
;檢測是否掃描到第4列
JZ
KERR
;是則跳回到開始處
ROL
AL,1
;沒檢測到第4列則準備檢測下一列
MOV
CH,AL
JMP
COLUM
KERR: RET
GETKEY1 ENDP PUTBUF PROC
NEAR
;保存鍵值子程序
MOV
DI,OFFSET KEY
MOV
[DI],AL
CMP
DI,2FFFH
JNZ
GOBACK
MOV
DI,3004H
GOBACK: RET
PUTBUF ENDP
3.2數碼管顯示模塊
4個數碼管的X端為選通端,將小鍵盤的X1~X4對應接到數碼管,這樣掃描小鍵盤的時候,也就選中了數碼管,當調用getkey1獲取鍵值子程序的時候,數碼管輪流選中,也就可以控制哪個數碼管顯示什么內容。通過對8255寫入數據,由B口輸出給數碼管的A~Dp,當沒有波形輸入時,數碼管顯示0數碼管;定義兩個緩沖區存放幅值和頻率,有波形輸出時,同步顯示該波形的幅值和頻率。
先在數據段定義一個緩沖區存放數碼管顯示0~F的段位值表: DTABLE DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB
7FH,6FH,77H,7CH,39H,5EH,79H,71H 因為要一直顯示數碼管,所以將顯示部分作為子程序,方便經常調用。DIS PROC
NEAR
;顯示鍵值子程序
AGAIN:
PUSH
AX
;以緩沖區存放的鍵值為鍵值表偏移找到鍵值
并顯示
MOV
SI,3000H
;緩沖區3000H內存放了當前波形的幅
值,3001H存放了頻率。
MOV
DL,0F7H MOV
AL,DL PUSH
DX MOV
DX,MY8255_A OUT
DX,AL
;設置X1~X4,選通一個數碼管 MOV
AL,[SI]
;取出緩沖區中存放鍵值 MOV
BX,OFFSET DTABLE AND
AX,00FFH ADD
BX,AX MOV
AL,[BX]
;將鍵值作為偏移和鍵值基地址相加得到
相應的鍵值
MOV
DX,MY8255_B OUT
DX,AL
;寫入數碼管A~Dp CALL
DALLY INC
SI
;取下一個鍵值 POP
DX MOV
AL,DL TEST
AL,01H
;判斷是否顯示完? JZ
OUT1
;顯示完,返回 ROR
AL,1 MOV
DL,AL
JMP
AGAIN
;未顯示完,跳回繼續
OUT1: POP
AX
RET
DIS ENDP 3.3有級調頻調幅判斷及控制模塊
改變波形產生子程序中的各個數據輸出時間,及延時,就可改變整個波形的頻率。改變波形產生子程序中的每次輸出數值的放大倍數,就可以改變整個波形的幅值。而實現有級變化的初值是在數據段預先定義的數據表。
在選擇波形以后,才能調節頻率和幅值,頻率和幅值的調節由小鍵盤控制。在3000H和3001H的緩沖區內存放了幅值和頻率的初值3,在每個波形輸出之前先掃描鍵盤,鍵值存在KEY里,對KEY值進行判斷后,取出緩沖區的初值做相應改變:0選擇增大頻率,1選擇減小頻率,2選擇減小幅值,3選擇增大幅值,4退出波形,返回開始狀態。
具體的實現代碼如下:
AMPLFENC PROC
NEAR
;調節幅值頻率子程序
CALL
DIS
;刷新
CALL
CCSCAN
;再次掃描按鍵
JNZ
TRI1
;有鍵按下則跳置tri1
JMP
TRI5
;沒按鍵按下就跳出該子程序
TRI1: CALL
DIS
;刷新
CALL
GETKEY1
MOV
SI,OFFSET KEY
MOV
AL,[SI]
CMP
AL,4
;第五個鍵就退出
JZ
TRI10
JZ
TRI5
CMP
AL,0
;第一個鍵減少周期
JNZ
TRI2
MOV
DI,3001H
;取延時初值
MOV
BL,[DI]
CMP
BL,01H
JE
TRI5
DEC
BL
MOV
[DI],BL
JMP
TRI5
TRI2: CMP
AL,1
;第二個鍵增加周期
JNZ
MOV
MOV
CMP
JE
INC
MOV
JMP
TRI3: CMP
JNZ
MOV
MOV
CMP
JE
DEC
MOV
JMP
TRI4: CMP
JNZ
MOV
MOV
CMP
JE
INC
MOV
JMP
TRI3
DI,3001H BL,[DI] BL,05H TRI5 BL [DI],BL TRI5
AL,2
TRI4 DI,3000H
BL,[DI]
BL,01H TRI5 BL [DI],BL TRI5
AL,3
TRI5 DI,3000H
BL,[DI]
BL,05H TRI5 BL [DI],BL TRI5
;取延時初值;第三個鍵減少幅度
;取幅值初值;第四個鍵增加幅度
;取幅值初值
TRI10: JMP
FAR PTR BEGIN0
TRI5: RET
AMPLFENC ENDP
3.4 波形切換及基本控制模塊
這個模塊是本次設計的主程序,它控制了波形的輸出和切換。它是根據對小鍵盤的操作來實現的,不同按鍵對應的編碼轉入不同模塊(0:方波,1:三角波,2:鋸齒波,3:正弦波,4:退出波形)。先掃描鍵盤是否有鍵按下,若無循環等待,若有則將鍵值保存再比較,然后實現相應操作。為使程序可循環使用,不至于顯示一次波形就退出,在執行完子程序返回時,不退出系統,而是返回到開始等待輸入狀態,這樣就能切換波形。
具體的實現代碼如下:
BEGIN0: MOV
SI,3000H
;把數碼管清0
MOV
AL,00H
;先初始化鍵值為0
MOV
[SI],AL
MOV
AL,00H
MOV
[SI+1],AL
MOV
AL,00H
MOV
[SI+2],AL
MOV
AL,00H
MOV
[SI+3],AL
MOV
SI,OFFSET KEY
MOV
AL,00H
MOV
[SI],AL BEGIN1: CALL
DIS
;顯示刷新
CALL
CCSCAN
;再次掃描按鍵
JNZ
LBEGIN0
;有鍵按下則跳置LBEGIN0
JMP
BEGIN1;不是按下第一或二鍵就繼續等待輸入
LBEGIN0: CALL
GETKEY1
;第二個菜單等待輸入
CALL
DIS
MOV
SI,OFFSET KEY
MOV
AL,[SI]
CMP
AL,4
;第5個鍵退出
JZ
BEGIN0
CMP
AL,0
;第1個鍵到squ(方波)函數
JZ
LBEGIN1
CMP
AL,1
;第2個鍵到tri(三角波)函數
JZ
LBEGIN2
CMP
AL,2
;第3個鍵到rec(鋸齒)函數
JZ
LBEGIN3
CMP
AL,3
;第4個鍵到sin(正弦)函數
JZ
LBEGIN4
JMP
BEGIN1
;其他鍵則跳到繼續等待輸入
LBEGIN1: CALL
SQUREW
;SQUARE
JMP
BEGIN0
LBEGIN2: CALL
TRIW
;TRIANGLE
JMP
BEGIN0
LBEGIN3: CALL
RCTW
;RECANGLE
JMP
BEGIN0
LBEGIN4: CALL
SINW
;SIN
JMP
BEGIN0
;執行完輸出波形之后 回到開始狀態
JMP
BEGIN0
3.5波形產生模塊 3.5.1方波
方波的產生只要使DAC0832輸出一個較大值(此處用20H),并延時一段時間,再輸出一個較小值(此處用00F),延時一段相同時間,就是方波的一個周期。但因為實現過程中結合了數碼管的顯示以及頻率幅值的調節所以并不那么簡單。先將幅值和頻率的初值放入暫存緩沖區,使數碼管顯示,掃描鍵盤,無鍵按下則繼續,有鍵按下則先判斷是否為0到3,是則調節頻率幅值,是4則退出波形。執行相應操作后刷新數碼管,將新的幅值和頻率存在TIAOFU和TIAOPIN的緩沖區內,把低電平的值乘以TIAOFU輸出,延遲時間乘以TIAOPIN,使該值持續一段時間,輸出高電平的過程與低電平相同,循環該周期就得到連續方波。
具體的實現代碼如下:
SQUREW PROC
NEAR
;方波發生子程序
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
SQUR1: CALL 調節幅值頻率
MOV
MOV
CMP
JZ
CALL
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
TRILOOP1: MOV
MOV
DI,OFFSET FENC
;初始化顯示管的值為3
AL,[DI]
SI,3000H
[SI],AL
DI,OFFSET AMPL
AL,[DI]
SI,3001H
[SI],AL
AMPLFENC
;調節幅值頻率子程序,有鍵按下是
SI,OFFSET KEY
;按下第五個鍵就退出
AL,4
[SI],AL
SQUA
DIS
;刷新數碼管
SI,3000H
BL,[SI]
DI,OFFSET TIAOFU
[DI],BL
SI,3001H
AL,[SI]
SI,OFFSET TIAOPIN
[SI],AL
DX,DA0832
;輸出低電平
輸出方波形
AL,00H
OUT
DX,AL
CALL
DIS
;刷新
PUSH
CX
PUSH
AX
MOV
CL,TIAOPIN
MOV
CH,00H
D11: MOV
D21: DEC
PUSH
PUSH
CALL
CALL
JNZ
POP
POP
JNZ
LOOP
POP
POP
CALL
JNZ
MOV
MOV
MUL
MOV
OUT
CALL
PUSH
PUSH
MOV
MOV
D12: MOV
AX,00FFH AX AX CX DIS
CCSCAN
;再次掃描按鍵 SQUR1
;有鍵按下則跳置squr1, CX AX D21 D11 AX CX
CCSCAN
;再次掃描按鍵
SQUR1;有鍵按下則跳置squr1,改變幅值頻率 BL,TIAOFU AL,20H BL
DX,DA0832
;輸出高電平DX,AL
DIS
;刷新 CX AX CL,TIAOPIN CH,00H AX,00FFH
D22: DEC
AX
PUSH
AX
PUSH
CX
CALL
DIS
CALL
CCSCAN
;再次掃描按鍵
JNZ
SQUR1
;有鍵按下則跳置tri1
POP
CX
POP
AX
JNZ
D22
LOOP
D12
POP
AX
POP
CX
JZ
TRILOOP1
;沒按鍵時繼續輸出波形
SQUA: RET
SQUREW ENDP
3.5.2三角波
三角波理論上有兩段,上升和下降,上升時從最低值開始自增,直到最大值,然后再自減至最低。本設計中,因為對波形精度要求不是很高,所以采用按列表輸出的方式,即先在數據段定義了一段三角波一個周期內的采樣值的數字量表,采樣頻率為60點/周期。數字量表中的值為參考值,輸出三角波時通過把表中的每個值乘以相同的倍數,該倍數為我們設定的幅值。波形輸出方式都相同,這里簡要說明:先將幅值和頻率的初值放入暫存緩沖區,使數碼管顯示,掃描鍵盤,執行相應操作后刷新數碼管,將新的幅值和頻率存在TIAOFU和TIAOPIN的緩沖區內,將第一個數字量乘以TIAOFU輸出,延遲時間乘以TIAOPIN,再掃描,輸出第二個值,直到指針指完該數字量表再循環該周期就得到連續三角波。
具體的實現代碼如下:
TRITAB
DB
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;三角函數表
DB
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
DB
30,29,28,27,26,25,24,23,22,21,20,19,18,17,16
DB
15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 TRIW PROC
NEAR
;三角波形子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
MOV
[SI],AL
TRA1:
TRLOOP1:
TRLOOP2:
MOV
DI,OFFSET AMPL MOV
AL,[DI] MOV
SI,3001H MOV
[SI],AL CALL
AMPLFENC MOV
SI,OFFSET KEY MOV
AL,4 CMP
[SI],AL JZ
TRIA CALL
DIS MOV
SI,3000H MOV
BL,[SI] MOV
DI,OFFSET TIAOFU MOV
[DI],BL MOV
SI,3001H MOV
AL,[SI] MOV
SI,OFFSET TIAOPIN MOV
[SI],AL MOV
SI,OFFSET TRITAB MOV
AL,[SI] MOV
BL,TIAOFU MUL
BL MOV
DX,DA0832
;啟動D/A轉換 OUT
DX,AL PUSH
AX PUSH
SI
PUSH
CX
MOV
CL,TIAOPIN
MOV
CH,00H
DALLYTRI1: CALL
DIS
CALL
CCSCAN
JNZ
TRA1
LOOP
DALLYTRI1
POP
CX
POP
SI
POP
AX
INC
SI
CMP
SI,OFFSET RCTTAB
JNZ
TRLOOP2
JMP
TRLOOP1
TRIA: RET
TRIW ENDP
3.5.3鋸齒波
鋸齒波就是截取了三角波的上升部分,由最小值自增到達最大值后下一個值就返回最小值。本設計中鋸齒波的產生方式也是對鋸齒波采樣,采樣周期為32點/周期,然后以采樣表為基礎輸出。鋸齒波的輸出方式與三角波相同,這里不再重復。
具體的實現代碼如下:
先在數據段定義一張鋸齒波采樣后的數字量表: RCTTAB DB
1,2,3,4,5,6,7,8
;鋸齒函數表
DB
9,10,11,12,13,14,15,16
DB
17,18,19,20,21,22,23,24
DB
25,26,27,28,29,30,31,32 RCTW PROC
NEAR
;鋸齒波形子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
MOV
[SI],AL
MOV
DI,OFFSET AMPL
MOV
AL,[DI]
MOV
SI,3001H
MOV
[SI],AL
RCT1: CALL
AMPLFENC
MOV
MOV
CMP
JZ
CALL
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
RCLOOP1: MOV
RCLOOP2: MOV
MOV
MUL
MOV
OUT
PUSH
PUSH
PUSH
MOV
MOV
DALLYRCT1: CALL
CALL
SI,OFFSET KEY AL,4 [SI],AL DIS SI,3000H BL,[SI]
DI,OFFSET TIAOFU [DI],BL SI,3001H AL,[SI]
SI,OFFSET TIAOPIN [SI],AL
SI,OFFSET RCTTAB AL,[SI] BL,TIAOFU BL
DX,DA0832
;啟動D/A轉換 DX,AL AX SI CX CL,TIAOPIN CH,00H
;刷新,掃描,延時CCSCAN
RCTA
DIS
JNZ
RCT1
LOOP
DALLYRCT1
POP
CX
POP
SI
POP
AX
INC
SI
;下一個值
CMP
SI,OFFSET STR1
JNZ
RCLOOP2
JMP
RCLOOP1
RCTA: RET
RCTW ENDP
3.5.4正弦波
正弦波的產生方式有兩種,一種是通過調用函數輸出,精度較高,第二種為采樣查表法。本實驗精度要求不高,所以采用第二種。該方法與前面的三角波,鋸齒波方法相同,對一個周期內的正弦波采樣,采樣周期為40點/周期,輸出方式與三角波相同,不再重復。
先在數據段定義正弦波的采樣數字量表:
SINTAB DB
16,19,21,23,25,27,29,30,31,32,32,32
;正弦函數表
DB
31,30,29,27,25,23,21,19,16,13,11,9
DB
7,5,3,2,1,0,0,0,1,2,3,5,7,9,11,13 SINW PROC
NEAR
;正弦波的子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
;取幅值初值
MOV
[SI],AL
MOV
DI,OFFSET AMPL
MOV
AL,[DI]
MOV
SI,3001H
;取頻率初值
MOV
[SI],AL
SINA1: CALL
AMPLFENC
MOV
SI,OFFSET KEY
MOV
AL,4
CMP
[SI],AL
JZ
SINA
CALL
DIS
MOV
SI,3000H
MOV
BL,[SI]
MOV
MOV
MOV
MOV
MOV
MOV
SINLOOP1: MOV
SINLOOP2: MOV
MOV
MUL
MOV
OUT
PUSH
PUSH
PUSH
MOV
MOV
DALLYSIN1: CALL
CALL
JNZ
LOOP
POP
POP
POP
INC
CMP
DI,OFFSET TIAOFU [DI],BL SI,3001H AL,[SI]
SI,OFFSET TIAOPIN [SI],AL
SI,OFFSET SINTAB AL,[SI] BL,TIAOFU BL
DX,DA0832
;啟動D/A轉換
DX,AL AX SI CX CL,TIAOPIN CH,00H CCSCAN SINA1 DALLYSIN1 CX SI AX SI
SI,OFFSET TRITAB
;是否結束一個周期
DIS
JNZ
SINLOOP2
JMP
SINLOOP1
SINA: RET
SINW ENDP
第四章 系統調試遇到的問題及解決方法
本次課程設計是對前幾次微機原理實驗的檢驗,也是微機原理與接口技術這門課程的綜合應用。前幾次軟件實驗,我都積極地實現了拓展題目的要求,所以在選擇課題的時候,我第一印象就感覺到信號發生器對軟件要求要大于硬件要求,重點是編程,所以,在選擇了這個題目以后我就開始思考用何種方式實現。
整體分析后,硬件電路的系統設計比較簡單,主程序的設計思路也比較清晰,主要分為波形產生,數碼管顯示,鍵盤控制,頻率幅值調節四個模塊。但是具體每個模塊的實現卻又遇到了很多的問題,方案上也有些調整。
在此次實驗系統調試的過程中,把整個大的程序劃分為幾個小模塊分開調試好,無誤后再寫主程序將各個子程序整合起來。雖然一開始感覺思路是很好的,但是在實現過程中遇到了很大的麻煩。
1.硬件的連線。硬件連好后,將方波子程序載入8086,最開始示波器連輸出都沒有,DAC0832的片選端一直沒有被選中,我總是以為是地址的問題,可是怎么檢查程序也是沒有理由出錯的,最后發現DAC0832的WR端虛接了,軟件畫圖容易出現虛接的情況,所以連線的時候一定要小心。
2.小鍵盤控制,這也是整個程序中最核心的部分。這個子程序加在程序的最前面的,如果沒有掃描到鍵值,整個程序就會陷入死循環,不會有任何輸出變化。要使鍵盤掃描得到鍵值,我參考了實驗指導書上的小鍵盤控制,先把小鍵盤掃描的程序單獨給出來,看能否顯示數字,結果并不能正常顯示,反復檢查調試以后,修改了鍵值的存儲方式以及延時,將其修改后,小鍵盤方面能正常掃描了。
3.其實最復雜的是將數碼管顯示和小鍵盤掃描整合在一起。數碼管顯示問題一直很復雜,總是不能正常的顯示,明明小鍵盤Y端有變化,表明有鍵按下,但是數碼管就是不能將要顯示的數平穩地顯示,剛開始只顯示零,后來經修改后,會偶爾顯示一下幅值或頻率但又立馬變了,并且顯示的數字也不正確,貌似會和之前顯示的數字有重雙影。查唐都的實驗說明得知,數碼管只提供了一個8位數據端口,一次只能讓一個數碼管顯示數據,然后顯示過程特別地快,基本上看不到想要的結果,并且閃爍得特別厲害。經過反復一直地查找修改,終于發現,有兩個數碼管顯示的內容重疊了,原來是要顯示的兩個存儲單元的地址弄混了,并且延時也有問題。但是數碼管的延時又涉及到波形每個輸出點的延時,所以將波形產生方面,我改用了采樣數字量表,使所有的波形產生都簡化了,同時也使延時更短,改為增加循環次數,并且使數碼管顯示也加入循環里,這樣利用視覺暫留,就能看到同時顯示幅值和頻率。
4.在小鍵盤實現中還出現了一個很重要的問題,就是在執行到對應的波形時要怎么樣跳出然后執行到另外一個波形里面去。原本我想多設置幾個按鍵,4個負責選擇波形,4個負責調幅調頻,還要加一個退出按鍵,每輸出一個周期就掃描一次,可是這樣按鍵太多了程序顯得臃腫,并且沒有波形的情況調節頻率也是沒有意義的,而且一個周期的時間,很有可能使你的按鍵落空,沒有掃描進去。最后決定只用5個鍵。沒有波形時4個按鍵選擇波形,每次執行完一個點后再重新鍵盤掃描,此時那4個鍵又代表調幅和調頻,而4鍵從始至終設置為退出鍵,只要任何時候掃描到此鍵就返回初始狀態,重新進入波形選擇,這樣就實現了波形的切換,又使按鍵有效率更高,而且按鍵數量也很少。
5.方波和三角波的波形產生的程序并不難。鋸齒波就是截取三角波的一半,而正弦波,我找到的正弦波采樣值序列表都很長,而且值都比較大,所以最后,我用計算器在0~2π內取了40個點的正弦值。最后在調節幅值的時候,當調到最大幅值時,有兩種波形失真了,尤其正弦波和三角波形被截頂了。但是我觀察到鋸齒波卻能正常顯示,原來鋸齒波的采樣數字量表的最大值比較小,經放大最大倍數后也沒有超出范圍。這可能是因為放大后正弦波的最大值已經超出了運放輸出的最大電壓,所以導致截頂失真。所以我將數字量的值整體縮小了,最后總算達到滿意的效果。第五章 課程設計收獲與體會
本次課程設計在面臨考試的巨大壓力和編程難度的雙重壓力下終于完成了。這讓我對于微機原理與接口技術這門課程又有了更深的了解,尤其是匯編語言的運用。這是一次很好的實踐的機會,將我們之前幾個星期做的微機原理與接口技術實驗的軟件和硬件部分都結合起來,靈活的運用,鍛煉我們學以致用,解決實際問題的能力。我在此次課程設計中受益匪淺,收獲良多。
本次設計我是用仿真完成的,因為上學期在模電數電課程設計中也使用到了protues軟件,所以這次的設計,對于protues的使用我一點也不陌生。但是,這次的仿真比起以前模電數電仿真要復雜多了。因為這次我選擇的信號發生器重點就是匯編語言程序的編寫和調試,程序出現的錯誤比硬件出現的錯要難找的多,尤其是邏輯錯誤,有的時候看都看不出來。但是我還是比較喜歡匯編語言的,可能是對C已經忘得差不多了的緣故吧,腦子里只有匯編。匯編是一門很原始的語言,但是也是一門很有用的語言,通過這么一個比較大的實驗,讓我對匯編的理解有了進一步的加深。雖然中間過程有苦有煎熬,但是還是很值得回味的,因為我們就是在這樣一次又一次煎熬中才熬出了頭,才不斷成長為更加強大的人。
在這次設計中,一開始想的比較簡單和樂觀,因為在做微機原理編程實驗的時候,我們接觸的都是幾十行到一百來行的小程序,寫完一檢查就能比較輕松地查找到錯誤,但是這次的題目重點就在編程。一開始,我以為這些程序不會錯,電路也比較簡單。所以當我很快的連好電路,再幾個子程序都加載進去的時候,就完全不是我想象的那樣輸出。而且從整個電路分析,我也找不到問題到底出在哪里。我必須要一步一步地再回頭檢查錯誤。這樣有可能還檢查不出來,最后我只能從一個小模塊開始重新連電路,再將該模塊對應的程序加載,有問題再改。就這樣,一步一步,只有解決了局部的問題,才能為解決整體的問題提供可能。
在小鍵盤和數碼管顯示的模塊,確實一度陷入瓶頸,不知道問題出在哪里,為什么就是不能顯示。我去了幾次實驗室,想和大家交流一下,但是選擇這個題目的人真的很少,最后找到幾個同學,但是他們迫于考試壓力要么放棄了仿真,要么放棄了小鍵盤,當時的情緒真是非常抑郁,難道就真的做不出來了嗎?怎么可能?就是不相信,感覺就差一點點,就要實現了,因為堅持,因為堅信,因為堅定,哪怕這個茬再難找也會原形畢露的。當看到數碼管顯示正常,自己的心血終于有了結果,內心的喜悅溢于言表。有句話說得對:失敗就是離成功最近的地方,邁過去了就是另一片天。
這次的課程設計,我要十分感謝同學們給予我的幫助,還有李志明老師的指導,讓我在短短的幾個星期里學到了很多很實用的知識,通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才是真正的知識,才能提高自己的實際動手能力和獨立思考的能力。而且在做課程設計的過程中,不僅是考驗自己所學的《微機原理》知識,更是要鍛煉自己的分析問題的能力和解決實際問題的能力,而在此次課程設計過程中得到了充分的體現。雖然在設計的過程遇到了各種各樣的問題,但同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,通過這次課程設計,把以前所學過的知識重新溫習,加以鞏固。
這回顧起此次課程設計,我收獲頗豐,不僅鞏固了《微機原理》的知識,而且鍛煉了動手設計,解決實際問題的能力,同時讓我堅定了一個信念,學習上,沒有攀登不了的山峰,即使山重水復疑無路,只要堅持下去,也會看到柳暗花明又一村。在今后的學習中,我也會將以這樣的精神面對所有的困難。
第六章 參考文獻
1.《微機原理與接口技術(第4版)》周荷琴等 中國科學技術大學出版社 2.《TD-PIT+實驗教程》 3.《TD-PIT+用戶手冊》
第七章 附錄
7.1匯編源程序
IOY0 EQU
0C400H
;片選IOY0對應的端口始地址
IOY1 EQU
0C440H
;片選IOY0對應的端口始地址;*****************************************************************
MY8255_A EQU
IOY0+00H*4;8255的A口地址
MY8255_B EQU
IOY0+01H*4;8255的B口地址
MY8255_C EQU
IOY0+02H*4;8255的C口地址
MY8255_MODE EQU
IOY0+03H*4;8255的控制寄存器地址
DA0832 EQU
IOY1+00H*4;DA0832的端口地址
STACK1 SEGMENT
STACK
DW
256 DUP(?)
STACK1 ENDS
DATA SEGMENT
DTABLE DB
3FH,06H,5BH,4FH,66H,6DH,7DH DB
07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
;鍵值表,0~F對應的7段數碼管的段位值
SINTAB DB
16,19,21,23,25,27,29,30,31,32,32,32 DB
31,30,29,27,25,23,21,19,16
;正弦函數表
DB
13,11,9,7,5,3,2,1,0,0,0,1,2,3,5,7,9,11,13
TRITAB DB
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;三角函數表
DB
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
DB
30,29,28,27,26,25,24,23,22,21,20,19,18,17,16
DB
15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
RCTTAB DB
1,2,3,4,5,6,7,8
;鋸齒函數表
DB
9,10,11,12,13,14,15,16
DB
17,18,19,20,21,22,23,24
DB
25,26,27,28,29,30,31,32
STR1 DB
'press 0~3 to output wave',0AH,0DH
DB
'press 4to quit ',0AH,0DH,'$'
AMPL DB
FENC DB
TIAOFU DB
?
TIAOPIN DB
?
KEY DB
?
DATA ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA
START: MOV
AX,DATA
MOV
DS,AX
MOV
DX,MY8255_MODE
;初始化8255工作方式
MOV
AL,81H
;方式0,A口、B口輸出,C口低4位輸入
OUT
DX,AL
BEGIN0: MOV
SI,3000H
;把數碼管清0
MOV
AL,00H
;先初始化鍵值為0
MOV
[SI],AL
MOV
AL,00H
MOV
[SI+1],AL
MOV
AL,00H
MOV
[SI+2],AL
MOV
AL,00H
MOV
[SI+3],AL
MOV
SI,OFFSET KEY
MOV
AL,00H
MOV
[SI],AL
BEGIN1: CALL
DIS
;顯示刷新
CALL
CCSCAN
;再次掃描按鍵
JNZ
LBEGIN0
;有鍵按下則跳置LBEGIN0
JMP
BEGIN1
;不是按下第一或二鍵就繼續等待輸入
LBEGIN0: CALL
GETKEY1
;第二個菜單等待輸入
CALL
DIS
MOV
SI,OFFSET KEY
MOV
AL,[SI]
CMP
AL,4
;第5個鍵退出
JZ
BEGIN0
CMP
AL,0
;第1個鍵到squ(方波)函數
JZ
CMP
JZ
CMP
JZ
CMP
JZ
JMP
LBEGIN1: CALL
JMP
LBEGIN2: CALL
JMP
LBEGIN3: CALL
JMP
LBEGIN4: CALL
JMP
JMP
SQUREW PROC
MOV
MOV
MOV
MOV
MOV
MOV
MOV
LBEGIN1
AL,1
;第2個鍵到tri(三角波)函數 LBEGIN2
AL,2
;第3個鍵到rec(鋸齒)函數 LBEGIN3
AL,3
;第4個鍵到sin(正弦)函數 LBEGIN4
BEGIN1
;其他鍵則跳到繼續等待輸入 SQUREW
;SQUARE BEGIN0
TRIW
;TRIANGLE BEGIN0
RCTW
;RECANGLE BEGIN0
SINW
;SIN
BEGIN0
;執行完輸出波形之后 回到開始狀態 BEGIN0
;上面是主程序
NEAR
;方波發生子程序
DI,OFFSET FENC
;初始化顯示管的值為3 AL,[DI] SI,3000H [SI],AL
DI,OFFSET AMPL AL,[DI] SI,3001H
MOV
[SI],AL
SQUR1: CALL
AMPLFENC
;調節幅值頻率子程序,有鍵按下是調節幅值頻率
MOV
SI,OFFSET KEY
;按下第五個鍵就退出
MOV
AL,4
CMP
[SI],AL
TRILOOP1:
D11:
D21:
JZ
SQUA CALL
DIS MOV
SI,3000H MOV
BL,[SI] MOV
DI,OFFSET TIAOFU MOV
[DI],BL MOV
SI,3001H MOV
AL,[SI] MOV
SI,OFFSET TIAOPIN MOV
[SI],AL
DX,DA0832
;輸出低電平
輸出方波形 MOV
AL,00H OUT
DX,AL CALL
DIS
;刷新 PUSH
CX PUSH
AX MOV
CL,TIAOPIN MOV
CH,00H MOV
AX,00FFH DEC
AX PUSH
AX PUSH
CX CALL
DIS CALL
CCSCAN
;再次掃描按鍵 JNZ
SQUR1
;有鍵按下則跳置squr1, POP
CX
MOV
POP
AX
JNZ
D21
LOOP
D11
POP
AX
POP
CX
CALL
CCSCAN
;再次掃描按鍵
JNZ
MOV
MOV
MUL
MOV
OUT
CALL
PUSH
PUSH
MOV
MOV
D12: MOV
D22: DEC
PUSH
PUSH
CALL
CALL
JNZ
POP
POP
JNZ
LOOP
POP
POP
JZ
SQUA: RET
SQUR1
;有鍵按下則跳置squr1,改變幅值頻率 BL,TIAOFU AL,20H BL
DX,DA0832
;輸出高電平
DX,AL
DIS
;刷新
CX AX CL,TIAOPIN CH,00H AX,00FFH AX AX CX DIS
CCSCAN
;再次掃描按鍵 SQUR1
;有鍵按下則跳置tri1 CX AX D22 D12 AX CX
TRILOOP1
;沒按鍵時繼續輸出波形
SQUREW ENDP
TRIW PROC
NEAR
;三角波形子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
TRA1:
TRLOOP1:
TRLOOP2:
MOV
[SI],AL MOV
DI,OFFSET AMPL MOV
AL,[DI] MOV
SI,3001H MOV
[SI],AL CALL
AMPLFENC MOV
SI,OFFSET KEY MOV
AL,4 CMP
[SI],AL JZ
TRIA CALL
DIS MOV
SI,3000H MOV
BL,[SI] MOV
DI,OFFSET TIAOFU MOV
[DI],BL MOV
SI,3001H MOV
AL,[SI] MOV
SI,OFFSET TIAOPIN MOV
[SI],AL MOV
SI,OFFSET TRITAB MOV
AL,[SI] MOV
BL,TIAOFU MUL
BL MOV
DX,DA0832
;啟動D/A轉換 OUT
DX,AL PUSH
AX
PUSH
SI
PUSH
CX
MOV
CL,TIAOPIN
MOV
CH,00H
DALLYTRI1: CALL
DIS
CALL
CCSCAN
JNZ
LOOP
POP
POP
POP
INC
CMP
JNZ
JMP
TRIA: RET
TRIW ENDP
RCTW PROC
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
RCT1: CALL
MOV
MOV
CMP
JZ
CALL
TRA1 DALLYTRI1 CX SI AX SI
SI,OFFSET RCTTAB TRLOOP2 TRLOOP1
NEAR
;鋸齒波形子程序 DI,OFFSET FENC AL,[DI] SI,3000H [SI],AL
DI,OFFSET AMPL AL,[DI] SI,3001H [SI],AL AMPLFENC SI,OFFSET KEY AL,4 [SI],AL RCTA DIS
MOV
SI,3000H
MOV
BL,[SI]
MOV
DI,OFFSET TIAOFU
MOV
[DI],BL
MOV
SI,3001H
MOV
AL,[SI]
MOV
MOV
RCLOOP1: MOV
RCLOOP2: MOV
MOV
MUL
MOV
OUT
PUSH
PUSH
PUSH
MOV
MOV
DALLYRCT1: CALL
CALL
JNZ
LOOP
POP
POP
POP
INC
CMP
JNZ
JMP
RCTA: RET
RCTW ENDP
SI,OFFSET TIAOPIN [SI],AL
SI,OFFSET RCTTAB AL,[SI] BL,TIAOFU BL
DX,DA0832
;啟動D/A轉換 DX,AL AX SI CX CL,TIAOPIN CH,00H CCSCAN RCT1 DALLYRCT1 CX SI AX SI
SI,OFFSET STR1 RCLOOP2 RCLOOP1
DIS
SINW PROC
NEAR
;正弦波的子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
MOV
[SI],AL
SINA1:
SINLOOP1:
SINLOOP2:
MOV
DI,OFFSET AMPL MOV
AL,[DI] MOV
SI,3001H MOV
[SI],AL CALL
AMPLFENC MOV
SI,OFFSET KEY MOV
AL,4 CMP
[SI],AL JZ
SINA CALL
DIS MOV
SI,3000H MOV
BL,[SI] MOV
DI,OFFSET TIAOFU MOV
[DI],BL MOV
SI,3001H MOV
AL,[SI] MOV
SI,OFFSET TIAOPIN MOV
[SI],AL MOV
SI,OFFSET SINTAB MOV
AL,[SI] MOV
BL,TIAOFU MUL
BL MOV
DX,DA0832
;啟動D/A轉換 OUT
DX,AL PUSH
AX PUSH
SI
PUSH
CX
MOV
CL,TIAOPIN
MOV
CH,00H
DALLYSIN1: CALL
DIS
CALL
CCSCAN
JNZ
SINA1
LOOP
POP
POP
POP
INC
CMP
JNZ
JMP
SINA: RET
SINW ENDP
AMPLFENC PROC
CALL
CALL
JNZ
JMP
TRI1: CALL
CALL
MOV
MOV
CMP
JZ
JZ
CMP
JNZ
MOV
DALLYSIN1 CX SI AX SI
SI,OFFSET TRITAB SINLOOP2 SINLOOP1
NEAR
;調節幅值頻率子程序 DIS
;刷新
CCSCAN
;再次掃描按鍵 TRI1
;有鍵按下則跳置tri1 TRI5
;沒按鍵按下就跳出該子程序DIS
;刷新 GETKEY1
SI,OFFSET KEY
AL,[SI]
AL,4
;第五個鍵就退出 TRI10 TRI5
AL,0
;第一個鍵減少周期 TRI2
DI,3001H
MOV
BL,[DI]
CMP
BL,01H
JE
TRI5
DEC
BL
MOV
[DI],BL
JMP
TRI5
TRI2: CMP
JNZ
MOV
MOV
CMP
JE
INC
MOV
JMP
TRI3: CMP
JNZ
MOV
MOV
CMP
JE
DEC
MOV
JMP
TRI4: CMP
JNZ
MOV
MOV
CMP
JE
INC
MOV
AL,1
TRI3 DI,3001H BL,[DI] BL,05H TRI5 BL [DI],BL TRI5
AL,2
TRI4 DI,3000H BL,[DI] BL,01H TRI5 BL [DI],BL TRI5
AL,3
TRI5 DI,3000H BL,[DI] BL,05H TRI5 BL [DI],BL
;第二個鍵增加周期;第三個鍵減少幅度;第四個鍵增加幅度
JMP
TRI5
TRI10: JMP
FAR PTR BEGIN0
TRI5: RET
AMPLFENC ENDP
GETKEY1 PROC
NEAR
CALL
CALL
CALL
CALL
CALL
JNZ
JMP
GETKEY2: MOV
MOV
COLUM: MOV
MOV
OUT
MOV
IN
L1: TEST
JNZ
MOV
JMP
L2: TEST
JNZ
MOV
JMP
L3: TEST
JNZ
MOV
JMP
DIS
;顯示刷新 DALLY DALLY
CLEAR
;清屏
CCSCAN
;再次掃描按鍵
GETKEY2
;有鍵按下則跳置GETKEY2 BEGIN1
;否則跳回開始繼續循環
CH,0FEH
CL,00H
;設置當前檢測的是第幾列
AL,CH
;選取一列,將X1~X4中一個置0
DX,MY8255_A DX,AL
DX,MY8255_C;讀Y1~Y4,用于判斷是哪一行按鍵閉合AL,DX
AL,01H
;是否為第1行 L2
;不是則繼續判斷
AL,00H
;設置第1行第1列的對應的鍵值
KCODE
AL,02H
;是否為第2行 L3
;不是則繼續判斷
AL,04H
;設置第2行第1列的對應的鍵值
KCODE
AL,04H
;是否為第3行 L4
;不是則繼續判斷
AL,08H
;設置第3行第1列的對應的鍵值
KCODE
L4: TEST
AL,08H
;是否為第4行
JNZ
NEXT
;不是則繼續判斷
MOV
AL,0CH
;設置第4行第1列的對應的鍵值
KCODE: ADD
AL,CL
;將第1列的值加上當前列數,確定按鍵值
CALL
PUTBUF
;保存按鍵值
PUSH
AX
KON: CALL
CALL
CALL
JNZ
POP
NEXT: INC
MOV
TEST
JZ
ROL
MOV
JMP
KERR: RET
GETKEY1 ENDP
CCSCAN PROC
MOV
MOV
OUT
MOV
IN
NOT
AND
RET
CCSCAN ENDP
DIS
;顯示刷新 CLEAR
;清屏
CCSCAN
;掃描按鍵,判斷按鍵是否彈起 KON
;未彈起則繼續循環等待彈起 AX
CL
;當前檢測的列數遞增
AL,CH
AL,08H
;檢測是否掃描到第4列 KERR
;是則跳回到開始處
AL,1
;沒檢測到第4列則準備檢測下一列
CH,AL COLUM NEAR
;掃描是否有按鍵閉合子程序
AL,00H
DX,MY8255_A;將4列全選通,X1~X4置0 DX,AL DX,MY8255_C AL,DX
;讀Y1~Y4 AL
AL,0FH
;取出Y1~Y4的反值
CLEAR PROC
NEAR
;清除數碼管顯示子程序
MOV
DX,MY8255_B;段位置0即可清除數碼管顯示
MOV
AL,00H
OUT
DX,AL
RET
CLEAR ENDP
DIS
鍵值并顯示
AGAIN:
相應的鍵值
NEAR
;顯示鍵值子程序
PUSH
AX
;以緩沖區存放的鍵值為鍵值表偏移找到MOV
SI,3000H MOV
DL,0F7H MOV
AL,DL PUSH
DX MOV
DX,MY8255_A OUT
DX,AL
;設置X1~X4,選通一個數碼管 MOV
AL,[SI]
;取出緩沖區中存放鍵值 MOV
BX,OFFSET DTABLE AND
AX,00FFH ADD
BX,AX MOV
AL,[BX]
;將鍵值作為偏移和鍵值基地址相加得到MOV
DX,MY8255_B OUT
DX,AL
;寫入數碼管A~Dp CALL
DALLY INC
SI
;取下一個鍵值 POP
DX MOV
AL,DL TEST
AL,01H
;判斷是否顯示完? JZ
OUT1
;顯示完,返回 ROR
AL,1 MOV
DL,AL PROC
JMP
AGAIN
;未顯示完,跳回繼續
OUT1: POP
AX
RET
DIS ENDP
PUTBUF PROC
NEAR
;保存鍵值子程序
MOV
MOV
CMP
JNZ
MOV
GOBACK: RET
PUTBUF ENDP
DALLY PROC
PUSH
MOV
D1: MOV
D2: DEC
JNZ
LOOP
POP
RET
DALLY ENDP
CODE ENDS
END
DI,OFFSET KEY [DI],AL DI,2FFFH GOBACK DI,3004H NEAR
;軟件延時子程序 CX CX,000FH AX,000FH AX D2 D1 CX START
7.2 8086 最小模式的硬件連接圖
第二篇:微機原理課設
目錄
一.課程設計的實驗目的與要求……………………………2 1.教學目的……………………………2 2.教學要求……………………………2 3.主要技術指標……………………………2 二.課程設計課題的分析……………………………2 三.課程設計的結果……………………………4 1.實驗代碼……………………………4 2.實驗現象……………………………10 四.心得體會 ……………………………12 五.參考文獻 ……………………………12
一、課程設計的目的與要求 1.教學目的
本課程的課程設計是自動化專業學生學習完《微機原理及應用》課程后,進行的一次以匯編語言為主,硬件設計為輔的綜合訓練。本課程設計的其目的在于加深對微機原理基本知識的理解,掌握匯編語言程序設計的基本方法;掌握運用微機原理開發系統的基本方法。2.教學要求
從課程設計的目的出發,通過設計工作的各個環節,達到以下要求: 1)掌握匯編語言程序設計的基本方法。
2)進一步理解各種接口電路的應用。例如8255并行接口,8253定時器等。3)掌握利用PC機揚聲器發出不同頻率聲音的方法。3.主要技術指標
1)在程序運行時使PC即成為一架可彈奏的電子琴。當按下數字鍵1-8時,依次發出1,2,3,4,5,6,7,I這八個音調。2)在程序運行時使PC自動按要求提示演奏樂曲。
二、課程設計課題的分析
圖1.揚聲器工作原理圖示
圖2.主程序工作流程圖
圖3.樂曲演奏子程序工作流程圖 圖4.電子琴子程序工作流程圖
圖5.揚聲器工作流程圖
三、課程設計的結果
1、實驗代碼
DATA
SEGMENT INFO1
DB 0AH, 0DH, 'WELCOME YOU TO COME HERE!$'
DB 0AH, 0DH, 'THIS IS A MUSIC PROGRAM!$' DB 0AH, 0DH, 'PLEASE SELECLT!$' INFO4
DB 0AH, 0DH, 'INPUT ERROR!$' INFO5
DB 0AH, 0DH, 'PLEASE INPUT AGAIN!$' MUSLIST
DB 0AH, 0DH, '========================='
DB 0AH, 0DH, 'Press1
HuanLeSong' DB 0AH, 0DH, 'Press2
KaiXin' DB 0AH, 0DH, 'Press3
XiaoBuWuQu' DB 0AH, 0DH, 'Press4
Wonderful' DB 0AH, 0DH, 'Press5
SCALE PLAY ' DB 0AH, 0DH, 'Press6
EXIT' DB 0AH, 0DH, '=========================' DB 0AH, 0DH, '$' MUS_FRQ1
DW 330, 330, 350, 393, 393, 350, 330, 294
DW 262, 262, 294, 330, 330, 294, 294 DW 330, 330, 350, 393, 393, 350, 330, 294
DW 262, 262, 294, 330, 294, 262, 262 DW 294, 294, 330, 262, 294, 330, 350, 330, 262 DW 294, 330, 350, 330, 262, 262, 294, 393 DW 330, 330, 350, 393, 393, 350, 330, 294 DW 262, 262, 294, 330, 294, 262, 262,-1 MUS_TIM1
DW 8 DUP(100)
DW 7 DUP(100),200 DW 8 DUP(100)DW 7 DUP(100),200 DW 5 DUP(100),50,50,2 DUP(100)DW 100,50,50,4 DUP(100),200 DW 8 DUP(100)DW 7 DUP(100),200 MUS_FRQ2
DW 330, 294, 262, 294, 3 DUP(330)DW 3 DUP(294), 330, 392, 392 DW 330, 294, 262, 294, 4 DUP(330)DW 294, 294, 330, 294, 262,-1 MUS_TIM2
DW 6 DUP(100),200 DW 2 DUP(100,100,200)DW 8 DUP(100)DW 4 DUP(100),400 MUS_FRQ3
DW 392, 262, 294, 330, 350, 392, 262, 262 DW 440, 350, 392, 440, 494, 524, 262, 262 DW 350, 392, 350, 330, 294, 330
DW 350, 330, 294, 262, 294, 330, 294, 262, 247, 262,-1 MUS_TIM3
DW 200, 4 DUP(100), 200, 200, 200 DW 200, 4 DUP(100), 200, 200, 200 DW 200, 4 DUP(100), 200 DW 4 DUP(100), 200, 4 DUP(100), 400 MUS_FRQ4
DW 330, 392, 330, 294, 330, 392, 330, 394, 330 DW 330, 392, 330, 294, 262, 294, 330, 392, 294
DW 262, 262, 220, 196, 196, 220, 262, 294, 330, 262,-1 MUS_TIM4
DW 3 DUP(200), 100, 100, 200, 100, 100, 400 DW 2 DUP(200,200,100,100), 400 DW 3 DUP(200,100,100), 400 TABLE
DW 262, 294, 330, 349, 392, 440, 494, 525
NUMB
DB 0AH, 0DH, 'Keyboard number 1~8 keys play notes of the scale'
DB 0AH, 0DH, 'Enter or Ctrl+C to exit' DB 0AH, 0DH, '$' DATA
ENDS STACK
SEGMENT
PARA STACK 'STACK'
STA
DB 200 DUP('STACK')
STACK
ENDS CODE
SEGMENT ASSUME DS: DATA, SS: STACK, CS: CODE, ES: DATA START:
MOV AX, DATA
MOV DS, AX MOV ES, AX MOV AX, STACK
MOV SS, AX SHOW
MACRO B MOV DX, OFFSET B
MOV AH, 09H
INT 21H ENDM SHOW INFO1 LOP:
SHOW MUSLIST MOV AH, 01H
INT
21H
CMP AL, 36H
JZ
RETU
CMP AL, 31H
JNZ
B0 CALL MUSIC1
JMP
EXIT1 B0:
CMP
AL, 32H
JNZ
C0 CALL MUSIC2
JMP
EXIT1 C0:
CMP
AL, 33H
JNZ
D0 CALL MUSIC3
JMP
EXIT1 D0:
CMP
AL, 34H
JNZ
E0 CALL MUSIC4
JMP
EXIT1 E0:
CMP
AL, 35H
JNZ
EXIT SHOW NUMB CALL MUSIC5 EXIT1:
SHOW INFO5
JMP
LOP EXIT:
SHOW INFO4 SHOW INFO5
JMP
LOP RETU:
MOV AX, 4C00H
INT
21H MUSIC1
PROC
LEA
SI, MUS_FRQ1
LEA
BP,DS: MUS_TIM1 FREQ1:
MOV DI, [SI] CMP DI,-1
JE
END_MUS1 MOV BX, DS: [BP] CALL GENSOUND
ADD
SI,2
ADD
BP,2 JMP FREQ1
END_MUS1:RET MUSIC1
ENDP MUSIC2
PROC
LEA
SI, MUS_FRQ2
LEA
BP,DS: MUS_TIM2 FREQ2:
MOV DI, [SI] CMP DI,-1
JE
END_MUS2 MOV BX, DS: [BP] CALL GENSOUND
ADD
SI,2
ADD
BP,2
JMP FREQ2
END_MUS2:RET MUSIC2
ENDP MUSIC3
PROC
LEA
SI, MUS_FRQ3
LEA
BP,DS: MUS_TIM3 FREQ3:
MOV DI, [SI] CMP DI,-1
JE
END_MUS3 MOV BX, DS: [BP] CALL GENSOUND
ADD
SI,2
ADD
BP,2 JMP FREQ3
END_MUS3:RET MUSIC3
ENDP MUSIC4
PROC
LEA
SI, MUS_FRQ4
LEA
BP,DS: MUS_TIM4 FREQ4:
MOV DI, [SI] CMP DI,-1
JE
END_MUS4 MOV BX, DS: [BP] CALL GENSOUND
ADD
SI,2
ADD
BP,2 JMP FREQ4
END_MUS4:RET MUSIC4
ENDP MUSIC5
PROC NEAR PUSH AX PUSH BX PUSH CX LOP5:
MOV AH, 01H
INT
21H
CMP AL, 0DH
JE
EXIT5
CMP AL, 31H
JB
LOP5
CMP AL, 38H
JA
LOP5
AND AX, 0FH
SHL
AX, 1
SUB
AX, 2
MOV SI, AX MOV BX, OFFSET TABLE MOV DI, [BX][SI]
MOV BX, 100
CALL
GENSOUND
JMP LOP5 EXIT5:
POP CX POP BX POP AX
RET MUSIC5
ENDP GENSOUND
PROC
PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL, 0B6H
OUT
43H, AL
MOV
DX, 12H
MOV AX, 533H*896 DIV DI OUT 42H, AL
MOV AL, AH OUT 42H, AL
IN AL, 61H
MOV AH, AL OR AL, 3
OUT 61H, AL
PUSH AX
WAIT1:
MOV CX, 1200
DELA1:
IN AL, 61H
AND AL, 10H CMP AL, AH JE DELA1 MOV AH,AL LOOP DELA1 DEC BX JNZ WAIT1 POP AX MOV AL, AH OUT 61H, AL
POP DI POP DX POP CX
POP
BX POP AX
RET GENSOUND ENDP CODE
ENDS END
START
2、實驗現象
1.進入DOS后在DOS界面進行匯編鏈接并生成可執行文件.exe 2.雙擊可執行文件DZQ.exe進入操作界面如圖所示
操作界面初始界面
3.在進行操作的時候只要在鍵盤上按1-4這數字鍵就可以聽取歌曲1-4,按數字鍵5時進入電子琴界面,這時候1-8分別表示音樂CDEFGABC這幾個音符。按回車后退出電子琴操作界面,這時候按6退出程序。
按數字鍵5后進入電子琴界面
四、心得體會
這次課程設計給我的感覺是:與其說這次課設是一個任務,不如說是期末對微機原理的一次系統的復習。通過課設,我弄清楚了課本上一些比較晦澀但是又非常重要的章節的內容,例如:鍵盤和顯示器DOS功能調用,數據定義偽指令的使用,子程序的嵌套,8253芯片的初始化等等。
剛拿到課設題目時可以說是毫無思緒,但是通過查閱資料,模仿別人的程序,不斷理解,拼湊,改進,終于按照課設要求完成任務。剛開始上機運行程序出現的問題不可謂不多,但是通過匯編的錯誤提示,我很容易的發現了問題并改正了它,如果不是上機運行,而是一味的盯著程序檢查,那樣的話真可謂無從下手,事倍功半。這個告訴我有時候動動手實踐,遠比啃書學習知識的效率要高得多。
五、參考文獻
[1] 王忠民.微型計算機原理(第二版).西安:西安電子科技大學出版社,2007年
[2] 馬春燕.微機原理與接口技術實驗與學習輔導.北京:電子工業出版社.2007年
第三篇:通信原理課設(本站推薦)
目
錄
一、音頻傳輸系統設計..................................................................................................................1
1.設計目的................................................................................................................................1 2.設計內容................................................................................................................................1 3.實現步驟................................................................................................................................1 4.結論及思考............................................................................................................................5
二、數字傳輸系統設計..................................................................................................................7
1.設計目的................................................................................................................................7 2.設計內容................................................................................................................................7 3.實現步驟..............................................................................................................................11 4.結論及思考..........................................................................................................................17
三、總結與收獲............................................................................................................................18 指導教師意見................................................................................................................................19
《通信原理》課程設計報告
一、音頻傳輸系統設計
1.設計目的
通信的基本形式是在信源和信宿之間建立一條傳遞信息的通道,通信系統通常由 信源,變換器,信道,反變換器,信宿以及等效噪聲等幾部分構成.通過這次音頻傳輸系統設計,我們可以深刻體會到信號在通信系統中的傳輸和處理過程有一個更加清晰的認識和理解,對于模擬通信系統,考查學生對調制技術的理解和使用, 同時,通過音頻傳輸系統的設計,我們更加深刻理解了模擬通信系統設計,以及模擬通信系統下最重要的調制技術的應用和設計,鍛煉了我們獨立思考和分析工程問題的能力,同時,通過設計和實現,我們對復雜的工程問題會有更加深刻的認識,對一個完整的模擬通信系統會有一個更加清晰和完善的概念.2.設計內容
利用NI-USRP節點設備接收實際的廣播信號.結合LABVIEW,實現對音頻信號的調制解調,觀察接收信號的質量并進行分析.3.實現步驟
音頻傳輸系統包括發送端和接收端: 音頻傳輸系統TX.vi: 發射端主程序的前面板如圖,前面板左側為參數輸入圖部分。
(1)首先,用NI-USRP Configuration Utility觀察確保硬件與電腦連接上,以及硬件的地址。
(2)然后修改發送端前面板的“設備的IP地址”。
(3)可以設置聲音文件路徑(labview只能識別wav格式音頻文件)。
(4)USRP配置各類程序控制參數,包括IQ速率,可以更改,但是發送端與接收端的IQ速率要相同,載波頻率就是頻點頻率。
《通信原理》課程設計報告
此模塊的作用是根據輸入的路徑獲取音頻文件,對應于程序框圖SUBVI OPEN Waveform File.vi,輸入是外部音頻文件的路徑,要求必須是wav格式。如果留空,則會自動選擇默認音頻文件,輸出時聲音文件的引用句柄,每次從聲音文件中讀取的樣點數以及任務id。此外,這個子程序還留有一個選擇是否同時播放的選項,程序的前面板會有一個勾選框,可以選擇是否在發送的同時也播放聲音。
2.讀取聲音波形
這個模塊的作用是將打開音頻文件模塊中得到的聲音文件轉換成波形數組形式輸出,同時,還將波形數據寫進聲音輸出設備,使得在發送端可以聽到將要發送的聲音,如果在前面板勾選了同時播放聲音這個選項,那么就可以通過電腦聲卡播放出聲音,對應于程序框圖中的SubVI Read Waveforem File.vi子程序。
輸出是波形數據、任務ID以及文件標示和同時播放聲音這個選項。3.進行FM調制
該模塊的作用是對音頻進行FM調制,對應于Exercises FM Modulation.vi
圖1-3FM調制圖
該模塊的輸入是聲音波形數據,IQ 采樣率和頻偏,輸出是經過FM調制后的時域波形,調制后的波形數據進入niUSRP Write Tx Data(poly)函數。根據前面板上配置后的各項參數發射到空間中,以供接收端程序,普通的FM收音機或者有FM接收功能的手機接收。
該模塊需要分兩步完成對聲音信號的FM調制。
《通信原理》課程設計報告
4.結論及思考
思考:
1.頻偏的意義是什么?它怎樣影響調制信號?從聽眾的角度,能做些什么來解決這些影響,做一些測試驗證觀點。
mf = 最大頻偏低頻信號的頻率,B = 2*(mf+1)F,影響帶寬,而帶寬影響噪聲,所以同時頻偏也影響輸出信噪比。
從聽眾的角度來講,因為公共廣播的頻帶范圍是有限的,為87.5~108MHz,以100KHz為步進搜索電臺。我們在使用通信系統時應該避開這些公共頻帶。
2.找出一些能證明所設計的FM收發機性能優劣的技術指標
采樣率的大小:接收機的采樣效率越高,相同信噪比下收聽效果越好。天線增益:天線增益越小,接收效果越好。結論:
1.利用NI-USRP節電設備,結合LabVIEW,我實現了對音頻信號的調制解調,收聽到了包含有噪聲的音樂。
2.提高接收質量:有很多因素影響FM通信系統的有效性和可靠性,如帶寬、頻偏、增益和載波頻率對FM通信系統的影響較大。經測試,提高增益和減小頻偏可以有效改善質量。
《通信原理》課程設計報告
3、信源編碼
該模塊主要是完成霍夫曼編碼—基于有序頻率二叉樹的編碼。
圖2-2信源編碼
4、信道編碼
這里主要是使用的(7,4)分組編碼
5、脈沖調制
主要完成添加訓練隊列以及脈沖成形濾波的功能。其中添加訓練序列主要是為了接收端可以頻偏校正。
6、信道設置
主要在信道中加入白噪聲。
《通信原理》課程設計報告
前面板左下方是接受信號的它的星座圖,和誤碼率曲線。可以通過這些來判斷程序是否正確。
圖2-5數字傳輸系統接收端
而對接收端的程序框圖進行分析:
1、初始化
實現USRP初始化和配置USRP的參數,此時注意與發送對應。如圖所示。
圖2-6初始化框圖
2、信號檢測
《通信原理》課程設計報告
2.設計內容
1)完成信道編碼即(7,4)分組編碼的過程,此時需要完成Exercises Encode-74.vi,學習(7,4)分組碼譯碼的過程。
2)將脈沖調制模塊的QPSK/BPSK程序圖補充完整 3)學習信源編碼即霍夫曼編譯碼的過程 3.實現步驟
1)發送端接收端程序結構:
圖2-6發送端(1)
圖2-7發送端(2)
發送端程序框圖:
《通信原理》課程設計報告
設置生成矩陣,然后輸入前面板的生成矩陣內,打開程序框圖,進行設計。
圖2-9分組碼程序框圖
設計圖如下:
輸入后將長串輸入數據流進行長度為4的分塊。也即為4維數組。和G矩陣相乘,之后再轉化為一維數組。由于矩陣乘法是數值相加的過程,而分組編碼是異或過程,因此需要將矩陣內每個元素除二取余,余數即為正確的異或過程。
分組碼譯碼: 首先設計校驗矩陣H。接著設計程序框圖如下:
圖2-10解調程序框圖
《通信原理》課程設計報告
入信號平均能量,將此能量與符號能量相乘乘上信號幅值,得到輸出信號
圖2-12 BPSK設計
BPSK。BPSK解調如圖所示。輸入數據流對2取余,輸出到下一個框圖,0對應1,1對應-1.4)利用USRP設備實現圖像發送 首先設置硬件設備,選擇好天線,然后打開發送端和接收端。得到結果如下:
圖2-13發送和接收圖像
在圖像傳輸過程中會出現噪聲干擾,通過增大增益可以使噪聲減小。
《通信原理》課程設計報告
(備注:此處要求手寫,不得拷貝,要有自己的心得體會)
本人簽名:
年
月
月
日指導教師意見
第四篇:通信原理課設
沈陽理工大學通信系統課程設計
摘 要
摘要:所謂調制,就是在傳送信號的一方將所要傳送的信號附加在高頻振蕩上,再由天線發射出去。這里高頻振蕩波就是攜帶信號的運載工具,也叫載波。振幅調制,就是由調制信號去控制高頻載波的振幅,直至隨調制信號做線性變化。在線性調制系列中,最先應用的一種幅度調制是全調幅或常規調幅,簡稱為調幅(AM)。為了提高傳輸的效率,還有載波受到抑制的雙邊帶調幅波(DSB)和單邊帶調幅波(SSB)。在頻域中已調波頻譜是基帶調制信號頻譜的線性位移;在時域中,已調波包絡與調制信號波形呈線性關系。
本課程設計主要利用MATLAB集成環境下的Simulink仿真平臺,設計一個AM調制與相干解調通信系統,分別在理想信道和非理想信道中運行,并把運行仿真結果輸入顯示器,根據顯示結果分析所設計的系統性能。經過調制,初步實現了設計目標,并且經過適當的完善后,實驗成功。
關鍵詞: MATLAB7.1 ;Simulink仿真平臺;AM調制;相干解調
沈陽理工大學通信系統課程設計
目錄 課程設計目的…………………………………………………………1 課程設計要求…………………………………………………………1 相關知識………………………………………………………………1 課程設計分析…………………………………………………………2 仿真……………………………………………………………………6
6結果分析………………………………………………………………10 參考文獻………………………………………………………………12
沈陽理工大學通信系統課程設計
1.課程設計的目的
1.掌握模擬系統AM調制和解調原理。2.掌握模擬系統AM調制和解調的設計方法。
3.掌握用MATLAB分析系統時域、頻域特性的方法,進一步鍛煉應用MATLAB進行編程仿真的能力。
4.熟悉基于Simulink的動態建模和仿真的步驟和過程。
2.課程設計的要求
利用Matlab軟件進行振幅調制和解調程序設計,輸出顯示調制信號、載波信號以及已調信號波形,并輸出顯示三種信號頻譜圖。對產生波形進行分析,并通過參數的改變,觀察波形變化,分析實驗現象。
3.相關知識 3.1 AM調制原理
幅度調制是用調制信號去控制高頻正弦載波的幅度,使其按調制信號的規律變化的過程。幅度調制器的一般模型如圖2.1所示。
圖3.1—1 幅度調制模型
在圖2-1中,若假設濾波器為全通網絡(=1),調制信號m?t?疊加直流A0后再與載波相乘,則輸出的信號就是常規雙邊帶(AM)調幅.AM調制器模型如圖2-2所示
圖3.1—2 AM調制模型
AM信號波形的包絡與輸入基帶信號m?t?成正比,故用包絡檢波的方法很容易恢復原始調制信號。但為了保證包絡檢波時不發生失真,必須滿足A0?m?t?max,否
沈陽理工大學通信系統課程設計
則將出現過調幅現象而帶來失真。AM信號的頻譜是由載頻分量和上、下兩個邊帶組成(通常稱頻譜中畫斜線的部分為上邊帶,不畫斜線的部分為下邊帶)。上邊帶的頻譜與原調制信號的頻譜結構相同,下邊帶是上邊帶的鏡像。顯然,無論是上邊帶還是下邊帶,都含有原調制信號的完整信息。故AM信號是帶有載波的雙邊帶信號,它的帶寬信號帶寬的兩倍。
3.2 相干解調
由AM信號的頻譜可知,如果將已調信號的頻譜搬回到原點位置,即可得到原始的調制信號頻譜,從而恢復出原始信號。解調中的頻譜搬移同樣可用調制時的相乘運算來實現。相干解調的關鍵是是必須產生一個與調制器同頻同相位的載波。如果同頻同相位的條件得不到滿足,則會破壞原始信號的恢復。
4.課程設計分析
4.1雙邊帶幅度調制
在DSB-AM系統中,已調信號的幅度正比與消息信號。這種調制通過使用乘法器完成,將消息信號嗎m(t)與載波Accos(2πfct),如圖4.1—1所示,表示為:
u(t)=Acm(t)cos(2πfct)
(1)
圖 4.1—1 DSB-AM調制原理結構框圖
其中
c(t)=Accos(2πfct)
(2)
是載波,而m(t)是消息信號。若以單頻正弦信號調制為例,那么典型波形如圖4.1—2所示。
沈陽理工大學通信系統課程設計
現取u(t)的傅立葉變換,可以得到DSB-AM信號的頻域表示為:
(3)
其中M(f)是m(t)的傅立葉變換。很明顯可以看出,這種調制方式將消息信號的頻譜進行了搬移,并在幅度上乘以Ac/2,傳輸帶寬Br是消息信號帶寬的兩倍,也就是說:
Br=2W
(4)
圖3顯示了一個典型的消息信號的頻譜及其相對應的DSB-AM已調信號的頻譜。
圖4.1—2 消息信號與DSB-AM已調信號的頻譜
已調信號的功率為
(5)
其中Pm是消息信號的功率。在DSB-AM通信系統中,信噪比SNR等于基帶的SNR,也就是:
沈陽理工大學通信系統課程設計
(6)
其中PR是接收到的功率(在接收端已調信號的功率),N0是噪聲功率譜密度(假定為白噪聲),W是信號噪聲的帶寬。
4.2雙邊帶抑制載波幅度調制
4.2.1.DSB信號的表達式、頻譜及帶寬
在幅度調制的一般模型中,若假設濾波器為全通網絡(=1),調制信號
中無直流分量,則輸出的已調信號就是無載波分量的雙邊帶調制信號,或稱抑制載波雙邊帶(DSB-SC)調制信號,簡稱雙邊帶(DSB)信號。
DSB調制器模型如圖4.2.1—1所示。可見DSB信號實質上就是基帶信號與載波直接相乘,其時域和頻域表示式分別為
圖4.2.1—1DSB-SC調制模型
(7)
(8)
DSB信號的包絡不再與
成正比,故不能進行包絡檢波,需采用相干解調;除不再含有載頻分量離散譜外,DSB信號的頻譜與AM信號的完全相同,仍由上下對稱的兩個邊帶組成。故DSB信號是不帶載波的雙邊帶信號,它的帶寬與AM信號相同,也為基帶信號帶寬的兩倍,即
4.2.2.DSB信號的解調
DSB信號只能采用相干解調,其模型與AM信號相干解調時完全相同,此時,乘法器輸出
沈陽理工大學通信系統課程設計
經低通濾波器濾除高次項,得
(9)
即無失真地恢復出原始電信號。
抑制載波的雙邊帶幅度調制的好處是,節省了載波發射功率,調制效率高;調制電路簡單,僅用一個乘法器就可實現。缺點是占用頻帶寬度比較寬,為基帶信號的2倍。
沈陽理工大學通信系統課程設計
5.仿真
5.1雙邊帶頻帶幅度調制的系統仿真
圖5.1-1雙邊帶頻帶幅度調制的系統仿真框圖
圖5.1-2 DSB AM Modulator Passband(雙邊帶頻帶幅度調制器)的主要參數
沈陽理工大學通信系統課程設計
圖5.1-3 DBS AM Demodulator Passband(雙邊帶頻帶幅度解調器)的主要參數
圖5.1-4 DBS AM(雙邊帶幅度調制)頻譜儀(Spectrum Scope)的主要參數
沈陽理工大學通信系統課程設計
5.2雙邊帶抑制載波幅度調制系統仿真
圖5.2-1 雙邊帶抑制載波幅度調制的系統仿真框圖
圖5.2-2 DSB-SC AM 信號發生器(Signal Generator)的主要參數
沈陽理工大學通信系統課程設計
圖5.2-3 DSB-SC AM Modualtor Passband(雙邊帶頻帶抑制幅度調制器)的主要參數
圖5.2-4 DSB-SC AM的頻譜儀(Spectrum Scope)的主要參數
沈陽理工大學通信系統課程設計
6.結果分析
6.1雙邊帶頻帶幅度調制的系統仿真結果
圖6.1-1雙邊帶頻帶幅度調制后的頻域圖
圖6.1-2雙邊帶頻帶幅度調制仿真系統中示波器的波形圖
沈陽理工大學通信系統課程設計
6.2雙邊帶抑制載波幅度調制系統仿真結果
圖6.2-1 雙邊帶頻帶抑制幅度調制后調制信號的頻域圖
圖6.2-2 雙邊帶抑制幅度調制后調制信號的時域圖
沈陽理工大學通信系統課程設計
7.參考文獻
【1】桑林,郝建軍,劉丹,【數字通信】,北京郵電大學出版社,2002 【2】苗云長等主編,【現代通信原理及應用】,電子工業出版社,2005 【3】吳偉鈴,龐沁華,【通信原理】,北京郵電大學出版社,2005 【4】張圣勤,【MATLAB7.0實用教程】桑林,郝建軍,劉丹,數字通信,北京郵電大學出版社,2002 【5】邵玉斌,【Matlab/Simulink通信原理建模與仿真實例分析】,清華大學出版社,2008 【6】沈偉慈。【通信電路】,西安電子科技大學出版社,2007
第五篇:微機硬件課設(紅綠燈)
微機原理實驗課程設計
硬件部分
東華大學信息學院
2013.1
一. 基礎實驗部分
實驗1存儲器讀寫實驗
一、實驗目的
1.掌握PC機外存擴展的方法。2.熟悉6264芯片的接口方法。
3.掌握8086十六位數據存儲的方法。
二、實驗設備
微機實驗箱、8086CPU模塊。
三、實驗內容
向02000~020FFH單元的偶地址送入AAH,奇地址送入55H。
四、實驗原理介紹
本實驗用到存儲器電路
五、實驗步驟和要求
1、實驗接線:本實驗無需接線。
2、編寫調試程序
3、運行實驗程序,可采取單步、設置斷點方式,打開內存窗口可看到內存區的變化。本實驗的主要目的是學會用使用工具軟件,掌握用單步執行和斷點方式運行程序,觀察寄存器和內存中的數據變化等程序調試的手段。
六、實驗提示
七、實驗范例程序框圖及源代碼(實驗程序名:RAM.ASM)
八、思考題
1、單步執行到“intram”標號的語句時,ds寄存器的數據是什么?采用斷點方式運行時執行到第一個斷點處,2000H~202FH內存單元的數據是什么?執行到第二個斷點處,2000H~200FH內存單元的數據是什么?并根據觀察結果和對源程序的判讀簡述源程序的運行效果。
答:單步執行到“intram”標號的語句時,ds寄存器的數據都為00。
斷點方式運行時執行到第一個斷點處時,2000H~202FH內存單元的數據都為00。
到第二個斷點處,2000H~200FH內存單元偶地址都為AA,奇地址都為00。
2、修改程序,實現從2000H到200FH單元依次賦值00H~0FH的功能。答:只需改變intram 和 fil中相關的程序: 需改動的原程序:
intram: mov [si],al
incsi loopintram mov si,1000h;設置斷點處 mov cx,100h mov ax,55aah fil:
mov [si],ax;RAM區循環置數 incsi
改為:
intram: mov [si],al incsi loopintram mov si,1000h;設置斷點處
mov cx,100h mov ax,0100h fil:
mov [si],ax incsi addax,0202h incsi loopfil
;RAM區循環置數
實驗2簡單I/O口擴展實驗
一、實驗目的
1、熟悉74LS273,74LS244的應用接口方法。
2、掌握用鎖存器、三態門擴展簡單并行輸入、輸出口的方法。
二、實驗設備
微機實驗箱、8086CPU模塊。
三、實驗內容
邏輯電平開關的狀態輸入74LS244,然后通過74LS273鎖存輸出,利用LED顯示電路作為輸出的狀態顯示。
四、實驗原理介紹
本實驗用到兩部分電路:開關量輸入輸出電路,簡單I/O口擴展電路。
五、實驗步驟
1、實驗接線:(?表示相互連接)CS0 ?CS244; CS1?CS273;平推開關的輸出K1~K8 ? IN0~IN7(對應連接); O0~O7?LED1~LED8。
2、編輯程序,單步運行,調試程序
3、調試通過后,全速運行程序,觀看實驗結果。
4、編寫實驗報告。
六、實驗提示
七、實驗結果
程序全速運行后,邏輯電平開關的狀態改變應能在LED上顯示出來。例如:K2置于L位置,則對應的LED2應該點亮。
八、實驗范例程序框圖(實驗程序名: T244273.ASM)
九、程序源代碼清單
十、思考題:
將74LS244的片選信號CS244改接CS2,將74LS273的片選信號CS273改接CS3,修改程序實現與范例程序相同的功能。
答:只需改變程序中start相應的輸入輸出口地址。需改動的原程序:
start:
mov dx,04a0h
inal,dx mov dx,04b0h outdx,al 改為:
start:
mov dx,04c0h
inal,dx mov dx,04d0h outdx,al
實驗3 8255并行口實驗
一、實驗目的
掌握8255A的編程原理。
二、實驗設備
微機實驗箱、8086CPU模塊。
三、實驗內容
8255A的A口作為輸入口,與邏輯電平開關相連。8255A的B口作為輸出口,與發光二極管相連。編寫程序,使得邏輯電平開關的變化在發光二極管上顯示出來。
四、實驗原理介紹
本實驗用到兩部分電路:開關量輸入輸出電路和8255可編程并口電路。
五、實驗步驟
1、實驗接線
CS0?CS8255; PA0~PA7?平推開關的輸出K1~K8; PB0~PB7?發光二極管的輸入LED1~LED8。
2、編程并全速或單步運行。
3、全速運行時撥動開關,觀察發光二極管的變化。當開關某位置于L時,對應的發光二極管點亮,置于H時熄滅。
六、實驗提示
七、實驗結果
程序全速運行后,邏輯電平開關的狀態改變應能在LED上顯示出來。例如: K2置于L位置,則對應的LED2應該點亮。
八、實驗范例程序框圖及源代碼(實驗程序名:t8255.asm)
九、思考題:
1、修改接線CS2?CS8255,并要求開關置“H”(下)位置時對應LED亮,修改程序實現相應功能。
答:改變相應的輸入輸出口地址,并將讀入ax的值取反。
需改動的原程序: start:
mov dx,04a6h
mov ax,90h
out dx,ax
start1:
mov dx,04a0h
in ax,dx
mov dx,04a2h
out dx,ax
jmp start1 改動后: start:
mov dx,04c6h
mov ax,90h
out dx,ax
start1:
mov dx,04c0h
in ax,dx
mov dx,04c2h not
ax
out dx,ax
jmp start1
實驗4 8253定時器/計數器接口實驗
一、實驗目的
掌握8253定時器的編程原理,用示波器觀察不同模式下的輸出波形。
二、實驗設備
微機實驗箱、8086CPU模塊、示波器。
三、實驗內容
了解8253計數器的不同工作方式,掌握其初始化控制字對定時/記數效果的影響。
四、實驗原理介紹
本實驗用到兩部分電路:脈沖產生電路、8253定時器/計數器電路
五、實驗步驟
1、實驗連線:
CS0?CS8253OUT0?8253CLK2 OUT2?LED1 OUT1?LED2 CLK3?8253CLK0,CLK3?8253CLK1
2、編程調試程序
3、全速運行,觀察實驗結果
六、實驗提示
七、實驗結果
程序全速運行后,LED1按一定周期閃爍(周期理論值為0.2s),LED2在高頻脈沖信號(約15KHz)影響下,有微弱的光亮,但無明顯的周期變化現象。
八、實驗范例程序框圖及源代碼(實驗程序名:t8253.asm)
九、思考題:
1、為什么說范例程序運行時LED1閃爍周期的理論值是0.2秒?在范例程序設置LED2的最大閃爍周期是多少?請分析說明。
答:因為T2采用OUT0的輸出為時鐘,且T2中設置初值為04h,則OUT2輸出方波周期為4*0.05s=0.2s 因為OUT1?LED2,則LED2的周期即為計數器T1的周期,且T1的計數初值由程序知為32h=50d,所以最大周期為50*4/3*10^6=6.67x10^-5s。
2、修改片選信號接線使CS1和CS8253連接,并要求LED1的閃爍周期變為4秒(亮2秒,滅2秒),修改程序實現功能。答:因為4/0.05=80d=50h,所以只需改變相應的計數值和片選接口地址。
需改動的原程序: mov ax,0b6h
out dx,ax mov dx,04a4h mov ax,04h out dx,ax mov ax,0 out dx,ax 改動后:
mov ax,0b6h
out dx,ax mov dx,04b4h mov ax,50h out dx,ax mov ax,0 out dx,ax 其余列出的程序段都只要將片選接口地址中的a改為b即可。
實驗5 8259中斷控制器實驗
一、實驗目的
1、掌握8259A的工作原理。
2、掌握編寫中斷服務程序方法。
3、掌握初始化中斷向量的方法。
二、實驗設備
微機實驗箱、8086CPU模塊。
三、實驗內容
了解中斷處理的原理,掌握利用中斷控制器進行中斷申請和中斷操作的方法。
四、實驗原理介紹
本實驗用到三部分電路:電平開關電路、簡單I/O口擴展電路和8259中斷控制器電路。
五、實驗步驟
1、實驗接線
CS0?CS8259
CS3 ?CS273 O0~O3?LED1~LED4
K1~K4?IR0~IR3 INT?INT(8086CPU板)INTA?INTA(8086CPU板)CS0?CS8253OUT0?8253CLK2 OUT2?LED1 OUT1?LED2 CLK3?8253CLK0,CLK3?8253CLK1
2、編譯調試程序
3、全速運行程序,撥動某一電平開關,觀察LED的亮滅情況。
六、實驗提示
七、實驗結果
全速運行程序,由上往下撥動開關時,相應位置的LED點亮,其余LED全滅。
八、實驗范例程序框圖及源代碼(實驗程序名:t8259.asm)
九、思考題:
1、說明源代碼8259初始化所設置的所有中斷控制字的值和含義(按位說明)。
答:ICW1為初始化字,13h即00010011b,對應于邊沿觸發,間距為8,單片8259A,需要ICW4。
ICW2為中斷類型碼字,80h即10000000b,對應于IR0~IR7的中斷類型碼為80h~87h。
ICW3為中斷結束方式字,01h即00000001b,對應于普通全嵌套方式,非緩沖方式,正常EOI,8086/8088模式。
OCW1為屏蔽控制字,00h即00000000b,對應于8為全部復位屏蔽。
2、修改接線IR3?P+(實驗箱右下角),并修改源程序,使按實驗箱右下角“Pules”鍵時LED1~LED4全亮。
答:改變程序最后IR2的中斷服務程序的設定值,即由0fbh改為0f0h.二、綜合設計實驗部分
一、設計要求
參考基礎實驗的實驗1~實驗5所使用的硬件和范例程序,設計一個簡單的紅綠燈控制系統,用LED1~LED4表示兩組紅綠燈,每組紅燈、綠燈各1只。要求實現以下功能:
(1)紅綠燈的定時切換(每10秒切換一次)
(2)設置燈光測試開關K1,當K1打開(高電平)時,LED1~LED4全亮,關閉后恢復正常。
二、實驗設備
微機實驗箱、8086CPU模塊。
三、實驗內容
了解中斷處理的原理,掌握利用中斷控制器進行中斷申請和中斷操作的方法。
四、實驗原理介紹
本實驗用到五部分電路:電平開關電路、簡單I/O口擴展電路和8259中斷控制器電路,脈沖產生電路、8253定時器/計數器電路
五、實驗步驟
1、實驗接線
CS0?CS8259CS0?CS8253 CS0?CS273 O0?LED101?LED2 02?LED403?LED3 INT?INT(8086CPU板)INTA?INTA(8086CPU板)OUT0?8253CLK2 OUT2?IR0 OUT1?k1 IR1?k1CLK3?8253CLK0,CLK3?8253CLK1
2、編譯調試程序
3、全速運行程序,觀察結果。
六、實驗提示
(1)定時功能可利用8253實現,利用定時器輸出作為中斷申請,利用中斷處理切換LED的顯示;LED狀態可用內存保存或用I/O口讀取。
(2)測試功能運行可在主循環中通過I/O口讀取開關狀態后判定,或利用中斷處理方式運行。
七、實驗結果
全速運行程序,LED1和LED3為一組,LED12和LED4為一組,兩組燈每亮10秒切換一次,撥動k1開關,觀察是否出現LED1~LED4全亮,關閉后恢復正常。
八、程序框圖及源代碼
ASSUME
CS:CODE CODE SEGMENT
PUBLIC
ORG
100H START:
MOV
CX,0
MOV
BX,0FAH START1:
CLI
MOV
DX,04A0H
MOV
AX,13H
OUT
DX,AX
;ICW1, ICW4 NEEDED
MOV
DX,04A2H
MOV
AX,80H
OUT
DX,AX
;ICW2 中斷類型80h
MOV
AX,01H
;01
OUT
DX,AX
;ICW4
MOV
AX,00H
OUT
DX,AX
;OCW1, 開放所有中斷
NOP
;以上為8259初始化
MOV
AX,0
MOV
DS,AX
MOV
DI,200H
;初始化中斷向量表
MOV
AX,OFFSETINT0
MOV
DS:[DI],AX
ADD
DI,2
MOV
DS:[DI],100H
ADD
DI,2
MOV
AX,OFFSET INT1
MOV
DS:[DI],AX
ADD
DI,2
MOV
DS:[DI],100H
ADD
DI,2
MOV
AX,OFFSET INT2
MOV
DS:[DI],AX
ADD
DI,2
MOV
DS:[DI],100H
ADD
DI,2
MOV
AX,OFFSETINT3
MOV
DS:[DI],AX
ADD
DI,2
;上述程序為芯片8259的初始化程序
MOV
DS:[DI],100H
;建議不熟練者不要修改。
MOV
DX,04A6H
;控制寄存器
MOV
AX,36H
;計數器0,方式3
OUT
DX,AX
MOV
DX,04A0H
MOV
AX,7CH
OUT
DX,AX
MOV
AX,92H
OUT
DX,AX
;計數值927Ch
MOV
DX,04A6H
MOV
AX,0B6H
;計數器2,方式3
OUT
DX,AX
MOV
DX,04A4H
MAIN:
WAITING:
DELAY:
INT0:
NOT
INT1:
MOV
INT2:
INT3:
NOP
MOV
CODE
MOV
AX,90H
OUT
DX,AX
MOV
AX,01H
;計數初值0190h
OUT
DX,AX
MOV
AX,0H
STI
;開中斷。
CMP
AX,0H
JE
WAITING
;沒發生中斷,則等待
NOP
NOP
MOV
DX,04A0H
OUT
DX,AX
;對應LED燈亮
MOV
CX,0
LOOP
DELAY
;數字濾波,按鍵去抖
JMP
START1
CLI
;關中斷。以下類推。
NOP
;此兩行為IR0的中斷服務程序 BX
;輸出取反
MOV
AX,BX
;用戶可修改。
IRET
;中斷返回,以下類推。
CLI
NOP
;此兩行為IR1的中斷服務程序,AX,0F0H
;用戶可修改。
IRET
CLI
NOP
;此兩行為IR2的中斷服務程序,MOV
AX,0F5H
;用戶可修改。
IRET
CLI
;此兩行為IR3的中斷服務程序,AX,0F7H
;用戶可修改。
IRET
ENDS
END
START
九.運行結果調試問題及解決方法
1.對于亮10秒鐘的時間設定問題,一開始是算好初值為190h,直接將其賦給AX而忽略了其高位低位的情況,導致驗證結果時總是只有3秒左右,發現后改為先低位后高位復制即達到設定要求:
MOV
AX,90H OUT
DX,AX
MOV
AX,01H
;計數初值0190h
OUT
DX,AX
2.對于撥動k1開關后LED1~LED4全亮的情況,一開始實驗結果總是四個燈都亮但都只保持10秒的設定時間,之后又恢復到兩組燈每亮10秒切換一次的情況。當將開關量k1改為脈沖輸入的時候發現每一次脈沖信號也可以產生相同的實驗結果,由此想到所設計的程序運行周期的情況,一次中斷的產生與有效作用的時間只在這一總線周期內,因此可以在原有中斷的基礎上再人為的加上周期小于總線周期的脈沖有效信號,使其在k1為高電平時期不斷地執行中斷程序,因此可在k1有效時使LED1~LED4一直保持全亮,而k1低電平后又恢復原狀態,具體操作為將脈沖輸出out1也接到k1上