信號發(fā)生器課程設計報告_第1頁
已閱讀1頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  微機應用系統(tǒng)設計與綜合實驗課程設計</p><p>  ——信號發(fā)生器功能程序設計</p><p>  第一章 設計課題概述 </p><p>  1.1 課程設計目的</p><p>  本學期開設的《微型計算機原理與接口技術》理論課程是一門專業(yè)基礎課程,它的主要內(nèi)容包括微型計算機體系結(jié)構、8086 微處理器和指令

2、系統(tǒng)、匯編語言設計以及微型計算機各個組成部分介紹等內(nèi)容。要求學生對微機原理中的基本概念有較深入的了解,能夠系統(tǒng)地掌握微型計算機的結(jié)構、8086 微處理器和指令系統(tǒng)、匯編語言程序設計方法、微機系統(tǒng)的接口電路設計及編程方法等,并具有綜合運用所學知識分析問題和解決問題的能力。</p><p>  《微機應用系統(tǒng)設計與綜合實驗(實踐)》課程設計,讓學生對微機系統(tǒng)有一個較全面的理解,掌握常規(guī)的芯片使用方法、掌握簡單的微型計

3、算機應用系統(tǒng)軟硬件的設計方法,對典型數(shù)字接口電路的應用技術有一個較深入的掌握,并對應用系統(tǒng)進行硬件原理和軟件編程進行分析、設計和調(diào)試,達到基本掌握簡單微型計算機應用系統(tǒng)軟硬件的設計方法,提高項目開發(fā)能力的目的。課程中要求學生根據(jù)課程設計指導書來選擇課題,并且獨立完成課題,寫出課程設計說明書,畫出電路原理圖,說明工作原理,畫出電路板圖,編寫程序以及程序流程圖。</p><p>  針對《信號發(fā)生器功能程序設計》這一

4、課題,主要涉及到硬件的連接(主要用到芯片有:8086CPU,DAC0832,8255,74LS273,74LS138,運放等)以及數(shù)碼管,鍵盤矩陣硬件,示波器等連接原理圖,程序的編寫(主要涉及到顯示波形,數(shù)碼管顯示以及通過小鍵盤來對波形進行選擇控制)以及各個子程序或程序段的程序流程等, </p><p>  通過課程設計不僅可以鍛煉學生在微機應用方面的實際工作能力,將所學轉(zhuǎn)化為所用,更是一個鍛煉解決實際問題能力的

5、很好機會。</p><p>  1.2 課程設計要求</p><p> ?。?)、分別用C語言和匯編語言編程完成硬件接口功能設計;</p><p> ?。?)、硬件電路基于80x86微機的接口電路;</p><p> ?。?)、程序功能要求:小鍵盤給定、數(shù)碼管(屏幕)顯示,并產(chǎn)生對應信號波形(D/A)輸出(信號波形包括正弦波、三角波、方波、鋸

6、齒波)、輸出信號波形幅度、頻率可調(diào)。(注意:按鍵數(shù)量應盡量少)。</p><p><b>  實現(xiàn)技術指標</b></p><p> ?。?)、完全用小鍵盤控制各波形間的切換和頻率和幅值的調(diào)節(jié)以及退出。</p><p>  (2)、實現(xiàn)正弦波、三角波、方波和鋸齒波信號的產(chǎn)生。</p><p>  (3)、數(shù)碼管同步顯示當

7、前工作波形的頻率和幅值。</p><p>  (4)、實現(xiàn)頻率的1到5倍可調(diào)。</p><p> ?。?)、實現(xiàn)幅值的1到5倍可調(diào)。</p><p><b>  使用說明</b></p><p> ?。?)、小鍵盤第一列對應0-3,第二列對應4—7。</p><p> ?。?)、開始選擇0—3分別

8、對應方波,三角波,鋸齒波,正弦波。同時數(shù)碼管會顯示當前波形的幅值和頻率。</p><p>  (3)、有波形產(chǎn)生以后,再調(diào)節(jié)幅值和頻率。0對應增大頻率,1對應減小頻率,2對應減小幅值,3對應增大幅值。</p><p> ?。?)、頻率和幅值可以實現(xiàn)1到5倍可調(diào),同時數(shù)碼管會顯示當前波形的幅值和頻率的倍數(shù)(1~5)。</p><p>  (5)、任何時候4都對應退出,

9、回到最開始的選擇波形狀態(tài),數(shù)碼管歸零。</p><p>  第二章 設計思想和實施方案</p><p><b>  2.1功能分析</b></p><p><b>  2.1.1波形產(chǎn)生</b></p><p>  由于要由數(shù)字信號轉(zhuǎn)換為模擬信號來產(chǎn)生波形,因此要由D/A轉(zhuǎn)換芯片DAC0832來完成

10、此項任務。通過匯編語言編寫各個波形子程序,由于要顯示波形,所以每輸出一個值,都要進行一定時間的延時,掃描沒有按鍵按下后再輸出下一個值,直到形成一個周期的代碼。利用循環(huán),就可產(chǎn)生連續(xù)波形代碼,再通過8255輸出給DAC0832,將數(shù)字量轉(zhuǎn)換成模擬量輸出,即可得各種波形。具體方案在后面有分析。</p><p><b>  2.1.2波形切換</b></p><p>  波

11、形的選擇和調(diào)節(jié)由小鍵盤控制。第一列從上到下編碼為0,1,2,3,分別對應方波、三角波、鋸齒波、正弦波。第二列第一個鍵的鍵值為4,對應退出波形,可以重新選擇波形,實現(xiàn)波形切換。當沒有輸出波形的時候,也就是輸出為零,選擇0到3就會進入相應的波形子程序。進入波形子程序以后,每一個點輸出之前都會調(diào)用掃描子程序,判斷是否有鍵按下,有則跳轉(zhuǎn)到相應的程序斷去執(zhí)行,無則繼續(xù)。由于小鍵盤掃描在程序總是存在的,因此可隨時進行波形間的切換。</p>

