微機原理課程設(shè)計--信號發(fā)生器功能程序設(shè)計_第1頁
已閱讀1頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  微機應(yīng)用系統(tǒng)設(shè)計與綜合實驗</p><p>  ——微機原理課程設(shè)計報告</p><p>  課題名稱: 信號發(fā)生器功能程序設(shè)計</p><p>  學(xué) 院: 信息科學(xué)與工程學(xué)院</p><p><b>  目錄</b></p><p><b> 

2、 目錄1</b></p><p><b>  第一章概要2</b></p><p>  1.1 設(shè)計目的2</p><p>  1.2 課程設(shè)計內(nèi)容及要求2</p><p>  1.3 所需芯片及硬件簡介2</p><p>  1.3.1 8255A 特性簡介2<

3、/p><p>  1.3.2 D /A0832功能簡介3</p><p>  1.3.3A /D0809功能簡介3</p><p>  1.3.4唐都小鍵盤簡介4</p><p>  第二章總體設(shè)計方案5</p><p>  2.1 設(shè)計思想論述5</p><p>  2.2 程序

4、流程圖6</p><p>  2.3 電路原理圖7</p><p>  第三章典型模塊分析8</p><p>  3.1 波形產(chǎn)生模塊8</p><p>  3.1.1 方波9</p><p>  3.1.2 三角波9</p><p>  3.1.3 鋸齒波10</p

5、><p>  3.1.4 正弦波12</p><p>  3.2 小鍵盤模塊13</p><p>  3.3 調(diào)幅調(diào)頻模塊14</p><p>  第四章系統(tǒng)調(diào)試過程及結(jié)果16</p><p>  第五章收獲與體會17</p><p><b>  參考文獻18</b

6、></p><p>  附錄1 匯編語言源程序代碼19</p><p>  附錄2 C語言源程序代碼33</p><p><b>  概要</b></p><p><b>  1.1 設(shè)計目的 </b></p><p>  信號發(fā)生器的功能設(shè)計結(jié)合了軟硬件的知識

7、,這樣的一個課程設(shè)計促使我們主動去找尋資料,自主學(xué)習(xí)更多的知識。尤其重要的是設(shè)計本身是一種實踐,將課本知識應(yīng)用到設(shè)計中,驗證并且進一步熟悉它從而獲得新的領(lǐng)悟,這是只啃書本所不能達成的好處。信號發(fā)生器的設(shè)計尤其加深我們對信號發(fā)生的理解,對以8086cpu為中心的各芯片功能的了解以及對微機原理和匯編語言編程有了更深的體會。</p><p>  1.2 課程設(shè)計內(nèi)容及要求</p><p> ?。?/p>

8、1)、分別用C語言和匯編語言編程完成硬件接口功能設(shè)計;</p><p>  (2)、硬件電路基于80x86微機的接口電路;</p><p> ?。?)、程序功能要求:小鍵盤給定、數(shù)碼管或屏幕顯示,并產(chǎn)生對應(yīng)信號波形(D/A)輸出(信號波形包括正弦波、三角波、方波、鋸齒波)、輸出信號波形幅度、頻率可調(diào)。(按鍵數(shù)量盡量少)。</p><p>  1.3 所需芯片及硬件簡

9、介</p><p>  1.3.1 8255A 特性簡介</p><p> ?。?)具有24條輸入/輸出引腳、可編程的通用并行輸入/輸出接口電路。它是一片使用單一+5V電源的40腳雙列直插式大規(guī)模集成電路。8255A的通用性強,使用靈活,通過它CPU可直接與外設(shè)相連</p><p> ?。?)8255A在使用前要寫入一個方式控制字,選擇A、B、C三個端口各自的工作

10、方式,共有三種。方式0 :基本的輸入輸出方式,即無須聯(lián)絡(luò)就可以直接進行的 I/O方式。其中A、B、C口的高四位或低四位可分別設(shè)置成輸入或輸出;方式1 :選通I/O,此時接口和外圍設(shè)備需聯(lián)絡(luò)信號進行協(xié)調(diào),只有A口和B口可以工作在方式1,此時C口的某些線被規(guī)定為A口或B口與外圍設(shè)備的聯(lián)絡(luò)信號,余下的線只有基本的I/O功能,即只工作在方式0;方式2: 雙向I/O方式,只有A口可以工作在這種方式,該I/O線即可輸入又可輸出,此時C口有5條線被規(guī)

11、定為A口和外圍設(shè)備的雙向聯(lián)絡(luò)線,C口剩下的三條線可作為B口方式1的聯(lián)絡(luò)線,也可以和B口一起方式0的I/O線。</p><p>  本次設(shè)計只用到了三個端口的方式0。</p><p>  1.3.2 D /A0832功能簡介</p><p>  DAC0832是采用CMOS工藝制成的單片電流輸出型8位數(shù) / 模轉(zhuǎn)換器。</p><p>  D

12、AC0832的引腳功能說明如下:</p><p>  D0-D7 :數(shù)字信號輸入端</p><p>  CS:片選信號,低電平有效</p><p>  WR:寫信號1,低電平有效</p><p>  OUT:DAC電流輸出端</p><p>  圖1.1 唐都實驗箱D /A0832接線圖</p><

