電子技術(shù)課程設(shè)計與實踐
題目:基于單片機的簡易智能信號源發(fā)生器設(shè)計 ——波形頻率的調(diào)節(jié) 學(xué)院:電氣電子工程學(xué)院 專業(yè):通信工程
摘要 本文所設(shè)計的系統(tǒng)是利用STC89C52單片機和數(shù)模轉(zhuǎn)換器件DAC0832產(chǎn)生所需不同信號的低頻信號源,即采用STC89C52單片機作為控制核心,而在外圍采用數(shù)字/模擬轉(zhuǎn)換電路(DAC0832)、運放電路(LM358)、按鍵和LCD液晶顯示電路等,通過按鍵可控制產(chǎn)生方波、鋸齒波、三角波、正弦波,同時用LCD液晶顯示對應(yīng)的波形輸出。 文中簡要介紹了信號發(fā)生器頻率改變的原理,通過硬件電路和軟件程序相結(jié)合,可輸出自定義波形,如正弦波、方波、三角波、鋸齒波等波形,波形的頻率和幅度在一定范圍內(nèi)可任意改變。波形和頻率的改變通過軟件控制,幅度的改變通過硬件實現(xiàn)。該系統(tǒng)采用單片機作為數(shù)據(jù)處理及控制核心,由單片機完成人機界面、系統(tǒng)控制、信號的采集分析以及信號的處理和變換,采用按鍵輸入,利用液晶顯示電路輸出數(shù)字顯示的方案。 本文所設(shè)計的系統(tǒng)設(shè)計簡單、性能優(yōu)良、性價比高,可用于多種需要低頻信號源的場所,具有一定的實用性。
目錄 第一章 緒論 1 1.1信號發(fā)生器背景 1 1.2信號發(fā)生器發(fā)展趨勢 1 1.3信號發(fā)生器的應(yīng)用 1 第二章 信號發(fā)生器的結(jié)構(gòu)和設(shè)計 3 2.1 信號發(fā)生器的基本結(jié)構(gòu) 3 2.2 電路設(shè)計 3 2.2.1 單片機基本結(jié)構(gòu) 3 2.2.2 復(fù)位電路 5 2.2.3 鍵盤電路 5 2.2.4 LCD顯示電路 7 2.2.5 5DAC0832芯片 8 2.2.6 LM358 11 2.3 程序設(shè)計 12 2.3.1 主程序流程圖 13 2.3.2 頻率調(diào)節(jié) 13 2.3.3 正弦波產(chǎn)生 14 2.3.4 方波產(chǎn)生 15 2.3.5 三角波產(chǎn)生 16 2.3.6 鋸齒波波產(chǎn)生 17 第三章 系統(tǒng)調(diào)試 18 3.1 硬件調(diào)試 18 3.2 軟件調(diào)試 18 3.3 實際調(diào)試 26 第四章 總結(jié)與展望 26 4.1總結(jié)問題 26 4.2展望未來 22 參考文獻(xiàn) 27 附 錄 28 附錄1 實物圖 28 附錄2 仿真圖 29 附錄3 程序代碼 30 附錄4 原件清單 37 致 謝 38
1.1 信號發(fā)生器背景
信號發(fā)生器,作為實驗用信號源,是現(xiàn)今各種電子電路實驗設(shè)計應(yīng)用中必不可少的儀器設(shè)備之一。目前,市場上常見的信號發(fā)生器多為純硬件的搭接而成,且波形種類有限,多為鋸齒、正弦、方波、三角等波形。 信號發(fā)生器是能夠產(chǎn)生大量的標(biāo)準(zhǔn)信號和用戶定義信號,并保證高精度、高穩(wěn)定性、可重復(fù)性和易操作性的電子儀器。信號發(fā)生器具有連續(xù)的相位變換和頻率穩(wěn)定性高等優(yōu)點,不僅可以模擬各種復(fù)雜信號,還可對頻率、幅值、相移、波形進(jìn)行動態(tài)、及時的控制,并能夠與其它儀器進(jìn)行通訊,組成自動測試系統(tǒng),因此被廣泛用于自動控制系統(tǒng)、震動激勵、通訊和儀器儀表領(lǐng)域。 在 70 年代前,信號發(fā)生器主要有兩類:正弦波和脈沖波,而函數(shù)發(fā)生器介于兩類之間,能夠提供正弦波、余弦波、方波、三角波、上弦波等幾種常用標(biāo)準(zhǔn)波形,產(chǎn)生其它波形時,需要采用較復(fù)雜的電路和機電結(jié)合的方法。這個時期的信號發(fā)生器多采用模擬電子技術(shù),而且模擬器件構(gòu)成的電路存在著尺寸大、價格貴、功耗大等缺點。 在 70 年代前,信號發(fā)生器主要有兩類:正弦波和脈沖波,而函數(shù)發(fā)生器介于兩類之間,能夠提供正弦波、余弦波、方波、三角波、上弦波等幾種常用標(biāo)準(zhǔn)波形,產(chǎn)生其它波形時,需要采用較復(fù)雜的電路和機電結(jié)合的方法。這個時期的波形發(fā)生器多采用模擬電子技術(shù),而且模擬器件構(gòu)成的電路存在著尺寸大、價格貴、功耗大等缺點。 在 70 年代后,微處理器的出現(xiàn),可以利用處理器、A/D/和 D/A,硬件和軟件使信號發(fā)生器的功能擴大,產(chǎn)生更加復(fù)雜的波形。這時期的信號發(fā)生器多以軟件為主,實質(zhì)是采用微處理器對 DAC的程序控制,就可以得到各種簡單的波形。 1.2 信號發(fā)生器發(fā)展趨勢
當(dāng)今是科學(xué)技術(shù)及儀器設(shè)備高度智能化飛速發(fā)展的信息社會,電子技術(shù)的進(jìn)步,給人們帶來了根本性的轉(zhuǎn)變,在現(xiàn)代電子領(lǐng)域中,單片機的應(yīng)用正在不斷的走向深入,這必將帶來一場儀器設(shè)備高度智能化的全面革命。隨著集成電路的迅速發(fā)展,用集成電路可很方便地構(gòu)成各種信號發(fā)生器,而用集成電路實現(xiàn)的信號發(fā)生器與其它信號發(fā)生器相比,其波形質(zhì)量、幅度和頻率穩(wěn)定性等性能指標(biāo),都有了很大的提高,特別是單片機應(yīng)用技術(shù)的不斷成熟,導(dǎo)致傳統(tǒng)控制與檢測技術(shù)的快速革新。單片機構(gòu)成的儀器具有高可靠性、高性能價格比,在智能儀表系統(tǒng)和辦公自動化等諸多領(lǐng)域中得以極為廣泛的應(yīng)用,特別是在電子工程、通信工程、自動控制、遙測控制、測量儀器、儀表和計算機等技術(shù)領(lǐng)域處處可以看見它的應(yīng)用。 一塊單片機芯片就是一臺微型計算機,在某些應(yīng)用領(lǐng)域中,它能夠承擔(dān)大中型計算機和通用微型計算機無法完成的一些工作。單片機之所以能夠在各個領(lǐng)域中都得到如此迅猛的發(fā)展,主要是因為它具有很多顯著的優(yōu)點和特點,歸納起來有以下幾方面: 1. 具有優(yōu)異的性能價格比:單片機盡可能地把應(yīng)用所需的存儲器,各種功能的I/O 接口集成在一塊芯片內(nèi),因而其性能很高,而價格卻相對較低廉,即性能價格比很高。 2. 集成度高、體積小、可靠性高:單片機把各種功能部件集成在一塊芯片上,因而集成度高,均為大規(guī)模或超大規(guī)模集成電路。又內(nèi)部采用總線結(jié)構(gòu),減少了芯片之間的連線,這大大提高了單片機的可靠性與抗干擾能力。同時,其體積小,對于強磁場環(huán)境易于采取屏蔽措施,適合于在惡劣環(huán)境下工作。 3. 控制功能強:單片機體積雖小,但“五臟俱全”,它非常適用于專門的控制用途。為了滿足工業(yè)控制要求,一般單片機的指令系統(tǒng)中有極豐富的轉(zhuǎn)移指令,I/O口的邏輯操作指令以及位操作指令。其邏輯控制功能及運行速度均高于同一檔次的微機。 4. 低電壓、低功耗:單片機大量用于攜帶式產(chǎn)品和家用消費類產(chǎn)品,低電壓和低功耗尤為重要。目前,許多單片機已可在2.2V電壓下運行,有的已能在1.2V或0.9V下工作,功耗降至μA級,一粒鈕扣電池就可長期使用。 利用單片機采用程序設(shè)計方法來產(chǎn)生低頻信號,其下限頻率很低。具有線路相對簡單,結(jié)構(gòu)緊湊,價格低廉,頻率穩(wěn)定度高,抗干擾能力強,用途廣泛等優(yōu)點,并且能夠?qū)Σㄐ芜M(jìn)行細(xì)微調(diào)整,改良波形,使其滿足系統(tǒng)的要求。只要對電路稍加修改,調(diào)整程序,即可完成功能升級。 1.3 信號發(fā)生器的應(yīng)用 信號發(fā)生器的作用——信號調(diào)制功能:信號調(diào)制是指被調(diào)制信號中,幅度、相位或頻率變化把低頻信息嵌入到高頻的載波信號中,得到的信號可以傳送從語音、到數(shù)據(jù)、到視頻的任何信號。信號調(diào)制可分為模擬調(diào)制和數(shù)字調(diào)制兩種,其中模擬調(diào)制,如幅度調(diào)制(AM)和頻率調(diào)制(FM)最常用于廣播通信中,而數(shù)字調(diào)制基于兩種狀態(tài),允許信號表示二進(jìn)制數(shù)據(jù)。例如在通信、廣播、電視系統(tǒng)中,都需要射頻(高頻)發(fā)射,這里的射頻波就是載波,把音頻(低頻)、視頻信號或脈沖信號運載出去,就需要能夠產(chǎn)生高頻的振蕩器。在工業(yè)、農(nóng)業(yè)、生物醫(yī)學(xué)等領(lǐng)域內(nèi),如高頻感應(yīng)加熱、熔煉、淬火、超聲診斷、核磁共振成像等,都需要功率或大或小、頻率或高或低的振蕩器。信號發(fā)生器在生產(chǎn)實踐和科技領(lǐng)域中有著廣泛的應(yīng)用。例如在通信、廣播、電視系統(tǒng)中,都需要射頻(高頻)發(fā)射,這里的射頻波就是載波,把音頻(低頻)、視頻信號或脈沖信號運載出去,就需要能夠產(chǎn)生高頻的振蕩器。在工業(yè)、農(nóng)業(yè)、生物醫(yī)學(xué)等領(lǐng)域內(nèi),如高頻感應(yīng)加熱、熔煉、淬火?、超聲診斷、核磁共振成像等,都需要功率或大或小、頻率或高或低的振蕩器。 1
天津理工大學(xué)2015級電子技術(shù)課程設(shè)計與實踐 第二章 信號發(fā)生器的結(jié)構(gòu)和設(shè)計 2.1 信號發(fā)生器的基本結(jié)構(gòu) 低頻信號發(fā)生器系統(tǒng)主要由CPU、D/A轉(zhuǎn)換電路、電流/電壓轉(zhuǎn)換電路、按鍵和波形指示電路、電源等電路組成。 其工作原理為當(dāng)分別按下四個按鍵中的一個按鍵就會分別切換出方波、鋸齒波、三角波、正弦波,并且有四個發(fā)光二極管分別作為不同的波形指示燈。 
圖2.1 信號發(fā)生器電路框圖 2.2電路設(shè)計 2.2.1 單片機的基本結(jié)構(gòu) STC89C52 是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8位CPU和在系統(tǒng) 可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 STC89C52具有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32 位I/O口線,看門狗定時器,2個數(shù)據(jù)指針,三個16位定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時鐘電路。另外,STC89C52可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。 P0口:P0口是一個8位漏極開路的雙向I/O口。作為輸出口,每位能驅(qū)動8個TTL邏輯電平。對P0端口寫“1”時,引腳用作高阻抗輸入。 P1口:P1口是一個具有內(nèi)部上拉電阻的8位雙向I/O口,p1輸出緩沖器能驅(qū)動4個TTL邏輯電平。對P1端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。 P2口:P2口是一個具有內(nèi)部上拉電阻的8位雙向I/O口,對P2端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。 P3口:P3口是一個具有內(nèi)部上拉電阻的8 位雙向I/O口,p3 輸出緩沖器能驅(qū)動4個TTL邏輯電平。 RST:復(fù)位輸入。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將是單片機復(fù)位。 ALE/PROG:當(dāng)訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鐘或用于定時目的。 PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當(dāng)STC89C52由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖,在此期間,當(dāng)訪問外部數(shù)據(jù)存儲器,將跳過兩次PSEN信號。 EA/VPP:外部訪問允許,欲使CPU僅訪問外部程序存儲器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。 XTAL1:振蕩器反相放大器和內(nèi)部時鐘發(fā)生電路的輸入端。 XTAL2:振蕩器反相放大器的輸出端。 對于 STC89C52,如果EA接VCC,程序讀寫先從內(nèi)部存儲器(地址為0000H~1FFFH)開始,接著從外部尋址,尋址地址為:2000H~FFFFH。 數(shù)據(jù)存儲器:STC89C52有256字節(jié)片內(nèi)數(shù)據(jù)存儲器。高128字節(jié)與特殊功能寄存器重疊。也就是說高128字節(jié)與特殊功能寄存器有相同的地址,而物理上是分開的。 STC89C52具有如下特點:40個引腳,8k Bytes Flash 片內(nèi)程序儲存器,256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),32個外部雙向輸入/輸出(I/0)口,5個中斷優(yōu)先級2層中斷嵌套中斷,2個16位可編程定時計數(shù)器,2個全雙工串行通信口,看門狗(WDT)電路,片內(nèi)時鐘振蕩器。此外,STC89C52設(shè)計和配置了振蕩頻率可為0HZ并通過軟件設(shè)置省電模式。空閑模式,CPU暫停工作,而RAM定時計數(shù)器,串行口,外中斷系統(tǒng)可繼續(xù)工作,掉電式凍結(jié)振蕩器而保存RAM的數(shù)據(jù),停止芯片其他功能直至外中斷激活或硬件復(fù)位[1][2][3]。同時該芯片還具有PDIP、TQFP和PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求, STC89C52引腳如圖2.2所示。 
圖2.2 STC89C52引腳示意圖 主要功能特性: ·兼容Mcs-51指令系統(tǒng) ·8K可反復(fù)擦寫ISP Flash ROM ·32個雙向I/O口 ·4.5~5.5v工作電壓 ·3個16位可編程定時計數(shù)器 ·時鐘頻率0-33MHz ·全雙工作UART穿行中斷口線·256bit內(nèi)部RAM ·2個外部中斷源 ·低功耗空閑和省電模式 ·中斷喚醒省電模式 ·3級加密位 ·看門狗(WDT)電路 ·軟件設(shè)置空閑和省電功能 ·靈活的ISP字節(jié)和分頁編程 ·雙數(shù)據(jù)寄存器指針 2.2.2 復(fù)位電路 復(fù)位是單片機的初始化操作,其主要的作用是把PC初始化為0000H,使單片機從0000H單元開始執(zhí)行程序。除了進(jìn)入系統(tǒng)的正常初始化之外,當(dāng)由于程序運行出錯或操作失誤使系統(tǒng)處于死鎖狀態(tài)時,為擺脫困境,也需要按復(fù)位鍵以重新啟動。除使PC歸零外,復(fù)位操作還對其他一些專用寄存器有影響,它們的復(fù)位狀態(tài)如表所示: 表2-1 復(fù)位后的內(nèi)部寄存器狀態(tài) 另外,復(fù)位操作還對單片機的個別引腳有影響,例如會把ALE和/PSEN變成無效狀態(tài),即使ALE=0,/PSEN=1。RST變成低電平后,退出復(fù)位狀態(tài),CPU從初始狀態(tài)開始工作。 89C51復(fù)位操作有3種方式:上電復(fù)位、上電按鈕復(fù)位和系統(tǒng)復(fù)位。上電復(fù)位電路如圖2.3所示。對于CMOS型單片機因RST引腳的內(nèi)部有一個拉低電阻,故電阻R可不接。單片機在上電瞬間,RC電路充電,RST引腳端出現(xiàn)正脈沖,只要RST端保持兩個機器周期以上的高電平,就能使單片機有效地復(fù)位。當(dāng)晶體振蕩頻率為12MHz時,RC的典型值為C=10uF,R=8.2K歐姆。簡單復(fù)位電路中,干擾信號易串入復(fù)位端,可能會引起內(nèi)部某些寄存器錯誤復(fù)位,這時可在RST引腳上接一去耦電容。 通常因為系統(tǒng)運行等的需要,常常需要人工按鈕復(fù)位,復(fù)位電路如圖2.4所示,其中R2>>R1,只需將一個常開按鈕開關(guān)并聯(lián)于上電復(fù)位電路,按下開關(guān)一定時間就能使RST引腳端為高電平,從而使單片機復(fù)位。 
圖2-3上電復(fù)位電路圖2-4上電按鈕復(fù)位電路
2.2.3 鍵盤電路 根據(jù)設(shè)計的電路特點,只需要用到4個按鈕來選擇波形,實現(xiàn)的功能也比較簡單,所以采用獨立式未編碼鍵盤結(jié)構(gòu)。鍵盤原理圖如圖2.5所示。本系統(tǒng)采用獨立鍵盤開關(guān),其中按鍵“K1”可以來調(diào)節(jié)切換波形的輸出,按鍵“K4”用來調(diào)節(jié)調(diào)節(jié)波形頻率的步進(jìn)值。按鍵“K2”,“K3”可以調(diào)節(jié)波形頻率的加和減。 
圖2.5 鍵盤原理圖 2.2.4 LCD顯示電路 液晶顯示器以其微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧的諸多優(yōu)點,在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中得到越來越廣泛的應(yīng)用。在本設(shè)計采用的字符型液晶模塊是一種用5x7點陣圖形來顯示字符的液晶顯示器,根據(jù)顯示的容量可以分為1行16個字、2行16個字、2行20個字等等,這里以常用的2行16個字的1602液晶模塊來介紹它的編程方法。1602采用標(biāo)準(zhǔn)的16腳接口,其中: 第3腳:VEE為液晶顯示器對比度調(diào)整端; 第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器; 第5腳:RW為讀寫信號線,高電平時進(jìn)行讀操作,低電平時進(jìn)行寫操作。當(dāng)RS和RW共同為低電平時可以寫入指令或者顯示地址,當(dāng)RS為低電平RW為高電平時可以讀忙信號,當(dāng)RS為高電平RW為低電平時可以寫入數(shù)據(jù); 第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令; 第7~14腳:D0~D7為8位雙向數(shù)據(jù)線; 第15~16腳:空腳。 液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,表2-2是DM-162的內(nèi)部顯示地址。 表2.2 1602的內(nèi)部顯示地址
1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼。在軟件中設(shè)置溫度的代碼是:30.0℃(00110011B,00110000B,00101110B, 00110000B,01000011B);37.0℃(00110011B,00110111B,00101110B,00110000B,01000011B);60℃(00110110B,00110000B,01000011B)。 在液顯電路連接上,LCD1602顯示模塊可以直接和單片機STC89C51直接接口,液晶顯示的D0~D7八個雙向端口接STC89C51單片機的P0口的P0.0~P0.7,單片機的P0口可以作為通用的輸入,輸出端口使用,此時,若要驅(qū)動NMOS或其他拉電流負(fù)載時,需外接上拉電阻,才能使該位高電平有效,所以中間接10K的排阻,決定顯示器高低點位,是否要顯示。 由于VEE端接電源時接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產(chǎn)生“鬼影”,對比度過低會使屏幕模糊不清,所以使用時可以通過一個10K的電位器來調(diào)整它的對比度。LCD1602的RS寄存器選擇端口接單片機的P2.5口,通過軟件程序中對此端口的設(shè)置來決定選擇的寄存器。液顯的RW端口直接接單片機的P2.6口,高電平時進(jìn)行對輸入的數(shù)字信號進(jìn)行讀數(shù)。使能E端接單片機的P2.7口,使能端由高電平到低電平時開始執(zhí)行命令,把讀數(shù)顯示出來。 LCD顯示電路原理圖如圖2.6: 
圖2.6 LCD現(xiàn)顯示電路 2.2.5 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)成。 DAC0832的主要特性參數(shù)如下: 分辨率為8位; 電流穩(wěn)定時間1us; 可單緩沖、雙緩沖或直接數(shù)字輸入; 只需在滿量程下調(diào)整其線性度; 單一電源供電(+5V~+15V); 低功耗,僅需要200mW。 DI7~DI0:8位的數(shù)據(jù)輸入端,DI7為最高位。 ILE:數(shù)據(jù)鎖存允許控制信號輸入線,高電平有效。 /CS:選片信號輸入線(選通數(shù)據(jù)鎖存器),低電平有效。 /WR1:數(shù)據(jù)鎖存器寫選選通輸入線,負(fù)脈沖有效,由ILE、/CS、/WR1的邏輯組合產(chǎn)生/LE1,當(dāng)/LE1為高電平時,數(shù)據(jù)鎖存器狀態(tài)隨輸入數(shù)據(jù)線變化,/LE1的負(fù)跳變時將輸入數(shù)據(jù)鎖存。 /XFER:數(shù)據(jù)傳輸控制信號輸入線,低電平有效,負(fù)脈沖有效。 /WR2:DAC寄存器選通輸入線,負(fù)脈沖有效,由/WR2、/XFER的邏輯組合產(chǎn)生/LE2,當(dāng)/LE2為高電平時,DAC寄存器的輸出隨寄存器的輸入而變化,/LE2的負(fù)跳變時將數(shù)據(jù)鎖存器的內(nèi)容打入DAC寄存器并開始D/A轉(zhuǎn)換。 Iout1:模擬電流輸出端1,當(dāng)DAC寄存器中數(shù)據(jù)全為1時,輸出電流最大,當(dāng) DAC寄存器中數(shù)據(jù)全為0時,輸出電流為0。 Iout2:模擬電流輸出端2,Iout1與Iout2的和為一個常數(shù),即Iout1+I(xiàn)out2=常數(shù)。 RFB:反饋電阻引出端,DAC0832內(nèi)部已經(jīng)有反饋電阻,所以 RFB端可以直接接到外部運算放大器的輸出端,這樣相當(dāng)于將一個反饋電阻接在運算放大器的輸出端和輸入端之間。 VREF:參考電壓輸入端,此端可接一個正電壓,也可接一個負(fù)電壓,它決定0至255的數(shù)字量轉(zhuǎn)化出來的模擬量電壓值的幅度,VREF范圍為(+10~-10)V。VREF端與D/A內(nèi)部T形電阻網(wǎng)絡(luò)相連。 Vcc:芯片供電電壓,范圍為(+5~+15)V。 AGND:模擬量地,即模擬電路接地端。 DGND:數(shù)字量地。 DAC0832主要由8位輸入寄存器、8位DAC寄存器、8位D/A轉(zhuǎn)換器以及輸入控制電路四部分組成。8 位輸入寄存器用于存放主機送來的數(shù)字量,使輸入數(shù)字量得到緩沖和鎖存,由加以控制;8位DAC寄存器用于存放待轉(zhuǎn)換的數(shù)字量,由加以控制;8位D/A轉(zhuǎn)換器輸出與數(shù)字量成正比的模擬電流;由與門、非與門組成的輸入控制電路來控制2個寄存器的選通或鎖存狀態(tài)。原理框圖如圖2.7所示: 
圖2.7 DAC0832原理框圖 當(dāng)/WR2和/XFER同時有效時,8位DAC寄存器端為高電平“1”,此時DAC寄存器的輸出端Q跟隨輸入端D也就是輸入寄存器Q端的電平變化;反之,當(dāng)端為低電平“0”時,第一級8位輸入寄存器Q端的狀態(tài)則鎖存到第二級8位DAC寄存器中,以便第三級8位DAC轉(zhuǎn)換器進(jìn)行D/A轉(zhuǎn)換。 一般情況下為了簡化接口電路,可以把/WR2和/XFER直接接地,使第二級8位DAC寄存器的輸入端到輸出端直通,只有第一級8位輸入寄存器置成可選通、可鎖存的單緩沖輸入方式。特殊情況下可采用雙緩沖輸入方式,即把兩個寄存器都分別接成受控方式。 DAC0832與反相比例放大器相連,實現(xiàn)電流到電壓的轉(zhuǎn)換,因此輸出模擬信號的極性與參考電壓的極性相反,數(shù)字量與模擬量的轉(zhuǎn)換關(guān)系為 Vout1=-Vref×(數(shù)字碼/256) (2-1) DAC0832內(nèi)部的8位D/A轉(zhuǎn)換電路由8位T型電阻網(wǎng)絡(luò)和電子開關(guān)組成,電子開關(guān)受8位DAC寄存器輸出的數(shù)字量控制,T型電阻網(wǎng)絡(luò)能輸出和數(shù)字量成正比的模擬電流。因此,DAC0832通常需要外接運算放大器,進(jìn)行電流電壓轉(zhuǎn)換,才能得到模擬輸出電壓。 當(dāng)輸入到DAC0832的數(shù)字量最高位為1時,則輸出的模擬電壓為正;當(dāng)輸入到DAC0832的數(shù)字量最高位為0時,則輸出的模擬電壓為負(fù),從而實現(xiàn)了模擬電壓的雙極性輸出。 2.2.6 LM358工作原理 LM358管腳排列如下圖所示: 
圖2.8 LM358管腳圖 LM358是雙運放集成電路 ,它采用8腳雙列直插塑料封袋,外形如上圖所示。它的內(nèi)部包含兩組形式完全相同的運算放大器,除電源共用外,兩組運放相互獨立。每一組運算放大器可用圖中所示的符號來表示,它有5個引出腳,其中“+”、“-”為兩個信號輸入端,“V+”、“V-”為正、負(fù)電源端,“OUT”為輸出端。兩個信號輸入端中,“-”為反相輸入端,表示運放輸出端OUT的信號與該輸入端的為相反;“+”為同相輸入端,表示運放輸出端OUT的信號與輸入端的相位相同。由于LM358雙運放電路具有電源電壓范圍寬,靜態(tài)功耗小,可單電源使用,價格低廉等優(yōu)點,因此被廣泛應(yīng)用在各種電路中。 特性: 低輸入偏流 內(nèi)部頻率補償 直流電壓增益高(約100dB) 單位增益頻帶寬(約1MHz) 電源電壓范圍寬:單電源(3—30V);雙電源(±1.5 一±15V) 低功耗電流,適合于電池供電 低輸入失調(diào)電壓和失調(diào)電流 共模輸入電壓范圍寬,包括接地 差模輸入電壓范圍寬,等于電源電壓范圍 輸出電壓擺幅大(0 至Vcc-1.5V) 
圖2.9 LM358原理圖 2.3 程序設(shè)計 2.3.1 主程序流程圖 主程序流程圖如圖所示: 
圖2.10 主程序框圖 2.3.2 頻率調(diào)節(jié)程序 通過改變定時器的周期達(dá)到改變頻率的目的
圖2.11 頻率改變程序框圖(見附件) 2.3.3 正弦波產(chǎn)生程序 正弦波程序流程圖如圖2.12所示 
圖2.12 正弦波程序流程圖 2.3.4 方波產(chǎn)生程序 方波程序流程圖如圖2.13所示 
圖2.13 方波程序流程圖 方波產(chǎn)生是當(dāng)A中的內(nèi)容為0時,輸出對應(yīng)模擬量,然后延時,當(dāng)A中的內(nèi)容為0FFH時,同樣輸出對應(yīng)模擬量,再延時,從而得到方波。 延時子程序流程圖如圖2.14所示 
圖2-14 延時子程序流程圖 2.3.5 三角波產(chǎn)生程序 三角波流程圖如圖2.15所示 
圖2.15 三角波產(chǎn)生流程圖 三角波產(chǎn)生通過A中數(shù)值的加一遞升,當(dāng)A中的內(nèi)容加到為0時, A中的內(nèi)容減一遞減,從而循環(huán)產(chǎn)生三角波。 2.3.5 鋸齒波產(chǎn)生程序 鋸齒波流程圖如圖2.15所示。 
圖2.15 鋸齒波流程圖 鋸齒波產(chǎn)生將00H送入寄存器A中,DAC0832輸出A中的內(nèi)容,當(dāng)A中的內(nèi)容等于FFH返回開始,當(dāng)A中的內(nèi)容不為FFH時,A中的內(nèi)容累加,從而輸出波形。 1
天津理工大學(xué)2015級電子技術(shù)課程設(shè)計與實踐 第三章 系統(tǒng)測試 3.1 硬件調(diào)試 為了準(zhǔn)確發(fā)現(xiàn)系統(tǒng)存在的問題,需要進(jìn)行系統(tǒng)調(diào)試,調(diào)試的順序按照先硬件后軟件,先局部后整體的順序來完成。首先介紹系統(tǒng)的硬件安裝過程及針對各單元模塊的硬件電路調(diào)試,檢驗其是否符合設(shè)計初衷,能否達(dá)到相應(yīng)指標(biāo)。硬件調(diào)試主要包括電源系統(tǒng)的調(diào)試、單片機小系統(tǒng)的調(diào)試、D/A轉(zhuǎn)換電路的調(diào)試、示波器的調(diào)試幾部分。 為保證整個系統(tǒng)能夠正常工作,首先要保證電源系統(tǒng)正常工作并且保證輸出為+5V。通過測量輸出口的電壓值不斷修改電路設(shè)計,完成電源系統(tǒng)的調(diào)試。 3.2 軟件調(diào)試 主要進(jìn)行了單片機STC89C52的軟件調(diào)試過程,檢驗其是否符合設(shè)計初衷,能否達(dá)到相應(yīng)的指標(biāo)。主要是示波器的調(diào)試,通過編寫程序?qū)崿F(xiàn)波形的顯示,按鍵的不同,對應(yīng)的示波器的顯示波形一樣。 正弦波波形如圖3.1所示: 
圖3.1 10Hz正弦波 改變頻率后波形如圖3.2所示 
圖3.2 30Hz正弦波 矩形波波形如圖3.3所示: 
圖3.3 10Hz方波 改變頻率后波形如圖3.4所示 
圖3.4 30Hz方波 三角波形如圖3.5所示: 
圖3.5 10Hz三角波 改變頻率后波形如圖3.6所示 
圖3.6 30Hz三角波 鋸齒波形如下圖3.7所示: 
圖3.7 10Hz鋸齒波 改變頻率后波形如圖3.8所示 
圖3.8 30Hz鋸齒波 3.3 實際調(diào)試 a.正弦波 
圖3.9 20Hz正弦波 
圖3.10 25Hz正弦波 b.方波 
圖3.11 30Hz方波 
圖3.12 25Hz方波 c.三角波 
圖3.13 25Hz三角波 圖3.14 30Hz三角波
b.鋸齒波 
圖3.15 25Hz鋸齒波 
圖3.16 30Hz鋸齒波 第四章 未來與展望 4.1 總結(jié)問題 對于本次課程設(shè)計的結(jié)束,我真切感覺到自己知識能力的匱乏,很多東西都只是知道一些淺顯的知識,真正搞懂會應(yīng)用的東西很少。或許一個人的進(jìn)步需要一個緩慢的過程。在過程中需要不斷地借鑒,學(xué)習(xí),汲取別人的東西。同別人的成果中攫取知識和營養(yǎng),然后它變成自己的東西。通過這次課程設(shè)計。我學(xué)到了很多東西,首先,通過這次課程設(shè)計,我熟練地掌握了單片機的程序設(shè)計以及信號源發(fā)生器的制作。其次,我覺得學(xué)習(xí)理論和實踐是兩個層次,理論指導(dǎo)實踐,而實踐驗證理論,理論往往是在理想的條件下得出的,而實踐是在現(xiàn)實生活中進(jìn)行的,所以,實踐得出的結(jié)論往往與理論的結(jié)論有一定的差別,這是很正常的。另外團結(jié)協(xié)作,互助共贏是時代的主流。在這次課設(shè)的制作中,交流合作的精神在我們體現(xiàn)的可謂是淋漓盡致。相互探討,學(xué)習(xí)交流,優(yōu)勢互補,這樣才最終處成了這課設(shè)。爭論與交流是解決問題很好的方法,問題也總是在思想與意見的碰撞中得到解決而這也是我們對理論理解的更為深刻。通過圖書館,搜索引擎查閱資料的能力也得到了相應(yīng)的提升。總之,在這次課程設(shè)計的制作的過程中學(xué)到了很多東西,能力也有相應(yīng)的提升。在此還要感謝指導(dǎo)老師的辛勤教導(dǎo),感謝老師在此次課程設(shè)計中給以孜孜不倦的解惑。 4.2展望未來 課程設(shè)計是培養(yǎng)學(xué)生綜合運用所學(xué)知識,發(fā)現(xiàn)、提出、分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對學(xué)生實際工作能力的具體訓(xùn)練和考察過程。對于單片機設(shè)計,其硬件電路是比較簡單的,主要是解決程序設(shè)計的問題,而程序設(shè)計是一個很靈活的東西,它反映了你解決問題的邏輯思維和創(chuàng)新能力,它才是一個設(shè)計的靈魂所在。因此在整個設(shè)計過程中大部分時間是用在程序上面的。通過這次電子技術(shù)課程設(shè)計鍛煉我們的能力,將理論和實踐結(jié)合到一起,提高了我們的動手能力,為我們以后單片機設(shè)計打下了基礎(chǔ)。 參考文獻(xiàn) [1] 周明德.微型計算機系統(tǒng)原理及應(yīng)用[M].北京:清華大學(xué)出版社,2002 [2] 劉樂善.微型計算機接口技術(shù)及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2001 [3] 童詩白.模擬電路技術(shù)基礎(chǔ)[M].北京:高等教育出版社,2000 [4] 張友德.單片微型機原理、應(yīng)用與實踐[M].上海:復(fù)旦大學(xué)出版社,2004 [5] 張永瑞.電子測量技術(shù)基礎(chǔ)[M].西安:西安電子科技大學(xué)出版社,2006 [6] 李葉紫. MCS-51單片機應(yīng)用教程[M].北京:清華大學(xué)出版社,2004 附錄 附錄1 實物圖 