12、;<p>  2.1.3 數(shù)碼管顯示</p><p>  數(shù)碼管同步顯示當前波形的幅值和頻率。硬件上由8086將數(shù)據(jù)輸出給8255,8255再將輸出送給數(shù)碼管的A~Dp,顯示相應字符。軟件上定義一個緩沖區(qū)存放波形的幅值和頻率,顯示數(shù)碼管時,利用緩沖區(qū)的數(shù)值查找數(shù)碼管鍵值表再輸出對應數(shù)值。循環(huán)輸出波形時也循環(huán)輸出緩沖區(qū)內(nèi)容對應的值,就可以同步顯示波形的幅值和頻率。利用小鍵盤掃描得到的鍵值進行判斷,對緩

13、沖區(qū)內(nèi)的幅值頻率進行相應的改變,使數(shù)碼管能顯示不同的幅值和頻率。</p><p>  2.1.4小鍵盤控制</p><p>  使用實驗箱上4×4鍵盤,可以實現(xiàn)切換波形,調(diào)頻、調(diào)幅和退出波形的控制功能。Protues內(nèi)的鍵盤矩陣掃描時輪流選通一行,然后從端口處讀取列數(shù)據(jù),如果有按鍵則讀取的數(shù)據(jù)肯定有一位為0,經(jīng)過取反后,盡有一位為1,然后再根據(jù)選取的列和讀取的行值,確定按的是哪一

14、個鍵,然后將鍵值編碼保存在一個名為keyass的存儲單元里。當有鍵按下時,從keyass內(nèi)取出鍵值進行判斷,就能轉(zhuǎn)入相應的子程序進行控制,并且鍵盤掃描、獲取鍵值等子程序也能夠很好的嵌入在其他程序中,方便調(diào)用。</p><p><b>  2.1.5有極調(diào)頻</b></p><p>  改變波形子程序中的各個數(shù)據(jù)輸出時間,即延時,就可改變整個波形的頻率。延時越短頻率越高

15、。定義三個緩沖區(qū)來存放延時,其中一個存放初始值3,一個存放當前波形的延時,還有一個作為中間暫存用。產(chǎn)生波形以后,取出延時初值存入中間暫存緩沖區(qū),再掃描鍵盤:0對應減小延時,1對應增大延時,無鍵則不改變延時。對暫存區(qū)的數(shù)值進行相應操作后,將最后的值存入名為tiaopin的緩沖區(qū)內(nèi)作為當前波形的延時。</p><p><b>  2.1.6有極調(diào)幅</b></p><p>

16、;  和有級調(diào)頻類似,有極調(diào)幅也是定義三個緩沖區(qū),功能和有極調(diào)頻類似。幅值緩沖區(qū)存放的是輸出點的值的放大倍數(shù),調(diào)節(jié)放大倍數(shù)也就使幅值改變了。產(chǎn)生波形以后,取出倍數(shù)初值存入中間暫存緩沖區(qū),再掃描鍵盤:2對應減小倍數(shù),3對應增大倍數(shù),無鍵則不改變倍數(shù)。對暫存區(qū)的數(shù)值進行相應操作后,將最后的值存入名為tiaofu的緩沖區(qū)內(nèi)作為當前波形的幅值放大倍數(shù)。</p><p><b>  2.1.6開始結(jié)束</b

17、></p><p>  用小鍵盤第二列第一個也就是4來結(jié)束波形,無論在什么時候只在小鍵盤掃描到了4鍵,它就會無條件跳出程序,返回起始狀態(tài),等待選擇波形,同時數(shù)碼管顯示零。</p><p>  2.2所用芯片功能簡介</p><p>  2.2.1 8086功能簡介</p><p>  8086 CPU是由總線接口部件BIU和執(zhí)行部件EU

18、這兩大部分構成??偩€接口部件BIU是8086 CPU在存儲器和I/O設備之間的接口部件,負責對全部引腳的操作,即8086對存儲器和I/O設備的所有操作都是由BIU完成的。所有對外部總線的操作都必須有正確的地址和適當?shù)目刂菩盘枺珺IU中的各部件主要是圍繞這個目標設計的。它提供了16位雙向數(shù)據(jù)總線、20位地址總線和若干條控制總線。 </p><p>  其具體任務是:負責從內(nèi)存單元中預取指令,并將它們送到指令隊列緩

19、沖器暫存。CPU執(zhí)行指令時,總線接口單元要配合執(zhí)行單元,從指定的內(nèi)存單元或I/O端口中取出數(shù)據(jù)傳送給執(zhí)行單元,或者把執(zhí)行單元的處理結(jié)果傳送到指定的內(nèi)存單元或I/O端口中。</p><p>  執(zhí)行單元EU中包含1個16位的運算器ALU、8個16位的寄存器、1個16位標志寄存器FR、1個運算暫存器和執(zhí)行單元的控制電路。這個單元進行所有指令的解釋和執(zhí)行,同時管理上述有關的寄存器。EU對指令的執(zhí)行是從取指令操作碼開始的

20、,它從總線接口單元的指令隊列緩沖器中每次取一個字節(jié)。如果指令隊列緩沖器中是空的,那么EU就要等待BIU通過外部總線從存儲器中取得指令并送到EU,通過譯碼電路分析,發(fā)出相應控制命令,控制ALU數(shù)據(jù)總線中數(shù)據(jù)的流向。</p><p><b>  管腳圖如下:</b></p><p>  2.2.2 8255A功能簡介</p><p>  8255A