13、;p>  A /D0809功能簡介</p><p>  ADC0809是采樣頻率為8位的、以逐次逼近原理進行?!獢?shù)轉(zhuǎn)換的器件。其內(nèi)部有一個8通道多路開關(guān),它可以根據(jù)地址碼鎖存譯碼后的信號,只選通8路模擬輸入信號中的一個進行A/D轉(zhuǎn)換。當(dāng)?shù)刂稟BC=000時,IN0通道被選通。</p><p>  圖1.2 唐都實驗箱A /D0809接線圖</p><p>&

14、lt;b>  唐都小鍵盤簡介</b></p><p>  唐都實驗箱中提供了4行×4列16個按鍵,列選擇信號X1-X4,行掃描信號Y1-Y4。</p><p>  圖1.3 唐都實驗箱小鍵盤接線圖</p><p><b>  總體設(shè)計方案</b></p><p>  2.1 設(shè)計思想論述&l

15、t;/p><p> ?。?).波形產(chǎn)生:通過匯編語言編寫各個波形子程序,其中方波和三角波參考了唐都的參考程序。鋸齒波由三角波修改而來,正弦波事先用MATLAB仿真存入各點數(shù)據(jù),產(chǎn)生波形時依次輸出各個數(shù)據(jù)即可。波形子程序中主要是各個波形一個周期的代碼,循環(huán)執(zhí)行,由此產(chǎn)生連續(xù)波形并通過D /A0832將數(shù)字量轉(zhuǎn)換成模擬量輸出,即可得各種波形。具體方案見第三章3.1節(jié)。</p><p> ?。?).

16、波形切換:用小鍵盤輸入進行波形的選擇,按鍵0~3分別對應(yīng)方波、三角波、鋸齒波和正弦波。每個波形周期輸出后,調(diào)用鍵盤查詢子程序,判斷有無按鍵按下,沒有則繼續(xù)輸出下一周期,否則轉(zhuǎn)到相應(yīng)的波行子程序上。可隨時進行波形間的切換。具體方案見第三章3.2節(jié)。</p><p> ?。?).無極調(diào)頻:改變波形子程序中的各個數(shù)據(jù)輸出延時時間,就可改變整個波形的頻率,延時越短頻率越高。而延時時間長短可由外部輸入決定,通過A/D080

17、9將電位計(0~5V)的模擬量轉(zhuǎn)化成數(shù)字量(00~FF)作為延時時間長短。調(diào)節(jié)電位器即可調(diào)節(jié)延時,進而調(diào)節(jié)頻率。ADC0809芯片分辨率為8位,即可將延時分為256個等級,實現(xiàn)無極調(diào)頻。具體方案見第三章3.3、3.4節(jié)。</p><p>  (4).無極調(diào)幅:改變波形子程序中DA輸出值的大小即可改變幅值,可以在原數(shù)據(jù)基礎(chǔ)上乘以一個增益。而增益可由外部輸入,原理與調(diào)頻相似,通過A/D0809輸入一個數(shù)字量(00~F

18、F)。按鍵4用于調(diào)頻/調(diào)幅的切換。當(dāng)判斷當(dāng)前為調(diào)幅狀態(tài)時就將這個數(shù)字量存入幅值增益變量中,如果判斷是調(diào)頻狀態(tài)則存入頻率延時變量中。從而實現(xiàn)只用一個電位器分別調(diào)節(jié)頻率和幅度的功能。具體方案見第三章3.3、3.4節(jié)。</p><p> ?。?).開始結(jié)束:通過掃描小鍵盤,按下5鍵則退出。</p><p><b>  2.2 程序流程圖</b></p><

19、;p><b>  2.3 電路原理圖</b></p><p>  圖2.2 硬件連接電路圖</p><p><b>  典型模塊分析</b></p><p>  3.1 波形產(chǎn)生模塊</p><p>  四個波形子程序結(jié)構(gòu)類似,當(dāng)子程序被調(diào)用后,進行以下步驟:</p><

20、p> ?。?)通過8255的C7位輸出一個低電平來啟動AD0809,并從8255的B口讀入AD輸入的數(shù)字量(00H~FFH)。</p><p>  (2)判斷幅頻標(biāo)志位FLAG_FUPIN,為0則把AD輸入的數(shù)字量存入頻率值空間FRE,否則存入幅值空間AMP。</p><p> ?。?)輸出波形的一個周期。</p><p> ?。?)調(diào)用子程序CCSCAN,判

21、斷小鍵盤有無按鍵按下,無則繼續(xù)步驟(1),有則返回主程序。</p><p>  流程圖如圖3.1所示。</p><p>  圖3.1 波形子程序流程圖</p><p><b>  3.1.1 方波</b></p><p>  方波的產(chǎn)生先向DA0832輸出一個低電平(00H),并延時一段時間。再輸出一個高電平(此處直

22、接用AMP的值作為高電平,AMP是外部AD輸入的幅值增益),延時一段相同時間,就是矩形波的一個周期。</p><p> ?。?)一個周期波形的代碼:</p><p>  NEXT1_1: MOV DX,DA0832 ;寫00H,輸出低電平</p><p>  MOV AL,00H</p><p>  OUT

