欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 基于單片機控制的函數(shù)信號發(fā)生器 [打印本頁]

作者: ye2330103    時間: 2018-9-4 09:05
標題: 基于單片機控制的函數(shù)信號發(fā)生器


畢業(yè)設計




題    目  基于單片機控制的函數(shù)信號發(fā)生器        
                                 
英文題目  microcontroller-based function signal generator                                    


二零一二  年 月

摘    要

信號發(fā)生器,它是一種用于產生標準信號的電子儀器,隨著科學技術的發(fā)展,對它的要求越來越高。在工業(yè)生產和科研中利用信號發(fā)生器輸出的信號,可以對元器件的性能及參數(shù)進行測量,還可以對電工和電子產品進行指數(shù)驗證、參數(shù)調整及性能鑒定。常用的信號發(fā)生器絕大部分都是由模擬電路構成的,當這種模擬信號發(fā)生器用于低頻信號輸出往往需要的RC值很大,這樣不但參數(shù)準確度難于保證,而且體積和功耗都很大,而由數(shù)字電路構成的低頻信號發(fā)生器,雖然其低頻性能好但體積較大,價格較貴,因此,高精度,寬調幅,低價格將成為數(shù)字量信號發(fā)生器的發(fā)展趨勢。
本設計核心任務是:以89C51為核心,結合DAC0832實現(xiàn)程序控制產生正弦波、鋸齒波及方波等常用的低頻信號。可以通過鍵盤選擇波形及增減頻率。

關鍵詞:波形發(fā)生器; 單片機80C51;數(shù)模轉換器件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 設計的基本要求        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數(shù)模轉換器件DAC0832        10
3.3 顯示模塊 1602液晶器件        14
4. 軟件系統(tǒng)設計        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 本課題的目的及意義

    信號發(fā)生器是一種經常使用的設備,有純粹物理器件構成的傳統(tǒng)的設計方法存在許多弊端,如體積較大、重量較沉、移動不方便、信號失真較大、波形種類過于單一、波形形狀調節(jié)過于死板,無法滿足用戶對精度、便捷性、穩(wěn)定性等要求,研究設計出一種具有頻率穩(wěn)定、準確、波形質量好、輸出頻率范圍寬、便捷性好等特點的波形發(fā)生器具有較好的市場前景,以滿足軍事和民用領域對信號源的要求。
本次設計的主要目標 是學習和運用單片機的C語言和匯編語言,實現(xiàn)利用單片機89c51和8位D/A轉換芯片DAC0832共同實現(xiàn)正弦波,方波,鋸齒波這三種常見波形的發(fā)生,并可以顯示波形種類和頻率大小。本次設計準備在成本較低廉的前提下完成,主要單片機89C51和8位D/A轉換芯片DAC0832,性能指數(shù)都不是很高。通過該課題的設計掌握函數(shù)發(fā)生器系統(tǒng)的設計流程;培養(yǎng)我們綜合運用所學的基本知識、基本理論和基本技能的能力,學習解決一般工程技術和有關專業(yè)問題的能力,學習工程設計和科學研究的基本方法,完成對所學的知識的綜合訓練。

1.2 本課題的研究現(xiàn)狀
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
    信號發(fā)生器既可以構成獨立的信號源,也可以是高性能網絡分析儀、頻譜儀及其它自動測試設備的組成部分。美國生產的33250A型函數(shù)/任意波形發(fā)生器,可以產生穩(wěn)定、精確和低失真的任意波形,其輸出頻率范圍為1μHZ ~80MHZ,而輸出幅度為10mVpp~10Vpp;該公司生產的8648D射頻信號發(fā)生器的頻率覆蓋范圍更可高達9kHz~4GHz。國產SG1060數(shù)字合成信號發(fā)生器能雙通道同時輸出高分辨率、高精度、高可靠性的各種波形,頻率覆蓋范圍為1μHZ ~60MHZ;國產S1000型數(shù)字合成掃頻信號發(fā)生器通過采用新技術、新器件實現(xiàn)高精度、寬頻帶的掃頻源,同時應用DDS和鎖相技術,使頻率范圍從1MHZ ~1024MHZ能精確地分辨到100hz,它既是一臺高精度的掃頻源,同時也是一臺高精度的標準信號發(fā)生器。還有很多其他類型的信號發(fā)生器,他們各有各的優(yōu)點,但是信號發(fā)生器總的趨勢將向著款頻率覆蓋、高精度、多功能、多用途、自動化和智能化方向發(fā)展。