21、具有24條輸入/輸出引腳、可編程的通用并行輸入/輸出接口電路。它是一片使用單一+5V電源的40腳雙列直插式大規(guī)模集成電路。8255A的通用性強,使用靈活,通過它CPU可直接與外設相連。</p><p>  8255A在使用前要寫入一個方式控制字,選擇A、B、C三個端口各自的工作方式,共有三種。方式0 :基本的輸入輸出方式,即無須聯(lián)絡就可以直接進行的 I/O方式。其中A、B、C口的高四位或低四位可分別設置成輸入或輸

22、出;方式1 :選通I/O,此時接口和外圍設備需聯(lián)絡信號進行協(xié)調(diào),只有A口和B口可以工作在方式1,此時C口的某些線被規(guī)定為A口或B口與外圍設備的聯(lián)絡信號,余下的線只有基本的I/O功能,即只工作在方式0;方式2: 雙向I/O方式,只有A口可以工作在這種方式,該I/O線即可輸入又可輸出,此時C口有5條線被規(guī)定為A口和外圍設備的雙向聯(lián)絡線,C口剩下的三條線可作為B口方式1的聯(lián)絡線,也可以和B口一起方式0的I/O線。</p><

23、;p><b>  管腳圖如下:</b></p><p>  2.2.3 DAC0832功能簡介</p><p>  DAC0832是采用CMOS工藝制成的單片電流輸出型8位數(shù) / 模轉(zhuǎn)換器。它由倒T型R-2R電阻網(wǎng)絡、模擬開關、運算放大器和參考電壓VREF四大部分組成。電路有極好的溫度跟隨性,使用了COMS電流開關和控制邏輯而獲得低功耗、低輸出的泄漏電流誤差。

24、集成電路內(nèi)有兩級輸入寄存器,使DAC0832芯片具備雙緩沖、單緩沖和直通三種輸入方式,以便適于各種電路的需要. DAC0832有8個輸入端(其中每個輸入端是8位二進制數(shù)的一位),有一個模擬輸出端。輸入可有2的8次方,即256個不同的二進制組態(tài),輸出為256個電壓之一,即輸出電壓不是整個電壓范圍內(nèi)任意值,而只能是256個可能值。</p><p>  D/A轉(zhuǎn)換結(jié)果采用電流形式輸出。若需要相應的模擬電壓信號,可通過一

25、個高輸入阻抗的線性運算放大器實現(xiàn)。運放的反饋電阻可通過RFB端引用片內(nèi)固有電阻,也可外接。DAC0832邏輯輸入滿足TTL電平,可直接與TTL電路或微機電路連接。</p><p>  DAC0832的管腳圖如下:</p><p>  2.2.4 74LS273功能簡介</p><p>  地址鎖存器就是一個暫存器,它根據(jù)控制信號的狀態(tài),將總線上地址代碼暫存起來。8

26、086/8088數(shù)據(jù)和地址總線采用分時復用操作方法,即用同一總線既傳輸數(shù)據(jù)又傳輸?shù)刂?。當微處理器與存儲器交換信號時,首先由CPU發(fā)出存儲器地址,同時發(fā)出允許鎖存信號ALE給鎖存器,當鎖存器接到該信號后將地址/數(shù)據(jù)總線上的地址鎖存在總線上,隨后才能傳輸數(shù)據(jù)。</p><p>  地址鎖存器74LS273是帶清除端的八D觸發(fā)器,只有清除端為高電平時才具有鎖存功能,鎖存控制端為11腳CLK,在上升沿鎖存。8086的AL

27、E端輸出的鎖存控制信號必須經(jīng)反相器后才能連到74LS273的CLK端,以滿足CLK在上升沿鎖存的要求。74LS273的引腳1D~8D為數(shù)據(jù)輸入端,1Q~8Q為數(shù)據(jù)輸出端,WR:主清除端,低電平觸發(fā),即當為低電平時,芯片被清除,輸出全為0。CP(CLK):觸發(fā)端,上升沿觸發(fā),即當CP從低到高電平時,D0~D7的數(shù)據(jù)通過芯片,為0時將數(shù)據(jù)鎖存,D0~D7的數(shù)據(jù)不變。由于8086有20位物理地址,所以需要用3片74LS273級聯(lián)。</p

28、><p>  74LS273的管腳圖如右:</p><p><b>  2.3 實施方案</b></p><p>  2.3.1系統(tǒng)總體設計方案</p><p>  該設計包括硬件設計和軟件設計兩部分。</p><p>  1.硬件上要求以8086CPU為核心進行電路設計。完全用小鍵盤對波形進行控制。

29、小鍵盤作為產(chǎn)生波形、波形切換、調(diào)節(jié)頻率,調(diào)節(jié)幅值、退出波形的控制端口。8255A芯片完成對小鍵盤掃描,獲取鍵值編碼以及輸出到數(shù)碼管。通過DAC0832將數(shù)字量轉(zhuǎn)換成模擬量輸出,再由轉(zhuǎn)換電路將電流輸出轉(zhuǎn)換為電壓輸出產(chǎn)生各種波形,通過虛擬示波器顯示出波形。由于8255A的A,B,C端口都已使用,所以采用鍵盤控制進行幅值和頻率的有極調(diào)節(jié)。</p><p>  2.軟件方面要設計方波,三角波,鋸齒波,正弦波何時產(chǎn)生,如何