23、 DX,AL</p><p>  CALL DALLY1;延時</p><p>  MOV DX,DA0832 ;寫 AMP,輸出高電平</p><p>  MOV AL,AMP ;AMP=00H~FFH,默認值 7FH</p><p>  OUT DX,AL</p&g

24、t;<p>  CALL DALLY1;延時</p><p> ?。?)延時子程序代碼:</p><p>  DALLY1 PROC NEAR ;軟件延時子程序</p><p>  PUSH CX</p><p>  PUSH AX</p><p&g

25、t;  MOV CH,FRE ;讀取頻率值,F(xiàn)RE=00H~FFH</p><p>  AND CH,0F0H</p><p>  ADD CH,0FH ;CH的值受FRE的控制,改變FRE則改變延時時間</p><p>  MOV CL,0FFH</p><p>  DD1:

26、 MOV AX,0FF00H</p><p>  DD2: DEC AX</p><p>  JNZ DD2</p><p>  LOOP DD1</p><p>  POP AX</p><p>  POP CX</p><p

27、><b>  RET</b></p><p>  DALLY1 ENDP</p><p>  3.1.2 三角波</p><p>  三角波從最小值開始逐漸上升,到達最大值之后再逐漸減小到最小。因此先將最小值(00H)放到BL,輸出并延時,對BL加一,再輸出并延時,達到最大值后就對BL依次減一,輸出并延時,直到BL=00H,則為一個周

28、期波形。因此三角波有兩個過程。</p><p>  一個周期波形的代碼如下: </p><p>  NEXT1_2: MOV BL,00H ;BL賦最小值00H</p><p>  UP1: MOV AL,AMP ;AL幅值增益AMP, AMP=00H~FFH </p><p>  AND

29、 AL,0F0H </p><p>  SHR AL,4 ; AL=00H~0FH</p><p>  MUL BL ; ALBL*AL</p><p>  MOV DX,DA0832 ;啟動D/A轉(zhuǎn)換</p><p>  OUT DX,AL ;輸出AL

30、</p><p>  CALL DALLY2</p><p>  INC BL ;BL加一</p><p>  CMP BL,25H ;判斷BL是否加到最大值了</p><p>  JNE UP1</p><p>  DOWN: MOV AL,A

31、MP ;AL幅值增益AMP ,AMP=00H~FFH </p><p>  AND AL,0F0H</p><p>  SHR AL,4 ; AL=00H~0FH</p><p>  MUL BL; ALBL*AL</p><p>  MOV DX,DA0832</p

32、><p>  OUT DX,AL</p><p>  CALL DALLY2 </p><p>  DEC BL ;BL減一</p><p>  CMP BL,00H;判斷BL是否減到最小值了</p><p>  JNE DOWN</p&

33、gt;<p>  延時子程序與方波類似,此處不再贅述。</p><p>  局部流程圖如圖3.2所示。</p><p>  3.1.3 鋸齒波</p><p>  鋸齒波與三角波類似,只是鋸齒波到達最大值之后,直接跳到最小值。因此鋸齒波只有對BL依次加一的過程。</p><p>  一個周期波形的代碼如下:</p>

34、<p>  NEXT1_3: MOV BL,00H ;BL賦最小值00H</p><p>  UP2: MOV AL,AMP ;AL幅值增益AMP, AMP=00H~FFH</p><p>  AND AL,0F0H </p><p>  SHR AL,4 ; A

35、L=00H~0FH</p><p>  MUL BL; ALBL*AL</p><p>  MOV DX,DA0832 ;啟動D/A轉(zhuǎn)換</p><p>  OUT DX,AL;輸出AL</p><p>  CALL DALLY2</p><p>  INC

36、 BL;BL加一</p><p>  CMP BL,25H;判斷BL是否加到最大值了</p><p>  JNE UP2</p><p>  MOV BL,00H;BL加到最大之后直接賦給最小值00H</p><p>  MOV AL,AMP</p><

37、p>  AND AL,0F0H</p><p>  SHR AL,4 </p><p>  MUL BL; ALBL*AL</p><p>  MOV DX,DA0832</p><p>  OUT DX,AL</p><p>  

38、CALL DALLY2</p><p>  延時子程序與方波類似,此處不再贅述。</p><p>  局部流程圖如圖3.3所示。</p><p>  3.1.4 正弦波</p><p>  正弦波是利用正弦表(見附錄 代碼段)輸出的,即將正弦表中的數(shù)值一一輸出并延時。</p><p>  一個周期波形的代碼

39、: </p><p>  NEXT1_4: LEA SI,SIN ;指向正弦表中的第一個數(shù)據(jù)</p><p>  MOV CX,255</p><p>  UP: MOV BL,AMP ;BL幅值增益AMP, AMP=00H~FFH</p><p>  AND BL,0F0H&l

40、t;/p><p>  SHR BL,4 ;AMP=00H~FFH ,BL=00H~0F</p><p>  MOV AL,[SI] ;讀取正弦表中的一個數(shù)據(jù)</p><p>  SHR AL,2</p><p>  MUL BL ; AL AL* BL</p>&