目前,市場上的信號發(fā)生器多種多樣,一般按頻率帶分為以下幾種;
超高頻:頻率范圍1MHz以上,可達幾十兆赫茲。
高頻:幾百赫茲到幾赫茲。
低頻:頻率范圍為幾十赫茲到幾百赫茲。
超低頻:頻率范圍為零點幾赫茲到幾百赫茲。
超高頻信號發(fā)生器,產生波形一般為用LC振蕩電路。
高頻、低頻和超低頻信號發(fā)生器,大多使用文氏橋振蕩電路,即RC振蕩電路,通過改變電容和電阻值,改變頻率。
用以上原理設計的信號發(fā)生器,其輸出波形一般只有兩種,即正弦波和脈沖波,其零點不可調,而且價格也比較貴,一般在幾百元左右。在實際應用中,超低頻波和高頻波一般是不用的,一般用中頻,即幾十赫茲到幾十千赫茲。用單片機AT89C51,加上一片DAC0832,就可以做成一個簡單的信號發(fā)生器,其頻率受單片機運行的程序控制。我們可以把產生各種波形的程序燒寫進單片機ROM中,用戶可以通過鍵盤和液晶顯示,按照自己的意愿選擇波形頻率可調的多功能信號發(fā)生器,這樣的系統(tǒng)價格便宜,耗電少,頻率適中,便于攜帶。

1.3 設計的基本要求

    本設計采用單片機控制技術了,開發(fā)、設計函數(shù)發(fā)生器。在條件許可情況下模擬調試成功。設計要求:
(1)系統(tǒng)能產生方波、鋸齒及正弦信號
(2)能提供信號的頻率的顯示
(3)系統(tǒng)硬件電路設計
(4)有必要的數(shù)據計算及元器件的選擇
(5)軟件系統(tǒng)設計


1.4 本課題研究內容

     本文是做基于單片機的信號發(fā)生器的設計,將采用編程的方法來實現(xiàn)鋸齒波、方波、正弦波的發(fā)生。根據設計的要求,對各種波形的頻率顯示,并將所寫程序裝入單片機的程序存儲器中。在程序運行中,當接收到來自外界的命令,需要輸出某種波形時再調用相應的波形發(fā)生程序,經電路的D/A轉換器和運算放大器處理后,從信號發(fā)生器的輸出端口輸出。本設計采用89C51單片機機及其外圍擴展系統(tǒng),軟件方面主要是應用c語言程序。系統(tǒng)以89C51為核心,配置相應的外設及接口電路,運用c語言開發(fā),組成一個多功能信號發(fā)生系統(tǒng)。該系統(tǒng)的軟件可運行于window環(huán)境下,硬件電路系統(tǒng)設計具有典型性。同時,本系統(tǒng)中任何一部分模塊均可移植實用開發(fā)系統(tǒng)設計中,電路設計具有實用性。

























2. 方案的設計與選擇
2.1 總體設計方案

數(shù)字信號可以通過數(shù)/模轉換器轉換成模擬信號,因此可通過產生數(shù)字信號再轉換成模擬信號的方法來獲得所需要的波形。89C51單片機本身就是一個完整的微型計算機,具有組成微型計算機的各部分部件:中央處理器CPU、隨機存取存儲器RAM、只讀存儲器ROM、I/O接口電路、定時器/計數(shù)器以及串行通訊接口等,只要將89C51再配置鍵盤及其接口、顯示器及其接口、數(shù)模轉換及波形輸出、指示燈及其接口等四部分,即可構成所需的波形發(fā)生器,其信號發(fā)生器構成原理框圖如圖2-1所示。








圖2-1  硬件原理框圖

2.2 方案的比較

方案一:采用單片機函數(shù)發(fā)生器(如8038),8038可同時產生正弦波、方波等,而且方法簡單易行,用D/A轉換器的輸出來改變調制電壓,也可以實現(xiàn)數(shù)控調整頻率,但產生信號的頻率穩(wěn)定度不高。
方案二:采用鎖相式頻率合成器,利用鎖相環(huán),將壓控振蕩器(VCO)的輸出頻率定在所需頻率上,該方案性能良好,但難以達到輸出頻率覆蓋系數(shù)的要求,且電路復雜。
方案三:采用單片機編程的方法來實現(xiàn)。該方案可以通過編程的方法來控制信號波形的頻率,而且在硬件電路不變的情況下,通過改變程序來實現(xiàn)頻率的變換。此外,由于通過編程的方法產生數(shù)字信號,所以信號的精度可以做的較高。

