版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 課 程 設(shè) 計</b></p><p> 題 目 波形發(fā)生器</p><p> 姓 名 </p><p><b> 院 (系) </b></p><p><b> 專業(yè)班級 </b></p>
2、<p> 學 號 </p><p> 日 期 2010年12月13日—2010年12月19日</p><p><b> 摘要</b></p><p> 數(shù)模轉(zhuǎn)化器可以實現(xiàn)將數(shù)字量轉(zhuǎn)化為模擬量的功能,對于理想的數(shù)模轉(zhuǎn)換器,輸入的數(shù)字量的波形與輸出的模擬量之間呈線性關(guān)系。因此,通過使用單片機來輸出不同的數(shù)
3、字量,再通過D/A轉(zhuǎn)換,就可以得到不同的波形。本文主要講述通過單片機產(chǎn)生方波、三角波、鋸齒波、梯形波、正弦波的數(shù)字量,并給出相應的D/A轉(zhuǎn)化電路,進而得到具有相應波形的模擬量。這五種波形的數(shù)字量都可以簡單地通過定時器中斷來產(chǎn)生。</p><p> 關(guān)鍵詞:波形發(fā)生 數(shù)模轉(zhuǎn)換 單片機 定時器中斷</p><p><b> 實驗原理</b></p>
4、<p> 利用單片機實現(xiàn)波形輸出的重點在于對應波形的數(shù)字量的產(chǎn)生。不同波形產(chǎn)生實質(zhì)上是對輸出的二進制數(shù)字量進行相應改變來實現(xiàn)的。在本文中,所有波形的二進制數(shù)字量的產(chǎn)生都通過定時器中斷。在每次中斷中,八位的二進制數(shù)字量通過I/O口輸出,再經(jīng)由D/A轉(zhuǎn)化電路轉(zhuǎn)化為模擬量。除正弦信號,其他波形的初始的八位二進制數(shù)字量都為0。各種波形的數(shù)字量產(chǎn)生如下:</p><p> 對于方波信號,在每次定時器中斷時都
5、對二進制數(shù)字量進行位取反,因此,方波信號的二進制數(shù)字量總是在0x00和0xff二者上變動。</p><p> 對于三角波信號,在每次定時器中斷中,二進制數(shù)字量依次加1,達到0xff時依次減1</p><p> 對于鋸齒波信號,其類似于三角波信號,但在達到0xff時將二進制數(shù)字量置為0x00</p><p> 對于梯形波信號,其類似于三角波信號,但在達到0xff
6、或0x00時,都會保持一段時間</p><p> 對于正弦波信號,可以直接對正弦曲線進行均勻取樣后直接轉(zhuǎn)化為數(shù)字量,在每次定時器中斷中,都依序?qū)⑦@些數(shù)字量輸出</p><p> 對于D/A轉(zhuǎn)換,可以利用集成芯片DAC0832來實現(xiàn)。由于DAC0832輸出的是電流量,在D/A轉(zhuǎn)換后需要添加額外的比例運放電路來產(chǎn)生電壓量。</p><p><b> 實驗
7、電路</b></p><p> 實驗的流程如下:單片機在開始運行后就會不斷進行鍵盤掃描。當按下對應波形的按鈕后,單片機會產(chǎn)生相應波形的數(shù)字量,這個數(shù)字量作為DAC0832的輸入再被轉(zhuǎn)化為電流量。電流量經(jīng)過兩個反比例運算放大器后,轉(zhuǎn)化為電壓量輸出到示波器中顯示。</p><p><b> 實驗結(jié)果</b></p><p> 實驗
8、所產(chǎn)生的方波、三角波、鋸齒波、梯形波、正弦波波形如下所示</p><p><b> 實驗體會</b></p><p><b> 程序代碼</b></p><p> #include <at89c51cc03.h></p><p> typedef unsigned char uc
9、har;</p><p> typedef unsigned int uint;</p><p> //正弦曲線四分之一周期曲線的數(shù)字量</p><p> uchar code sdata[256] = \</p><p> {128,130,131,133,134,136,137,139,140,142,144,145,147,14
10、8,150,151,153,154,156,157,159,160,162,164,165,167,168,169,171,172,174,175,177,178,180,181,182,184,185,187,188,189,191,192,194,195,196,197,199,200,201,203,204,205,206,208,209,210,211,212,214,215,216,217,218,219,220,221,22
11、2,223,224,225,226,227,228,229,230,231,232,233,234,235,236,236,237,238,239,240,240,241,242,242,243,244,244,245,246,246,247,247,248,248,249,249,250,250,251,251,251,252,252,252,253,253,253,253,254,254,254,254,254,255,255,25
12、5,255</p><p> //timer用于重裝時間常數(shù)</p><p> static union{</p><p> uint time;</p><p><b> struct{</b></p><p><b> uchar th;</b></p&g
13、t;<p><b> uchar tl;</b></p><p> }time_array;</p><p><b> }timer;</b></p><p> //counter用于波形發(fā)生時的計數(shù),從0到255</p><p> static uchar counter;
14、</p><p> //state表示當前所要輸出波形,1表示方波,2表示三角波,3表示鋸齒玻,4表示梯形波,5表示正弦波,0表示暫停波形發(fā)生(保持P2口輸出不變)</p><p> static uchar state;</p><p> //new_state根據(jù)P1口的電平,轉(zhuǎn)化為state</p><p> static uc
15、har new_state;</p><p> //check_state_bit用于get_state函數(shù)中</p><p> static uchar check_state_bit;</p><p> //direction表示波形方向,direction=0表示波形處于上升,direction=1表示波形處于下降</p><p>
16、; static bit direction; </p><p> //delay用于梯形波中</p><p> static bit delay;</p><p> //stop表示暫停波形發(fā)生(保持P2口輸出不變)</p><p> static bit stop;</p><p><b>
17、/*</b></p><p> 獲取當前狀態(tài),即哪個按鈕被按下</p><p> 若沒有按鈕被按下,則state保持不變</p><p> 若P1_0=0,則state=1,表示方波發(fā)生</p><p> 若P1_1=0,則state=2,表示三角波發(fā)生</p><p><b> 以此類
18、推</b></p><p> 若P1_5=0,則state=0,表示暫停波形發(fā)生(保持P2口輸出不變)</p><p><b> */</b></p><p> void get_state(){</p><p> //優(yōu)先考慮P1_5口,即優(yōu)先考慮暫停波形發(fā)生</p><p>
19、; if(!P1_5){</p><p> new_state = 0;</p><p><b> return;</b></p><p><b> }</b></p><p> check_state_bit = 0x01;</p><p> new_state
20、=1;</p><p> while ((check_state_bit & P1) && new_state<6){</p><p> check_state_bit<<=1;</p><p> ++new_state;</p><p><b> }</b></p
21、><p> if(new_state==6)</p><p> new_state = state;</p><p><b> }</b></p><p> //每次state即將發(fā)生改變,即切換輸出到另一種波形時,都進行初始化</p><p> void init(){</p>
22、<p><b> P2=0;</b></p><p> direction=0;</p><p> counter=0;</p><p><b> }</b></p><p> //檢查P1口,以輸出相應的選擇的波形</p><p> void ch
23、eck(){</p><p> get_state();</p><p> //如果state即將發(fā)生改變</p><p> if(state!=new_state){</p><p> //當P1_5口為低電平,new_state=0</p><p> //則暫停波形發(fā)生,則暫停定時器1定時,并令P3_6口
24、(WR)為高電平</p><p> if(new_state==0){</p><p><b> P3_6=1;</b></p><p><b> TR1=0;</b></p><p><b> stop=1;</b></p><p><b
25、> return;</b></p><p><b> }</b></p><p><b> //切換輸出波形</b></p><p><b> else{</b></p><p><b> init();</b></p&g
26、t;<p> state = new_state;</p><p> if(state==4)</p><p><b> delay=0;</b></p><p><b> }</b></p><p><b> }</b></p><
27、p> else if(stop){</p><p><b> P3_6=0;</b></p><p><b> TR1=1;</b></p><p><b> stop=0;</b></p><p><b> }</b></p>
28、<p><b> }</b></p><p> //當INT0腳接收到一個下降沿,則觸發(fā)外部中斷0</p><p> //則輸出波形的周期倍增</p><p> void int0int() interrupt 0{</p><p> if(timer.time==15680)</p>
29、<p> timer.time = 245;</p><p><b> else</b></p><p> timer.time<<=1;</p><p><b> init();</b></p><p><b> }</b></p&g
30、t;<p> //當INT1腳接收到一個下降沿,則觸發(fā)外部中斷1</p><p> //則輸出波形的周期倍減</p><p> void int1int() interrupt 2{</p><p> if(timer.time==245)</p><p> timer.time = 15680;</p>
31、<p><b> else</b></p><p> timer.time>>=1;</p><p><b> init();</b></p><p><b> }</b></p><p> //定時器1用于波形的發(fā)生</p>&
32、lt;p> void timeint() interrupt 3{</p><p> //~time.time等價于time.time=65535-time.time</p><p> timer.time = ~timer.time + 1;</p><p> TL1 = timer.time_array.tl;</p><p&g
33、t; TH1 = timer.time_array.th;</p><p> timer.time = ~( timer.time -1 );</p><p><b> //方波發(fā)生</b></p><p> if(state==1){</p><p> ++counter;</p><p&
34、gt; if(counter==0xff){</p><p> direction = ~direction;</p><p><b> P2 = ~P2;</b></p><p> counter = 1;</p><p><b> }</b></p><p>&
35、lt;b> }</b></p><p><b> //其余波的發(fā)生</b></p><p> else if(state>1 && state<6){</p><p> //當輸出梯形波,若delay=1則進行延遲,即保持當前輸出電平不變</p><p> if (
36、state==4){</p><p> if(!delay)</p><p> P2=counter;</p><p><b> }</b></p><p><b> //輸出正弦波</b></p><p> else if(state==5){</p>
37、<p> if(direction)</p><p> P2 = ~(sdata[counter])+1;</p><p><b> else</b></p><p> P2 = sdata[counter];</p><p><b> }</b></p>&l
38、t;p> //輸出三角波、鋸齒波</p><p><b> else</b></p><p> P2=counter;</p><p> //當波形處于下降過程</p><p> if(direction){</p><p> //若counter下降至0,則改變波形方向至上升
39、過程</p><p> if(counter == 0){</p><p> //對于梯形波,下降結(jié)束后進行延遲</p><p> if(state==4){</p><p> delay=~delay;</p><p><b> if(delay)</b></p><
40、;p> counter=0xfe;</p><p><b> else</b></p><p> direction=~direction;</p><p><b> }</b></p><p><b> else{</b></p><p&g
41、t; direction=~direction;</p><p> counter++;</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p> counter
42、--;</p><p><b> }</b></p><p> //當波形處于上升過程</p><p><b> else{</b></p><p> //若counter上升至0xff,則改變波形方向至下降過程</p><p> if(counter==0xff)
43、{</p><p> //對于梯形波,上升結(jié)束后進行延遲</p><p> if(state==4){</p><p> delay=~delay;</p><p><b> if(delay)</b></p><p> counter=0x01;</p><p>
44、;<b> else</b></p><p> direction=~direction;</p><p><b> }</b></p><p> //對于鋸齒波,當上升至0xff,將counter置為0</p><p> else if(state==3)</p><
45、p> counter=0;</p><p><b> else{</b></p><p> direction=~direction;</p><p> counter--;</p><p><b> }</b></p><p><b> }<
46、;/b></p><p><b> else</b></p><p> counter++;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></
47、p><p> void main(){</p><p> IEN = 0x8F;</p><p> TMOD = 0x10;</p><p><b> PT1 = 1;</b></p><p><b> IT0 = 1;</b></p><p>
48、<b> IT1 = 1;</b></p><p> state = 0xff;</p><p><b> P3_6 = 0;</b></p><p> //~time.time等價于time.time=65535-time.time</p><p> timer.time = 1960;
49、</p><p> timer.time = ~timer.time + 1;</p><p> TL1 = timer.time_array.tl;</p><p> TH1 = timer.time_array.th;</p><p> timer.time = ~( timer.time -1 );</p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計——波形發(fā)生器
- 波形發(fā)生器課程設(shè)計
- 課程設(shè)計——波形發(fā)生器
- 課程設(shè)計-波形發(fā)生器
- 波形發(fā)生器課程設(shè)計
- 波形發(fā)生器課程設(shè)計
- 課程設(shè)計--波形發(fā)生器設(shè)計
- 課程設(shè)計--函數(shù)波形發(fā)生器
- vlsi波形發(fā)生器課程設(shè)計
- 波形發(fā)生器課程設(shè)計報告
- 波形發(fā)生器課程設(shè)計報告
- 波形發(fā)生器課程設(shè)計報告
- 簡易波形發(fā)生器課程設(shè)計
- 波形發(fā)生器的設(shè)計課程設(shè)計
- eda課程設(shè)計--任意波形發(fā)生器
- 綜合課程設(shè)計--簡易波形發(fā)生器
- 微機課程設(shè)計報告-波形發(fā)生器
- 微機原理課程設(shè)計波形發(fā)生器
- 模電課程設(shè)計---波形發(fā)生器
- 微機原理課程設(shè)計-- 波形發(fā)生器
評論
0/150
提交評論