41、lt;p>  MOV DX,DA0832 ;啟動D/A轉(zhuǎn)換</p><p>  OUT DX,AL ;輸出AL</p><p>  CALL DALLY3</p><p>  INC SI ;指向表中的下一個數(shù)據(jù)</p><p>  LOOP UP</p

42、><p>  延時子程序與方波類似,此處不再贅述。</p><p>  局部流程圖如圖3.4所示。</p><p><b>  3.2 小鍵盤模塊</b></p><p>  小鍵盤用到兩個子程序(ccscan和scan)。</p><p>  ccscan子程序只是一個輔助程序,用于判斷當(dāng)前小鍵盤是

43、否有鍵按下,有則全零標(biāo)志位ZF=0(運算結(jié)果不為0),無鍵按下則ZF=1(運算結(jié)果為0)。子程序代碼如下:</p><p>  CCSCAN PROC NEAR ;掃描是否有按鍵閉合子程序</p><p>  MOV AL,00H</p><p>  MOV DX,MY8255_A ;將4列全選通,X1~X4置0&l

44、t;/p><p>  OUT DX,AL</p><p>  MOV DX,MY8255_C</p><p>  IN AL,DX ;讀Y1~Y4</p><p>  NOT AL</p><p>  AND AL,0FH ;取出Y1~Y4

45、的反值</p><p><b>  RET</b></p><p>  CCSCAN ENDP</p><p>  scan功能為當(dāng)確定小鍵盤有鍵按下則一列一列掃描鍵盤,判斷是哪一列哪一行的鍵被按下了,并把鍵值保存到數(shù)據(jù)段的key空間去。子程序代碼如下:</p><p>  SCAN PROC NEAR&l

46、t;/p><p>  MOV CH,0FEH</p><p>  MOV CL,00H ;設(shè)置當(dāng)前檢測的是第幾列</p><p>  COLUM: MOV AL,CH ;選取一列,將X1~X4中一個置0</p><p>  MOV DX,MY8255_A</p>

47、<p>  OUT DX,AL</p><p>  MOV DX,MY8255_C ;讀Y1~Y4,用于判斷是哪一行按鍵閉合</p><p>  IN AL,DX</p><p>  L1: TEST AL,01H ;是否為第1行</p><p>  JNZ

48、L2 ;不是則繼續(xù)判斷</p><p>  MOV AL,00H ;設(shè)置第1行第1列的對應(yīng)的鍵值</p><p>  JMP KCODE</p><p>  L2: TEST AL,02H ;是否為第2行</p><p>  JNZ L3

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

50、/p><p>  MOV AL,08H ;設(shè)置第3行第1列的對應(yīng)的鍵值</p><p>  JMP KCODE</p><p>  L4: TEST AL,08H ;是否為第4行</p><p>  JNZ NEXT ;不是則繼續(xù)判斷</p><

51、p>  MOV AL,0CH ;設(shè)置第4行第1列的對應(yīng)的鍵值</p><p>  JMP KCODE</p><p>  NEXT: INC CL ;當(dāng)前檢測的列數(shù)遞增</p><p>  MOV AL,CH</p><p>  TEST AL,08

52、H ;檢測是否掃描到第4列</p><p>  JZ KERR ;是則跳回到開始處</p><p>  ROL AL,1 ;沒檢測到第4列則準(zhǔn)備檢測下一列</p><p>  MOV CH,AL</p><p>  JMP COLUM</p>

53、<p>  KCODE: ADD AL,CL ;將第1列的值加上當(dāng)前列數(shù),確定按鍵值</p><p>  MOV KEY,AL ;保存按鍵值到key空間</p><p>  KERR: RET</p><p>  SCAN ENDP</p><p>  3.3 調(diào)幅調(diào)頻模塊<

54、;/p><p>  系統(tǒng)只使用了一個電位計可以分別調(diào)節(jié)頻率和幅值。波形子程序中每個循環(huán)周期啟動一次A/D轉(zhuǎn)換,啟動信號由C7口輸出,將讀入的數(shù)據(jù)放到特定的存儲單元FRE(或AMP)中,供延時(或幅值輸出)時使用。</p><p>  本次實驗ADC 0809芯片的輸出八位數(shù)據(jù)線連到了8255端口B,通過端口B讀入。模擬輸入量Vin通過電位計從0~5V無極可調(diào),對應(yīng)的數(shù)字輸出量N從00H~FFH

55、變化。</p><p>  調(diào)頻:改變波形子程序中的各個數(shù)據(jù)輸出延時時間,就可改變整個波形的頻率。延時時間由AD0809讀入的數(shù)據(jù)控制。</p><p>  調(diào)幅:在波形子程序中給DA輸出值乘以一個增益,改變增益的大小即可改變幅值。增益由AD0809讀入的數(shù)據(jù)控制。</p><p>  調(diào)頻/調(diào)幅切換:主程序設(shè)了一個幅頻標(biāo)志位FLAG_FUPIN,當(dāng)小鍵盤的4鍵按下

56、時,使FLAG_FUPIN取反(默認標(biāo)志位=0)。波形子程序中通過判斷幅頻標(biāo)志位FLAG_FUPIN的狀態(tài),可以選擇是調(diào)頻還是調(diào)幅。</p><p><b>  部分代碼如下:</b></p><p>  (1)主程序中的切換部分</p><p>  GETKEY3: CALL SCAN ;有鍵按下,調(diào)用鍵盤掃描子程序