30、產(chǎn)生,何時退出,并且還要設計如何通過對按鍵的判斷,對頻率和幅值進行調(diào)節(jié)。</p><p>  方波比較簡單,先掃描鍵盤,無鍵按下時輸出零,保持一個延時,再掃描鍵盤,無鍵按下時輸出20H的倍數(shù),該倍數(shù)就是我定義的幅值,再延時,循環(huán)該周期就可得到方波。如果有鍵按下就會轉(zhuǎn)入相應子程序。</p><p>  三角波分為兩段,因它的上升斜坡和下降斜坡都是線性關系,所以只要由數(shù)字量的增減來控制就可以了

31、。產(chǎn)生上升斜坡時讓輸出值從零開始逐漸遞增,其上升的最大值是30乘以放大倍數(shù),相反,產(chǎn)生下降斜坡時,讓輸出值從最大值逐漸遞減到零。為簡單起見 ,這里采用的是查表法,在數(shù)據(jù)段定義了三角波函數(shù)表,規(guī)律如上。其幅值由放大倍數(shù)控制,頻率是由輸出點之間的延時來控制。 </p><p>  鋸齒波截取三角波的上升斜坡部分,到達最大值后就跳回最低值0,方法與三角波相同,也采用查表法。先定義了鋸齒波的函數(shù)表,輸出時只要按著函數(shù)表一

32、個一個往下輸出,當顯示到最大值即一個周期內(nèi)的最后一個值再將指針指向表的首地址就開始了新的周期。其幅值由放大倍數(shù)控制,頻率是由輸出點之間的延時來控制。</p><p>  正弦波也是用的查表法。該方法的優(yōu)點是速度快,但在精度高的情況下要求的存儲器容量也要增大,所以此種方法應用在對精度要求不高的場合。本程序中制造了一張正弦數(shù)字量表,即查函數(shù)表得到的值轉(zhuǎn)換成十進制數(shù)填表。一個周期內(nèi),采樣點越多,精度越高,本實驗中采樣點

33、為40點/周期。正弦數(shù)字量表中的值為參考值,對于不同幅值的正弦波可以通過把表中的每個值乘以相同的倍數(shù)得到,其頻率由改變輸出點之間的延時來實現(xiàn)。 </p><p>  頻率和幅值的調(diào)節(jié)由每個點的延時和幅值的放大倍數(shù)決定。在各個波形輸出之前,先讀取頻率和幅值的初值,若要增加(減?。╊l率,則使延時減(加)1;若要增大(減小)幅值,則使原幅值基礎值得放大倍數(shù)加(減)1。然后再將改變后的幅值頻率送給原波形進行輸出,同時,幅

34、值和頻率的值作為偏移量查找數(shù)碼管顯示表,然后送給對應的數(shù)碼管顯示。</p><p>  2.3.2系統(tǒng)設計方框圖</p><p>  第三章 典型程序模塊及編程技巧分析</p><p><b>  3.1鍵盤掃描模塊</b></p><p><b>  小鍵盤工作原理:</b></p>

35、<p> ?。?)初始化8255的工作方式:A,B口作為輸出,C口低四位作為輸入。矩陣的X1~X4接到輸出端口PA0-PA3上,用程序控制4條行線的輸出。4條列線Y1~Y4連接到輸入端口C的PC0-PC3。用讀指令讀取C口狀態(tài)時,可讀取鍵盤的列號。</p><p>  (2)在無鍵按下的時候,由于接到+5V上的上拉電阻的作用,列線被置成高電平。壓下某一個鍵所在的行線和列線接通。這時,如果向被壓下的鍵所

36、在的行線上輸出一個低電平信號,則對應的列線也呈現(xiàn)低電平。當從C口讀取列線信號時,便能檢測到該列線上的低電平。</p><p> ?。?)掃描鍵盤時,A口輸出全0,讀C口,取低四位再取反,若為0則無鍵輸入,若不為零則轉(zhuǎn)獲取鍵值子程序。獲取鍵值時,對X1到X4輪流選中,即輪流輸出0。先把第一行賦0,讀C口檢測是不是第一行,不是再繼續(xù)第二行,沒有的話總共循環(huán)4次跳出循環(huán),這樣根據(jù)選中的行和讀入的列狀態(tài)中低電平的位置,便

37、能確定哪個鍵被按下了。檢測到按鍵后,對壓下的鍵進行編碼,將該鍵的行列信號轉(zhuǎn)化成16進制碼,將鍵值存入緩沖區(qū),以便以后利用進行判斷比較。接著繼續(xù)掃描按鍵,等待按鍵釋放。</p><p>  具體的實現(xiàn)如下: </p><p>  CCSCAN掃描按鍵是否有鍵按下:</p><p>  CCSCAN PROC NEAR ;掃描是否有按鍵閉合子

38、程序</p><p>  MOV AL,00H</p><p>  MOV DX,MY8255_A ;將4列全選通,X1~X4置0</p><p>  OUT DX,AL</p><p>  MOV DX,MY8255_C</p><p>  IN AL,D

39、X ;讀Y1~Y4</p><p>  NOT AL</p><p>  AND AL,0FH ;取出Y1~Y4的反值</p><p><b>  RET</b></p><p>  CCSCAN ENDP</p><p>  如果有按鍵,就獲取按鍵

40、碼的功能,4×4鍵盤的編碼, 從上到下,從左到右,依次編碼為0~F, 如果有按鍵, 則轉(zhuǎn)入到按鍵處理子程序模塊執(zhí)行, 如果沒有,則返回主程序循環(huán)。</p><p>  具體的實現(xiàn)代碼如下:</p><p>  GETKEY1 PROC NEAR ;獲取鍵值子程序</p><p>  CALL DIS ;顯示刷新&

41、lt;/p><p>  CALL DALLY ;延時</p><p>  CALL DALLY ;延時</p><p>  CALL CLEAR ;清屏</p><p>  CALL CCSCAN ;再次掃描按鍵</p><p>

