課程設(shè)計(論文)任務書
專業(yè)班級:電子1302
學生姓名:
指導教師(簽名):
一、課程設(shè)計(論文)題目
正弦波信號發(fā)生器設(shè)計
二、本次課程設(shè)計(論文)應達到的目的
本次課程設(shè)計是自動化專業(yè)學生在學習了《單片機原理及應用》課程及《模擬電子線路》、《數(shù)字電子線路》等專業(yè)基礎(chǔ)課程之后進行的一次綜合訓練,其主要目的是加深學生對單片機軟硬件技術(shù)和相關(guān)理論知識的理解,進一步熟悉51單片機系統(tǒng)設(shè)計的基本理論、方法和技能;掌握工程應用的基本內(nèi)容和要求,力爭做到理論與實際的統(tǒng)一;同時培養(yǎng)學生分析問題、解決問題的能力和獨立完成系統(tǒng)設(shè)計的能力,并按要求編寫相關(guān)的技術(shù)文檔和設(shè)計報告等。
三、本次課程設(shè)計(論文)任務的主要內(nèi)容和要求(包括原始數(shù)據(jù)、技術(shù)參數(shù)、設(shè)計要求等)
1.設(shè)計內(nèi)容
(1)選擇51單片機,晶振采用12MHz。
(2)設(shè)計一個能產(chǎn)生0至50HZ正弦波信號。通過0832D/A芯片完成數(shù)模轉(zhuǎn)換。
(3)頻率值由鍵盤輸入。
(4)將頻率值由LED數(shù)碼管上顯示(兩位)。
2.設(shè)計要求
(1)按照任務書的要個求完成系統(tǒng)分析及方案設(shè)計。
(2)完成硬件原理圖的設(shè)計,并選擇相關(guān)元器件。
(3)完成控制軟件流程圖的設(shè)計,編寫相應的單片機控制程序。
(4)撰寫設(shè)計報告。
3. 成果要求
(1)在proteus中實現(xiàn)仿真。
(2)提交課程設(shè)計報告。
摘要 信號發(fā)生器是一種常用的信號源,廣泛地應用于電子電路、自動控制系統(tǒng)和教學實驗等領(lǐng)域。 本設(shè)計采用AT89C51單片機作為控制核心,外圍采用數(shù)字/模擬轉(zhuǎn)換電路(DAC0832)、運放電路(LM324)、按鍵和LCD液晶顯示電路。電路采用單片機和一片DAC0832數(shù)模轉(zhuǎn)換器組成數(shù)字式低頻信號發(fā)生器,可產(chǎn)生正弦波、矩形波、鋸齒波和三角波四種波形。系統(tǒng)通過單片機產(chǎn)生數(shù)字信號,通過DAC0832轉(zhuǎn)換為模擬信號,再通過放大器LM324就可以得到雙極性的各種波形,最終由示波器顯示出來。通過鍵盤來控制四種波形的類型選擇、頻率變化,并通過液晶1602顯示其各自的波形類型以及頻率數(shù)值。 本設(shè)計硬件電路簡單,軟件功能完善,控制系統(tǒng)可靠,性價比較高,具有一定的實用價值和參考價值。
目錄 1 系統(tǒng)總體設(shè)計 1 1.1 系統(tǒng)基本模塊設(shè)計與論證 1 1.1.1 信號發(fā)生模塊 1 1.1.2 鍵盤模塊 1 1.1.3 電路設(shè)計最終方案 2 1.2 系統(tǒng)原理及總體結(jié)構(gòu)圖 2 1.2.1 系統(tǒng)總體結(jié)構(gòu)圖 2 1.2.2 系統(tǒng)工作原理 2 2 系統(tǒng)硬件設(shè)計 3 2.1 系統(tǒng)硬件仿真原理圖 3 2.2 系統(tǒng)主要單元電路設(shè)計 4 2.2.1 主控制器AT89C51 4 2.2.2 數(shù)/模轉(zhuǎn)換電路 7 2.2.3 電流/電壓轉(zhuǎn)換放大電路 2.2.4 鍵盤電路 3 系統(tǒng)軟件設(shè)計 3.1 系統(tǒng)主程序流程框圖 3.2 信號產(chǎn)生子程序 3.2.1 正弦波發(fā)生子程序 3.2.2 矩形波發(fā)生子程序 18 3.2.3 三角波發(fā)生子程序 18 3.2.4 鋸齒波發(fā)生子程序 20 3.3按鍵處理子程序 20 3.4 INT0中斷子程序 1 4 系統(tǒng)調(diào)試 4.1 系統(tǒng)調(diào)試過程 4.2 調(diào)試中的問題及解決方法 4.3 系統(tǒng)仿真結(jié)果 5 結(jié)論 28 5.1 結(jié)論 28 參考文獻8 1
1 系統(tǒng)總體設(shè)計
1.1 系統(tǒng)基本模塊設(shè)計與論證
1.1.1 信號發(fā)生模塊采用單片機和DAC0832數(shù)模轉(zhuǎn)換器生成波形。通過編程的方法來控制輸入到數(shù)模轉(zhuǎn)換電路的數(shù)字量,從而控制輸出信號的波形和頻率。它的特點是價格低、設(shè)計簡單,在低頻范圍內(nèi)穩(wěn)定性好、操作方便、體積小、耗電少。 該既可滿足畢業(yè)設(shè)計的基本要求又能充分發(fā)揮其優(yōu)勢,電路簡單,易控制,性價比較高,所以采用該方案。 1.1.2 鍵盤模塊采用矩陣式鍵盤,鍵盤為4*4矩陣式行列掃描,優(yōu)點是當按鍵較多時可降低占用單片機的I/O口數(shù)目。 1.1.3 電路設(shè)計最終方案本系統(tǒng)包括主控模塊,顯示模塊,信號發(fā)生模塊,鍵盤模塊,運放模塊,綜上各方案所述,確定最終設(shè)計方案為:采用AT89C51作為主控制系統(tǒng),獨立式按鍵作為鍵盤模塊,數(shù)模轉(zhuǎn)換芯片DAC0832作為信號發(fā)生模塊,LM324作為電流/電壓轉(zhuǎn)換放大模塊。 1.2 系統(tǒng)原理及總體結(jié)構(gòu)圖1.2.1 系統(tǒng)總體結(jié)構(gòu)圖根據(jù)上述電路設(shè)計的最終方案,系統(tǒng)總體設(shè)計結(jié)構(gòu)如圖1所示。 圖1 系統(tǒng)總體結(jié)構(gòu)圖 1.2.2系統(tǒng)工作原理數(shù)字信號可以通過數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號,因此可通過產(chǎn)生數(shù)字信號再轉(zhuǎn)換成模擬信號的方法來獲得所需要的波形。在本設(shè)計中,AT89C51是整個波形發(fā)生器的核心部分,外圍電路包括數(shù)字/模擬轉(zhuǎn)換電路、電流/電壓轉(zhuǎn)換放大電路、按鍵電路和晶振電路。外接12MHz晶振電路為單片機提供工作脈沖。P0口接數(shù)模轉(zhuǎn)換芯片DAC0832的DI0~DI7,為數(shù)模轉(zhuǎn)換芯片提供數(shù)字信號;P2.0~P2.4外接獨立鍵盤,以控制信號的類型、頻率等。 通過對單片機編寫程序,控制從P0口輸出的數(shù)字信號類型,P0口的數(shù)字信號再輸入到數(shù)模轉(zhuǎn)換芯片DAC0832中,從而轉(zhuǎn)換為模擬信號輸出。DAC0832輸出的模擬信號為電流信號,所以用電流/電壓運算放大器LM324將電流信號再轉(zhuǎn)換成電壓信號輸出。用兩片LM324可以得到輸出波形的雙極性輸出,將輸出的波形與示波器相連即可觀察輸出波形的特征。獨立式鍵盤可以控制從P0口輸出的數(shù)字信號,按下不同的鍵可以使此輸出信號改變,從而使輸出的波形實現(xiàn)正弦波、矩形波、鋸齒波和三角波之間的轉(zhuǎn)變,并能夠改變波形輸出頻率的大小。 2 系統(tǒng)硬件設(shè)計2.1系統(tǒng)硬件仿真原理圖硬件設(shè)計是系統(tǒng)設(shè)計的重點之一,選擇合適的元器件尤為重要。在本設(shè)計中,根據(jù)設(shè)計的總體方案,選擇AT89C51作為主控制器、DAC0832為數(shù)模轉(zhuǎn)換芯片、LM324為電流/電壓轉(zhuǎn)換元件、5個獨立式按鍵為按鍵模塊元件。本設(shè)計在Proteus軟件中繪制的硬件電路圖如圖2所示。  圖2 硬件仿真原理圖 2.2 系統(tǒng)主要單元電路設(shè)計2.2.1 主控制器AT89C51AT89C51是美國ATMEL公司生產(chǎn)的低電壓、高性能CMOS 8位單片機,片內(nèi)含4KB的可反復擦除的只讀程序存儲器(PEROM)和128B隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn)兼容標準MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(CPU)和FLASH存儲單元,功能強大AT89C51單片機可為您提供許多高性價比的應用場合。 主要性能參數(shù): ①與MCS-51產(chǎn)品指令系統(tǒng)完全兼容 ②4K字節(jié)可重擦寫FLASH閃速存儲器 ③1000次擦寫周期 ④全靜態(tài)操作:0HZ-24MHZ ⑤三級加密程序存儲器 ⑥128 8字節(jié)內(nèi)部RAM ⑦32個可編程I/O口線 ⑧2個16位定時/計數(shù)器 ⑨6個中斷源 ⑩可編程串行UART通道  圖3 AT89C51 引腳封裝圖 AT89C51引腳封裝如圖3所示,其芯片引腳介紹如下: (1)主電源引腳 VCC:+5 V電源 VSS:地線。 (2)時鐘電路引腳 XTAL1和XTAL2:外接晶體引線端。當使用芯片內(nèi)部時鐘時,此二引線端用于外接石英晶體和微調(diào)電容;當使用外部時鐘時,用于接外部時鐘脈沖信號。 (3)控制信號引腳 RST/VPD:復位信號。當輸入的復位信號延續(xù)兩個機器周期以上的高電平時即為有效,用以完成單片機的復位初始化操作;當單片機掉電時,此引腳上可接備用電源,由VPD向片內(nèi)RAM提供備用電源,以保持片內(nèi)RAM中的數(shù)據(jù)不丟失。 ALE/PROG:地址鎖存控制信號。在系統(tǒng)擴展時,ALE用于控制把P0口輸出的低8位地址鎖存起來,以實現(xiàn)低位地址和數(shù)據(jù)的隔離。此外,由于ALE是以晶振1/6的固定頻率輸出的正脈沖,因此,可作為外部時鐘或外部定時脈沖使用。 PSEN:片外程序存儲器讀選通信號輸出端。 EA/VPP:訪問程序存儲控制信號。當EA信號為低電平時,對ROM的讀操作限定在外部程序存儲器;當EA信號為高電平時,對ROM的讀操作是從內(nèi)部程序存儲器開始,并可延至外部程序存儲器。 (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三個引腳,由于第一功能信號與第二功能信號是單片機在不同工作方式下的信號,因此不會發(fā)生使用上的矛盾。但是P3口的情況卻有所不同,它的第二功能信號都是單片機的重要控制信號。因此,在實際使用時,都是先按需要選用第二功能信號,剩下的才以第一功能的身份作數(shù)據(jù)位的輸入/輸出使用。 如圖4所示,本設(shè)計中單片機資源的分配情況如下: (1)單片機使用外部電路來提供時鐘脈沖。引腳XTAL1和XTAL2之間接12MHz的石英晶體,使單片機的一個機器周期為1us。 (2)P0口與DAC0832的DI0-DI7數(shù)據(jù)輸入口相連,因為P0口內(nèi)部沒有上拉電阻,不能輸出高電平,所以要接上拉電阻RESPACK-8; P2口的P2^0-P2^4分別與5個獨立按鍵相連。 
圖4 單片機控制模塊 2.2.2 數(shù)模轉(zhuǎn)換電路數(shù)模轉(zhuǎn)換電路是本設(shè)計的關(guān)鍵電路,它決定著將數(shù)字信號轉(zhuǎn)變?yōu)槟M信號,從而得到各種所需要的波形。 1. 數(shù)模轉(zhuǎn)換器的工作原理 數(shù)模轉(zhuǎn)換器可將數(shù)字量信號轉(zhuǎn)換成與此數(shù)值成正比的模擬量信號。需要轉(zhuǎn)換的數(shù)字量由一個二進制數(shù)字表示,每位二進制數(shù)字都有一定的權(quán),在轉(zhuǎn)換中,應將二進制數(shù)的每一位按照權(quán)的大小轉(zhuǎn)換成相應的模擬量輸出分量,然后將各個輸出分量疊加,總和就是與數(shù)字量成正比的模擬量數(shù)值。 上述的D/A轉(zhuǎn)換,常用如圖5所示的倒T形解碼網(wǎng)絡(luò)加以實現(xiàn)。  圖5 倒T形電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換器 電路設(shè)計如圖5所示,包括由R-2R組成的電阻網(wǎng)絡(luò)、模擬電子開關(guān)和集成運算放大器。 對于電阻網(wǎng)絡(luò),無論從哪個R-2R節(jié)點看,等效電阻都是R,因此,從參考電壓端輸入的電流為: IR=VREF/R 根據(jù)分流公式,各支路電流為: I7=I/21I6 =I/22I5 =I/23I4 =I/24I3 =I/25I2 =I/26I1 =I/27I0 =I/28 于是,經(jīng)過運算放大器輸出的模擬電壓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轉(zhuǎn)換的系統(tǒng)提供的參考電壓,Rfb為集成運算放大器的反饋電阻,D7 ~ D0取值為0或1,0表示切換開關(guān)與地相連,1表示與參考電壓相連。通過上述電路,即完成了二進制數(shù)字信號到模擬電壓信號的轉(zhuǎn)換。 2.數(shù)模轉(zhuǎn)換器的主要技術(shù)指標 分辨率指輸入給D/A轉(zhuǎn)換器的單位數(shù)字量引起的模擬量輸出的變化,通常定義為輸出滿刻度值與2n之比(n為D/A轉(zhuǎn)換器的二進制位數(shù))。顯然,二進制位數(shù)越多,分辨率越高,即D/A轉(zhuǎn)換器對輸入量變化的敏感程度越高。例如,8位的D/A轉(zhuǎn)換器,若滿量程輸出為10V,根據(jù)分辨率定義,則分辨率為10V/2n,分辨率為10V/256=39.1mV,即輸入的二進制最低位的變化可引起輸出的模擬電壓變化39.1mV,該值占滿量程的0.391%,常用1LSB表示。使用時,應根據(jù)對D/A轉(zhuǎn)換器分辨率的需要來選定D/A轉(zhuǎn)換器的位數(shù)。 相對精度是指在滿刻度已經(jīng)校準的前提下,在整個刻度范圍內(nèi),對應于任一數(shù)碼的模擬量輸出與它的理論值之差。通常用偏差幾個LSB來表示。 建立時間是描述D/A轉(zhuǎn)換器轉(zhuǎn)換快慢的一個參數(shù),用于表明轉(zhuǎn)換時間或轉(zhuǎn)換速度。其值為從輸入數(shù)字量到輸出達到總值誤差±(1/2)LSB(最低有效位)時所需的時間。電流輸出的轉(zhuǎn)換時間較短,而電壓輸出的轉(zhuǎn)換器,由于要加上完成I-V轉(zhuǎn)換的運算放大器的延遲時間,因此轉(zhuǎn)換時間要長一些�?焖貲/A轉(zhuǎn)換器的轉(zhuǎn)換時間可控制在1us以下。 通常用非線性誤差的大小表示D/A轉(zhuǎn)換器的線性度,輸入輸出特性的偏差與滿刻度輸出之比的百分數(shù)表示非線性誤差。一定溫度下的最大非線性誤差一般為0.01%~0.03%。 3. DAC0832數(shù)模轉(zhuǎn)換芯片主要特性與結(jié)構(gòu) DAC0832系列為美國國家半導體公司生產(chǎn)的具有2個數(shù)據(jù)寄存器的8位分辨率的D/A轉(zhuǎn)換芯片。此芯片與微處理器完全兼容,并且價格低廉,接口簡單,轉(zhuǎn)換控制容易,在單片機應用系統(tǒng)中得到了廣泛的應用。 1.DAC0832的主要特性 - 分辨率為8位;
- 轉(zhuǎn)換時間為1us;
- 可單緩沖、雙緩沖或者直接數(shù)字轉(zhuǎn)換;
- 只需在滿量程下調(diào)整其線性度;
- 邏輯電平輸入與TTL兼容;
- 單一電源供電(+5V~+15V);
- 基準電壓的范圍為±10V。
2.DAC0832的內(nèi)部結(jié)構(gòu) DAC0832的內(nèi)部結(jié)構(gòu)框圖如圖6所示。它由8位輸入鎖存器、8位DAC寄存器、8位D/A轉(zhuǎn)換器及轉(zhuǎn)換控制電路構(gòu)成,通過兩個輸入寄存器構(gòu)成兩級數(shù)據(jù)輸入鎖存。 圖 6 DAC0832內(nèi)部邏輯框圖 使用時,數(shù)據(jù)輸入可以采用兩級鎖存(雙鎖存)、單級鎖存(一級鎖存,一級直通方式)或直接輸入(兩級直通)形式。上圖中,2個與門電路組成寄存器輸出控制邏輯電路,該邏輯電路的功能是進行數(shù)據(jù)鎖存控制。 3.DAC0832的引腳功能
DI0~DI7:8位數(shù)據(jù)輸入線。 :片選信號輸入,低電平有效。 ILE:數(shù)據(jù)鎖存允許控制信號,高電平有效。 1:輸入寄存器寫選通輸入信號,低 平有效。 圖 7 DAC0832的引腳 2:DAC寄存器寫選通輸入信號,低電平有效。 :數(shù)據(jù)傳送控制信號,低電平有效。上述兩個信號控制DAC寄存器是否為數(shù)據(jù)直通方式。當2=0和=0時,為DAC寄存器直通方式;當2=1或=1時,為DAC寄存器鎖存方式。 IOUT1、IOUT2:電流輸出,IOUT1+IOUT2=常數(shù)。 Rfb:反饋電阻輸入端。內(nèi)部接反饋電阻,外部通過該引腳接運放輸出端。為了取得電壓輸出,需要在輸出端接運算放大器,Rfb即為運算放大器的反饋電阻端。 Vref:基準電壓,其值為-10V~+10V。 AGND:模擬信號地。 DGND:數(shù)字信號地,為工作電源地和數(shù)字邏輯地,可在基準電源處進行單點共地。 VCC:電源輸入端,其值為+5V~+15V。 4.DAC0832芯片與單片機的接口 DAC0832根據(jù)控制信號的接法可分為三種工作方式:直通方式、單緩沖方式、雙緩沖方式。 此時輸入鎖存器和DAC寄存器相應的控制信號引腳分別連在一起,使數(shù)據(jù)直接寫入DAC寄存器,立即進行D/A轉(zhuǎn)換(這種情況下,輸入鎖存器不起鎖存作用)。此方式適用于只有一路模擬量輸出,或有幾路模擬量輸出但是并不要求同步的系統(tǒng)。 2. 雙緩沖方式 對于多路D/A轉(zhuǎn)換輸出,如果要求同步進行,可以采用雙緩沖同步方式。DAC0832工作于雙緩沖工作方式時,數(shù)字量的輸入鎖存和D/A轉(zhuǎn)換是分兩步完成的。首先CPU的數(shù)據(jù)總線分時向各路D/A轉(zhuǎn)換器輸入要轉(zhuǎn)換的數(shù)字量,并將其鎖存在各自的輸入鎖存器中,然后CPU對所有的DAC發(fā)出控制信號,使各個DAC輸入鎖存器中的數(shù)據(jù)打入DAC寄存器,實現(xiàn)同步轉(zhuǎn)換輸出。 3. 直通工作方式 當DAC0832芯片的片選信號、寫信號1、2及傳送控制信號的引腳全部接地,允許輸入鎖存信號ILE引腳+5V時,DAC0832芯片就處于直通工作方式,數(shù)字量一旦輸入,就直接進入DAC寄存器,進行D/A轉(zhuǎn)換,從輸出端得到轉(zhuǎn)換的模擬量。 本設(shè)計中,為了降低數(shù)模轉(zhuǎn)換建立的時間,數(shù)模轉(zhuǎn)換芯片DAC0832采用直通的工作方式。 2.2.3 電流/電壓轉(zhuǎn)換放大電路由于從DAC0832轉(zhuǎn)換出來的模擬信號為電流信號,為了方便觀測輸出信號的特征,特將DAC0832輸出的信號經(jīng)過電流/電壓轉(zhuǎn)換放大電路轉(zhuǎn)變?yōu)殡妷盒盘�。本設(shè)計中使用的運放為LM324。LM324運算放大器是價格便宜的帶差動輸入功能的四運算放大器。其引腳圖如圖8所示。 LM324的特點:
1.短路保護輸出 2.真差動輸入級 3.可單電源工作:3V-32V 4.低偏置電流:最大100nA(LM324A) 5.每封裝含四個運算放大器。 6.具有內(nèi)部補償?shù)墓δ堋?/font> 7.共模范圍擴展到負電源 8.行業(yè)標準的引腳排列 9.輸入端具有靜電保護功能 圖8 LM324引腳
DAC0832輸出信號經(jīng)運放電路轉(zhuǎn)變?yōu)殡妷汉笥袃煞N輸出方式。一種為單極性輸出方式。此方式中,DAC0832通過使用一片LM324運算放大器將從單片機輸入的數(shù)字量Din轉(zhuǎn)換為電壓輸出,其輸出電壓為Uout=Din/28 *(-VREF)。當VREF=5V時,Uout的輸出范圍為-5V~0V。另一種為雙極性輸出方式。本設(shè)計中采用雙極性輸出方式,如圖9所示。其雙極性輸出原理為:因為U1為-5V~0V,根據(jù)電流環(huán)路定理有 即:Uout=-VREF-2U1
所以當VREF=5V,而U1為-5V~ 0V輸出時,Uout的輸出為-5~+5V,即實現(xiàn)了雙極性輸出。 圖9 DAC0832和兩片LM324實現(xiàn)雙極性輸出
2.2.4鍵盤電路該子系統(tǒng)是5個獨立鍵盤和一個2輸入與門組成,其中與門輸出端連接單片機的P3.2口以便形成外部中斷。5個按鍵分別連接單片機的P2.0~P2.4口。2輸入與門一引腳與K1按鍵相連,另一引腳接高電平。當K1按下時,INT0為低電平,可知外部中斷到了,系統(tǒng)執(zhí)行中斷程序。當K2~K5按鍵某一個按下時,對應的P2.1~P2.4口中某個為低電平,系統(tǒng)可以感知此按鍵按下,從而執(zhí)行相應的程序。每個按鍵的功能如表2所示。 表2 按鍵功能表 按鍵電路的電路圖如圖15所示。 
圖15 按鍵電路圖 3 系統(tǒng)軟件設(shè)計系統(tǒng)軟件主要是用來控制信號發(fā)生器系統(tǒng)按照設(shè)計的邏輯進行運行。在軟件設(shè)計上,根據(jù)功能分成了多個模塊編程,主要包括:主程序模塊、四種不同的波形產(chǎn)生模塊、按鍵處理模塊、外部中斷模塊等。 3.1 系統(tǒng)主程序流程框圖系統(tǒng)主程序流程圖如圖16所示,源程序見附件。
圖16 系統(tǒng)主程序流程圖 3.2 信號產(chǎn)生子程序本系統(tǒng)采用編程的方法,來輸出四種不同的波形即正弦波、矩形波、三角波、鋸齒波。各種波形的產(chǎn)生方法如下。 3.2.1 正弦波發(fā)生子程序正弦波的產(chǎn)生比較特殊,它不能由單片機直接產(chǎn)生,只能由如圖17所示的階梯波來向正弦波逼近。很顯然,在一個周期內(nèi)階梯波的階梯數(shù)目越多,單片機輸出的波形也就越接近正弦波。 圖17 正弦波信號的產(chǎn)生 先假定正弦波的振幅是2.56 V,則波谷對應的數(shù)字量為最小值00H,波峰對應的數(shù)字量為最大值FFH。將正弦波的第一個周期的波形按角度均分為若干等份,并計算出各點對應的電壓值,電壓值計算方法:Vx=2.5·(1+sinθ),因為00H~FFH對應的數(shù)字量為0~255,所以根據(jù)算出的電壓就可直接寫出各點所對應的數(shù)字量。單片機將一個周期的數(shù)字量存入一定的存儲區(qū)域中,然后依次循環(huán)取出這些數(shù)字量,并送D/A電路轉(zhuǎn)換成階梯波,即近似的正弦波輸出。圖18為正弦波產(chǎn)生的流程圖。 圖18 正弦波產(chǎn)生的流程圖 3.2.2 矩形波發(fā)生子程序如圖19所示,矩形波的實現(xiàn)比較簡單。首先定義一個無符號字符型變量i=0,使自變量i不斷的自動加1,若i的值小于squa_num,將P0口賦值為0xFF;若i的值大于squa_num,則將P0口賦值為0x00。當i自加到256后又自動變?yōu)?,以此循環(huán),即可得到矩形波。當squa_num=128時,此時輸出的為方波。調(diào)節(jié)squa_num的大小,即可實現(xiàn)矩形波占空比的調(diào)節(jié);調(diào)節(jié)延時時間的大小,即可實現(xiàn)矩形波頻率的改變。 圖19 矩形波產(chǎn)生流程圖 3.2.3 三角波發(fā)生子程序三角波中的斜線用一個個小臺階來逼近,當臺階間隔很小時,波形基本上近似一直線。首先定義一個無符號字符型變量i=0,使自變量i不斷的自動加1,若i的值小于128,將P0口賦值為i;若i的值大于128,則將P0口賦值為256-i。當i自加到256后又自動變?yōu)?,以此循環(huán),從而P0口實現(xiàn)了周期性的數(shù)字量變換,在經(jīng)過數(shù)模轉(zhuǎn)換后轉(zhuǎn)變成模擬信號,經(jīng)運算放大電路后就得到了周期性的三角波。三角波產(chǎn)生流程圖如圖20所示。 圖20 三角波發(fā)生流程圖 3.2.4 鋸齒波發(fā)生子程序鋸齒波的實現(xiàn)過程與三角波類似,也是定義一個變量i=0,并使P0=i,自變量i不斷的自動加1,直到加到255,然后i又可以自動歸為0,再不斷的重復上過程。在此過程中,P0口的值也隨著i一樣變化,經(jīng)數(shù)模轉(zhuǎn)換DAC0832后,周期性逐一變化的數(shù)字量就轉(zhuǎn)換為鋸齒波輸出了。通過調(diào)節(jié)P0口每相鄰兩個值之間的延遲時間,就可以改變鋸齒波的頻率。圖21為鋸齒波發(fā)生流程圖。 圖21 鋸齒波發(fā)生流程圖 3.3按鍵處理子程序在本設(shè)計中,主要是通過按鍵來調(diào)節(jié)輸出波形的類型、頻率的大小及矩形波的占空比,采用程序控制掃描方式,時刻監(jiān)視著有無按鍵按下。為了能夠更準確的判斷按鍵的情況,一旦有按鍵按下時,先延時去除按鍵的抖動,再判斷是哪個按鍵按下,從而單片機對應的執(zhí)行相應的程序。圖22為按鍵處理流程圖。 圖22 按鍵處理流程圖 3.4 INT0中斷子程序中斷子程序是用來控制輸出波形的選擇。當波形選擇按鍵K1按下時,進入中斷程序中,此時波形選擇標識WaveChoice加1,中斷結(jié)束后,主程序中根據(jù)WaveChoice的值輸出相應的波形。圖24為INT0中斷流程圖。 
圖24 INT0中斷流程圖 4 系統(tǒng)調(diào)試
4.1 系統(tǒng)調(diào)試過程1.編譯、連接項目,形成目標文件 打開Keil新建工程文件,然后添加源程序文件,保存時把文件后綴名改成“.c”,再直接導入新建的工程中。 把源程序全部錄入后,先粗略的檢查一遍,主要改正明顯的各種錯誤,這樣可以減少之后的修改工作量。接著Options for Target “Target 1”,點擊Output ,勾選Create Hex 那個選項,生成可執(zhí)行的文件。然后點擊Project菜單下的Built Target命令然后再進行編譯、連接,形成目標文件。編譯、連接用Project菜單下的Built Target命令(或快捷鍵F7),也可以直接點擊工具欄中相對應的圖標。 編譯、連接時,如果程序存在語法有錯,則不會通過編譯,并在下面的信息窗口給出相應的出錯提示信息,其中錯誤是一定得改正的,警告可以忽略。雙擊下面顯示錯誤信息的那一行,可以直接定位錯誤所在的行,用戶可以方便的對程序進行修改。修改后再編譯、連接,繼續(xù)進行調(diào)試,這個過程可能會重復多次。如果沒有任何語法上的錯誤,則編譯、連接成功,并且信息窗口給出提示信息。 2.運行調(diào)試 在Proteus軟件中先從元件庫中加載要使用的那些元件,然后把元件放在圖紙上一個一個的接線,盡量不讓線交錯,便于查看、分析,有必要時,使用接線標號法。完成所有元器件的接線后,在單片機上右擊選Edit Properties,在Program file 那一行右側(cè)點擊,然后選擇前面生成的以“.hex”為后綴名的文件,為單片機AT89C51添加可執(zhí)行文件。然后點擊左下角的相關(guān)按鍵,開始進行仿真。 4.2 調(diào)試中的問題及解決方法在設(shè)計方案確定后,為了更好的調(diào)試,可以先分別對不同模塊進行調(diào)試,最后在進行整體調(diào)試。在整個調(diào)試的過程中,遇到了不少的問題,經(jīng)自己查閱資料,并向老師、同學請教后,這些問題基本已解決。調(diào)試中遇到的問題及解決方法如下: (1) 在調(diào)試波形產(chǎn)生過程中,波形選擇按鍵按下時,沒有波形輸出或只輸出一種波形。 解決方法:若無波形輸出,則要先檢查硬件原理圖是否連接好,再檢查程序是否出現(xiàn)問題。若僅有一種波形輸出,則要檢查程序中是否出現(xiàn)了死循環(huán),還應檢查按鍵控制程序是否符合邏輯要求。 (2) 當個個模塊的功能都可以實現(xiàn)時,就可以進行總體的調(diào)試。在總體的調(diào)試中,發(fā)現(xiàn)波形選擇按鍵按下時,液晶顯示波形類型變化和輸出波形的變化并不能同時實現(xiàn)。 解決方法:當波形選擇按鍵按下時,液晶上的顯示只要做一次就可以,而信號波形的輸出則是連續(xù)著的。所以使用外部中斷INT0,當有按鍵按下時,先響應中斷程序,然后再回到主程序中,輸出對應的波形。 (4) 系統(tǒng)使用的是控制延時的方法來改變輸出信號的頻率,故頻率值的大小不好計算。 解決方法:設(shè)定不同的延時時間,從示波器顯示的輸出波形來計算其對應的頻率,并記錄下來。再根據(jù)每條指令大約的執(zhí)行時間,來粗略的估計出輸出信號的頻率與延時時間的函數(shù)關(guān)系。當然,這種方法所測得的頻率與實際頻率的誤差還是很大的,此問題并沒得到完美的解決。 4.3 系統(tǒng)仿真結(jié)果經(jīng)以上調(diào)試,確認程序沒有問題時,加載到Proteus軟件中進行仿真,所得仿真結(jié)果如下。 (1)剛開始運行程序,沒有按鍵操作時,仿真結(jié)果如圖25所示。
圖25 仿真初始化結(jié)果 (2)當K1鍵按下進行波形四種波形選擇時,每種波形的仿真結(jié)果如下。
圖26 正弦波
圖27 方波
圖28 三角波
圖29 鋸齒波 (3)波形為正弦波,K2鍵按下時,輸出波形的頻率增大仿真如圖30 所示。 圖30 正弦波頻率增加仿真
(4)當波形為矩形波且K4鍵按下后,矩形波的占空比增加。其仿真結(jié)果如圖31所示。 圖31 矩形波占空比增加仿真 5 結(jié)論(1)通過查閱大量資料使自己對信號發(fā)生器的研究現(xiàn)狀、原理、工作方式等的基本概念及技術(shù)發(fā)展有了更好的理解。 (2)針對設(shè)計的任務和要求,確定信號發(fā)生器的設(shè)計方案,并逐步來實現(xiàn)。 (3)本系統(tǒng)使用了單片機作為主控制器,直接由軟件產(chǎn)生不同波形信號的輸出,因此在如何編寫程序方面下了很大的功夫,也收獲了很多知識。 (4)在Keil中編寫仿真程序,在Proteus中繪制硬件仿真圖,并實現(xiàn)聯(lián)調(diào)仿真。從仿真的結(jié)果來看,基本完成了設(shè)計的要求。 經(jīng)過此次設(shè)計學會了很多關(guān)于電子方面的軟件:如Proteus、Keil51等。了解到了一個模型從項目選擇、方案選擇和論證電路設(shè)計、元器件選擇等到軟硬件的設(shè)計及實現(xiàn),再到最終的整機測試和調(diào)試整個工作過程,為以后工作打下了堅實的基礎(chǔ)。其次,經(jīng)過這次畢業(yè)設(shè)計,使我深刻地認識到學好專業(yè)知識的重要性,也理解了理論聯(lián)系實際的含義,提升了我對電子設(shè)計和制作的興趣。
0.png (44.42 KB, 下載次數(shù): 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的值進而利用該函數(shù)達到調(diào)頻率的目的
- 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下載地址:
單片機課程設(shè)計波形發(fā)生器.rar
(1.45 MB, 下載次數(shù): 160)
2018-7-11 11:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|