57、</p><p>  MOV AL,KEY</p><p>  CMP AL,08H ;判斷是否為調(diào)幅 /調(diào)頻鍵</p><p>  JNE LOOP1 ;不是則返回判斷波形或退出</p><p>  NOT BYTE PTR[FLAG_FUPIN] ;是,則將幅頻標(biāo)

58、志位取反</p><p>  CMP FLAG_FUPIN,0</p><p>  JNE TIAOFU</p><p>  MOV DX,OFFSET MES5 ;屏幕顯示切換到調(diào)頻狀態(tài)</p><p>  MOV AH,09H</p><p>  I

59、NT 21H</p><p>  JMP JIXU </p><p>  TIAOFU: MOV DX,OFFSET MES6 ; 屏幕顯示切換到調(diào)幅狀態(tài)</p><p>  MOV AH,09H</p><p>  INT 21H &l

60、t;/p><p>  JIXU: MOV BL,FLAG_BOXING</p><p>  MOV KEY,BL ;將波形對應(yīng)的鍵值存回 KEY中</p><p>  JMP LOOP1 ;返回判斷波形</p><p> ?。?)波形子程序部分</p><p&

61、gt;  MOV DX,MY8255_MODE ; 通過8255的C7口發(fā)出一個低電平</p><p>  MOV AL,00001110B </p><p>  OUT DX,AL;啟動AD0809</p><p>  MOV DX,MY8255_B ;讀8255B口數(shù)據(jù)<

62、;/p><p>  IN AL,DX</p><p>  MOV BL,FLAG_FUPIN ;判斷幅頻標(biāo)志位,默認為0</p><p>  CMP BL,0</p><p>  JE PIN_1 ; 為0則跳轉(zhuǎn)到PIN_1</p>

63、;<p>  MOV AMP,AL ; 不為0則存為振幅值</p><p>  JMP NEXT1_1</p><p>  PIN_1: MOV FRE,AL; 為0則存為頻率值</p><p>  流程圖見圖2.1和圖3.1</p><p&g

64、t;<b>  系統(tǒng)調(diào)試過程及結(jié)果</b></p><p>  此次設(shè)計波形發(fā)生器是我們在學(xué)習(xí)匯編以來接觸到的比較大的程序。無論用何種程序書寫,理清思路是關(guān)鍵。因此,從拿到題目開始,我們花了很多時間來對設(shè)計波形發(fā)生器的硬件和軟件進行了分析與思考,從中選出最好的解決方法。</p><p>  在系統(tǒng)調(diào)試的過程中,我們用到的一個很重要的分析過程就是先易后難,先局部后整體,

65、先將各個波形的子程序?qū)懗鰜?,一一進行測試。無誤后再寫主程序?qū)⒏鱾€子程序整合起來。</p><p>  設(shè)計的過程是由易到難的,我們從實現(xiàn)最簡單的波形產(chǎn)生功能開始,逐步添加波形切換功能、小鍵盤輸入功能、無極調(diào)頻功能、無極調(diào)幅功能,整個系統(tǒng)由簡至繁逐步完善。</p><p>  最先遇到的比較大的困難是小鍵盤的輸入,前后試過兩個方案,最終以唐都提供的參考程序為基礎(chǔ),進過修改得到了現(xiàn)在使用的鍵盤

66、掃描子程序,效果很好。</p><p>  整個過程中最難的是實現(xiàn)無級調(diào)頻和無極調(diào)幅,開始時一直無法調(diào)頻,經(jīng)過對各個部位的仔細調(diào)試分析,是0809模數(shù)轉(zhuǎn)換的問題。0809需要一個啟動信號,且轉(zhuǎn)換需要一定時間。于是我們用C口每周期輸出一啟動信號進行轉(zhuǎn)換。最終達到理想效果。</p><p>  實現(xiàn)了調(diào)頻之后,對整個程序的結(jié)構(gòu)稍加改進,引入了幅頻標(biāo)志位,實現(xiàn)了小鍵盤控制調(diào)頻/調(diào)幅的切換,從而只

67、用一個電位計和一個小鍵盤按鍵實現(xiàn)了無極調(diào)頻和無極調(diào)幅的功能。</p><p><b>  不足和改進:</b></p><p>  1.所產(chǎn)生的頻率范圍較窄。應(yīng)盡量減少延時拓寬頻率。</p><p>  2.幅值調(diào)節(jié)范圍不夠大。</p><p>  3.產(chǎn)生的波形不是理想狀態(tài)。特別是方波,上下跳變時,總會有斷點。波形有噪

68、聲,不是理想的波形。</p><p>  4.由于波形每周期之后要讀端口,與下一個周期之間有一定延時誤差。</p><p><b>  收獲與體會</b></p><p>  本次課程設(shè)計的要求雖然不多,但整個設(shè)計過程是問題不斷,一波三折。整個課程設(shè)計完成之后,我在整體設(shè)計思路、硬件連結(jié)和匯編語言編程等方面得到了很大的收獲。</p>