42、  JNZ GETKEY2 ;有鍵按下則跳置GETKEY2</p><p>  JMP BEGIN1 ;否則跳回開始繼續(xù)循環(huán)</p><p>  GETKEY2: MOV CH,0FEH</p><p>  MOV CL,00H ;設置當前檢測的是第幾列</p><p&

43、gt;  COLUM: MOV AL,CH ;選取一列,將X1~X4中一個置0</p><p>  MOV DX,MY8255_A</p><p>  OUT DX,AL</p><p>  MOV DX,MY8255_C ;讀Y1~Y4,用于判斷哪一行按鍵閉合</p><p> 

44、 IN AL,DX</p><p>  L1: TEST AL,01H ;是否為第1行</p><p>  JNZ L2 ;不是則繼續(xù)判斷</p><p>  MOV AL,00H ;設置第1行第1列的對應的鍵值</p><p>  JMP K

45、CODE</p><p>  L2: TEST AL,02H ;是否為第2行</p><p>  JNZ L3 ;不是則繼續(xù)判斷</p><p>  MOV AL,04H ;設置第2行第1列的對應的鍵值</p><p>  JMP KCODE</p&g

46、t;<p>  L3: TEST AL,04H ;是否為第3行</p><p>  JNZ L4 ;不是則繼續(xù)判斷</p><p>  MOV AL,08H ;設置第3行第1列的對應的鍵值</p><p>  JMP KCODE</p><p>

47、;  L4: TEST AL,08H ;是否為第4行</p><p>  JNZ NEXT ;不是則繼續(xù)判斷</p><p>  MOV AL,0CH ;設置第4行第1列的對應的鍵值</p><p>  KCODE: ADD AL,CL ;將第1列的值加上當前列數(shù),確定按

48、鍵值</p><p>  CALL PUTBUF ;保存按鍵值</p><p>  PUSH AX</p><p>  KON: CALL DIS ;顯示刷新</p><p>  CALL CLEAR ;清屏</p><p>  CALL

49、 CCSCAN ;掃描按鍵,判斷按鍵是否彈起</p><p>  JNZ KON ;未彈起則繼續(xù)循環(huán)等待彈起</p><p>  POP AX</p><p>  NEXT: INC CL ;當前檢測的列數(shù)遞增</p><p>  MOV A

50、L,CH</p><p>  TEST AL,08H ;檢測是否掃描到第4列</p><p>  JZ KERR ;是則跳回到開始處</p><p>  ROL AL,1 ;沒檢測到第4列則準備檢測下一列</p><p>  MOV CH,AL</p&

51、gt;<p>  JMP COLUM</p><p>  KERR: RET</p><p>  GETKEY1 ENDP</p><p>  PUTBUF PROC NEAR ;保存鍵值子程序</p><p>  MOV DI,OFFSET KEY</p>&

52、lt;p>  MOV [DI],AL</p><p>  CMP DI,2FFFH</p><p>  JNZ GOBACK</p><p>  MOV DI,3004H</p><p>  GOBACK: RET</p><p>  PUTBUF ENDP&l

53、t;/p><p>  3.2數(shù)碼管顯示模塊</p><p>  4個數(shù)碼管的X端為選通端,將小鍵盤的X1~X4對應接到數(shù)碼管,這樣掃描小鍵盤的時候,也就選中了數(shù)碼管,當調(diào)用getkey1獲取鍵值子程序的時候,數(shù)碼管輪流選中,也就可以控制哪個數(shù)碼管顯示什么內(nèi)容。通過對8255寫入數(shù)據(jù),由B口輸出給數(shù)碼管的A~Dp,當沒有波形輸入時,數(shù)碼管顯示0數(shù)碼管;定義兩個緩沖區(qū)存放幅值和頻率,有波形輸出時,

54、同步顯示該波形的幅值和頻率。</p><p>  先在數(shù)據(jù)段定義一個緩沖區(qū)存放數(shù)碼管顯示0~F的段位值表:</p><p>  DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H</p><p>  DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H</p><p>  

55、因為要一直顯示數(shù)碼管,所以將顯示部分作為子程序,方便經(jīng)常調(diào)用。</p><p>  DIS PROC NEAR ;顯示鍵值子程序</p><p>  PUSH AX ;以緩沖區(qū)存放的鍵值為鍵值表偏移找到鍵值并顯示</p><p>  MOV SI,3000H ;緩沖區(qū)3000H內(nèi)存放了當前波形的幅值,3

56、001H存放了頻率。 </p><p>  MOV DL,0F7H</p><p>  MOV AL,DL</p><p>  AGAIN: PUSH DX</p><p>  MOV DX,MY8255_A</p><p>  OUT DX,AL

57、 ;設置X1~X4,選通一個數(shù)碼管</p><p>  MOV AL,[SI] ;取出緩沖區(qū)中存放鍵值</p><p>  MOV BX,OFFSET DTABLE</p><p>  AND AX,00FFH</p><p>  ADD BX,AX</p><p&g

58、t;  MOV AL,[BX] ;將鍵值作為偏移和鍵值基地址相加得到相應的鍵值</p><p>  MOV DX,MY8255_B</p><p>  OUT DX,AL ;寫入數(shù)碼管A~Dp</p><p>  CALL DALLY</p><p>  INC S

59、I ;取下一個鍵值</p><p>  POP DX</p><p>  MOV AL,DL</p><p>  TEST AL,01H ;判斷是否顯示完?</p><p>  JZ OUT1 ;顯示完,返回</p><p>  

60、ROR AL,1</p><p>  MOV DL,AL</p><p>  JMP AGAIN ;未顯示完,跳回繼續(xù)</p><p>  OUT1: POP AX</p><p><b>  RET</b></p><p><b

