課程設計(論文)任務書
專業班級:電子1302
學生姓名:
指導教師(簽名):
一、課程設計(論文)題目
正弦波信號發生器設計
二、本次課程設計(論文)應達到的目的
本次課程設計是自動化專業學生在學習了《單片機原理及應用》課程及《模擬電子線路》、《數字電子線路》等專業基礎課程之后進行的一次綜合訓練,其主要目的是加深學生對單片機軟硬件技術和相關理論知識的理解,進一步熟悉51單片機系統設計的基本理論、方法和技能;掌握工程應用的基本內容和要求,力爭做到理論與實際的統一;同時培養學生分析問題、解決問題的能力和獨立完成系統設計的能力,并按要求編寫相關的技術文檔和設計報告等。
三、本次課程設計(論文)任務的主要內容和要求(包括原始數據、技術參數、設計要求等)
1.設計內容
(1)選擇51單片機,晶振采用12MHz。
(2)設計一個能產生0至50HZ正弦波信號。通過0832D/A芯片完成數模轉換。
(3)頻率值由鍵盤輸入。
(4)將頻率值由LED數碼管上顯示(兩位)。
2.設計要求
(1)按照任務書的要個求完成系統分析及方案設計。
(2)完成硬件原理圖的設計,并選擇相關元器件。
(3)完成控制軟件流程圖的設計,編寫相應的單片機控制程序。
(4)撰寫設計報告。
3. 成果要求
(1)在proteus中實現仿真。
(2)提交課程設計報告。
摘要 信號發生器是一種常用的信號源,廣泛地應用于電子電路、自動控制系統和教學實驗等領域。 本設計采用AT89C51單片機作為控制核心,外圍采用數字/模擬轉換電路(DAC0832)、運放電路(LM324)、按鍵和LCD液晶顯示電路。電路采用單片機和一片DAC0832數模轉換器組成數字式低頻信號發生器,可產生正弦波、矩形波、鋸齒波和三角波四種波形。系統通過單片機產生數字信號,通過DAC0832轉換為模擬信號,再通過放大器LM324就可以得到雙極性的各種波形,最終由示波器顯示出來。通過鍵盤來控制四種波形的類型選擇、頻率變化,并通過液晶1602顯示其各自的波形類型以及頻率數值。 本設計硬件電路簡單,軟件功能完善,控制系統可靠,性價比較高,具有一定的實用價值和參考價值。
目錄 1 系統總體設計 1 1.1 系統基本模塊設計與論證 1 1.1.1 信號發生模塊 1 1.1.2 鍵盤模塊 1 1.1.3 電路設計最終方案 2 1.2 系統原理及總體結構圖 2 1.2.1 系統總體結構圖 2 1.2.2 系統工作原理 2 2 系統硬件設計 3 2.1 系統硬件仿真原理圖 3 2.2 系統主要單元電路設計 4 2.2.1 主控制器AT89C51 4 2.2.2 數/模轉換電路 7 2.2.3 電流/電壓轉換放大電路 2.2.4 鍵盤電路 3 系統軟件設計 3.1 系統主程序流程框圖 3.2 信號產生子程序 3.2.1 正弦波發生子程序 3.2.2 矩形波發生子程序 18 3.2.3 三角波發生子程序 18 3.2.4 鋸齒波發生子程序 20 3.3按鍵處理子程序 20 3.4 INT0中斷子程序 1 4 系統調試 4.1 系統調試過程 4.2 調試中的問題及解決方法 4.3 系統仿真結果 5 結論 28 5.1 結論 28 參考文獻8 1
1 系統總體設計
1.1 系統基本模塊設計與論證
1.1.1 信號發生模塊采用單片機和DAC0832數模轉換器生成波形。通過編程的方法來控制輸入到數模轉換電路的數字量,從而控制輸出信號的波形和頻率。它的特點是價格低、設計簡單,在低頻范圍內穩定性好、操作方便、體積小、耗電少。 該既可滿足畢業設計的基本要求又能充分發揮其優勢,電路簡單,易控制,性價比較高,所以采用該方案。 1.1.2 鍵盤模塊采用矩陣式鍵盤,鍵盤為4*4矩陣式行列掃描,優點是當按鍵較多時可降低占用單片機的I/O口數目。 1.1.3 電路設計最終方案本系統包括主控模塊,顯示模塊,信號發生模塊,鍵盤模塊,運放模塊,綜上各方案所述,確定最終設計方案為:采用AT89C51作為主控制系統,獨立式按鍵作為鍵盤模塊,數模轉換芯片DAC0832作為信號發生模塊,LM324作為電流/電壓轉換放大模塊。 1.2 系統原理及總體結構圖1.2.1 系統總體結構圖根據上述電路設計的最終方案,系統總體設計結構如圖1所示。 圖1 系統總體結構圖 1.2.2系統工作原理數字信號可以通過數/模轉換器轉換成模擬信號,因此可通過產生數字信號再轉換成模擬信號的方法來獲得所需要的波形。在本設計中,AT89C51是整個波形發生器的核心部分,外圍電路包括數字/模擬轉換電路、電流/電壓轉換放大電路、按鍵電路和晶振電路。外接12MHz晶振電路為單片機提供工作脈沖。P0口接數模轉換芯片DAC0832的DI0~DI7,為數模轉換芯片提供數字信號;P2.0~P2.4外接獨立鍵盤,以控制信號的類型、頻率等。 通過對單片機編寫程序,控制從P0口輸出的數字信號類型,P0口的數字信號再輸入到數模轉換芯片DAC0832中,從而轉換為模擬信號輸出。DAC0832輸出的模擬信號為電流信號,所以用電流/電壓運算放大器LM324將電流信號再轉換成電壓信號輸出。用兩片LM324可以得到輸出波形的雙極性輸出,將輸出的波形與示波器相連即可觀察輸出波形的特征。獨立式鍵盤可以控制從P0口輸出的數字信號,按下不同的鍵可以使此輸出信號改變,從而使輸出的波形實現正弦波、矩形波、鋸齒波和三角波之間的轉變,并能夠改變波形輸出頻率的大小。 2 系統硬件設計2.1系統硬件仿真原理圖硬件設計是系統設計的重點之一,選擇合適的元器件尤為重要。在本設計中,根據設計的總體方案,選擇AT89C51作為主控制器、DAC0832為數模轉換芯片、LM324為電流/電壓轉換元件、5個獨立式按鍵為按鍵模塊元件。本設計在Proteus軟件中繪制的硬件電路圖如圖2所示。  圖2 硬件仿真原理圖 2.2 系統主要單元電路設計2.2.1 主控制器AT89C51AT89C51是美國ATMEL公司生產的低電壓、高性能CMOS 8位單片機,片內含4KB的可反復擦除的只讀程序存儲器(PEROM)和128B隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產兼容標準MCS-51指令系統,片內置通用8位中央處理器(CPU)和FLASH存儲單元,功能強大AT89C51單片機可為您提供許多高性價比的應用場合。 主要性能參數: ①與MCS-51產品指令系統完全兼容 ②4K字節可重擦寫FLASH閃速存儲器 ③1000次擦寫周期 ④全靜態操作:0HZ-24MHZ ⑤三級加密程序存儲器 ⑥128 8字節內部RAM ⑦32個可編程I/O口線 ⑧2個16位定時/計數器 ⑨6個中斷源 ⑩可編程串行UART通道  圖3 AT89C51 引腳封裝圖 AT89C51引腳封裝如圖3所示,其芯片引腳介紹如下: (1)主電源引腳 VCC:+5 V電源 VSS:地線。 (2)時鐘電路引腳 XTAL1和XTAL2:外接晶體引線端。當使用芯片內部時鐘時,此二引線端用于外接石英晶體和微調電容;當使用外部時鐘時,用于接外部時鐘脈沖信號。 (3)控制信號引腳 RST/VPD:復位信號。當輸入的復位信號延續兩個機器周期以上的高電平時即為有效,用以完成單片機的復位初始化操作;當單片機掉電時,此引腳上可接備用電源,由VPD向片內RAM提供備用電源,以保持片內RAM中的數據不丟失。 ALE/PROG:地址鎖存控制信號。在系統擴展時,ALE用于控制把P0口輸出的低8位地址鎖存起來,以實現低位地址和數據的隔離。此外,由于ALE是以晶振1/6的固定頻率輸出的正脈沖,因此,可作為外部時鐘或外部定時脈沖使用。 PSEN:片外程序存儲器讀選通信號輸出端。 EA/VPP:訪問程序存儲控制信號。當EA信號為低電平時,對ROM的讀操作限定在外部程序存儲器;當EA信號為高電平時,對ROM的讀操作是從內部程序存儲器開始,并可延至外部程序存儲器。 (4)I/O引腳 P0.0 ~ P0.7 :P0口8位雙向口線;P1.0 ~ P1.7 :P1口8位雙向口線; P2.0 ~ P2.7 :P2口8位雙向口線;P3.0 ~ P3.7 :P3口8位雙向口線。 P3口線的第二功能。P3的8條口線都定義有第二功能,詳見表1。 表1 P3口各引腳與第二功能表 以上把8051單片機的全部信號引腳分別以第一功能和第二功能的形式列出。對于各種型號的芯片,其引腳的第一功能信號是相同的,所不同的只在引腳的第二功能信號。對于9、30和31三個引腳,由于第一功能信號與第二功能信號是單片機在不同工作方式下的信號,因此不會發生使用上的矛盾。但是P3口的情況卻有所不同,它的第二功能信號都是單片機的重要控制信號。因此,在實際使用時,都是先按需要選用第二功能信號,剩下的才以第一功能的身份作數據位的輸入/輸出使用。 如圖4所示,本設計中單片機資源的分配情況如下: (1)單片機使用外部電路來提供時鐘脈沖。引腳XTAL1和XTAL2之間接12MHz的石英晶體,使單片機的一個機器周期為1us。 (2)P0口與DAC0832的DI0-DI7數據輸入口相連,因為P0口內部沒有上拉電阻,不能輸出高電平,所以要接上拉電阻RESPACK-8; P2口的P2^0-P2^4分別與5個獨立按鍵相連。 
圖4 單片機控制模塊 2.2.2 數模轉換電路數模轉換電路是本設計的關鍵電路,它決定著將數字信號轉變為模擬信號,從而得到各種所需要的波形。 1. 數模轉換器的工作原理 數模轉換器可將數字量信號轉換成與此數值成正比的模擬量信號。需要轉換的數字量由一個二進制數字表示,每位二進制數字都有一定的權,在轉換中,應將二進制數的每一位按照權的大小轉換成相應的模擬量輸出分量,然后將各個輸出分量疊加,總和就是與數字量成正比的模擬量數值。 上述的D/A轉換,常用如圖5所示的倒T形解碼網絡加以實現。  圖5 倒T形電阻網絡D/A轉換器 電路設計如圖5所示,包括由R-2R組成的電阻網絡、模擬電子開關和集成運算放大器。 對于電阻網絡,無論從哪個R-2R節點看,等效電阻都是R,因此,從參考電壓端輸入的電流為: IR=VREF/R 根據分流公式,各支路電流為: I7=I/21I6 =I/22I5 =I/23I4 =I/24I3 =I/25I2 =I/26I1 =I/27I0 =I/28 于是,經過運算放大器輸出的模擬電壓VO為: VO = - RF∑Ii= -Rfb VREF/R×28(D7×27 +D6×26 +D5×25+ D4×24+D3×23+D2×22+D1×21+D0×20) 其中VREF是進行D/A轉換的系統提供的參考電壓,Rfb為集成運算放大器的反饋電阻,D7 ~ D0取值為0或1,0表示切換開關與地相連,1表示與參考電壓相連。通過上述電路,即完成了二進制數字信號到模擬電壓信號的轉換。 2.數模轉換器的主要技術指標 分辨率指輸入給D/A轉換器的單位數字量引起的模擬量輸出的變化,通常定義為輸出滿刻度值與2n之比(n為D/A轉換器的二進制位數)。顯然,二進制位數越多,分辨率越高,即D/A轉換器對輸入量變化的敏感程度越高。例如,8位的D/A轉換器,若滿量程輸出為10V,根據分辨率定義,則分辨率為10V/2n,分辨率為10V/256=39.1mV,即輸入的二進制最低位的變化可引起輸出的模擬電壓變化39.1mV,該值占滿量程的0.391%,常用1LSB表示。使用時,應根據對D/A轉換器分辨率的需要來選定D/A轉換器的位數。 相對精度是指在滿刻度已經校準的前提下,在整個刻度范圍內,對應于任一數碼的模擬量輸出與它的理論值之差。通常用偏差幾個LSB來表示。 建立時間是描述D/A轉換器轉換快慢的一個參數,用于表明轉換時間或轉換速度。其值為從輸入數字量到輸出達到總值誤差±(1/2)LSB(最低有效位)時所需的時間。電流輸出的轉換時間較短,而電壓輸出的轉換器,由于要加上完成I-V轉換的運算放大器的延遲時間,因此轉換時間要長一些。快速D/A轉換器的轉換時間可控制在1us以下。 通常用非線性誤差的大小表示D/A轉換器的線性度,輸入輸出特性的偏差與滿刻度輸出之比的百分數表示非線性誤差。一定溫度下的最大非線性誤差一般為0.01%~0.03%。 3. DAC0832數模轉換芯片主要特性與結構 DAC0832系列為美國國家半導體公司生產的具有2個數據寄存器的8位分辨率的D/A轉換芯片。此芯片與微處理器完全兼容,并且價格低廉,接口簡單,轉換控制容易,在單片機應用系統中得到了廣泛的應用。 1.DAC0832的主要特性 - 分辨率為8位;
- 轉換時間為1us;
- 可單緩沖、雙緩沖或者直接數字轉換;
- 只需在滿量程下調整其線性度;
- 邏輯電平輸入與TTL兼容;
- 單一電源供電(+5V~+15V);
- 基準電壓的范圍為±10V。
2.DAC0832的內部結構 DAC0832的內部結構框圖如圖6所示。它由8位輸入鎖存器、8位DAC寄存器、8位D/A轉換器及轉換控制電路構成,通過兩個輸入寄存器構成兩級數據輸入鎖存。 圖 6 DAC0832內部邏輯框圖 使用時,數據輸入可以采用兩級鎖存(雙鎖存)、單級鎖存(一級鎖存,一級直通方式)或直接輸入(兩級直通)形式。上圖中,2個與門電路組成寄存器輸出控制邏輯電路,該邏輯電路的功能是進行數據鎖存控制。 3.DAC0832的引腳功能
DI0~DI7:8位數據輸入線。 :片選信號輸入,低電平有效。 ILE:數據鎖存允許控制信號,高電平有效。 1:輸入寄存器寫選通輸入信號,低 平有效。 圖 7 DAC0832的引腳 2:DAC寄存器寫選通輸入信號,低電平有效。 :數據傳送控制信號,低電平有效。上述兩個信號控制DAC寄存器是否為數據直通方式。當2=0和=0時,為DAC寄存器直通方式;當2=1或=1時,為DAC寄存器鎖存方式。 IOUT1、IOUT2:電流輸出,IOUT1+IOUT2=常數。 Rfb:反饋電阻輸入端。內部接反饋電阻,外部通過該引腳接運放輸出端。為了取得電壓輸出,需要在輸出端接運算放大器,Rfb即為運算放大器的反饋電阻端。 Vref:基準電壓,其值為-10V~+10V。 AGND:模擬信號地。 DGND:數字信號地,為工作電源地和數字邏輯地,可在基準電源處進行單點共地。 VCC:電源輸入端,其值為+5V~+15V。 4.DAC0832芯片與單片機的接口 DAC0832根據控制信號的接法可分為三種工作方式:直通方式、單緩沖方式、雙緩沖方式。 此時輸入鎖存器和DAC寄存器相應的控制信號引腳分別連在一起,使數據直接寫入DAC寄存器,立即進行D/A轉換(這種情況下,輸入鎖存器不起鎖存作用)。此方式適用于只有一路模擬量輸出,或有幾路模擬量輸出但是并不要求同步的系統。 2. 雙緩沖方式 對于多路D/A轉換輸出,如果要求同步進行,可以采用雙緩沖同步方式。DAC0832工作于雙緩沖工作方式時,數字量的輸入鎖存和D/A轉換是分兩步完成的。首先CPU的數據總線分時向各路D/A轉換器輸入要轉換的數字量,并將其鎖存在各自的輸入鎖存器中,然后CPU對所有的DAC發出控制信號,使各個DAC輸入鎖存器中的數據打入DAC寄存器,實現同步轉換輸出。 3. 直通工作方式 當DAC0832芯片的片選信號、寫信號1、2及傳送控制信號的引腳全部接地,允許輸入鎖存信號ILE引腳+5V時,DAC0832芯片就處于直通工作方式,數字量一旦輸入,就直接進入DAC寄存器,進行D/A轉換,從輸出端得到轉換的模擬量。 本設計中,為了降低數模轉換建立的時間,數模轉換芯片DAC0832采用直通的工作方式。 2.2.3 電流/電壓轉換放大電路由于從DAC0832轉換出來的模擬信號為電流信號,為了方便觀測輸出信號的特征,特將DAC0832輸出的信號經過電流/電壓轉換放大電路轉變為電壓信號。本設計中使用的運放為LM324。LM324運算放大器是價格便宜的帶差動輸入功能的四運算放大器。其引腳圖如圖8所示。 LM324的特點:
1.短路保護輸出 2.真差動輸入級 3.可單電源工作:3V-32V 4.低偏置電流:最大100nA(LM324A) 5.每封裝含四個運算放大器。 6.具有內部補償的功能。 7.共模范圍擴展到負電源 8.行業標準的引腳排列 9.輸入端具有靜電保護功能 圖8 LM324引腳
DAC0832輸出信號經運放電路轉變為電壓后有兩種輸出方式。一種為單極性輸出方式。此方式中,DAC0832通過使用一片LM324運算放大器將從單片機輸入的數字量Din轉換為電壓輸出,其輸出電壓為Uout=Din/28 *(-VREF)。當VREF=5V時,Uout的輸出范圍為-5V~0V。另一種為雙極性輸出方式。本設計中采用雙極性輸出方式,如圖9所示。其雙極性輸出原理為:因為U1為-5V~0V,根據電流環路定理有 即:Uout=-VREF-2U1
所以當VREF=5V,而U1為-5V~ 0V輸出時,Uout的輸出為-5~+5V,即實現了雙極性輸出。 圖9 DAC0832和兩片LM324實現雙極性輸出
2.2.4鍵盤電路該子系統是5個獨立鍵盤和一個2輸入與門組成,其中與門輸出端連接單片機的P3.2口以便形成外部中斷。5個按鍵分別連接單片機的P2.0~P2.4口。2輸入與門一引腳與K1按鍵相連,另一引腳接高電平。當K1按下時,INT0為低電平,可知外部中斷到了,系統執行中斷程序。當K2~K5按鍵某一個按下時,對應的P2.1~P2.4口中某個為低電平,系統可以感知此按鍵按下,從而執行相應的程序。每個按鍵的功能如表2所示。 表2 按鍵功能表 按鍵電路的電路圖如圖15所示。 
圖15 按鍵電路圖 3 系統軟件設計系統軟件主要是用來控制信號發生器系統按照設計的邏輯進行運行。在軟件設計上,根據功能分成了多個模塊編程,主要包括:主程序模塊、四種不同的波形產生模塊、按鍵處理模塊、外部中斷模塊等。 3.1 系統主程序流程框圖系統主程序流程圖如圖16所示,源程序見附件。
圖16 系統主程序流程圖 3.2 信號產生子程序本系統采用編程的方法,來輸出四種不同的波形即正弦波、矩形波、三角波、鋸齒波。各種波形的產生方法如下。 3.2.1 正弦波發生子程序正弦波的產生比較特殊,它不能由單片機直接產生,只能由如圖17所示的階梯波來向正弦波逼近。很顯然,在一個周期內階梯波的階梯數目越多,單片機輸出的波形也就越接近正弦波。 圖17 正弦波信號的產生 先假定正弦波的振幅是2.56 V,則波谷對應的數字量為最小值00H,波峰對應的數字量為最大值FFH。將正弦波的第一個周期的波形按角度均分為若干等份,并計算出各點對應的電壓值,電壓值計算方法:Vx=2.5·(1+sinθ),因為00H~FFH對應的數字量為0~255,所以根據算出的電壓就可直接寫出各點所對應的數字量。單片機將一個周期的數字量存入一定的存儲區域中,然后依次循環取出這些數字量,并送D/A電路轉換成階梯波,即近似的正弦波輸出。圖18為正弦波產生的流程圖。 圖18 正弦波產生的流程圖 3.2.2 矩形波發生子程序如圖19所示,矩形波的實現比較簡單。首先定義一個無符號字符型變量i=0,使自變量i不斷的自動加1,若i的值小于squa_num,將P0口賦值為0xFF;若i的值大于squa_num,則將P0口賦值為0x00。當i自加到256后又自動變為0,以此循環,即可得到矩形波。當squa_num=128時,此時輸出的為方波。調節squa_num的大小,即可實現矩形波占空比的調節;調節延時時間的大小,即可實現矩形波頻率的改變。 圖19 矩形波產生流程圖 3.2.3 三角波發生子程序三角波中的斜線用一個個小臺階來逼近,當臺階間隔很小時,波形基本上近似一直線。首先定義一個無符號字符型變量i=0,使自變量i不斷的自動加1,若i的值小于128,將P0口賦值為i;若i的值大于128,則將P0口賦值為256-i。當i自加到256后又自動變為0,以此循環,從而P0口實現了周期性的數字量變換,在經過數模轉換后轉變成模擬信號,經運算放大電路后就得到了周期性的三角波。三角波產生流程圖如圖20所示。 圖20 三角波發生流程圖 3.2.4 鋸齒波發生子程序鋸齒波的實現過程與三角波類似,也是定義一個變量i=0,并使P0=i,自變量i不斷的自動加1,直到加到255,然后i又可以自動歸為0,再不斷的重復上過程。在此過程中,P0口的值也隨著i一樣變化,經數模轉換DAC0832后,周期性逐一變化的數字量就轉換為鋸齒波輸出了。通過調節P0口每相鄰兩個值之間的延遲時間,就可以改變鋸齒波的頻率。圖21為鋸齒波發生流程圖。 圖21 鋸齒波發生流程圖 3.3按鍵處理子程序在本設計中,主要是通過按鍵來調節輸出波形的類型、頻率的大小及矩形波的占空比,采用程序控制掃描方式,時刻監視著有無按鍵按下。為了能夠更準確的判斷按鍵的情況,一旦有按鍵按下時,先延時去除按鍵的抖動,再判斷是哪個按鍵按下,從而單片機對應的執行相應的程序。圖22為按鍵處理流程圖。 圖22 按鍵處理流程圖 3.4 INT0中斷子程序中斷子程序是用來控制輸出波形的選擇。當波形選擇按鍵K1按下時,進入中斷程序中,此時波形選擇標識WaveChoice加1,中斷結束后,主程序中根據WaveChoice的值輸出相應的波形。圖24為INT0中斷流程圖。 
圖24 INT0中斷流程圖 4 系統調試
4.1 系統調試過程1.編譯、連接項目,形成目標文件 打開Keil新建工程文件,然后添加源程序文件,保存時把文件后綴名改成“.c”,再直接導入新建的工程中。 把源程序全部錄入后,先粗略的檢查一遍,主要改正明顯的各種錯誤,這樣可以減少之后的修改工作量。接著Options for Target “Target 1”,點擊Output ,勾選Create Hex 那個選項,生成可執行的文件。然后點擊Project菜單下的Built Target命令然后再進行編譯、連接,形成目標文件。編譯、連接用Project菜單下的Built Target命令(或快捷鍵F7),也可以直接點擊工具欄中相對應的圖標。 編譯、連接時,如果程序存在語法有錯,則不會通過編譯,并在下面的信息窗口給出相應的出錯提示信息,其中錯誤是一定得改正的,警告可以忽略。雙擊下面顯示錯誤信息的那一行,可以直接定位錯誤所在的行,用戶可以方便的對程序進行修改。修改后再編譯、連接,繼續進行調試,這個過程可能會重復多次。如果沒有任何語法上的錯誤,則編譯、連接成功,并且信息窗口給出提示信息。 2.運行調試 在Proteus軟件中先從元件庫中加載要使用的那些元件,然后把元件放在圖紙上一個一個的接線,盡量不讓線交錯,便于查看、分析,有必要時,使用接線標號法。完成所有元器件的接線后,在單片機上右擊選Edit Properties,在Program file 那一行右側點擊,然后選擇前面生成的以“.hex”為后綴名的文件,為單片機AT89C51添加可執行文件。然后點擊左下角的相關按鍵,開始進行仿真。 4.2 調試中的問題及解決方法在設計方案確定后,為了更好的調試,可以先分別對不同模塊進行調試,最后在進行整體調試。在整個調試的過程中,遇到了不少的問題,經自己查閱資料,并向老師、同學請教后,這些問題基本已解決。調試中遇到的問題及解決方法如下: (1) 在調試波形產生過程中,波形選擇按鍵按下時,沒有波形輸出或只輸出一種波形。 解決方法:若無波形輸出,則要先檢查硬件原理圖是否連接好,再檢查程序是否出現問題。若僅有一種波形輸出,則要檢查程序中是否出現了死循環,還應檢查按鍵控制程序是否符合邏輯要求。 (2) 當個個模塊的功能都可以實現時,就可以進行總體的調試。在總體的調試中,發現波形選擇按鍵按下時,液晶顯示波形類型變化和輸出波形的變化并不能同時實現。 解決方法:當波形選擇按鍵按下時,液晶上的顯示只要做一次就可以,而信號波形的輸出則是連續著的。所以使用外部中斷INT0,當有按鍵按下時,先響應中斷程序,然后再回到主程序中,輸出對應的波形。 (4) 系統使用的是控制延時的方法來改變輸出信號的頻率,故頻率值的大小不好計算。 解決方法:設定不同的延時時間,從示波器顯示的輸出波形來計算其對應的頻率,并記錄下來。再根據每條指令大約的執行時間,來粗略的估計出輸出信號的頻率與延時時間的函數關系。當然,這種方法所測得的頻率與實際頻率的誤差還是很大的,此問題并沒得到完美的解決。 4.3 系統仿真結果經以上調試,確認程序沒有問題時,加載到Proteus軟件中進行仿真,所得仿真結果如下。 (1)剛開始運行程序,沒有按鍵操作時,仿真結果如圖25所示。
圖25 仿真初始化結果 (2)當K1鍵按下進行波形四種波形選擇時,每種波形的仿真結果如下。
圖26 正弦波
圖27 方波
圖28 三角波
圖29 鋸齒波 (3)波形為正弦波,K2鍵按下時,輸出波形的頻率增大仿真如圖30 所示。 圖30 正弦波頻率增加仿真
(4)當波形為矩形波且K4鍵按下后,矩形波的占空比增加。其仿真結果如圖31所示。 圖31 矩形波占空比增加仿真 5 結論(1)通過查閱大量資料使自己對信號發生器的研究現狀、原理、工作方式等的基本概念及技術發展有了更好的理解。 (2)針對設計的任務和要求,確定信號發生器的設計方案,并逐步來實現。 (3)本系統使用了單片機作為主控制器,直接由軟件產生不同波形信號的輸出,因此在如何編寫程序方面下了很大的功夫,也收獲了很多知識。 (4)在Keil中編寫仿真程序,在Proteus中繪制硬件仿真圖,并實現聯調仿真。從仿真的結果來看,基本完成了設計的要求。 經過此次設計學會了很多關于電子方面的軟件:如Proteus、Keil51等。了解到了一個模型從項目選擇、方案選擇和論證電路設計、元器件選擇等到軟硬件的設計及實現,再到最終的整機測試和調試整個工作過程,為以后工作打下了堅實的基礎。其次,經過這次畢業設計,使我深刻地認識到學好專業知識的重要性,也理解了理論聯系實際的含義,提升了我對電子設計和制作的興趣。
0.png (44.42 KB, 下載次數: 31)
下載附件
2018-7-11 18:35 上傳
- #include <reg51.h>
- #include<string.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code tosin[256]=
- {0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,
- 0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
- 0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,
- 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,
- 0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,
- 0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,
- 0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
- 0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,
- 0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,
- 0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,
- 0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,
- 0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,
- 0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,
- 0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,
- 0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; //正弦波碼
- //--按鍵
- sbit K1=P2^0;
- sbit K2=P2^1;
- sbit K3=P2^2;
- sbit K4=P2^3;
- sbit K5=P2^4;
- uchar WaveChoice=0;
- uchar ys=30;
- uchar i,a=0;
- uchar sqar_num=128;
- //--延時MS 輸入一個確切的值用于鍵盤輸入時消除按鍵抖動
- void DelayMS(uchar ms)
- {
- uchar i;
- while(ms--) for(i=0;i<120;i++);
- }
- //--延時y*9us 改變ys的值進而利用該函數達到調頻率的目的
- void Delay1(uint y)
- {
- uint i;
- for(i=y;i>0;i--);
- }
- //---輸出波形
- void Out_Wave(uchar i)
- { uchar j;
- switch(i)
- {
- case 0: P0=0x00;break;
- case 1:
- //---正弦波
- for (j=0;j<255;j++)
- {
- P0=tosin[j];
- Delay1(ys);
- }
- break;
- case 2:
- //----矩形波
- {
- if(a<sqar_num)
- {
- P0=0xff;
- Delay1(ys);
- }
- else
- {
- P0=0x00;
- Delay1(ys);
- }
- a++;
- } break;
- case 3:
- //----三角波
- {
- if(a<128)
- {
- P0=a;
- Delay1(ys);
- }
- else
- {
- P0=255-a;
- Delay1(ys);
- }
- a++;
- } break;
- case 4:
- //----鋸齒波
- {
- if(a<255)
- {
- P0=a;
- Delay1(ys);
- }
-
- a++;
- if(a==255)
- {
- a=0;
- } break;
- }
- }
- }
- //----按鍵掃描
- void keyscanf()
- {
- if(K2==0)
- {
- DelayMS(5);
- if(K2==0)
- {
- while(!K2);
- ys--;
- if(ys==0)
- ys=30;
- }
- }
- if(K3==0)
- {
- DelayMS(5);
- if(K3==0)
- {
- while(!K3);
- ys++;
- if(ys>60)
- ys=30;
- }
- }
- if(K4==0)
- {
- DelayMS(5);
- if(K4==0)
- {
- while(!K4);
- if(WaveChoice==2)
- sqar_num=sqar_num+2;
- if(sqar_num==238)
- sqar_num=128;
- }
- }
- if(K5==0)
- {
- DelayMS(5);
- if(K5==0)
- {
- while(!K5);
- if(WaveChoice==2)
- sqar_num=sqar_num-2;
- if(sqar_num==18)
- sqar_num=128;
- }
- }
- }
- //----主程序---
- void main()
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
單片機課程設計波形發生器.rar
(1.45 MB, 下載次數: 160)
2018-7-11 11:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|