單片機波形發(fā)生器_第1頁
單片機波形發(fā)生器_第2頁
單片機波形發(fā)生器_第3頁
單片機波形發(fā)生器_第4頁
單片機波形發(fā)生器_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、信息科學(xué)與技術(shù)學(xué)院波形發(fā)生器課程設(shè)計報告題目名稱:波心發(fā)生器 學(xué)生姓名:張昕灝學(xué) 號:2018508087專業(yè)年級:指導(dǎo)教師:時間:10級電信1班劉巧2018-07-6目錄1.設(shè)計要求12設(shè)計方案12.1總體方案12.2幅度頻率調(diào)節(jié)方案12.3工作原理13. 設(shè)計內(nèi)容23.1硬件原理電路圖的設(shè)計及分析23.1.1單片機接口 23.1.2矩陣按鍵33.1.3指示燈33.1.4數(shù)模轉(zhuǎn)換43.2程序設(shè)計與分析43.2.1初始化43.2.2功能選擇53.2.3頻率 周期)和幅度設(shè)置53.2.4波形產(chǎn)生64. 仿真結(jié)果85. 心得體會96. 附錄96.1源程序96.2仿真電路、PCB圖和開發(fā)板191.

2、設(shè)計要求設(shè)計一個如下波形發(fā)生器 :1. 可產(chǎn)生鋸齒波、三角波、方波;2. 通過三個按鍵選擇輸出的波形,可選擇不同幅值和頻率;3. 需要在仿真軟件上繪制設(shè)計電路圖,并仿真實現(xiàn)4. 使用開發(fā)板設(shè)計實現(xiàn),可外接示波器觀察結(jié)果5. 開發(fā)板設(shè)計與仿真設(shè)計盡可能一致2. 設(shè)計方案2.1 總體方案采用AT89C51單片機和PCF8591數(shù)模轉(zhuǎn)換器生成波形,生成的波形比較純 凈。它的特點是可產(chǎn)生任意波形,頻率容易調(diào)節(jié),穩(wěn)定性好、操作方便、體積 小、耗電少。經(jīng)比較,方案該既可滿足課程設(shè)計的基本要求又能充分發(fā)揮其優(yōu)勢,電路簡單,易控 制,性價比高,所以采用該方案。2.2 幅度頻率調(diào)節(jié)方案方案 1:事先在數(shù)據(jù)存儲區(qū)

3、內(nèi)存放一批數(shù)組,當(dāng)改變頻率時便調(diào)用數(shù)組賦值 給頻率幅度。該方案的優(yōu)點是程序簡單,執(zhí)行效率較高。缺點是不能任意調(diào)節(jié) 參數(shù),并且需要事先進行計算。如果存儲的數(shù)組太少,則可調(diào)范圍就很小,如 果存儲數(shù)據(jù)太多,則計算量會大大增加,而且還可能占滿數(shù)據(jù)區(qū),而使系統(tǒng)無 法運行。方案 2:設(shè)置兩個變量來代表周期幅度,當(dāng)頻率幅度需要改變時只用改變這 連個變量的數(shù)值并用數(shù)模轉(zhuǎn)換即可。經(jīng)比較,方案二的參數(shù)可以任意調(diào)節(jié),頻率幅度可任意控制,能夠滿足設(shè)計要求2.3 工作原理數(shù)字信號可以通過數(shù) / 模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號,因此可通過產(chǎn)生數(shù)字信號 再轉(zhuǎn)換成模擬信號的方法來獲得所需要的波形。 AT89C51 單片機本身就是一個

4、 完整的微型計算機,具有組成微型計算機的各部分部件:中央處理器CPU、隨機存取存儲器RAM只讀存儲器ROM、I/O接口電路、定時器/計數(shù)器以及串行按鍵查詢按鍵停止 、 , , 1頻率設(shè)置h一通訊接口等,只要將 AT89C51再配置鍵盤及、數(shù)模轉(zhuǎn)換及波形輸出等部分,即 可構(gòu)成所需的波形發(fā)生器,其信號發(fā)生器構(gòu)成系統(tǒng)框圖如下圖所示幅頻調(diào)整幅度設(shè)置 波形產(chǎn)生圖一數(shù)模轉(zhuǎn)換波形輸出3. 設(shè)計內(nèi)容3.1硬件原理電路圖的設(shè)計及分析3.1.1單片機接口圖二按鍵由P2 口連接按鍵,P0 口連接LED指示燈,p3.6和P3.7分別輸出時序和脈 沖信號。3.1.2矩陣按鍵圖三鍵盤開關(guān)KEYIN端默認(rèn)是高電平信號,KE