61、>  DIS ENDP</b></p><p>  3.3有級調(diào)頻調(diào)幅判斷及控制模塊</p><p>  改變波形產(chǎn)生子程序中的各個數(shù)據(jù)輸出時間,及延時,就可改變整個波形的頻率。改變波形產(chǎn)生子程序中的每次輸出數(shù)值的放大倍數(shù),就可以改變整個波形的幅值。而實現(xiàn)有級變化的初值是在數(shù)據(jù)段預先定義的數(shù)據(jù)表。</p><p>  在選擇波形以后,才能調(diào)節(jié)頻率

62、和幅值,頻率和幅值的調(diào)節(jié)由小鍵盤控制。在3000H和3001H的緩沖區(qū)內(nèi)存放了幅值和頻率的初值3,在每個波形輸出之前先掃描鍵盤,鍵值存在KEY里,對KEY值進行判斷后,取出緩沖區(qū)的初值做相應改變:0選擇增大頻率,1選擇減小頻率,2選擇減小幅值,3選擇增大幅值,4退出波形,返回開始狀態(tài)。</p><p>  具體的實現(xiàn)代碼如下:</p><p>  AMPLFENC PROC N

63、EAR ;調(diào)節(jié)幅值頻率子程序</p><p>  CALL DIS ;刷新</p><p>  CALL CCSCAN ;再次掃描按鍵</p><p>  JNZ TRI1 ;有鍵按下則跳置tri1</p><p>  JMP TRI5

64、 ;沒按鍵按下就跳出該子程序</p><p>  TRI1: CALL DIS ;刷新</p><p>  CALL GETKEY1</p><p>  MOV SI,OFFSET KEY</p><p>  MOV AL,[SI]</p><p>  

65、CMP AL,4 ;第五個鍵就退出</p><p>  JZ TRI10</p><p>  JZ TRI5</p><p>  CMP AL,0 ;第一個鍵減少周期</p><p>  JNZ TRI2</p><p>  M

66、OV DI,3001H ;取延時初值</p><p>  MOV BL,[DI]</p><p>  CMP BL,01H</p><p>  JE TRI5</p><p>  DEC BL</p><p>  MOV [DI],

67、BL</p><p>  JMP TRI5</p><p>  TRI2: CMP AL,1 ;第二個鍵增加周期</p><p>  JNZ TRI3</p><p>  MOV DI,3001H ;取延時初值</p><p>  MOV

68、 BL,[DI]</p><p>  CMP BL,05H</p><p>  JE TRI5</p><p>  INC BL</p><p>  MOV [DI],BL</p><p>  JMP TRI5</p><p>

69、  TRI3: CMP AL,2 ;第三個鍵減少幅度</p><p>  JNZ TRI4</p><p>  MOV DI,3000H</p><p>  MOV BL,[DI] ;取幅值初值</p><p>  CMP BL,01H</p>

70、;<p>  JE TRI5</p><p>  DEC BL</p><p>  MOV [DI],BL</p><p>  JMP TRI5</p><p>  TRI4: CMP AL,3 ;第四個鍵增加幅度</p><p&g

71、t;  JNZ TRI5</p><p>  MOV DI,3000H</p><p>  MOV BL,[DI] ;取幅值初值</p><p>  CMP BL,05H</p><p>  JE TRI5</p><p>  INC

72、 BL</p><p>  MOV [DI],BL</p><p>  JMP TRI5</p><p>  TRI10: JMP FAR PTR BEGIN0</p><p>  TRI5: RET</p><p>  AMPLFENC ENDP</p>&l

73、t;p>  3.4 波形切換及基本控制模塊</p><p>  這個模塊是本次設計的主程序,它控制了波形的輸出和切換。它是根據(jù)對小鍵盤的操作來實現(xiàn)的,不同按鍵對應的編碼轉(zhuǎn)入不同模塊(0:方波,1:三角波,2:鋸齒波,3:正弦波,4:退出波形)。先掃描鍵盤是否有鍵按下,若無循環(huán)等待,若有則將鍵值保存再比較,然后實現(xiàn)相應操作。為使程序可循環(huán)使用,不至于顯示一次波形就退出,在執(zhí)行完子程序返回時,不退出系統(tǒng),而是返

74、回到開始等待輸入狀態(tài),這樣就能切換波形。</p><p>  具體的實現(xiàn)代碼如下:</p><p>  BEGIN0: MOV SI,3000H ; 把數(shù)碼管清0</p><p>  MOV AL,00H ; 先初始化鍵值為0</p><p>  MOV [SI],AL</p>

75、<p>  MOV AL,00H</p><p>  MOV [SI+1],AL</p><p>  MOV AL,00H</p><p>  MOV [SI+2],AL</p><p>  MOV AL,00H</p><p>  MOV

76、 [SI+3],AL</p><p>  MOV SI,OFFSET KEY</p><p>  MOV AL,00H</p><p>  MOV [SI],AL</p><p>  BEGIN1: CALL DIS ;顯示刷新</p><p>  

77、CALL CCSCAN ;再次掃描按鍵</p><p>  JNZ LBEGIN0 ;有鍵按下則跳置LBEGIN0</p><p>  JMP BEGIN1 ;不是按下第一或二鍵就繼續(xù)等待輸入</p><p>  LBEGIN0: CALL GETKEY1 ;第二個菜單等待輸入</p&g

78、t;<p>  CALL DIS</p><p>  MOV SI,OFFSET KEY</p><p>  MOV AL,[SI]</p><p>  CMP AL,4 ;第5個鍵退出</p><p>  JZ BEGIN0</p><