69、<p>  設(shè)計的過程是由易到難的,我們從實現(xiàn)最簡單的波形產(chǎn)生功能開始,逐步添加波形切換功能、小鍵盤輸入功能、無極調(diào)頻功能、無極調(diào)幅功能,整個系統(tǒng)由簡至繁逐步完善。而程序總體流程也是三易其稿,其中有借鑒了別人的一些設(shè)計思路。</p><p>  第一個方案實在缺乏設(shè)計的智慧,在得到正確的指標(biāo)后就被拋棄了。第二個方案時,我們把控制波形轉(zhuǎn)換的功能寄希望于用中斷實現(xiàn),而調(diào)頻變化在延時子程序中進行,最后證實

70、這樣子的程序流程圖將很復(fù)雜冗長,條理不清晰,而且用中斷實現(xiàn)時缺乏所需的硬件。最后一個方案即為當(dāng)前選擇的方案,條理清晰,程序簡單,代碼也短,但是能很好實現(xiàn)所有功能。</p><p>  硬件連結(jié)的問題主要在使用第二個方案時出現(xiàn)的。第二個方案的中斷控制需要手動輸入一個中斷脈沖,然后結(jié)果總是有差,最后討論得出結(jié)論是我們很難保證這個手動輸入脈沖的合格,這個脈沖可能不夠標(biāo)準(zhǔn)。后面做最終方案時,波形發(fā)生顫抖,檢查發(fā)現(xiàn)是控制波

71、形選擇的開關(guān)處不穩(wěn)定,也算是硬件連結(jié)的問題。而波形特別是矩形波輸出時,在中間總是一個斷痕,反復(fù)檢查軟件設(shè)計后也歸結(jié)為硬件內(nèi)部延時所產(chǎn)生誤差。</p><p>  做軟件設(shè)計時遇到的關(guān)鍵點也是難點集中到了調(diào)頻電路的選擇。第二方案時,我們把調(diào)頻參數(shù)的讀取放置在延時程序,主程序不循環(huán),每一個波形都是無限循環(huán)的波形。后來得到高人指點,我們忽略了主程序循環(huán)所會帶來的延時對波形的影響,以主程序無限循環(huán),每輸出一個周期波形讀一

72、次調(diào)頻參數(shù)的方式進行調(diào)頻。結(jié)果很完美。</p><p>  實現(xiàn)了調(diào)頻之后,對整個程序的結(jié)構(gòu)稍加改進,引入了幅頻標(biāo)志位,實現(xiàn)了小鍵盤控制調(diào)頻/調(diào)幅的切換,從而只用一個電位計和一個小鍵盤按鍵實現(xiàn)了無極調(diào)頻和無極調(diào)幅的功能。</p><p><b>  參考文獻</b></p><p>  [1]周荷琴,吳秀清.微型計算機原理與接口技術(shù).合肥:中國

73、科學(xué)技術(shù)大學(xué)出版社,2008.6</p><p>  [2]唐都科教儀器開發(fā)有限公司. 32位微機原理與接口技術(shù)實驗教程.</p><p>  [3]陳明義.數(shù)字電子技術(shù)基礎(chǔ).長沙.中南大學(xué)出版社,2008.9</p><p>  附錄1 匯編語言源程序代碼 </p><p>  ;****************根據(jù)查看端口資源修改下列

74、符號值*******************</p><p>  IOY0 EQU 0E400H ;片選IOY0對應(yīng)的端口始地址</p><p>  IOY1 EQU 0E440H ;片選IOY1對應(yīng)的端口始地址</p><p>  ;******************************************

75、***********************</p><p>  DA0832 EQU IOY0+00H*4 ;DA0832的端口地址</p><p>  MY8255_A EQU IOY1+00H*4 ;8255的A口地址</p><p>  MY8255_B EQU IOY1+01H*4 ;8255的B口地址&l

76、t;/p><p>  MY8255_C EQU IOY1+02H*4 ;8255的C口地址</p><p>  MY8255_MODE EQU IOY1+03H*4 ;8255的控制寄存器地址</p><p>  STACK1 SEGMENT STACK</p><p>  DW 256 DUP

77、(?)</p><p>  STACK1 ENDS</p><p>  DATA SEGMENT</p><p>  STR1 DB 'DA0832: Please choose Wave',0AH,0DH,'$' ;定義顯示的字符串 </p><p>  MES1 DB

78、 'SHOW A SQUARE',0AH,0DH,'$'</p><p>  MES2 DB 'SHOW A SANJIAO',0AH,0DH,'$'</p><p>  MES3 DB 'SHOW A JUCHI',0AH,0DH,'$'</

79、p><p>  MES4 DB 'SHOW A SINE',0AH,0DH,'$'</p><p>  MES5 DB 'CHANGE THE Frequence',0AH,0DH,'$' </p><p>  MES6 DB 'CHANGE THE

80、 Amplitude',0AH,0DH,'$' </p><p>  KEY DB'?'</p><p>  FLAG_BOXING DB '?'</p><p>  FLAG_FUPIN DB 0</p><p>  FRE DB