5、YOUT端由程序控制輸出。當(dāng) KEYOUT輸出低電平時,通過檢查KEYIN端是否為低電平即可判斷是否按鍵。如果KEYOUT輸出高電平,KEYIN端任然是高電平,故而按鍵無效按鍵位置對應(yīng)功能輸出方波輸出三角波輸出鋸齒波退出波形輸出增大周期減小周期退出周期設(shè)置增大幅度減小幅度退出幅度設(shè)置當(dāng)某個波形輸出時,只有退出波形輸出才能進行其他操作或選擇輸出其他波 形。當(dāng)設(shè)置周期時,如果不退出周期設(shè)置,則不能進行其他操作。 當(dāng)設(shè)置幅度時,如果不退出幅度設(shè)置,則不能進行其他操作。3.1.3指示燈為便于操作,在方案中設(shè)計了顯示燈。當(dāng)燈亮?xí)r,從左到右依次表示等待 操作、正執(zhí)行某個功能、修改頻率或幅度、等待幅度值修改

6、、等待頻率值修 改、方波輸出、三角波輸出、鋸齒波輸出3.1.4數(shù)模轉(zhuǎn)換void main ()EKLEE=;ADDRO=ADDR1=1;ADDR2-1;ADDR3=1; otherKeyl; ledAll=Ox; mnl ):圖五SDA連接單片機P3.6 口,SCL連接單片機P3.7 口。他們對應(yīng)的是時鐘和脈沖 信號的輸出。PCF8591是數(shù)模轉(zhuǎn)換器件,AOUT 口輸出的是轉(zhuǎn)換后的模擬信 號波形。3.2程序設(shè)計與分析3.2.1初始化因為在單片機開發(fā)板中,有對應(yīng)模塊 的控制信號,所以必須初始化。而對于 仿真電路來說,為了設(shè)計簡單,而省略 了一些控制模塊和信號,直接對所用模 塊操作即可,不必進行初

7、始化。3.2.2功能選擇whrile(l)mnfudu=O;stopLedO;if (fuDujia=0) | (fuDujian=O) U enFuou=l;enpi nbv=0;if nLvlia=O) | | (pHnLvian=O)enpi nLv=l;errBo=0;if(jjchieo=0)t* if(sanJ1aoBo=0)If(fangBo=0)erreo=l;程序采用循環(huán)查詢方式進行 按鍵功能選擇。因為按鍵行列中,不同按鍵 有相同引腳的控制,所以在 進行查詢不同功能選擇時, 一定要開放有關(guān)控制信號, 而關(guān)閉干擾信號。因為所有信號默認(rèn)是關(guān)閉 的,說以程序中只需要開放 相關(guān)信號,