附錄2 仿真圖 
附錄4 原件清單
1)9*15萬用板
2)STC89C52單片機
3)DAC0832芯片
4)LM358芯片
5)8腳IC座
6)20腳IC座
7)40腳IC座
8)1602液晶
9)16p母座
10)16p排針
11)4p排針
12)103電位器
13)10k電阻*2
14)2.2k電阻*3
15)100歐姆電阻*2
16)220歐姆電阻
17)1k電阻*2
18)103排阻(10k)
19)按鍵*5
20)5mmLED(紅、黃、綠、白)*4
21)10uf電解電容
22)30pf瓷片電容*2
23)12M晶振
24)104獨石電容*2
25)自鎖開關(guān)
26)DC電源插口
27)導(dǎo)線若干
28)焊錫若干
29)USB電源線或電池盒
致 謝
很高興這次能能夠完成這次的電子課程設(shè)計。尤其是與老師和同學(xué)給予我的幫助是分不開的,老師們的悉心指導(dǎo)讓我們很快找到了入手的方向,小組成員之間的團結(jié)協(xié)作讓組內(nèi)工作非常高效和有序,這次的實踐讓我學(xué)到了很多,無論是知識,還是友誼,都將會是我人生中一筆寶貴的財富,在此向大家表達(dá)一下我由衷地感謝,希望在接下來的工作和學(xué)習(xí)中,我們一起共同進(jìn)步!
單片機源程序如下:
- #include<reg52.h> //包含頭文件
- #include<intrins.h>
- #define uchar unsigned char //宏定義
- #define uint unsigned int
- sbit s1=P3^5; //定義按鍵的接口
- sbit s2=P3^6;
- sbit s3=P3^7;
- sbit s4=P3^4;
- sbit led0=P3^0;
- sbit led1=P3^1;
- sbit led2=P3^2;
- sbit led3=P3^3;
- sbit lcdrs=P2^7; //液晶控制位
- sbit lcden=P2^6;
- char num,boxing,u; //定義全局變量
- int pinlv=100,bujin=1,bujin1=1;
- uchar code table[]="0123456789"; //定義顯示的數(shù)組
- uchar code table1[]="Fout= Wave form:";
- unsigned long int m;
- int a,b,h,num1;//自定義字符
- uchar code zifu[]={
- 0x0e,0x11,0x11,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x00,
- 0x00,0x07,0x04,0x04,0x04,0x04,0x1c,0x00,
- 0x00,0x1c,0x04,0x04,0x04,0x04,0x07,0x00,
- 0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00,
- 0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,
- 0x00,0x01,0x03,0x05,0x09,0x11,0x00,0x00, };
- uchar code sin[64]={
- 135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
- 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
- };
- uchar code juxing[64]={
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- }; //矩形波取碼
- uchar code sanjiao[64]={
- 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
- 248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
- }; //三角波取碼
- uchar code juchi[64]={
- 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
- 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
- }; //鋸齒波取碼
- void delay(uint xms) //延時函數(shù)
- {
- int a,b;
- for(a=xms;a>0;a--)
- for(b=110;b>0;b--);
- }
- void write_com(uchar com) //寫命令函數(shù)
- {
- lcdrs=0;
- P0=com;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void write_date(uchar date) //寫數(shù)據(jù)函數(shù)
- {
- lcdrs=1;
- P0=date;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }//自定義字符集
- void Lcd_ram()
- {
- uint i,j,k=0,temp=0x40;
- for(i=0;i<7;i++)
- {
- for(j=0;j<8;j++)
- {
- write_com(temp+j);
- write_date(zifu[k]);
- k++;
- }
- temp=temp+8;
- }
- }
- void init_lcd() //初始化函數(shù)
- {
- uchar i;
- lcden=0; //默認(rèn)開始狀態(tài)為關(guān)使能端,見時序圖
- Lcd_ram();
- write_com(0x0f);
- write_com(0x38); //顯示模式設(shè)置,默認(rèn)為0x38,不用變。
- write_com(0x01); //顯示清屏,將上次的內(nèi)容清除,默認(rèn)為0x01.
- write_com(0x0c); //顯示功能設(shè)置0x0f為開顯示,顯示光標(biāo),光標(biāo)閃爍;0x0c為開顯示,不顯光標(biāo),光標(biāo)不閃
- write_com(0x06); //設(shè)置光標(biāo)狀態(tài)默認(rèn)0x06,為讀一個字符光標(biāo)加1.
- write_com(0x80); //設(shè)置初始化數(shù)據(jù)指針,是在讀指令的操作里進(jìn)行的
- for(i=10;i<20;i++) //顯示初始化
- {
- write_date(table1[i]);
- }
- write_com(0x80+0x40);
- for(i=0;i<9;i++)
- {
- write_date(table1[i]);
- }
- write_com(0x80+10);
- write_date(0);
- write_date(1);
- write_date(0);
- write_date(1);
- write_date(0);
- write_date(1);
- write_com(0x80+0x40+0x09);
- write_date(' ');
- write_date('1');
- write_date('0');
- write_date('.');
- write_date('0');
- write_date('H');
- write_date('z');
- }
- void initclock() //時鐘初始化
- {
- TMOD=0x01;
- TH0=a;
- TL0=b;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void display() //顯示函數(shù)
- {
- uchar qian,bai,shi,ge;
- qian=pinlv/1000;
- bai=pinlv%1000/100;
- shi=pinlv%1000%100/10;
- ge=pinlv%1000%100%10;
- write_com(0x80+0x40+0x09);
- if(qian==0)
- write_date(' ');
- else
- write_date(table[qian]);
- if(qian==0&&bai==0)
- write_date(' ');
- else
- write_date(table[bai]);
- write_date(table[shi]);
- write_date('.');
- write_date(table[ge]);
- write_date('H');
- write_date('z');
- if(boxing==0)
- {
- write_com(0x80+10);
- write_date(0);
- write_date(1);
- write_date(0);
- write_date(1);
- write_date(0);
- write_date(1);
- led3=1;
- led0=0;
- }
- if(boxing==1)
- {
- write_com(0x80+10);
- write_date(2);
- write_date(3);
- write_date(2);
- write_date(3);
- write_date(2);
- write_date(3);
- led0=1;
- led1=0;
- }
- if(boxing==2)
- {
- write_com(0x80+10);
- write_date(4);
- write_date(5);
- write_date(4);
- write_date(5);
- write_date(4);
- write_date(5);
- led1=1;
- led2=0;
- }
- if(boxing==3)
- {
- write_com(0x80+10);
- write_date(6);
- write_date(6);
- write_date(6);
- write_date(6);
- write_date(6);
- write_date(6);
- led2=1;
- led3=0;
- }
-
- }
- void keyscan() //鍵盤檢測函數(shù)
- {
- if(s1==0)
- {
- EA=0;
- delay(2);
- if(s1==0)
- {
- while(!s1);
- pinlv+=bujin;
- if(pinlv>1000)
- {
- pinlv=100;
- }
- display();
- m=65536-(150000/pinlv);
- a=m/256;
- b=m%256;
- EA=1;
- }
- }
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- EA=0;
- while(!s2);
- pinlv-=bujin;
- if(pinlv<100)
- {
- pinlv=1000;
- }
- display();
- m=65536-(150000/pinlv);
- a=m/256;
- b=m%256;
- EA=1;
- }
- }
- if(s3==0)
- {
- delay(5);
- if(s3==0)
- {
- EA=0;
- while(!s3);
- boxing++;
- if(boxing>=4)
- {
- boxing=0;
- }
- display();
- EA=1;
- }
- }
- }
- void bujindisplay()
- {
- uint bai,shi,ge;
- bai=bujin1/100;
- shi=bujin1%100/10;
- ge=bujin1%100%10;
- write_com(0x80+11);
- if(bai==0)
- write_date(' ');
- else
- write_date(table[bai]);
- write_date(table[shi]);
- write_date('.');
- write_date(table[ge]);
- }
- void bujinjiance()
- {
- if(s4==0)
- {
- delay(5);
- if(s4==0)
- {
- while(!s4);
- h++;
- if(h==1)
- {
- write_com(0x01);
- write_com(0x80);
- write_date('S');delay(1); //step value
- write_date('t');delay(1);
- write_date('e');delay(1);
- write_date('p');delay(1);
- write_date(' ');delay(1);
- write_date('v');delay(1);
- write_date('a');delay(1);
- write_date('l');delay(1);
- write_date('u');delay(1);
- write_date('e');delay(1);
- write_date(':');delay(1);
- bujin1=bujin;
- bujindisplay();
- }
- if(h==2)
- {
- h=0;
- bujin=bujin1;
- init_lcd();
- initclock();
- display();
- }
- }
- }
- if(h==1)
- {
- if(s1==0)
- {
- delay(5);
- if(s1==0)
- {
- while(!s1);
- bujin1++;
- if(bujin1>=101)
- {
- bujin1=1;
- }
- bujindisplay();
- }
- }
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- while(!s2);
- bujin1--;
- if(bujin1<=0)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼 完整的Word格式文檔51黑下載地址:
基于單片機的簡易智能源信號發(fā)生器.docx
(19.79 MB, 下載次數(shù): 118)
2018-10-16 22:23 上傳
點擊文件名下載附件
簡易信號發(fā)生器 下載積分: 黑幣 -5
|