|
畢業(yè)設(shè)計
題 目 基于單片機控制的函數(shù)信號發(fā)生器
英文題目 microcontroller-based function signal generator
二零一二 年 月
摘 要
信號發(fā)生器,它是一種用于產(chǎn)生標(biāo)準(zhǔn)信號的電子儀器,隨著科學(xué)技術(shù)的發(fā)展,對它的要求越來越高。在工業(yè)生產(chǎn)和科研中利用信號發(fā)生器輸出的信號,可以對元器件的性能及參數(shù)進行測量,還可以對電工和電子產(chǎn)品進行指數(shù)驗證、參數(shù)調(diào)整及性能鑒定。常用的信號發(fā)生器絕大部分都是由模擬電路構(gòu)成的,當(dāng)這種模擬信號發(fā)生器用于低頻信號輸出往往需要的RC值很大,這樣不但參數(shù)準(zhǔn)確度難于保證,而且體積和功耗都很大,而由數(shù)字電路構(gòu)成的低頻信號發(fā)生器,雖然其低頻性能好但體積較大,價格較貴,因此,高精度,寬調(diào)幅,低價格將成為數(shù)字量信號發(fā)生器的發(fā)展趨勢。
本設(shè)計核心任務(wù)是:以89C51為核心,結(jié)合DAC0832實現(xiàn)程序控制產(chǎn)生正弦波、鋸齒波及方波等常用的低頻信號。可以通過鍵盤選擇波形及增減頻率。
關(guān)鍵詞:波形發(fā)生器; 單片機80C51;數(shù)模轉(zhuǎn)換器件DAC0832
ABSTRACT
Signal generator, it is a widely used sourse, with the scientific and the technological development,increasing its demands. industrial production and scientific research in the use of signal generator output signal generator output signal, the performance of components and parameters measured, but also the electrical and electronic products for authentication, and adjust parameters of identificatiaon. The signal generator used by the vast majority of Analog circuit components, such as analog signal generator for the low-frequency signals often require output value of the RC great, it will not only difficult to ensure the accuracy of parameters, but also have great size and power consumption. Digital components of low-frequency signal generator, although the low-frequency performance good but larger, more expensive price, therefore, high accuracy, wide-AM, will become a low-cost digital signal generator trend of development.
The graduation project core task is to design:89c51 as the microcontroller, unifies DAC0832 to realize the programmed control to have the sine wave, the sawtooth wave and the square wave three commonly used low-frequency signals. Can choose the waveform and frequency by the keyboard.
Key word: 89C51; DAC0832; signal generator
目 錄
緒論 1
1.1本課題的目的及意義 1
1.2 本課題的研究現(xiàn)狀 1
1.3 設(shè)計的基本要求 2
1.4 本課題研究內(nèi)容 2
2. 方案的設(shè)計與選擇 4
2.1 總體設(shè)計方案 4
2.2 方案的比較 4
2.3 單片機的選擇 5
2.4 顯示方案選擇 5
2.5 鍵盤方案選擇 5
3. 硬件設(shè)計 6
3.1 ATC89C51單片機 6
3.2數(shù)模轉(zhuǎn)換器件DAC0832 10
3.3 顯示模塊 1602液晶器件 14
4. 軟件系統(tǒng)設(shè)計 15
4.1主程序流程圖 15
4.2定時中斷程序流程圖 16
4.3外部中斷按鍵子程序流程圖 17
4.4正弦波子程序流程圖 18
4.5三角波子主程序流程圖 19
4.6方波子程序流程圖 20
4.7初始顯示子程序流程圖 20
5. 仿真 21
結(jié) 論 25
致 謝 26
參考資料 27
附錄 28
附錄1:程序 28
附錄2:硬件原理圖 36
附錄3:仿真用圖 37
緒論
1.1 本課題的目的及意義
信號發(fā)生器是一種經(jīng)常使用的設(shè)備,有純粹物理器件構(gòu)成的傳統(tǒng)的設(shè)計方法存在許多弊端,如體積較大、重量較沉、移動不方便、信號失真較大、波形種類過于單一、波形形狀調(diào)節(jié)過于死板,無法滿足用戶對精度、便捷性、穩(wěn)定性等要求,研究設(shè)計出一種具有頻率穩(wěn)定、準(zhǔn)確、波形質(zhì)量好、輸出頻率范圍寬、便捷性好等特點的波形發(fā)生器具有較好的市場前景,以滿足軍事和民用領(lǐng)域?qū)π盘栐吹囊蟆?br />
本次設(shè)計的主要目標(biāo) 是學(xué)習(xí)和運用單片機的C語言和匯編語言,實現(xiàn)利用單片機89c51和8位D/A轉(zhuǎn)換芯片DAC0832共同實現(xiàn)正弦波,方波,鋸齒波這三種常見波形的發(fā)生,并可以顯示波形種類和頻率大小。本次設(shè)計準(zhǔn)備在成本較低廉的前提下完成,主要單片機89C51和8位D/A轉(zhuǎn)換芯片DAC0832,性能指數(shù)都不是很高。通過該課題的設(shè)計掌握函數(shù)發(fā)生器系統(tǒng)的設(shè)計流程;培養(yǎng)我們綜合運用所學(xué)的基本知識、基本理論和基本技能的能力,學(xué)習(xí)解決一般工程技術(shù)和有關(guān)專業(yè)問題的能力,學(xué)習(xí)工程設(shè)計和科學(xué)研究的基本方法,完成對所學(xué)的知識的綜合訓(xùn)練。
1.2 本課題的研究現(xiàn)狀
信號發(fā)生器既可以構(gòu)成獨立的信號源,也可以是高性能網(wǎng)絡(luò)分析儀、頻譜儀及其它自動測試設(shè)備的組成部分。美國生產(chǎn)的33250A型函數(shù)/任意波形發(fā)生器,可以產(chǎn)生穩(wěn)定、精確和低失真的任意波形,其輸出頻率范圍為1μHZ ~80MHZ,而輸出幅度為10mVpp~10Vpp;該公司生產(chǎn)的8648D射頻信號發(fā)生器的頻率覆蓋范圍更可高達(dá)9kHz~4GHz。國產(chǎn)SG1060數(shù)字合成信號發(fā)生器能雙通道同時輸出高分辨率、高精度、高可靠性的各種波形,頻率覆蓋范圍為1μHZ ~60MHZ;國產(chǎn)S1000型數(shù)字合成掃頻信號發(fā)生器通過采用新技術(shù)、新器件實現(xiàn)高精度、寬頻帶的掃頻源,同時應(yīng)用DDS和鎖相技術(shù),使頻率范圍從1MHZ ~1024MHZ能精確地分辨到100hz,它既是一臺高精度的掃頻源,同時也是一臺高精度的標(biāo)準(zhǔn)信號發(fā)生器。還有很多其他類型的信號發(fā)生器,他們各有各的優(yōu)點,但是信號發(fā)生器總的趨勢將向著款頻率覆蓋、高精度、多功能、多用途、自動化和智能化方向發(fā)展。
目前,市場上的信號發(fā)生器多種多樣,一般按頻率帶分為以下幾種;
超高頻:頻率范圍1MHz以上,可達(dá)幾十兆赫茲。
高頻:幾百赫茲到幾赫茲。
低頻:頻率范圍為幾十赫茲到幾百赫茲。
超低頻:頻率范圍為零點幾赫茲到幾百赫茲。
超高頻信號發(fā)生器,產(chǎn)生波形一般為用LC振蕩電路。
高頻、低頻和超低頻信號發(fā)生器,大多使用文氏橋振蕩電路,即RC振蕩電路,通過改變電容和電阻值,改變頻率。
用以上原理設(shè)計的信號發(fā)生器,其輸出波形一般只有兩種,即正弦波和脈沖波,其零點不可調(diào),而且價格也比較貴,一般在幾百元左右。在實際應(yīng)用中,超低頻波和高頻波一般是不用的,一般用中頻,即幾十赫茲到幾十千赫茲。用單片機AT89C51,加上一片DAC0832,就可以做成一個簡單的信號發(fā)生器,其頻率受單片機運行的程序控制。我們可以把產(chǎn)生各種波形的程序燒寫進單片機ROM中,用戶可以通過鍵盤和液晶顯示,按照自己的意愿選擇波形頻率可調(diào)的多功能信號發(fā)生器,這樣的系統(tǒng)價格便宜,耗電少,頻率適中,便于攜帶。
1.3 設(shè)計的基本要求
本設(shè)計采用單片機控制技術(shù)了,開發(fā)、設(shè)計函數(shù)發(fā)生器。在條件許可情況下模擬調(diào)試成功。設(shè)計要求:
(1)系統(tǒng)能產(chǎn)生方波、鋸齒及正弦信號
(2)能提供信號的頻率的顯示
(3)系統(tǒng)硬件電路設(shè)計
(4)有必要的數(shù)據(jù)計算及元器件的選擇
(5)軟件系統(tǒng)設(shè)計
1.4 本課題研究內(nèi)容
本文是做基于單片機的信號發(fā)生器的設(shè)計,將采用編程的方法來實現(xiàn)鋸齒波、方波、正弦波的發(fā)生。根據(jù)設(shè)計的要求,對各種波形的頻率顯示,并將所寫程序裝入單片機的程序存儲器中。在程序運行中,當(dāng)接收到來自外界的命令,需要輸出某種波形時再調(diào)用相應(yīng)的波形發(fā)生程序,經(jīng)電路的D/A轉(zhuǎn)換器和運算放大器處理后,從信號發(fā)生器的輸出端口輸出。本設(shè)計采用89C51單片機機及其外圍擴展系統(tǒng),軟件方面主要是應(yīng)用c語言程序。系統(tǒng)以89C51為核心,配置相應(yīng)的外設(shè)及接口電路,運用c語言開發(fā),組成一個多功能信號發(fā)生系統(tǒng)。該系統(tǒng)的軟件可運行于window環(huán)境下,硬件電路系統(tǒng)設(shè)計具有典型性。同時,本系統(tǒng)中任何一部分模塊均可移植實用開發(fā)系統(tǒng)設(shè)計中,電路設(shè)計具有實用性。
2. 方案的設(shè)計與選擇
2.1 總體設(shè)計方案
數(shù)字信號可以通過數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號,因此可通過產(chǎn)生數(shù)字信號再轉(zhuǎn)換成模擬信號的方法來獲得所需要的波形。89C51單片機本身就是一個完整的微型計算機,具有組成微型計算機的各部分部件:中央處理器CPU、隨機存取存儲器RAM、只讀存儲器ROM、I/O接口電路、定時器/計數(shù)器以及串行通訊接口等,只要將89C51再配置鍵盤及其接口、顯示器及其接口、數(shù)模轉(zhuǎn)換及波形輸出、指示燈及其接口等四部分,即可構(gòu)成所需的波形發(fā)生器,其信號發(fā)生器構(gòu)成原理框圖如圖2-1所示。
圖2-1 硬件原理框圖
2.2 方案的比較
方案一:采用單片機函數(shù)發(fā)生器(如8038),8038可同時產(chǎn)生正弦波、方波等,而且方法簡單易行,用D/A轉(zhuǎn)換器的輸出來改變調(diào)制電壓,也可以實現(xiàn)數(shù)控調(diào)整頻率,但產(chǎn)生信號的頻率穩(wěn)定度不高。
方案二:采用鎖相式頻率合成器,利用鎖相環(huán),將壓控振蕩器(VCO)的輸出頻率定在所需頻率上,該方案性能良好,但難以達(dá)到輸出頻率覆蓋系數(shù)的要求,且電路復(fù)雜。
方案三:采用單片機編程的方法來實現(xiàn)。該方案可以通過編程的方法來控制信號波形的頻率,而且在硬件電路不變的情況下,通過改變程序來實現(xiàn)頻率的變換。此外,由于通過編程的方法產(chǎn)生數(shù)字信號,所以信號的精度可以做的較高。
2.3 單片機的選擇
方案一:AT89C51單片機是一種高性能的8位單片微型計算機。它把構(gòu)成計算機的中央處理器CPU、存儲器、寄存器、I/O接口制作在一塊集成電路芯片中,從而構(gòu)成較為完整的計算機,而且價格便宜。
方案二:C8051F005單片機是完全集成混合信號系統(tǒng)及芯片,具有與8051兼容的微控制器內(nèi)核,與MCS-51指令集完全兼容,除了具有標(biāo)準(zhǔn)8052的數(shù)字外設(shè)部件,片內(nèi)還集成了數(shù)據(jù)采集和控制系統(tǒng)中常用的模擬部件和其他數(shù)字外設(shè)及功能部件,而且執(zhí)行速度較快,但其價格較貴。
綜合考慮價格和性能決定選用AT89C51單片機
2.4 顯示方案選擇
方案一:采用LED數(shù)碼管。LED數(shù)碼管由8個發(fā)光二極管組成,每只數(shù)碼管輪流顯示各自的字符。由于人眼具有視覺特性,當(dāng)每只數(shù)碼管顯示的時間間隔小于1/16時人眼感覺不到閃動,看到的是每只數(shù)碼管常亮。使用數(shù)碼管顯示編程較易,但本系統(tǒng)中要顯示的內(nèi)容較多,而且數(shù)碼管只能顯示少數(shù)幾個字母。
方案二:采用LCD液晶顯示器1602.。其功率小,效果明顯,顯示變成容易控制,可以分行顯示,能夠很方面的顯示波形種類和頻率。
以上兩種方案綜合考慮,選擇LCD液晶顯示器作為系統(tǒng)顯示終端。
2.5 鍵盤方案選擇
方案一:矩陣式鍵盤。矩陣式鍵盤的按鍵觸點接于由行、列母線構(gòu)成的矩陣電路的交叉處。當(dāng)鍵盤上沒有鍵閉合時,所有的行線和列線都斷開,行線都呈高電平。當(dāng)某一個鍵閉合時,該鍵所對應(yīng)的行線和列線被短路。
方案二:編碼式鍵盤。編碼式鍵盤的按鍵觸點接于74ls148輸出。當(dāng)鍵盤上沒有閉合時,所有鍵都斷開,當(dāng)某一鍵閉合時,該鍵對應(yīng)的編碼由74ls148輸出。
方案三:獨立式鍵盤。獨立式鍵盤指各個按鍵的輸入相互獨立,每一個按鍵都單獨接一根輸入數(shù)據(jù)線。
經(jīng)過比較以上三種方案,鑒于本系統(tǒng)所用鍵盤比較少,所以選擇獨立式鍵盤。
3. 硬件設(shè)計
3.1 ATC89C51單片機
AT89C51 是美國 ATMEL 公司生產(chǎn)的低電壓,高性能 CMOS8 位單片機,片內(nèi)含 4k bytes 的可反復(fù)擦寫的只讀程序存儲器(PEROM)和 128 bytes 的隨機存取數(shù)據(jù)存儲器(RAM),器件采用 ATMEL 公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn) MCS-51 指令系統(tǒng),片內(nèi)置通用 8 位中央處理器(CPU)和 Flash 存儲單元,功能強大 AT89C51 單片機可為您提供許多高性價比的應(yīng)用場合,可靈活應(yīng)用于各種控制領(lǐng)域。AT89C51 提供以下標(biāo)準(zhǔn)功能:4k 字節(jié) Flash 閃速存儲器,128 字節(jié)內(nèi)部 RAM,32 個 I/O 口線,兩個 16 位定時/計數(shù)器,一個 5 向量兩級中斷結(jié)構(gòu),一個全雙工串行通信口,片內(nèi)振蕩器及時鐘電路。同時,AT89C51 可降至 0Hz 的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。空閑方式停止 CPU 的工作,但允許 RAM,定時/計數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存 RAM 中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復(fù)位。
圖3-1 proteus中的ATC89C51
圖3-2 ATC89C51方框圖
引腳功能說明:
Vcc:電源電壓
GND:地
P0 口:P0 口是一組 8 位漏極開路型雙向 I/O 口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位能吸收電流的方式驅(qū)動 8 個 TTL 邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址(低 8 位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在 FIash 編程時,P0 口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。
P1 口:P1 是一個帶內(nèi)部上拉電阻的 8 位雙向 I/O 口,P1 的輸出緩沖級可驅(qū)動(吸收或輸出電流)4 個 TTL 邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。FIash 編程和程序校驗期間,P1 接收低 8 位地址。
P2 口:P2 是一個帶有內(nèi)部上拉電阻的 8 位雙向 I/O 口,P2 的輸出緩沖級可驅(qū)動(吸收或輸出電流)4 個 TTL 邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或 16 位地址的外部數(shù)據(jù)存儲器(例如執(zhí)行 MOVX@DPTR 指令)時,P2 口送出高 8 位地址數(shù)據(jù)。在訪問 8 位地址的外部數(shù)據(jù)存儲器(如執(zhí)行 MOVX@RI 指令)時,P2 口線上的內(nèi)容(也即特殊功能寄存器(SFR)區(qū)中 R2 寄存器的內(nèi)容),在整個訪問期間不改變。Flash 編程或校驗時,P2 亦接收高位地址和其它控制信號。
P3 口:P3 口是一組帶有內(nèi)部上拉電阻的 8 位雙向 I/O 口。P3 口輸出緩沖級可驅(qū)動(吸收或輸出電流)4 個 TTL邏輯門電路。對 P3 口寫入“1”時,它們被內(nèi)部上拉電阻拉高并可作為輸入端口。作輸入端時,被外部拉低的 P3 口將用上拉電阻輸出電流(IIL)。
P3 口除了作為一般的 I/O 口線外,更重要的用途是它的第二功能,如下表所示:
表3-1 P3 口第二功能
端口引腳 第二功能
P3.0 RXD(串行輸入口)
P3.1 TXD(串行輸出口)
P3.2 /INT0(外中斷 0)
P3.3 /INT1(外中斷 1)
P3.4 T0(定時/計數(shù)器 0 外部輸入)
P3.5 T1(定時/計數(shù)器 1 外部輸入)
P3.6 /WR(外部數(shù)據(jù)存儲器寫選通)
P3.7 /RD(外部數(shù)據(jù)存儲器讀選通)
P3 口還接收一些用于 Flash 閃速存儲器編程和程序校驗的控制信號。
RST:復(fù)位輸入。當(dāng)振蕩器工作時,RST 引腳出現(xiàn)兩個機器周期以上高電平將使單片機復(fù)位。
ALE/PROG: 當(dāng)訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低 8 位字節(jié)。即使不訪問外部存儲器,ALE 仍以時鐘振蕩頻率的 1/6 輸出固定的正脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲器時將跳過一個 ALE 脈沖。對 Flash 存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的 8EH 單元的 DO 位置位,可禁止 ALE 操作。該位置位后,只有一條 MOVX 和 MOVC 指令 ALE 才會被激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應(yīng)設(shè)置 ALE 無效。PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當(dāng) AT89C51 由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲器,這兩次有效的PSEN信號不出現(xiàn)。
/EA/VPP:外部訪問允許。欲使 CPU 僅訪問外部程序存儲器(地址為 0000H—FFFFH),EA 端必須保持低電平(接地)。需注意的是:如果加密位 LB1 被編程,復(fù)位時內(nèi)部會鎖存 EA 端狀態(tài)。如 EA 端為高電平(接 VCC 端),CPU 則執(zhí)行內(nèi)部程序存儲器中的指令。Flash 存儲器編程時,該引腳加上+12V 的編程允許電源 Vpp,當(dāng)然這必須是該器件是使用 12V 編程電壓 Vpp。
XTAL1:振蕩器反相放大器的及內(nèi)部時鐘發(fā)生器的輸入端。
XTAL2:振蕩器反相放大器的輸出端。
時鐘振蕩器:AT89C5l 中有一個用于構(gòu)成內(nèi)部振蕩器的高增益反相放大器,引腳 XTAL1 和 XTAL2 分別是該放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起構(gòu)成自激振蕩器,振蕩電路參見圖3-3。外接石英晶體(或陶瓷諧振器)及電容 C1、C2 接在放大器的反饋回路中構(gòu)成并聯(lián)振蕩電路。對外接電容 C1、C2 雖然沒有十分嚴(yán)格的要求,但電容容量的大小會輕微影響振蕩頻率的高低、振蕩器工作的穩(wěn)定性、起振的難易程序及溫度穩(wěn)定性,如果使用石英晶體,我們推薦電容使用 30pF±10pF,而如使用陶瓷諧振器建議選擇 40pF±10F。用戶也可以采用外部時鐘。采用外部時鐘的電路如圖 3-3所示。這種情況下,外部時鐘脈沖接到 XTAL1 端,即內(nèi)部時鐘發(fā)生器的輸入端,XTAL2 則懸空。
圖3-3 晶振電路
3.2數(shù)模轉(zhuǎn)換器件DAC0832
DAC0832是8分辨率的D/A轉(zhuǎn)換集成芯片。與微處理器完全兼容。這個DA芯片以其價格低廉、接口簡單、轉(zhuǎn)換控制容易等優(yōu)點,在單片機應(yīng)用系統(tǒng)中得到廣泛的應(yīng)用。D/A轉(zhuǎn)換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉(zhuǎn)換電路及轉(zhuǎn)換控制電路構(gòu)成。
圖3-4 DAC0832數(shù)模轉(zhuǎn)換器件
管腳說明:
DI0~DI7:數(shù)據(jù)輸入線,TLL電平。
ILE:數(shù)據(jù)鎖存允許控制信號輸入線,高電平有效。
CS:片選信號輸入線,低電平有效。
WR1:為輸入寄存器的寫選通信號。
XFER:數(shù)據(jù)傳送控制信號輸入線,低電平有效。
WR2:為DAC寄存器寫選通輸入線。
Iout1:電流輸出線。當(dāng)輸入全為1時Iout1最大。
Iout2: 電流輸出線。其值與Iout1之和為一常數(shù)。
Rfb:反饋信號輸入線,芯片內(nèi)部有反饋電阻.
Vcc:電源輸入線 (+5v~+15v)
Vref:基準(zhǔn)電壓輸入線 (-10v~+10v)
AGND:模擬地,摸擬信號和基準(zhǔn)電源的參考地.
DGND:數(shù)字地,兩種地線在基準(zhǔn)電源處共地比較好.
圖3-5 DAC0832部分內(nèi)部結(jié)構(gòu)
D/A轉(zhuǎn)換器DAC0832是采用CMOS工藝制成的單片直流輸出型8位數(shù)/模轉(zhuǎn)換器。如圖3-6所示,它由倒T型R-2R電阻網(wǎng)絡(luò)、模擬開關(guān)、運算放大器和參考電壓VREF四大部分組成。運算放大器輸出的模擬量V0為
(3-1)
由上式可見,輸出的模擬量與輸入的數(shù)字量成正比,這就實現(xiàn)了從數(shù)字量到模擬量的轉(zhuǎn)換。 一個8位D/A轉(zhuǎn)換器有8個輸入端(其中每個輸入端是8位二進制數(shù)的一位),有一個模擬輸出端。輸入可有28=256個不同的二進制組態(tài),輸出為256個電壓之一,即輸出電壓不是整個電壓范圍內(nèi)任意值,而只能是256個可能值。
DAC0832的工作方式:
DAC0832引腳功能電路應(yīng)用原理圖DAC0832是采樣頻率為八位的D/A轉(zhuǎn)換芯片,集成電路內(nèi)有兩級輸入寄存器,使DAC0832芯片具備雙緩沖、單緩沖和直通三種輸入方式,以便適于各種電路的需要(如要求多路D/A異步輸入、同步轉(zhuǎn)換等)。D/A轉(zhuǎn)換結(jié)果采用電流形式輸出。若需要相應(yīng)的模擬電壓信號,可通過一個高輸入阻抗的線性運算放大器實現(xiàn)。運放的反饋電阻可通過RFB端引用片內(nèi)固有電阻,也可外接。DAC0832邏輯輸入滿足TTL電平,可直接與TTL電路或微機電路連接。
根據(jù)對DAC0832的輸入鎖存器和DAC寄存器的不同的控制方式,DAC0832有三種工作方式:直通方式、單緩沖方式和雙緩沖方式。本方案采用單緩沖方式,即使DAC寄存器處于直通狀態(tài),輸入寄存器處于鎖存狀態(tài)。
放大電路:
放大電路由TL082雙運算放大器組成,其特點有:較低的輸入偏置電壓和偏移電流;輸出設(shè)有短路保護;輸入級具有較高的輸入阻抗;內(nèi)建頻率補償電路;較高的壓擺率。最大工作電壓:VCCmax=+18V。
TL082引腳功能如下表3-2:
表3-2 TL082引腳功能圖
腳號 腳名 功能 腳號 腳名 功能
1 Output 1 輸出1 5 Non-inverting input 2 反向輸入2
2 Inverting input 1 反向輸入1 6 Inverting input 2 正向輸入2
3 Non-inverting input 1 正向輸入2 7 Output 2 輸出2
4 VCC 電源 8 VCC+ 電源+
圖3-6 放大電路
DAC0832與反相比例放大器相連,實現(xiàn)電流到電壓的轉(zhuǎn)換,因此輸出模擬信號的極性與參考電壓的極性相反,數(shù)字量與模擬量的轉(zhuǎn)換關(guān)系為
(3-2)
若D/A轉(zhuǎn)換器輸出為雙極性,如圖3-6所示。運算放大器B的作用是把運算放大器A的單向輸出電壓轉(zhuǎn)換成雙向輸出電壓。其原理是將B的反向輸入端通過電阻R2與參考電壓VREF相連,VREF經(jīng)R2向B提供一個偏流I1,其電流方向與I2相反,因此運算放大器B的輸入電流為I1、I2的代數(shù)和。則D/A轉(zhuǎn)換器的總輸出電壓為:
(3-3)
因R5= R6=2 R7,所以
(3-4)
3.3 顯示模塊 1602液晶器件
引腳功能:
表3-3 LM1602液晶顯示各引腳功能
編號 符號 引腳說明 編號 符號 引腳說明
1 VSS 電源地 9 D2 Date I/O
2 VDD 電源正極 10 D3 Date I/O
3 VL 液晶顯示偏壓信號 11 D4 Date I/O
4 R5 數(shù)據(jù)/命令選擇端 12 D5 Date I/O
5 R/W 讀/寫選擇端 13 D6 Date I/O
6 E 使能信號 14 D7 Date I/O
7 D0 Date I/O 15 BLA 背光源正極
8 D1 Date I/O 16 BLK 背光源負(fù)極
圖3-8顯示仿真
4. 軟件系統(tǒng)設(shè)計
本設(shè)計方案采用 C51程序語言編寫,整個程序包含主程序、延時、液晶顯示模塊、定時中斷、外部中斷及三種波形輸出函數(shù)組成。
4.1 主程序流程圖
主程序主要設(shè)置了D/A轉(zhuǎn)換器件DAC0832的工作模式,定義了DAC0832數(shù)據(jù)端口。調(diào)用了顯示初始子程序,設(shè)置了定時器工作模式及定時中斷和外部中斷。
4.2 定時中斷程序流程圖
否
是
否
是
圖4-2 定時器中斷子程序
定時中斷的作用是用來改變相應(yīng)波形的頻率,通過改變TH,TL的值就可以改變定時時間,從而改變相應(yīng)波形的頻率。Waveform的值代表不同的波形,Waveform=0代表正弦波,Waveform=1代表鋸齒波,Waveform=2代表方波,根據(jù)Waveform值調(diào)用對應(yīng)的波形輸出子程序。
4.3 外部中斷按鍵子程序流程圖
否
是 否
是
是
圖4-3按鍵外部中斷子程序
外部中斷是由按鍵引起的P3.2引腳下降沿觸發(fā)的,波形切換、頻率增減都是通過外部中斷和定時中斷相結(jié)合完成的,外部中斷程序中只是改變了相應(yīng)的參數(shù)或中間值(如波形形式waveform及相應(yīng)波形頻率wavefreq[waveform]和定時器0的定時初值寄存器的中間值T_temp)另外外部中斷程序還對波形的頻率做了數(shù)據(jù)處理并送到液晶屏顯示。
4.4 正弦波子程序流程圖
否
是
圖4-5正弦波子程序
正弦波主要是通過單片機向D/A轉(zhuǎn)換器DAC0832輸送8位二進制數(shù)產(chǎn)生的,本方案選取的256個8位二進制數(shù)存放在數(shù)組sine_tab[],中wavecount的作用就是抽點計數(shù)范圍是0~255,本方案中DAC0832工作在單緩沖狀態(tài),DAC寄存器處于直通狀態(tài),只要在相應(yīng)的時間打開和關(guān)閉輸入寄存器就能完成數(shù)據(jù)輸送。
4.5 三角波子主程序流程圖
否
是
圖4-5 三角波子程序
三角波的產(chǎn)生方法以正弦波類似都是通過取點來產(chǎn)生的,本方案取了64個點,全部存放在sawtooth_tab[Wavecount]中。
4.6 方波子程序流程圖
否
是
圖4-6 方波子程序
4.7 初始顯示子程序流程圖
圖4-7初始顯示子程序
5. 仿真
圖5.1液晶顯示圖
圖5.2鋸齒波
圖5.3方波
圖5.4正弦波
圖5.5 200Hz方波
系統(tǒng)可以改變頻率的大小,方波的頻率區(qū)間為200Hz至2000Hz,鋸齒波的頻率區(qū)間是10Hz至100Hz,正弦波的頻率區(qū)間為10Hz至100Hz,利用定時中斷并改變相應(yīng)的定時時間即可改變頻率的大小。
圖5.6 10Hz鋸齒波
圖5.4 20Hz鋸齒波
圖5.4 10Hz正弦波
結(jié) 論
通過半年的研究設(shè)計和調(diào)試,實現(xiàn)系統(tǒng)的正常工作并且基本上達(dá)到了預(yù)期的設(shè)計目標(biāo)這樣一個過程,使我學(xué)到了很多知識,積累了許多寶貴的經(jīng)驗,鍛煉了自己的獨立思考能力和實際動手能力,學(xué)會了如何綜合實施一個工程項目的研究與設(shè)計。
畢業(yè)論文課題是基于單片機控制函數(shù)信號發(fā)生器。在這次設(shè)計過程中我與邱寒同學(xué)共同完成此課題,由于我們專業(yè)知識不是很扎實,我們遇到很多問題,還好在涂緒堅老師的多次指導(dǎo)下我們才能完成這次畢業(yè)論文。在這過程中我深刻體會到專業(yè)知識的欠缺和知識的重要性。
雖然本方案設(shè)計的系統(tǒng)基本上符合課題的要求但是還有一些不足之處如下
(1)鋸齒波的產(chǎn)生是根據(jù)數(shù)組表產(chǎn)生的而不是通過自增或者自減產(chǎn)生。
(2)正弦波的頻率不夠精準(zhǔn)誤差較大等等
致 謝
為此要感謝教研室的諸位老師四年來對我細(xì)心的培養(yǎng),教給了我專業(yè)知識為我們學(xué)生進入社會打下堅實的基礎(chǔ)。
做畢業(yè)設(shè)計的過程中老師給出了不少指導(dǎo)意見,讓我少走了不少的彎路,比如說在畫程序流程圖的時候,開始我沒掌握正確的規(guī)律,后來在老師的指導(dǎo)下才順利的完成了。感謝這篇論文所涉及到的各位學(xué)者。本文引用了數(shù)位學(xué)者的研究文獻(xiàn),如果沒有各位學(xué)者的研究成果的幫助和啟發(fā),我將很難完成本篇論文的寫作。
感謝我的同學(xué)和朋友,在我寫論文的過程中給予我了很多你問素材,還在論文的撰寫和排版等過程中提供熱情的幫助。
參考資料
[1]朱兆優(yōu)、陳堅、王海濤、鄧文娟. 《單片機原理與應(yīng)用》. 電子工業(yè)出版社. 2010
[2]徐慧民 . 《微機原理與接口技術(shù)》 .高等教育出版社.2007
[3]余修武. 《單片機原理與應(yīng)用》. 電子科技大學(xué)出版社.2008
[4]劉文濤. 《單片機培訓(xùn)教程:(C51版)》.電子工業(yè)出版社.2005
[5]閻石 . 《數(shù)字電子技術(shù)基礎(chǔ)》.高等教育出版社.2009
[6]童詩白. 《模擬電子技術(shù)基礎(chǔ)》.高等教育出版社.2009
[7] AT89C51 DATA SHEEP Philips Semiconductors 1999.dec
[8]Yang. Y., Yi. J., Woo, Y.Y., and Kim. B.: ‘Optimum design for linearityand efficiency of microwave Doherty amplifier using a new loadmatching technique’, Microw. J., 2001, 44, (12), pp. 20–36
[9] Vizimuller, P.: ‘RF design guide-systems, circuits, and equations’ (ArtechHouse, Boston, MA, 1995)
附錄
附錄1:程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define DAdata P0
sbit DA_S1= P2^0;
sbit DA_S2= P2^1;
sbit key= P3^2;
uchar wavecount;
uchar THtemp,TLtemp;
uchar judge=1;
uchar waveform;
uchar code freq_unit[3]={10,50,200};
uchar idata wavefreq[3]={1,1,1};
uchar code lcd_hang1[]={"Sine Wave " "sawtooth Wave " "Square Wave " "Select Wave: " "press No.1 key! "};
uchar idata lcd_hang2[16]={"f= Hz "};
uchar code waveTH[]={
0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xf9,0xfc,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,
0xf6,0xfb,0xfd,0xfb,0xfe,0xff,0xff,0xff,0xff,0xff};
uchar code waveTL[]={
0x79,0x3d,0x7e,0x9e,0xbe,0xbf,0xc8,0xcf,0xd4,0xd9, //正弦波頻率調(diào)整中間值
0xe8,0xf4,0xf8,0x7a,0xc7,0xfc,0x23,0x3d,0x53,0x64, //鋸齒波頻率調(diào)整中間值
0x3c,0x1e,0x8f,0x32,0xc7,0x63,0xb1,0xd8,0xec,0xf6}; //方波頻率調(diào)整中間值
uchar code sawtooth_tab[]={
0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x24,0x28,0x2c,0x30,0x34,0x38,0x3c,0x40,
0x44,0x48,0x4c,0x50,0x54,0x58,0x5c,0x60,0x64,0x68,0x6c,0x70,0x74,0x78,0x7c,
0x80,0x84,0x88,0x8c,0x90,0x94,0x98,0x9c,0xa0,0xa4,0xa8,0xac,0xb0,0xb4,0xb8,0xbc,0xc0,
0xc4,0xc8,0xcc,0xd0,0xd4,0xd8,0xdc,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,
};
uchar code sine_tab[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};
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*void sawtooth_out()
{ uchar i;
for(i=255;i>0;i--)
{DAdata=i;
DA_S1=0;
DA_S1=1;
}
}*/
void sawtooth_out()
{
DAdata=sawtooth_tab[wavecount++];
if(wavecount>64) wavecount=0;
DA_S1=0;
DA_S1=1; }
void sine_out()
{
DAdata=sine_tab[wavecount++];
DA_S1=0;
DA_S1=1;
}
void square_out()
{
judge=~judge;
if(judge==1) DAdata=0xff;
else DAdata=0x00;
DA_S1=0;
DA_S1=1;
}
/************1602液晶的相關(guān)函數(shù)*************/
#define lcd_ports P1
sbit rs=P2^2;
sbit rw=P2^3;
sbit lcden=P2^4;
void write_com(uchar com)
{
rs=0; //置零,表示寫指令
lcden=0;
lcd_ports=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1; //置1,表示寫數(shù)據(jù)(在指令所指的地方寫數(shù)據(jù))
lcden=0;
lcd_ports=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void disp_lcd(uchar addr,uchar *temp1)
{
uchar num;
write_com(addr);
delay(1); //延時一會兒???
for(num=0;num<16;num++)
{
write_date(temp1[num]);//或者這樣寫write_date(*(temp1+num));
delay(1);
}
}
void init_lcd()
{
lcden=0;
rw=0; //初始化一定要設(shè)置為零,表示寫數(shù)據(jù)
write_com(0x38); //使液晶顯示點陣,為下面做準(zhǔn)備
write_com(0x0c); //初始設(shè)置
write_com(0x06); //初始設(shè)置
write_com(0x01); //清零
write_com(0x80); //使指針指向第一行第一格
disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行顯示
disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行顯示
}
/********************1602液晶函數(shù)聲明結(jié)束*********************/
void main()
{
DA_S2=0;
DAdata=0;
DA_S1=1;
init_lcd();
waveform=0;
TMOD=0x01; //設(shè)置定時器0方式1為16位工作方式
IT0=1; //設(shè)置外部中斷0為下降沿觸發(fā)
ET0=1; //開定時器中斷
EX0=1;
EA=1;
while(1)
{
}
}
void timer0() interrupt 1
{
TH0=THtemp;
TL0=TLtemp;
if(waveform==0) sine_out();
else if(waveform==1) sawtooth_out();
else if(waveform==2) square_out();
}
void key_int0() interrupt 0
{
uchar keytemp;
uint total_freq; //總頻率
EA=0; TR0=0; //關(guān)總中斷與定時器
delay(10); //延時夠嗎???
if(key==0) //確實有按鍵按下而引發(fā)中斷
{
keytemp=P3&0xf0; //獲取P3口高四位的值
switch(keytemp)
{
case 0xe0: //選擇波形
waveform++;
if(waveform>2) waveform=0;
break;
case 0xd0: //頻率按規(guī)定單位依次增加
wavefreq[waveform]++;
if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*這邊要用">10",因為它比"=11"可靠
break; // 性更高,使加數(shù)有個上限,不會一直加下去*/
case 0xb0: //頻率按規(guī)定單位依次衰減
wavefreq[waveform]--;
if(wavefreq[waveform]<1) wavefreq[waveform]=10; //這邊要用"<1",因為它比"=0"可靠性更高
break;
}
THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括號中選取第幾個數(shù)后,并把該值賦給T_temp
TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];
total_freq= wavefreq[waveform] * freq_unit[waveform]; //求輸出頻率(個數(shù)*單位)
lcd_hang2[5]=total_freq%10+0x30; //在液晶中顯示個位,(0x30 在液晶顯示中表示數(shù)字0)
total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中顯示時十位
total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中顯示時百位
total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中顯示時千位
disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行顯示
disp_lcd(0xc0,lcd_hang2); //在第二行顯示
}
EA=1; TR0=1; //開啟總中斷與定時器
}
附錄2:硬件原理圖
附錄3:仿真用圖
|
|