81、 7FH</p><p>  AMP DB 7FH</p><p>  SIN DB 100, 102, 105, 107, 110, 112, 115, 117, 120, 122</p><p>  DB 124, 127, 129, 132, 134, 136, 139, 141, 143, 145<

82、/p><p>  DB 147, 150, 152, 154, 156, 158, 160, 162, 164, 166</p><p>  DB 168, 169, 171, 173, 175, 176, 178, 179, 181, 182</p><p>  DB 184, 185, 186, 187, 189, 190,

83、 191, 192, 193, 194</p><p>  DB 194, 195, 196, 197, 197, 198, 198, 199, 199, 199</p><p>  DB 200, 200, 200, 200, 200, 200, 200, 200, 199, 199</p><p>  DB 199, 1

84、98, 198, 197, 197, 196, 195, 194, 194, 193</p><p>  DB 192, 191, 190, 189, 187, 186, 185, 184, 182, 181</p><p>  DB 179, 178, 176, 175, 173, 171, 169, 168, 166, 164</p><

85、p>  DB 162, 160, 158, 156, 154, 152, 150, 147, 145, 143</p><p>  DB 141, 139, 136, 134, 132, 129, 127, 124, 122, 120</p><p>  DB 117, 115, 112, 110, 107, 105, 102, 100,

86、98, 95</p><p>  DB 93, 90, 88, 85, 83, 80, 78, 76, 73, 71</p><p>  DB 68, 66, 64, 61, 59, 57, 55, 53, 50, 48</p><p>  DB 46, 44, 42, 40,

87、38, 36, 34, 32, 31, 29</p><p>  DB 27, 25, 24, 22, 21, 19, 18, 16, 15, 14</p><p>  DB 13, 11, 10, 9, 8, 7, 6, 6, 5, 4</p><p>  DB

88、3, 3, 2, 2, 1, 1, 1, 0, 0, 0</p><p>  DB 0, 0, 0, 0, 0, 1, 1, 1, 2, 2</p><p>  DB 3, 3, 4, 5, 6, 6, 7, 8, 9, 10</p><

89、p>  DB 11, 13, 14, 15, 16, 18, 19, 21, 22, 24</p><p>  DB 25, 27, 29, 31, 32, 34, 36, 38, 40, 42</p><p>  DB 44, 46, 48, 50, 53, 55, 57, 59, 61,

90、 64</p><p>  DB 66, 68, 71, 73, 76, 78, 80, 83, 85, 88</p><p>  DB 90, 93, 95, 98, 100</p><p>  DATA ENDS</p><p>  CODE SEGMENT</p>

91、<p>  ASSUME CS:CODE,DS:DATA</p><p>  START: MOV AX,DATA</p><p>  MOV DS,AX</p><p>  MOV DX,OFFSET STR1 ;顯示提示選擇界面</p><p>  MOV

92、 AH,9</p><p>  INT 21H</p><p>  MOV DX,OFFSET MES5 ;show message</p><p>  MOV AH,09H</p><p>  INT 21H</p><p>  MOV D

93、X,MY8255_MODE ;初始化8255工作方式</p><p>  MOV AL,10000011B ;方式0,A口、C口高四位輸出,</p><p>  OUT DX,AL ; B口、C口低4位輸入</p><p>  ;無鍵按下則循環(huán)等待,有鍵按下則消抖</p>&

94、lt;p>  KEYBEGIN: CALL CCSCAN ;掃描按鍵</p><p>  JNZ GETKEY1 ;有鍵按下則跳置GETKEY1</p><p>  JMP KEYBEGIN ;無按鍵則繼續(xù)循環(huán)等待</p><p>  GETKEY1: CALL DALLY_SCAN

95、 ;有鍵壓下,延時消抖</p><p>  CALL DALLY_SCAN</p><p>  CALL CCSCAN ;再次掃描按鍵</p><p>  JNZ GETKEY2 ;有鍵按下則跳置GETKEY2</p><p>  JMP KEYBEGIN ;否則跳回開始繼續(xù)

96、循環(huán)</p><p>  GETKEY2: CALL SCAN </p><p>  LOOP1: MOV AL,KEY</p><p>  CMP AL,0CH</p><p>  JE A0</p><p>  CMP AL,0DH</p

97、><p>  JE A1</p><p>  CMP AL,0EH</p><p>  JE A2</p><p>  CMP AL,0FH</p><p>  JE A3</p><p>  CMP AL,9H&l

98、t;/p><p>  JE QUIT </p><p>  JMP KEYBEGIN</p><p>  A0: MOV DX,OFFSET MES1 ;show message</p><p>  MOV AH,09H</p><p>  INT

99、 21H</p><p>  CALL SQUARE</p><p>  MOV FLAG_BOXING,0CH</p><p>  JMP GETKEY3</p><p>  A1: MOV DX,OFFSET MES2 ;show message</p&

100、gt;<p>  MOV AH,09H</p><p>  INT 21H</p><p>  CALL SANJIAO</p><p>  MOV FLAG_BOXING,0DH</p><p>  JMP GETKEY3</p><p> 

101、 A2: MOV DX,OFFSET MES3 ;show message</p><p>  MOV AH,09H</p><p>  INT 21H</p><p>  CALL JUCHI</p><p>  MOV FLAG_BOXING,0EH</