2.3 單片機的選擇

方案一:AT89C51單片機是一種高性能的8位單片微型計算機。它把構成計算機的中央處理器CPU、存儲器、寄存器、I/O接口制作在一塊集成電路芯片中,從而構成較為完整的計算機,而且價格便宜。
方案二:C8051F005單片機是完全集成混合信號系統(tǒng)及芯片,具有與8051兼容的微控制器內核,與MCS-51指令集完全兼容,除了具有標準8052的數(shù)字外設部件,片內還集成了數(shù)據采集和控制系統(tǒng)中常用的模擬部件和其他數(shù)字外設及功能部件,而且執(zhí)行速度較快,但其價格較貴。
綜合考慮價格和性能決定選用AT89C51單片機
2.4 顯示方案選擇

方案一:采用LED數(shù)碼管。LED數(shù)碼管由8個發(fā)光二極管組成,每只數(shù)碼管輪流顯示各自的字符。由于人眼具有視覺特性,當每只數(shù)碼管顯示的時間間隔小于1/16時人眼感覺不到閃動,看到的是每只數(shù)碼管常亮。使用數(shù)碼管顯示編程較易,但本系統(tǒng)中要顯示的內容較多,而且數(shù)碼管只能顯示少數(shù)幾個字母。
方案二:采用LCD液晶顯示器1602.。其功率小,效果明顯,顯示變成容易控制,可以分行顯示,能夠很方面的顯示波形種類和頻率。
以上兩種方案綜合考慮,選擇LCD液晶顯示器作為系統(tǒng)顯示終端。
2.5 鍵盤方案選擇

方案一:矩陣式鍵盤。矩陣式鍵盤的按鍵觸點接于由行、列母線構成的矩陣電路的交叉處。當鍵盤上沒有鍵閉合時,所有的行線和列線都斷開,行線都呈高電平。當某一個鍵閉合時,該鍵所對應的行線和列線被短路。
方案二:編碼式鍵盤。編碼式鍵盤的按鍵觸點接于74ls148輸出。當鍵盤上沒有閉合時,所有鍵都斷開,當某一鍵閉合時,該鍵對應的編碼由74ls148輸出。
方案三:獨立式鍵盤。獨立式鍵盤指各個按鍵的輸入相互獨立,每一個按鍵都單獨接一根輸入數(shù)據線。
經過比較以上三種方案,鑒于本系統(tǒng)所用鍵盤比較少,所以選擇獨立式鍵盤。

3. 硬件設計
3.1 ATC89C51單片機
AT89C51 是美國 ATMEL 公司生產的低電壓,高性能 CMOS8 位單片機,片內含 4k bytes 的可反復擦寫的只讀程序存儲器(PEROM)和 128 bytes 的隨機存取數(shù)據存儲器(RAM),器件采用 ATMEL 公司的高密度、非易失性存儲技術生產,兼容標準 MCS-51 指令系統(tǒng),片內置通用 8 位中央處理器(CPU)和 Flash 存儲單元,功能強大 AT89C51 單片機可為您提供許多高性價比的應用場合,可靈活應用于各種控制領域。AT89C51 提供以下標準功能:4k 字節(jié) Flash 閃速存儲器,128 字節(jié)內部 RAM,32 個 I/O 口線,兩個 16 位定時/計數(shù)器,一個 5 向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,AT89C51 可降至 0Hz 的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。空閑方式停止 CPU 的工作,但允許 RAM,定時/計數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存 RAM 中的內容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。

圖3-1 proteus中的ATC89C51