79、;p>  CMP AL,0 ;第1個鍵到squ(方波)函數(shù)</p><p>  JZ LBEGIN1</p><p>  CMP AL,1 ;第2個鍵到tri(三角波)函數(shù)</p><p>  JZ LBEGIN2</p><p>  CMP A

80、L,2 ;第3個鍵到rec(鋸齒)函數(shù)</p><p>  JZ LBEGIN3</p><p>  CMP AL,3 ;第4個鍵到sin(正弦)函數(shù)</p><p>  JZ LBEGIN4</p><p>  JMP BEGIN1 ; 其他鍵則跳到繼

81、續(xù)等待輸入</p><p>  LBEGIN1: CALL SQUREW ;SQUARE</p><p>  JMP BEGIN0</p><p>  LBEGIN2: CALL TRIW ;TRIANGLE</p><p>  JMP BEGIN0</p>

82、<p>  LBEGIN3: CALL RCTW ; RECANGLE</p><p>  JMP BEGIN0</p><p>  LBEGIN4: CALL SINW ;SIN</p><p>  JMP BEGIN0 ;執(zhí)行完輸出波形之后 回到開始狀態(tài)</p>

83、;<p>  JMP BEGIN0</p><p><b>  3.5波形產(chǎn)生模塊</b></p><p><b>  3.5.1方波</b></p><p>  方波的產(chǎn)生只要使DAC0832輸出一個較大值(此處用20H),并延時一段時間,再輸出一個較小值(此處用00F),延時一段相同時間,就是

84、方波的一個周期。但因為實現(xiàn)過程中結(jié)合了數(shù)碼管的顯示以及頻率幅值的調(diào)節(jié)所以并不那么簡單。先將幅值和頻率的初值放入暫存緩沖區(qū),使數(shù)碼管顯示,掃描鍵盤,無鍵按下則繼續(xù),有鍵按下則先判斷是否為0到3,是則調(diào)節(jié)頻率幅值,是4則退出波形。執(zhí)行相應操作后刷新數(shù)碼管,將新的幅值和頻率存在TIAOFU和TIAOPIN的緩沖區(qū)內(nèi),把低電平的值乘以TIAOFU輸出,延遲時間乘以TIAOPIN,使該值持續(xù)一段時間,輸出高電平的過程與低電平相同,循環(huán)該周期就得到

85、連續(xù)方波。</p><p>  具體的實現(xiàn)代碼如下:</p><p>  SQUREW PROC NEAR ;方波發(fā)生子程序</p><p>  MOV DI,OFFSET FENC ;初始化顯示管的值為3</p><p>  MOV AL,[DI]</p><p

86、>  MOV SI,3000H</p><p>  MOV [SI],AL</p><p>  MOV DI,OFFSET AMPL</p><p>  MOV AL,[DI]</p><p>  MOV SI,3001H</p><p>  MOV

87、 [SI],AL</p><p>  SQUR1: CALL AMPLFENC ;調(diào)節(jié)幅值頻率子程序,有鍵按下是調(diào)節(jié)幅值頻率</p><p>  MOV SI,OFFSET KEY ;按下第五個鍵就退出</p><p>  MOV AL,4</p><p>  CMP

88、 [SI],AL</p><p>  JZ SQUA</p><p>  CALL DIS ;刷新數(shù)碼管</p><p>  MOV SI,3000H</p><p>  MOV BL,[SI]</p><p>  MOV DI,OFFSET

89、 TIAOFU</p><p>  MOV [DI],BL</p><p>  MOV SI,3001H</p><p>  MOV AL,[SI]</p><p>  MOV SI,OFFSET TIAOPIN</p><p>  MOV [SI],AL&l

90、t;/p><p>  TRILOOP1: MOV DX,DA0832 ;輸出低電平 輸出方波形</p><p>  MOV AL,00H</p><p>  OUT DX,AL</p><p>  CALL DIS ;刷新</p><p>  PUS

91、H CX</p><p>  PUSH AX</p><p>  MOV CL,TIAOPIN</p><p>  MOV CH,00H</p><p>  D11: MOV AX,00FFH</p><p>  D21: DEC AX</p

92、><p>  PUSH AX</p><p>  PUSH CX</p><p>  CALL DIS</p><p>  CALL CCSCAN ;再次掃描按鍵</p><p>  JNZ SQUR1 ;有鍵按下則跳置squr1,</p>

93、;<p>  POP CX</p><p>  POP AX</p><p>  JNZ D21</p><p>  LOOP D11</p><p>  POP AX</p><p>  POP CX</p><p

94、>  CALL CCSCAN ;再次掃描按鍵</p><p>  JNZ SQUR1 ;有鍵按下則跳置squr1,改變幅值頻率</p><p>  MOV BL,TIAOFU</p><p>  MOV AL,20H</p><p>  MUL BL</p>

95、<p>  MOV DX,DA0832 ;輸出高電平</p><p>  OUT DX,AL</p><p>  CALL DIS ;刷新</p><p>  PUSH CX</p><p>  PUSH AX</p><p>  MO

96、V CL,TIAOPIN</p><p>  MOV CH,00H</p><p>  D12: MOV AX,00FFH</p><p>  D22: DEC AX</p><p>  PUSH AX</p><p>  PUSH CX</

97、p><p>  CALL DIS</p><p>  CALL CCSCAN ;再次掃描按鍵</p><p>  JNZ SQUR1 ;有鍵按下則跳置tri1</p><p>  POP CX</p><p>  POP AX</p>

98、<p>  JNZ D22</p><p>  LOOP D12</p><p>  POP AX</p><p>  POP CX</p><p>  JZ TRILOOP1 ;沒按鍵時繼續(xù)輸出波形</p><p>  SQUA: RE