102、p><p>  JMP GETKEY3</p><p>  A3: MOV DX,OFFSET MES4 ;show message</p><p>  MOV AH,09H</p><p>  INT 21H</p><p>  CALL

103、SINE</p><p>  MOV FLAG_BOXING,0FH</p><p>  JMP GETKEY3</p><p>  GETKEY3: CALL SCAN ;有鍵按下,調(diào)用鍵盤掃描子程序</p><p>  MOV AL,KEY;判斷是否為調(diào)幅 /調(diào)頻鍵<

104、;/p><p>  CMP AL,08H ;不是則返回判斷波形或退出</p><p>  JNE LOOP1 </p><p>  NOT BYTE PTR[FLAG_FUPIN] ;是,則改變幅頻標(biāo)志位</p><p>  CMP FLAG_FUPIN,0</

105、p><p>  JNE TIAOFU</p><p>  MOV DX,OFFSET MES5 ;show message</p><p>  MOV AH,09H</p><p>  INT 21H</p><p>  JMP JIXU

106、 </p><p>  TIAOFU: </p><p>  MOV DX,OFFSET MES6 ;show message</p><p>  MOV AH,09H</p><p>  INT 21H </p><p>  JIXU:

107、 MOV BL,FLAG_BOXING</p><p>  MOV KEY,BL ;將波形對應(yīng)的鍵值存回 KEY中 </p><p>  JMP LOOP1 ;返回判斷波形</p><p>  QUIT: MOV AX,4C00H ;返回到DOS</p><

108、p>  INT 21H</p><p>  SCAN PROC NEAR</p><p>  MOV CH,0FEH</p><p>  MOV CL,00H ;設(shè)置當(dāng)前檢測的是第幾列</p><p>  COLUM: MOV AL,CH ;選取一列,

109、將X1~X4中一個置0</p><p>  MOV DX,MY8255_A</p><p>  OUT DX,AL</p><p>  MOV DX,MY8255_C ;讀Y1~Y4,用于判斷是哪一行按鍵閉合</p><p>  IN AL,DX</p><p>  

110、L1: TEST AL,01H ;是否為第1行</p><p>  JNZ L2 ;不是則繼續(xù)判斷</p><p>  MOV AL,00H ;設(shè)置第1行第1列的對應(yīng)的鍵值</p><p>  JMP KCODE</p><p>  L2: TEST

111、 AL,02H ;是否為第2行</p><p>  JNZ L3 ;不是則繼續(xù)判斷</p><p>  MOV AL,04H ;設(shè)置第2行第1列的對應(yīng)的鍵值</p><p>  JMP KCODE</p><p>  L3: TEST AL,04H

112、 ;是否為第3行</p><p>  JNZ L4 ;不是則繼續(xù)判斷</p><p>  MOV AL,08H ;設(shè)置第3行第1列的對應(yīng)的鍵值</p><p>  JMP KCODE</p><p>  L4: TEST AL,08H ;是否為第4行</

113、p><p>  JNZ NEXT ;不是則繼續(xù)判斷</p><p>  MOV AL,0CH ;設(shè)置第4行第1列的對應(yīng)的鍵值</p><p>  JMP KCODE</p><p>  NEXT: INC CL ;當(dāng)前檢測的列數(shù)遞增</p>&

114、lt;p>  MOV AL,CH</p><p>  TEST AL,08H ;檢測是否掃描到第4列</p><p>  JZ KERR ;是則跳回到開始處</p><p>  ROL AL,1 ;沒檢測到第4列則準(zhǔn)備檢測下一列</p><p>  M

115、OV CH,AL</p><p>  JMP COLUM</p><p>  KCODE: ADD AL,CL ;將第1列的值加上當(dāng)前列數(shù),確定按鍵值</p><p>  MOV KEY,AL ;保存按鍵值</p><p>  KERR: RET</p>&

116、lt;p>  SCAN ENDP</p><p>  CCSCAN PROC NEAR ;掃描是否有按鍵閉合子程序</p><p>  MOV AL,00H</p><p>  MOV DX,MY8255_A ;將4列全選通,X1~X4置0</p><p>  OUT DX

117、,AL</p><p>  MOV DX,MY8255_C</p><p>  IN AL,DX ;讀Y1~Y4</p><p>  NOT AL</p><p>  AND AL,0FH ;取出Y1~Y4的反值</p><p><b>

118、;  RET</b></p><p>  CCSCAN ENDP</p><p>  SQUARE PROC NEAR ;方波產(chǎn)生子程序</p><p><b>  SQUARE1:</b></p><p>  MOV DX,MY8255_MODE ; 通過

119、8255的C7口發(fā)出一個低電平</p><p>  MOV AL,00001110B </p><p>  OUT DX,AL;啟動AD0809</p><p>  MOV DX,MY8255_B ;讀8255B口數(shù)據(jù)</p><p>  IN AL,DX&l

120、t;/p><p>  MOV BL,FLAG_FUPIN ;判斷幅頻標(biāo)志位,默認為0?</p><p>  CMP BL,0</p><p>  JE PIN_1 ; 為0則存為頻率值</p><p>  MOV AMP,AL ;

溫馨提示

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

評論

0/150

提交評論