8、并及時關(guān)閉即 可。3.2.3頻率 周期)和幅度設(shè)置1)頻率 周期)設(shè)置主程序的調(diào)用方式:cm pinLvStop是按鍵信號,默認(rèn)高電平 頻率 /當(dāng)按下周期加信號鍵modifyLed=0。II參數(shù)修改指示燈信號,0表示有修改請求,燈亮if(pi nLv255 II當(dāng)周期已達(dá)到上限,仍要增加時,設(shè)置為最小值 pin Lv=5。elsepinLv+=5。else if(pin LvJia n=0modifyLed=0。if(pin Lv/當(dāng)周期達(dá)到下限,還要減小時,設(shè)置為最大值pin Lv=255。elsepinLv-=5。elsemodifyLed=1 。2)幅度設(shè)置 與周期設(shè)置類似-略)pinL

9、vi)(whi le (f uDulpirLLvl)fuDul-=pnLv1; shang+4;yuShu=pinLvl-fuDul: break;else if(pinLvlfuDul)while(pinLvlfuDulpiriLvl-=fuDul;shang4+;yuShu-fuIul-pinLvi ; break;elseshang=L;yuShu0; break;因為頻率和幅度絕大多數(shù)情況 下不相等,對于方波無所謂。但對 于采用累加方式,來實現(xiàn)波形變化 同時使用循環(huán)方式來實現(xiàn)周期產(chǎn)生 的鋸齒波和三角波來說,就不一樣 了。具體如下:如果周期比幅度大,則實際幅 度會大于想要的幅度。另外因為

10、單 片機對于溢出的數(shù)據(jù)會清零,所以 有可能出現(xiàn)大幅度值與小幅度值交 替出現(xiàn)的結(jié)果。如果幅度值大于周期,則因為 周期太小,還沒有加到幅度值,一 個周期內(nèi)的波就已經(jīng)結(jié)束。因此需要確定周期和幅度的比 例關(guān)系,單片機C語言沒有除法, 故而只能用減法得出關(guān)系。3.2.4波形產(chǎn)生1)方波for(i=0。 i wave=fuDu。tran sformData(wave。 if(boStop=0break。for(i=pinLv。i0。i-wave=0。tran sformData(wave。 if(boStop=0break。pi nLv幅度=周期x商+余數(shù)wave=yuShu。for(i=0。 itran

11、 sformData(wave。wave+=sha ng。if(boStop=0break。wave=0。delay(p in Lv。else/周期二幅度x商+余數(shù)delay(yuShu。for(i=0。ivfuDu。i+delay(sha ng為tran sformData(wave。wave+。if(boStop=0break。wave=0。delay(p in Lv。3)三角波 pinLv)( wave=yu5hu;for 2; KpinLv; 1+transforitData (wave; wave+=shang;i f(fcoStop=0)break:for(i=0;ipinLv;i

12、+ transforitDfit* (wave); wave-=shang;i f(boStop=0break;wave=0;elsedelayyuShu):for (i=0; KfuDu; i+)delay(shang); transf azirData (wave); wave+;if (baSopObreak;for(i-0;i&(keyout仁=0sbit juChiBo=P2A6 。sbit boStop=P2A7。sbit san JiaoBo=P2A5。/keyi n2-k2=(keyi n2=0&(keyout 仁=0/keyin3-k3=(keyin3=0&(keyout1=

13、0/keyin4-k4=(keyin4=0&(keyout1=0/keyout1sbit pinLvJia=P2A4 。sbit pinLvJian=P2A5 。sbit pinLvStop=P2A6 。sbit enPinLv=P2A2 。 sbit fuDuJia=P2A4 。 sbit fuDuJian=P2A5 。sbit fuDuStop=P2A6 。sbit enBo=P2A3 。/keyin1-k5=(keyin1=0&(keyout2=0 /keyin2-k6=(keyin2=0&(keyout2=0/keyin3-k7=(keyin3=0&(keyout2=0/keyout2

14、/keyin1-k9=(keyin1=0&(keyout3=0/keyin2-k10=(keyin2=0&(keyout3=0/keyin3-k11=(keyin3=0&(keyout3=0sbit enFuDu=P2A1 。/keyout3sbit otherKey=P2A0 。/keyout4 sbit juChiBoLed=P0A0 。sbit sanJiaoBoLed=P0A1 。 sbit fangBoLed=P0A2 。sbit pinLvLed=P0A3 。sbit fuDuLed=P0A4 。sbit modifyLed=P0A5 。 sbit startLed=P0A6 。s

15、bit stopLed=P0A7 。 sbit ENLED=P1A4 。sbit ADDR0=P1A0 。sbit ADDR1=P1A1 。sbit ADDR2=P1A2 。sbit ADDR3=P1A3 。void sanJiaoBo1( 。void juChiBo1( 。void fangBo1( 。void fuDu1( 。void pinLv1( 。void fuPin1(cint pinLv1,uint fuDu1 。void run1( 。void delay(uint x 。void transformData(uint a 。#endifFile1 end 源文件 2:DA.h

16、File2 begin #ifndef _AD_#define _AD_#define nops(。 do_nop_( 。 _nop_(。 while(0 /#define PCF8591 0x90 /PCF8591 ?sbit ADDA_SCL=P37。I2Csbit ADDA_SDA=P3A6。/I2Cbit ack。/void Start_I2c( 。void Stop_I2c( 。void SendByte(unsigned char c 。bit DACconversion(unsigned char sla, unsigned char c, unsigned char val 。

17、 #endifFile2 end 源文件 3: DA.cFile3 begin #include #includeDA.hvoid Start_I2c(/ADDA_SDA=1 。nops(。ADDA_SCL=1 。nops(。ADDA_SDA=0 。nops(。ADDA_SCL=0 。nops(。/* */void Stop_I2c(/ADDA_SCL=0 。 nops(。ADDA_SDA=0 。 nops(。ADDA_SCL=1 。 nops(。ADDA_SDA=1 。 nops(。*/ void SendByte(unsigned char c/ unsigned char i 。for

18、(i=0 。 iif (c & 0x80ADDA_SDA=1 。 elseADDA_SDA=0 。 nops(。ADDA_SCL=1 。 nops(。ADDA_SCL=0 。ADDA_SDA=1 。nops(。ADDA_SCL=1 。nops(。if (ADDA_SDA=1ack=0。elseack=1。ADDA_SCL=0 。/*/ bit DACconversion(unsigned char sla, unsigned char c, unsigned char val/Start_I2c( 。 /SendByte(sla 。/if (ack=0 return(0 。SendByte(c

19、 。/if (ack=0 return(0 。SendByte(val 。 / if (ack=0 return(0 。Stop_I2c( 。 / return(1 。File3 end 源文件 4: waveformGenerator.cFile4 begin #include#includeWG .h#includeDA.cuint i=0 。uint j=0 。uint shang=0 。uint yuShu=0 。cint pinLv=255 。uint fuDu=255 。uint wave=0 。/void main(ENLED=0 。ADDR0=0 。ADDR1=1 。ADDR2

20、=1 。ADDR3=1 。otherKey=1 。ledAll=0xff 。run1( 。/void run1(while(1enFuDu=0。stopLed=0。 if(fuDuJia=0|(fuDuJian=0 startLed=0 。stopLed=1。fuDuLed=0 。while(fuDuStopfuDu1( 。 fuPin1(pinLv,fuDu 。 fuDuLed=1 。stopLed=0。startLed=1 。enFuDu=1。enPinLv=0 。 if(pinLvJia=0|(pinLvJian=0 startLed=0 。stopLed=1。pinLvLed=0 。

21、while(pinLvStoppinLv1( 。 fuPin1(pinLv,fuDu 。pinLvLed=1 。stopLed=0。startLed=1 。enPinLv=1 。/fuPin1(pinLv,fuDu 。 enBo=0 。if(juChiBo=0startLed=0 。stopLed=1。juChiBoLed=0 。/delay(300 。 while(boStopjuChiBo1( 。 / juChiBoLed=1 。stopLed=0。startLed=1 。 if(sanJiaoBo=0startLed=0 。stopLed=1。sanJiaoBoLed=0 。 /dela

22、y(300 。 while(boStopsanJiaoBo1( 。 sanJiaoBoLed=1 。stopLed=0。startLed=1 。if(fangBo=0startLed=0 。stopLed=1。fangBoLed=0 。/delay(300 。 while(boStopfangBo1( 。 fangBoLed=1 。stopLed=0。startLed=1 。enBo=1 。/void fuDu1(if(fuDuJia=0modifyLed=0 。if(fuDu255 fuDu=5 。elsefuDu+=5 。else if(fuDuJian=0modifyLed=0 。if(

23、fuDufuDu=255 。 else fuDu-=5 。elsemodifyLed=1 。/void pinLv1(if(pinLvJia=0modifyLed=0 。if(pinLv255 pinLv=5 。elsepinLv+=5 。else if(pinLvJian=0modifyLed=0 。if(pinLvpinLv=255 。elsepinLv-=5 。elsemodifyLed=1 。/ void fuPin1(cint pinLv1,uint fuDu1shang=0。yuShu=0。while(1if(fuDu1pinLv1while(fuDu1pinLv1fuDu1-=p

24、inLv1 。 shang+。yuShu=pinLv1-fuDu1 。 break。else if(pinLv1fuDu1while(pinLv1fuDu1pinLv1-=fuDu1 。 shang+。yuShu=fuDu1-pinLv1 。 break。elseshang=1。yuShu=0。 break。/ void fangBo1(for(i=0 。 iwave=fuDu 。transformData(wave 。 if(boStop=0break 。for(i=pinLv。i0。i-wave=0。transformData(wave 。 if(boStop=0break 。/*wave=fuDu 。delay(pinLv 。wave=0 。delay(pinLv 。 */void juChiBo1(wave=0 。if(fuD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。