99、T</p><p>  SQUREW ENDP</p><p><b>  3.5.2三角波</b></p><p>  三角波理論上有兩段,上升和下降,上升時從最低值開始自增,直到最大值,然后再自減至最低。本設計中,因為對波形精度要求不是很高,所以采用按列表輸出的方式,即先在數(shù)據(jù)段定義了一段三角波一個周期內(nèi)的采樣值的數(shù)字量表,采樣頻率為60

100、點/周期。數(shù)字量表中的值為參考值,輸出三角波時通過把表中的每個值乘以相同的倍數(shù),該倍數(shù)為我們設定的幅值。波形輸出方式都相同,這里簡要說明:先將幅值和頻率的初值放入暫存緩沖區(qū),使數(shù)碼管顯示,掃描鍵盤,執(zhí)行相應操作后刷新數(shù)碼管,將新的幅值和頻率存在TIAOFU和TIAOPIN的緩沖區(qū)內(nèi),將第一個數(shù)字量乘以TIAOFU輸出,延遲時間乘以TIAOPIN,再掃描,輸出第二個值,直到指針指完該數(shù)字量表再循環(huán)該周期就得到連續(xù)三角波。</p>

101、;<p>  具體的實現(xiàn)代碼如下:</p><p>  TRITAB DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ;三角函數(shù)表</p><p>  DB 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30</p><p>  DB 30,29,28,27,26,2

102、5,24,23,22,21,20,19,18,17,16</p><p>  DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1</p><p>  TRIW PROC NEAR ;三角波形子程序</p><p>  MOV DI,OFFSET FENC</p><p>  

103、MOV AL,[DI]</p><p>  MOV SI,3000H</p><p>  MOV [SI],AL</p><p>  MOV DI,OFFSET AMPL</p><p>  MOV AL,[DI]</p><p>  MOV SI

104、,3001H</p><p>  MOV [SI],AL</p><p>  TRA1: CALL AMPLFENC</p><p>  MOV SI,OFFSET KEY</p><p>  MOV AL,4</p><p>  CMP [SI],AL<

105、;/p><p>  JZ TRIA</p><p>  CALL DIS</p><p>  MOV SI,3000H</p><p>  MOV BL,[SI]</p><p>  MOV DI,OFFSET TIAOFU</p><p>

106、;  MOV [DI],BL</p><p>  MOV SI,3001H</p><p>  MOV AL,[SI]</p><p>  MOV SI,OFFSET TIAOPIN</p><p>  MOV [SI],AL</p><p>  TRLOOP

107、1: MOV SI,OFFSET TRITAB</p><p>  TRLOOP2: MOV AL,[SI]</p><p>  MOV BL,TIAOFU</p><p>  MUL BL</p><p>  MOV DX,DA0832 ;啟動D/A轉(zhuǎn)換</p>

108、<p>  OUT DX,AL</p><p>  PUSH AX</p><p>  PUSH SI</p><p>  PUSH CX</p><p>  MOV CL,TIAOPIN</p><p>  MOV CH,00H</

109、p><p>  DALLYTRI1: CALL DIS</p><p>  CALL CCSCAN</p><p>  JNZ TRA1</p><p>  LOOP DALLYTRI1</p><p>  POP CX</p><p>  P

110、OP SI</p><p>  POP AX</p><p>  INC SI</p><p>  CMP SI,OFFSET RCTTAB</p><p>  JNZ TRLOOP2</p><p>  JMP TRLOOP1</p>

111、<p>  TRIA: RET</p><p>  TRIW ENDP</p><p><b>  3.5.3鋸齒波</b></p><p>  鋸齒波就是截取了三角波的上升部分,由最小值自增到達最大值后下一個值就返回最小值。本設計中鋸齒波的產(chǎn)生方式也是對鋸齒波采樣,采樣周期為32點/周期,然后以采樣表為基礎輸出。鋸齒波的輸出

112、方式與三角波相同,這里不再重復。</p><p>  具體的實現(xiàn)代碼如下:</p><p>  先在數(shù)據(jù)段定義一張鋸齒波采樣后的數(shù)字量表:</p><p>  RCTTAB DB 1,2,3,4,5,6,7,8 ;鋸齒函數(shù)表</p><p>  DB 9,10,11,12,13,14,15,16&

113、lt;/p><p>  DB 17,18,19,20,21,22,23,24</p><p>  DB 25,26,27,28,29,30,31,32</p><p>  RCTW PROC NEAR ; 鋸齒波形子程序</p><p>  MOV DI,OFFSET FENC&l

114、t;/p><p>  MOV AL,[DI]</p><p>  MOV SI,3000H</p><p>  MOV [SI],AL</p><p>  MOV DI,OFFSET AMPL</p><p>  MOV AL,[DI]</p>&l

115、t;p>  MOV SI,3001H</p><p>  MOV [SI],AL</p><p>  RCT1: CALL AMPLFENC</p><p>  MOV SI,OFFSET KEY</p><p>  MOV AL,4</p><p> 

116、 CMP [SI],AL</p><p>  JZ RCTA</p><p>  CALL DIS</p><p>  MOV SI,3000H</p><p>  MOV BL,[SI]</p><p>  MOV DI,OFFSET TIAOF

117、U</p><p>  MOV [DI],BL</p><p>  MOV SI,3001H</p><p>  MOV AL,[SI]</p><p>  MOV SI,OFFSET TIAOPIN</p><p>  MOV [SI],AL</p&g

118、t;<p>  RCLOOP1: MOV SI,OFFSET RCTTAB</p><p>  RCLOOP2: MOV AL,[SI]</p><p>  MOV BL,TIAOFU</p><p>  MUL BL</p><p>  MOV DX,DA0832

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論