畢業設計
題 目 基于單片機控制的函數信號發生器
英文題目 microcontroller-based function signal generator
二零一二 年 月
摘 要
信號發生器,它是一種用于產生標準信號的電子儀器,隨著科學技術的發展,對它的要求越來越高。在工業生產和科研中利用信號發生器輸出的信號,可以對元器件的性能及參數進行測量,還可以對電工和電子產品進行指數驗證、參數調整及性能鑒定。常用的信號發生器絕大部分都是由模擬電路構成的,當這種模擬信號發生器用于低頻信號輸出往往需要的RC值很大,這樣不但參數準確度難于保證,而且體積和功耗都很大,而由數字電路構成的低頻信號發生器,雖然其低頻性能好但體積較大,價格較貴,因此,高精度,寬調幅,低價格將成為數字量信號發生器的發展趨勢。
本設計核心任務是:以89C51為核心,結合DAC0832實現程序控制產生正弦波、鋸齒波及方波等常用的低頻信號。可以通過鍵盤選擇波形及增減頻率。
關鍵詞:波形發生器; 單片機80C51;數模轉換器件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 本課題的研究現狀 1
1.3 設計的基本要求 2
1.4 本課題研究內容 2
2. 方案的設計與選擇 4
2.1 總體設計方案 4
2.2 方案的比較 4
2.3 單片機的選擇 5
2.4 顯示方案選擇 5
2.5 鍵盤方案選擇 5
3. 硬件設計 6
3.1 ATC89C51單片機 6
3.2數模轉換器件DAC0832 10
3.3 顯示模塊 1602液晶器件 14
4. 軟件系統設計 15
4.1主程序流程圖 15
4.2定時中斷程序流程圖 16
4.3外部中斷按鍵子程序流程圖 17
4.4正弦波子程序流程圖 18
4.5三角波子主程序流程圖 19
4.6方波子程序流程圖 20
4.7初始顯示子程序流程圖 20
5. 仿真 21
結 論 25
致 謝 26
參考資料 27
附錄 28
附錄1:程序 28
附錄2:硬件原理圖 36
附錄3:仿真用圖 37
緒論
1.1 本課題的目的及意義
信號發生器是一種經常使用的設備,有純粹物理器件構成的傳統的設計方法存在許多弊端,如體積較大、重量較沉、移動不方便、信號失真較大、波形種類過于單一、波形形狀調節過于死板,無法滿足用戶對精度、便捷性、穩定性等要求,研究設計出一種具有頻率穩定、準確、波形質量好、輸出頻率范圍寬、便捷性好等特點的波形發生器具有較好的市場前景,以滿足軍事和民用領域對信號源的要求。
本次設計的主要目標 是學習和運用單片機的C語言和匯編語言,實現利用單片機89c51和8位D/A轉換芯片DAC0832共同實現正弦波,方波,鋸齒波這三種常見波形的發生,并可以顯示波形種類和頻率大小。本次設計準備在成本較低廉的前提下完成,主要單片機89C51和8位D/A轉換芯片DAC0832,性能指數都不是很高。通過該課題的設計掌握函數發生器系統的設計流程;培養我們綜合運用所學的基本知識、基本理論和基本技能的能力,學習解決一般工程技術和有關專業問題的能力,學習工程設計和科學研究的基本方法,完成對所學的知識的綜合訓練。
1.2 本課題的研究現狀
信號發生器既可以構成獨立的信號源,也可以是高性能網絡分析儀、頻譜儀及其它自動測試設備的組成部分。美國生產的33250A型函數/任意波形發生器,可以產生穩定、精確和低失真的任意波形,其輸出頻率范圍為1μHZ ~80MHZ,而輸出幅度為10mVpp~10Vpp;該公司生產的8648D射頻信號發生器的頻率覆蓋范圍更可高達9kHz~4GHz。國產SG1060數字合成信號發生器能雙通道同時輸出高分辨率、高精度、高可靠性的各種波形,頻率覆蓋范圍為1μHZ ~60MHZ;國產S1000型數字合成掃頻信號發生器通過采用新技術、新器件實現高精度、寬頻帶的掃頻源,同時應用DDS和鎖相技術,使頻率范圍從1MHZ ~1024MHZ能精確地分辨到100hz,它既是一臺高精度的掃頻源,同時也是一臺高精度的標準信號發生器。還有很多其他類型的信號發生器,他們各有各的優點,但是信號發生器總的趨勢將向著款頻率覆蓋、高精度、多功能、多用途、自動化和智能化方向發展。
目前,市場上的信號發生器多種多樣,一般按頻率帶分為以下幾種;
超高頻:頻率范圍1MHz以上,可達幾十兆赫茲。
高頻:幾百赫茲到幾赫茲。
低頻:頻率范圍為幾十赫茲到幾百赫茲。
超低頻:頻率范圍為零點幾赫茲到幾百赫茲。
超高頻信號發生器,產生波形一般為用LC振蕩電路。
高頻、低頻和超低頻信號發生器,大多使用文氏橋振蕩電路,即RC振蕩電路,通過改變電容和電阻值,改變頻率。
用以上原理設計的信號發生器,其輸出波形一般只有兩種,即正弦波和脈沖波,其零點不可調,而且價格也比較貴,一般在幾百元左右。在實際應用中,超低頻波和高頻波一般是不用的,一般用中頻,即幾十赫茲到幾十千赫茲。用單片機AT89C51,加上一片DAC0832,就可以做成一個簡單的信號發生器,其頻率受單片機運行的程序控制。我們可以把產生各種波形的程序燒寫進單片機ROM中,用戶可以通過鍵盤和液晶顯示,按照自己的意愿選擇波形頻率可調的多功能信號發生器,這樣的系統價格便宜,耗電少,頻率適中,便于攜帶。
1.3 設計的基本要求
本設計采用單片機控制技術了,開發、設計函數發生器。在條件許可情況下模擬調試成功。設計要求:
(1)系統能產生方波、鋸齒及正弦信號
(2)能提供信號的頻率的顯示
(3)系統硬件電路設計
(4)有必要的數據計算及元器件的選擇
(5)軟件系統設計
1.4 本課題研究內容
本文是做基于單片機的信號發生器的設計,將采用編程的方法來實現鋸齒波、方波、正弦波的發生。根據設計的要求,對各種波形的頻率顯示,并將所寫程序裝入單片機的程序存儲器中。在程序運行中,當接收到來自外界的命令,需要輸出某種波形時再調用相應的波形發生程序,經電路的D/A轉換器和運算放大器處理后,從信號發生器的輸出端口輸出。本設計采用89C51單片機機及其外圍擴展系統,軟件方面主要是應用c語言程序。系統以89C51為核心,配置相應的外設及接口電路,運用c語言開發,組成一個多功能信號發生系統。該系統的軟件可運行于window環境下,硬件電路系統設計具有典型性。同時,本系統中任何一部分模塊均可移植實用開發系統設計中,電路設計具有實用性。
2. 方案的設計與選擇
2.1 總體設計方案
數字信號可以通過數/模轉換器轉換成模擬信號,因此可通過產生數字信號再轉換成模擬信號的方法來獲得所需要的波形。89C51單片機本身就是一個完整的微型計算機,具有組成微型計算機的各部分部件:中央處理器CPU、隨機存取存儲器RAM、只讀存儲器ROM、I/O接口電路、定時器/計數器以及串行通訊接口等,只要將89C51再配置鍵盤及其接口、顯示器及其接口、數模轉換及波形輸出、指示燈及其接口等四部分,即可構成所需的波形發生器,其信號發生器構成原理框圖如圖2-1所示。
圖2-1 硬件原理框圖
2.2 方案的比較
方案一:采用單片機函數發生器(如8038),8038可同時產生正弦波、方波等,而且方法簡單易行,用D/A轉換器的輸出來改變調制電壓,也可以實現數控調整頻率,但產生信號的頻率穩定度不高。
方案二:采用鎖相式頻率合成器,利用鎖相環,將壓控振蕩器(VCO)的輸出頻率定在所需頻率上,該方案性能良好,但難以達到輸出頻率覆蓋系數的要求,且電路復雜。
方案三:采用單片機編程的方法來實現。該方案可以通過編程的方法來控制信號波形的頻率,而且在硬件電路不變的情況下,通過改變程序來實現頻率的變換。此外,由于通過編程的方法產生數字信號,所以信號的精度可以做的較高。
2.3 單片機的選擇
方案一:AT89C51單片機是一種高性能的8位單片微型計算機。它把構成計算機的中央處理器CPU、存儲器、寄存器、I/O接口制作在一塊集成電路芯片中,從而構成較為完整的計算機,而且價格便宜。
方案二:C8051F005單片機是完全集成混合信號系統及芯片,具有與8051兼容的微控制器內核,與MCS-51指令集完全兼容,除了具有標準8052的數字外設部件,片內還集成了數據采集和控制系統中常用的模擬部件和其他數字外設及功能部件,而且執行速度較快,但其價格較貴。
綜合考慮價格和性能決定選用AT89C51單片機
2.4 顯示方案選擇
方案一:采用LED數碼管。LED數碼管由8個發光二極管組成,每只數碼管輪流顯示各自的字符。由于人眼具有視覺特性,當每只數碼管顯示的時間間隔小于1/16時人眼感覺不到閃動,看到的是每只數碼管常亮。使用數碼管顯示編程較易,但本系統中要顯示的內容較多,而且數碼管只能顯示少數幾個字母。
方案二:采用LCD液晶顯示器1602.。其功率小,效果明顯,顯示變成容易控制,可以分行顯示,能夠很方面的顯示波形種類和頻率。
以上兩種方案綜合考慮,選擇LCD液晶顯示器作為系統顯示終端。
2.5 鍵盤方案選擇
方案一:矩陣式鍵盤。矩陣式鍵盤的按鍵觸點接于由行、列母線構成的矩陣電路的交叉處。當鍵盤上沒有鍵閉合時,所有的行線和列線都斷開,行線都呈高電平。當某一個鍵閉合時,該鍵所對應的行線和列線被短路。
方案二:編碼式鍵盤。編碼式鍵盤的按鍵觸點接于74ls148輸出。當鍵盤上沒有閉合時,所有鍵都斷開,當某一鍵閉合時,該鍵對應的編碼由74ls148輸出。
方案三:獨立式鍵盤。獨立式鍵盤指各個按鍵的輸入相互獨立,每一個按鍵都單獨接一根輸入數據線。
經過比較以上三種方案,鑒于本系統所用鍵盤比較少,所以選擇獨立式鍵盤。
3. 硬件設計
3.1 ATC89C51單片機
AT89C51 是美國 ATMEL 公司生產的低電壓,高性能 CMOS8 位單片機,片內含 4k bytes 的可反復擦寫的只讀程序存儲器(PEROM)和 128 bytes 的隨機存取數據存儲器(RAM),器件采用 ATMEL 公司的高密度、非易失性存儲技術生產,兼容標準 MCS-51 指令系統,片內置通用 8 位中央處理器(CPU)和 Flash 存儲單元,功能強大 AT89C51 單片機可為您提供許多高性價比的應用場合,可靈活應用于各種控制領域。AT89C51 提供以下標準功能:4k 字節 Flash 閃速存儲器,128 字節內部 RAM,32 個 I/O 口線,兩個 16 位定時/計數器,一個 5 向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,AT89C51 可降至 0Hz 的靜態邏輯操作,并支持兩種軟件可選的節電工作模式。空閑方式停止 CPU 的工作,但允許 RAM,定時/計數器,串行通信口及中斷系統繼續工作。掉電方式保存 RAM 中的內容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。
圖3-1 proteus中的ATC89C51
圖3-2 ATC89C51方框圖
引腳功能說明:
Vcc:電源電壓
GND:地
P0 口:P0 口是一組 8 位漏極開路型雙向 I/O 口,也即地址/數據總線復用口。作為輸出口用時,每位能吸收電流的方式驅動 8 個 TTL 邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。在訪問外部數據存儲器或程序存儲器時,這組口線分時轉換地址(低 8 位)和數據總線復用,在訪問期間激活內部上拉電阻。在 FIash 編程時,P0 口接收指令字節,而在程序校驗時,輸出指令字節,校驗時,要求外接上拉電阻。
P1 口:P1 是一個帶內部上拉電阻的 8 位雙向 I/O 口,P1 的輸出緩沖級可驅動(吸收或輸出電流)4 個 TTL 邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。FIash 編程和程序校驗期間,P1 接收低 8 位地址。
P2 口:P2 是一個帶有內部上拉電阻的 8 位雙向 I/O 口,P2 的輸出緩沖級可驅動(吸收或輸出電流)4 個 TTL 邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或 16 位地址的外部數據存儲器(例如執行 MOVX@DPTR 指令)時,P2 口送出高 8 位地址數據。在訪問 8 位地址的外部數據存儲器(如執行 MOVX@RI 指令)時,P2 口線上的內容(也即特殊功能寄存器(SFR)區中 R2 寄存器的內容),在整個訪問期間不改變。Flash 編程或校驗時,P2 亦接收高位地址和其它控制信號。
P3 口:P3 口是一組帶有內部上拉電阻的 8 位雙向 I/O 口。P3 口輸出緩沖級可驅動(吸收或輸出電流)4 個 TTL邏輯門電路。對 P3 口寫入“1”時,它們被內部上拉電阻拉高并可作為輸入端口。作輸入端時,被外部拉低的 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(定時/計數器 0 外部輸入)
P3.5 T1(定時/計數器 1 外部輸入)
P3.6 /WR(外部數據存儲器寫選通)
P3.7 /RD(外部數據存儲器讀選通)
P3 口還接收一些用于 Flash 閃速存儲器編程和程序校驗的控制信號。
RST:復位輸入。當振蕩器工作時,RST 引腳出現兩個機器周期以上高電平將使單片機復位。
ALE/PROG: 當訪問外部程序存儲器或數據存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低 8 位字節。即使不訪問外部存儲器,ALE 仍以時鐘振蕩頻率的 1/6 輸出固定的正脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當訪問外部數據存儲器時將跳過一個 ALE 脈沖。對 Flash 存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區中的 8EH 單元的 DO 位置位,可禁止 ALE 操作。該位置位后,只有一條 MOVX 和 MOVC 指令 ALE 才會被激活。此外,該引腳會被微弱拉高,單片機執行外部程序時,應設置 ALE 無效。PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當 AT89C51 由外部程序存儲器取指令(或數據)時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當訪問外部數據存儲器,這兩次有效的PSEN信號不出現。
/EA/VPP:外部訪問允許。欲使 CPU 僅訪問外部程序存儲器(地址為 0000H—FFFFH),EA 端必須保持低電平(接地)。需注意的是:如果加密位 LB1 被編程,復位時內部會鎖存 EA 端狀態。如 EA 端為高電平(接 VCC 端),CPU 則執行內部程序存儲器中的指令。Flash 存儲器編程時,該引腳加上+12V 的編程允許電源 Vpp,當然這必須是該器件是使用 12V 編程電壓 Vpp。
XTAL1:振蕩器反相放大器的及內部時鐘發生器的輸入端。
XTAL2:振蕩器反相放大器的輸出端。
時鐘振蕩器:AT89C5l 中有一個用于構成內部振蕩器的高增益反相放大器,引腳 XTAL1 和 XTAL2 分別是該放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起構成自激振蕩器,振蕩電路參見圖3-3。外接石英晶體(或陶瓷諧振器)及電容 C1、C2 接在放大器的反饋回路中構成并聯振蕩電路。對外接電容 C1、C2 雖然沒有十分嚴格的要求,但電容容量的大小會輕微影響振蕩頻率的高低、振蕩器工作的穩定性、起振的難易程序及溫度穩定性,如果使用石英晶體,我們推薦電容使用 30pF±10pF,而如使用陶瓷諧振器建議選擇 40pF±10F。用戶也可以采用外部時鐘。采用外部時鐘的電路如圖 3-3所示。這種情況下,外部時鐘脈沖接到 XTAL1 端,即內部時鐘發生器的輸入端,XTAL2 則懸空。
圖3-3 晶振電路
3.2數模轉換器件DAC0832
DAC0832是8分辨率的D/A轉換集成芯片。與微處理器完全兼容。這個DA芯片以其價格低廉、接口簡單、轉換控制容易等優點,在單片機應用系統中得到廣泛的應用。D/A轉換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉換電路及轉換控制電路構成。
圖3-4 DAC0832數模轉換器件
管腳說明:
DI0~DI7:數據輸入線,TLL電平。
ILE:數據鎖存允許控制信號輸入線,高電平有效。
CS:片選信號輸入線,低電平有效。
WR1:為輸入寄存器的寫選通信號。
XFER:數據傳送控制信號輸入線,低電平有效。
WR2:為DAC寄存器寫選通輸入線。
Iout1:電流輸出線。當輸入全為1時Iout1最大。
Iout2: 電流輸出線。其值與Iout1之和為一常數。
Rfb:反饋信號輸入線,芯片內部有反饋電阻.
Vcc:電源輸入線 (+5v~+15v)
Vref:基準電壓輸入線 (-10v~+10v)
AGND:模擬地,摸擬信號和基準電源的參考地.
DGND:數字地,兩種地線在基準電源處共地比較好.
圖3-5 DAC0832部分內部結構
D/A轉換器DAC0832是采用CMOS工藝制成的單片直流輸出型8位數/模轉換器。如圖3-6所示,它由倒T型R-2R電阻網絡、模擬開關、運算放大器和參考電壓VREF四大部分組成。運算放大器輸出的模擬量V0為
(3-1)
由上式可見,輸出的模擬量與輸入的數字量成正比,這就實現了從數字量到模擬量的轉換。 一個8位D/A轉換器有8個輸入端(其中每個輸入端是8位二進制數的一位),有一個模擬輸出端。輸入可有28=256個不同的二進制組態,輸出為256個電壓之一,即輸出電壓不是整個電壓范圍內任意值,而只能是256個可能值。
DAC0832的工作方式:
DAC0832引腳功能電路應用原理圖DAC0832是采樣頻率為八位的D/A轉換芯片,集成電路內有兩級輸入寄存器,使DAC0832芯片具備雙緩沖、單緩沖和直通三種輸入方式,以便適于各種電路的需要(如要求多路D/A異步輸入、同步轉換等)。D/A轉換結果采用電流形式輸出。若需要相應的模擬電壓信號,可通過一個高輸入阻抗的線性運算放大器實現。運放的反饋電阻可通過RFB端引用片內固有電阻,也可外接。DAC0832邏輯輸入滿足TTL電平,可直接與TTL電路或微機電路連接。
根據對DAC0832的輸入鎖存器和DAC寄存器的不同的控制方式,DAC0832有三種工作方式:直通方式、單緩沖方式和雙緩沖方式。本方案采用單緩沖方式,即使DAC寄存器處于直通狀態,輸入寄存器處于鎖存狀態。
放大電路:
放大電路由TL082雙運算放大器組成,其特點有:較低的輸入偏置電壓和偏移電流;輸出設有短路保護;輸入級具有較高的輸入阻抗;內建頻率補償電路;較高的壓擺率。最大工作電壓: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與反相比例放大器相連,實現電流到電壓的轉換,因此輸出模擬信號的極性與參考電壓的極性相反,數字量與模擬量的轉換關系為
(3-2)
若D/A轉換器輸出為雙極性,如圖3-6所示。運算放大器B的作用是把運算放大器A的單向輸出電壓轉換成雙向輸出電壓。其原理是將B的反向輸入端通過電阻R2與參考電壓VREF相連,VREF經R2向B提供一個偏流I1,其電流方向與I2相反,因此運算放大器B的輸入電流為I1、I2的代數和。則D/A轉換器的總輸出電壓為:
(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 數據/命令選擇端 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 背光源負極
圖3-8顯示仿真
4. 軟件系統設計
本設計方案采用 C51程序語言編寫,整個程序包含主程序、延時、液晶顯示模塊、定時中斷、外部中斷及三種波形輸出函數組成。
4.1 主程序流程圖
主程序主要設置了D/A轉換器件DAC0832的工作模式,定義了DAC0832數據端口。調用了顯示初始子程序,設置了定時器工作模式及定時中斷和外部中斷。
4.2 定時中斷程序流程圖
否
是
否
是
圖4-2 定時器中斷子程序
定時中斷的作用是用來改變相應波形的頻率,通過改變TH,TL的值就可以改變定時時間,從而改變相應波形的頻率。Waveform的值代表不同的波形,Waveform=0代表正弦波,Waveform=1代表鋸齒波,Waveform=2代表方波,根據Waveform值調用對應的波形輸出子程序。
4.3 外部中斷按鍵子程序流程圖
否
是 否
是
是
圖4-3按鍵外部中斷子程序
外部中斷是由按鍵引起的P3.2引腳下降沿觸發的,波形切換、頻率增減都是通過外部中斷和定時中斷相結合完成的,外部中斷程序中只是改變了相應的參數或中間值(如波形形式waveform及相應波形頻率wavefreq[waveform]和定時器0的定時初值寄存器的中間值T_temp)另外外部中斷程序還對波形的頻率做了數據處理并送到液晶屏顯示。
4.4 正弦波子程序流程圖
否
是
圖4-5正弦波子程序
正弦波主要是通過單片機向D/A轉換器DAC0832輸送8位二進制數產生的,本方案選取的256個8位二進制數存放在數組sine_tab[],中wavecount的作用就是抽點計數范圍是0~255,本方案中DAC0832工作在單緩沖狀態,DAC寄存器處于直通狀態,只要在相應的時間打開和關閉輸入寄存器就能完成數據輸送。
4.5 三角波子主程序流程圖
否
是
圖4-5 三角波子程序
三角波的產生方法以正弦波類似都是通過取點來產生的,本方案取了64個點,全部存放在sawtooth_tab[Wavecount]中。
4.6 方波子程序流程圖
否
是
圖4-6 方波子程序
4.7 初始顯示子程序流程圖
圖4-7初始顯示子程序
5. 仿真
圖5.1液晶顯示圖
圖5.2鋸齒波
圖5.3方波
圖5.4正弦波
圖5.5 200Hz方波
系統可以改變頻率的大小,方波的頻率區間為200Hz至2000Hz,鋸齒波的頻率區間是10Hz至100Hz,正弦波的頻率區間為10Hz至100Hz,利用定時中斷并改變相應的定時時間即可改變頻率的大小。
圖5.6 10Hz鋸齒波
圖5.4 20Hz鋸齒波
圖5.4 10Hz正弦波
結 論
通過半年的研究設計和調試,實現系統的正常工作并且基本上達到了預期的設計目標這樣一個過程,使我學到了很多知識,積累了許多寶貴的經驗,鍛煉了自己的獨立思考能力和實際動手能力,學會了如何綜合實施一個工程項目的研究與設計。
畢業論文課題是基于單片機控制函數信號發生器。在這次設計過程中我與邱寒同學共同完成此課題,由于我們專業知識不是很扎實,我們遇到很多問題,還好在涂緒堅老師的多次指導下我們才能完成這次畢業論文。在這過程中我深刻體會到專業知識的欠缺和知識的重要性。
雖然本方案設計的系統基本上符合課題的要求但是還有一些不足之處如下
(1)鋸齒波的產生是根據數組表產生的而不是通過自增或者自減產生。
(2)正弦波的頻率不夠精準誤差較大等等
致 謝
為此要感謝教研室的諸位老師四年來對我細心的培養,教給了我專業知識為我們學生進入社會打下堅實的基礎。
做畢業設計的過程中老師給出了不少指導意見,讓我少走了不少的彎路,比如說在畫程序流程圖的時候,開始我沒掌握正確的規律,后來在老師的指導下才順利的完成了。感謝這篇論文所涉及到的各位學者。本文引用了數位學者的研究文獻,如果沒有各位學者的研究成果的幫助和啟發,我將很難完成本篇論文的寫作。
感謝我的同學和朋友,在我寫論文的過程中給予我了很多你問素材,還在論文的撰寫和排版等過程中提供熱情的幫助。
參考資料
[1]朱兆優、陳堅、王海濤、鄧文娟. 《單片機原理與應用》. 電子工業出版社. 2010
[2]徐慧民 . 《微機原理與接口技術》 .高等教育出版社.2007
[3]余修武. 《單片機原理與應用》. 電子科技大學出版社.2008
[4]劉文濤. 《單片機培訓教程:(C51版)》.電子工業出版社.2005
[5]閻石 . 《數字電子技術基礎》.高等教育出版社.2009
[6]童詩白. 《模擬電子技術基礎》.高等教育出版社.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, //正弦波頻率調整中間值
0xe8,0xf4,0xf8,0x7a,0xc7,0xfc,0x23,0x3d,0x53,0x64, //鋸齒波頻率調整中間值
0x3c,0x1e,0x8f,0x32,0xc7,0x63,0xb1,0xd8,0xec,0xf6}; //方波頻率調整中間值
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液晶的相關函數*************/
#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,表示寫數據(在指令所指的地方寫數據)
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; //初始化一定要設置為零,表示寫數據
write_com(0x38); //使液晶顯示點陣,為下面做準備
write_com(0x0c); //初始設置
write_com(0x06); //初始設置
write_com(0x01); //清零
write_com(0x80); //使指針指向第一行第一格
disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行顯示
disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行顯示
}
/********************1602液晶函數聲明結束*********************/
void main()
{
DA_S2=0;
DAdata=0;
DA_S1=1;
init_lcd();
waveform=0;
TMOD=0x01; //設置定時器0方式1為16位工作方式
IT0=1; //設置外部中斷0為下降沿觸發
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; //關總中斷與定時器
delay(10); //延時夠嗎???
if(key==0) //確實有按鍵按下而引發中斷
{
keytemp=P3&0xf0; //獲取P3口高四位的值
switch(keytemp)
{
case 0xe0: //選擇波形
waveform++;
if(waveform>2) waveform=0;
break;
case 0xd0: //頻率按規定單位依次增加
wavefreq[waveform]++;
if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*這邊要用">10",因為它比"=11"可靠
break; // 性更高,使加數有個上限,不會一直加下去*/
case 0xb0: //頻率按規定單位依次衰減
wavefreq[waveform]--;
if(wavefreq[waveform]<1) wavefreq[waveform]=10; //這邊要用"<1",因為它比"=0"可靠性更高
break;
}
THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括號中選取第幾個數后,并把該值賦給T_temp
TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];
total_freq= wavefreq[waveform] * freq_unit[waveform]; //求輸出頻率(個數*單位)
lcd_hang2[5]=total_freq%10+0x30; //在液晶中顯示個位,(0x30 在液晶顯示中表示數字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:仿真用圖
|