圖3-2 ATC89C51方框圖
引腳功能說明:
Vcc:電源電壓
GND:地
P0 口:P0 口是一組 8 位漏極開路型雙向 I/O 口,也即地址/數(shù)據總線復用口。作為輸出口用時,每位能吸收電流的方式驅動 8 個 TTL 邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。在訪問外部數(shù)據存儲器或程序存儲器時,這組口線分時轉換地址(低 8 位)和數(shù)據總線復用,在訪問期間激活內部上拉電阻。在 FIash 編程時,P0 口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。
P1 口:P1 是一個帶內部上拉電阻的 8 位雙向 I/O 口,P1 的輸出緩沖級可驅動(吸收或輸出電流)4 個 TTL 邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。FIash 編程和程序校驗期間,P1 接收低 8 位地址。
P2 口:P2 是一個帶有內部上拉電阻的 8 位雙向 I/O 口,P2 的輸出緩沖級可驅動(吸收或輸出電流)4 個 TTL 邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或 16 位地址的外部數(shù)據存儲器(例如執(zhí)行 MOVX@DPTR 指令)時,P2 口送出高 8 位地址數(shù)據。在訪問 8 位地址的外部數(shù)據存儲器(如執(zhí)行 MOVX@RI 指令)時,P2 口線上的內容(也即特殊功能寄存器(SFR)區(qū)中 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(定時/計數(shù)器 0 外部輸入)
P3.5        T1(定時/計數(shù)器 1 外部輸入)
P3.6        /WR(外部數(shù)據存儲器寫選通)
P3.7        /RD(外部數(shù)據存儲器讀選通)
P3 口還接收一些用于 Flash 閃速存儲器編程和程序校驗的控制信號。
RST:復位輸入。當振蕩器工作時,RST 引腳出現(xiàn)兩個機器周期以上高電平將使單片機復位。
ALE/PROG:  當訪問外部程序存儲器或數(shù)據存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低 8 位字節(jié)。即使不訪問外部存儲器,ALE  仍以時鐘振蕩頻率的  1/6 輸出固定的正脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當訪問外部數(shù)據存儲器時將跳過一個 ALE 脈沖。對 Flash 存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的 8EH 單元的 DO 位置位,可禁止 ALE 操作。該位置位后,只有一條 MOVX 和 MOVC 指令 ALE 才會被激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應設置 ALE 無效。PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當 AT89C51 由外部程序存儲器取指令(或數(shù)據)時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當訪問外部數(shù)據存儲器,這兩次有效的PSEN信號不出現(xiàn)。
/EA/VPP:外部訪問允許。欲使 CPU 僅訪問外部程序存儲器(地址為 0000H—FFFFH),EA 端必須保持低電平(接地)。需注意的是:如果加密位 LB1 被編程,復位時內部會鎖存 EA 端狀態(tài)。如 EA 端為高電平(接 VCC 端),CPU 則執(zhí)行內部程序存儲器中的指令。Flash 存儲器編程時,該引腳加上+12V 的編程允許電源 Vpp,當然這必須是該器件是使用 12V 編程電壓 Vpp。
XTAL1:振蕩器反相放大器的及內部時鐘發(fā)生器的輸入端。
XTAL2:振蕩器反相放大器的輸出端。
時鐘振蕩器:AT89C5l 中有一個用于構成內部振蕩器的高增益反相放大器,引腳 XTAL1 和 XTAL2 分別是該放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起構成自激振蕩器,振蕩電路參見圖3-3。外接石英晶體(或陶瓷諧振器)及電容 C1、C2 接在放大器的反饋回路中構成并聯(lián)振蕩電路。對外接電容 C1、C2 雖然沒有十分嚴格的要求,但電容容量的大小會輕微影響振蕩頻率的高低、振蕩器工作的穩(wěn)定性、起振的難易程序及溫度穩(wěn)定性,如果使用石英晶體,我們推薦電容使用 30pF±10pF,而如使用陶瓷諧振器建議選擇 40pF±10F。用戶也可以采用外部時鐘。采用外部時鐘的電路如圖 3-3所示。這種情況下,外部時鐘脈沖接到 XTAL1 端,即內部時鐘發(fā)生器的輸入端,XTAL2 則懸空。


圖3-3 晶振電路

3.2數(shù)模轉換器件DAC0832
DAC0832是8分辨率的D/A轉換集成芯片。與微處理器完全兼容。這個DA芯片以其價格低廉、接口簡單、轉換控制容易等優(yōu)點,在單片機應用系統(tǒng)中得到廣泛的應用。D/A轉換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉換電路及轉換控制電路構成。

圖3-4 DAC0832數(shù)模轉換器件
管腳說明:
DI0~DI7:數(shù)據輸入線,TLL電平。
  ILE:數(shù)據鎖存允許控制信號輸入線,高電平有效。
  CS:片選信號輸入線,低電平有效。
  WR1:為輸入寄存器的寫選通信號。
  XFER:數(shù)據傳送控制信號輸入線,低電平有效。
  WR2:為DAC寄存器寫選通輸入線。
  Iout1:電流輸出線。當輸入全為1時Iout1最大。
  Iout2: 電流輸出線。其值與Iout1之和為一常數(shù)。
  Rfb:反饋信號輸入線,芯片內部有反饋電阻.
  Vcc:電源輸入線 (+5v~+15v)
  Vref:基準電壓輸入線 (-10v~+10v)
  AGND:模擬地,摸擬信號和基準電源的參考地.
  DGND:數(shù)字地,兩種地線在基準電源處共地比較好.

圖3-5 DAC0832部分內部結構

D/A轉換器DAC0832是采用CMOS工藝制成的單片直流輸出型8位數(shù)/模轉換器。如圖3-6所示,它由倒T型R-2R電阻網絡、模擬開關、運算放大器和參考電壓VREF四大部分組成。運算放大器輸出的模擬量V0為
                        (3-1)
由上式可見,輸出的模擬量與輸入的數(shù)字量成正比,這就實現(xiàn)了從數(shù)字量到模擬量的轉換。 一個8位D/A轉換器有8個輸入端(其中每個輸入端是8位二進制數(shù)的一位),有一個模擬輸出端。輸入可有28=256個不同的二進制組態(tài),輸出為256個電壓之一,即輸出電壓不是整個電壓范圍內任意值,而只能是256個可能值。
DAC0832的工作方式:
DAC0832引腳功能電路應用原理圖DAC0832是采樣頻率為八位的D/A轉換芯片,集成電路內有兩級輸入寄存器,使DAC0832芯片具備雙緩沖、單緩沖和直通三種輸入方式,以便適于各種電路的需要(如要求多路D/A異步輸入、同步轉換等)。D/A轉換結果采用電流形式輸出。若需要相應的模擬電壓信號,可通過一個高輸入阻抗的線性運算放大器實現(xiàn)。運放的反饋電阻可通過RFB端引用片內固有電阻,也可外接。DAC0832邏輯輸入滿足TTL電平,可直接與TTL電路或微機電路連接。
根據對DAC0832的輸入鎖存器和DAC寄存器的不同的控制方式,DAC0832有三種工作方式:直通方式、單緩沖方式和雙緩沖方式。本方案采用單緩沖方式,即使DAC寄存器處于直通狀態(tài),輸入寄存器處于鎖存狀態(tài)。


放大電路:
放大電路由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與反相比例放大器相連,實現(xiàn)電流到電壓的轉換,因此輸出模擬信號的極性與參考電壓的極性相反,數(shù)字量與模擬量的轉換關系為
                                                 (3-2)
    若D/A轉換器輸出為雙極性,如圖3-6所示。運算放大器B的作用是把運算放大器A的單向輸出電壓轉換成雙向輸出電壓。其原理是將B的反向輸入端通過電阻R2與參考電壓VREF相連,VREF經R2向B提供一個偏流I1,其電流方向與I2相反,因此運算放大器B的輸入電流為I1、I2的代數(shù)和。則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        數(shù)據/命令選擇端        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. 軟件系統(tǒng)設計
  本設計方案采用 C51程序語言編寫,整個程序包含主程序、延時、液晶顯示模塊、定時中斷、外部中斷及三種波形輸出函數(shù)組成。
4.1 主程序流程圖

  

























主程序主要設置了D/A轉換器件DAC0832的工作模式,定義了DAC0832數(shù)據端口。調用了顯示初始子程序,設置了定時器工作模式及定時中斷和外部中斷。





4.2 定時中斷程序流程圖







        否       

        是                       
        否





       


       





圖4-2 定時器中斷子程序



定時中斷的作用是用來改變相應波形的頻率,通過改變TH,TL的值就可以改變定時時間,從而改變相應波形的頻率。Waveform的值代表不同的波形,Waveform=0代表正弦波,Waveform=1代表鋸齒波,Waveform=2代表方波,根據Waveform值調用對應的波形輸出子程序。





4.3 外部中斷按鍵子程序流程圖







        否

        是        否
        是
        是       
       

          

       





                       






圖4-3按鍵外部中斷子程序
外部中斷是由按鍵引起的P3.2引腳下降沿觸發(fā)的,波形切換、頻率增減都是通過外部中斷和定時中斷相結合完成的,外部中斷程序中只是改變了相應的參數(shù)或中間值(如波形形式waveform及相應波形頻率wavefreq[waveform]和定時器0的定時初值寄存器的中間值T_temp)另外外部中斷程序還對波形的頻率做了數(shù)據處理并送到液晶屏顯示。





4.4 正弦波子程序流程圖

       





       

                                       
        否
                                             

        是










圖4-5正弦波子程序

正弦波主要是通過單片機向D/A轉換器DAC0832輸送8位二進制數(shù)產生的,本方案選取的256個8位二進制數(shù)存放在數(shù)組sine_tab[],中wavecount的作用就是抽點計數(shù)范圍是0~255,本方案中DAC0832工作在單緩沖狀態(tài),DAC寄存器處于直通狀態(tài),只要在相應的時間打開和關閉輸入寄存器就能完成數(shù)據輸送。



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方波
系統(tǒng)可以改變頻率的大小,方波的頻率區(qū)間為200Hz至2000Hz,鋸齒波的頻率區(qū)間是10Hz至100Hz,正弦波的頻率區(qū)間為10Hz至100Hz,利用定時中斷并改變相應的定時時間即可改變頻率的大小。

圖5.6 10Hz鋸齒波

圖5.4 20Hz鋸齒波

圖5.4 10Hz正弦波

結 論
通過半年的研究設計和調試,實現(xiàn)系統(tǒng)的正常工作并且基本上達到了預期的設計目標這樣一個過程,使我學到了很多知識,積累了許多寶貴的經驗,鍛煉了自己的獨立思考能力和實際動手能力,學會了如何綜合實施一個工程項目的研究與設計。
畢業(yè)論文課題是基于單片機控制函數(shù)信號發(fā)生器。在這次設計過程中我與邱寒同學共同完成此課題,由于我們專業(yè)知識不是很扎實,我們遇到很多問題,還好在涂緒堅老師的多次指導下我們才能完成這次畢業(yè)論文。在這過程中我深刻體會到專業(yè)知識的欠缺和知識的重要性。
雖然本方案設計的系統(tǒng)基本上符合課題的要求但是還有一些不足之處如下
(1)鋸齒波的產生是根據數(shù)組表產生的而不是通過自增或者自減產生。
(2)正弦波的頻率不夠精準誤差較大等等



























致  謝
為此要感謝教研室的諸位老師四年來對我細心的培養(yǎng),教給了我專業(yè)知識為我們學生進入社會打下堅實的基礎。
做畢業(yè)設計的過程中老師給出了不少指導意見,讓我少走了不少的彎路,比如說在畫程序流程圖的時候,開始我沒掌握正確的規(guī)律,后來在老師的指導下才順利的完成了。感謝這篇論文所涉及到的各位學者。本文引用了數(shù)位學者的研究文獻,如果沒有各位學者的研究成果的幫助和啟發(fā),我將很難完成本篇論文的寫作。
    感謝我的同學和朋友,在我寫論文的過程中給予我了很多你問素材,還在論文的撰寫和排版等過程中提供熱情的幫助。

                                


























參考資料

[1]朱兆優(yōu)、陳堅、王海濤、鄧文娟.  《單片機原理與應用》.  電子工業(yè)出版社. 2010
[2]徐慧民 . 《微機原理與接口技術》 .高等教育出版社.2007
[3]余修武.  《單片機原理與應用》. 電子科技大學出版社.2008
[4]劉文濤.  《單片機培訓教程:(C51版)》.電子工業(yè)出版社.2005
[5]閻石  .  《數(shù)字電子技術基礎》.高等教育出版社.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液晶的相關函數(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ù)據(在指令所指的地方寫數(shù)據)
        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ù)據
        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液晶函數(shù)聲明結束*********************/
void main()
{
   
        DA_S2=0;   
        DAdata=0;
        DA_S1=1;   
        init_lcd();
    waveform=0;       
        TMOD=0x01;  //設置定時器0方式1為16位工作方式
        IT0=1;      //設置外部中斷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;     //關總中斷與定時器
        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:仿真用圖

作者: 499799107    時間: 2019-2-26 10:34
下載在哪啊
作者: guadd    時間: 2019-2-27 11:13
下載地址呢





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1