簡易信號發(fā)生器及其測試儀設計與制作_第1頁
簡易信號發(fā)生器及其測試儀設計與制作_第2頁
簡易信號發(fā)生器及其測試儀設計與制作_第3頁
簡易信號發(fā)生器及其測試儀設計與制作_第4頁
簡易信號發(fā)生器及其測試儀設計與制作_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、簡易信號發(fā)生器及其測試儀設計與制作學 院: 姓 名: 學 號: 班 級: 指導教師: 目錄一. 設計題目1二、設計目的1三、設計任務及要求1四、設計思路2五、設計內(nèi)容3六、設計成果12七、故障排除及注意事項15八、實驗總結15一、設計題目簡易信號發(fā)生器及其測試儀設計與制作二、設計目的能夠制作簡易的信號發(fā)生器,學習單片機相關知識,利用keil軟件和C語言進行編程,利用Altium進行電路設計,并進一步熟悉電路的布局與焊接,實現(xiàn)硬件與軟件的結合。提高獨立思考與團隊合作的能力,培養(yǎng)創(chuàng)新意識,鍛煉創(chuàng)新思維,提高創(chuàng)新能力。三、設計任務及要求設計任務:(一)利用單片機(AT89C52)及DA轉換器(AD7

2、520)作為主要元件設計并制作一信號發(fā)生裝置,其原理框圖如圖1所示。圖1:簡易信號發(fā)生器原理示意圖(二)利用單片機(AT89C52)及AD轉換器(MAX157)作為主要元件設計一信號測試儀測量(一)中所產(chǎn)生信號的頻率、信號幅度等參數(shù),其原理框圖如圖2所示。圖2:信號測試儀原理示意圖設計要求:(一)基本要求1.信號發(fā)生器至少要能夠產(chǎn)生正弦波、方波、三角波和鋸齒波等四種波形;2.信號發(fā)生器所能產(chǎn)生信號的最高頻率不得低于100HZ;3.信號發(fā)生器所能產(chǎn)生信號的最高幅度不得小于5V;4.信號發(fā)生器的所有參數(shù)均能通過鍵盤設置,并用數(shù)碼管循環(huán)顯示所設置得各個參數(shù)、也可用鍵盤選擇所需要顯示的參數(shù);5.信號測

3、試儀能利用鍵盤選擇在數(shù)碼管上顯示所測得參數(shù);6.自制系統(tǒng)所需電源。(二)擴展要求1.利用計算機設置信號波形、幅度、頻率等;2.利用計算機顯示所測得的信號參數(shù);3.其他(如掃頻等)。四、設計思路使用C語言進行編程,控制按下鍵盤中某個鍵實現(xiàn)特定的功能,通過單片機的I/O口進行輸出,產(chǎn)生的信號通過DA轉換器變換為模擬信號,并使用數(shù)碼管進行波形種類和頻率、幅度的顯示。五、設計內(nèi)容(一)軟件部分1、幅度、頻率調節(jié)模塊本次實驗中,我們所作出的信號發(fā)生器需要實現(xiàn)幅度、頻率可調,對于幅度,我們可取默認值1V,當按鍵檢測到按下時執(zhí)行加或減的命令。而頻率的調節(jié)可以通過運用中斷時間的調節(jié)來實現(xiàn)。else if(ke

4、yboard_status=5) /幅值加1,最大為5Asign=Asign+1;xianshi();if(Asign>=5)Asign=5; else if(keyboard_status=6) /幅值減1,最小為1Asign=Asign-1;if(Asign<=1)Asign=1; xianshi();else if(keyboard_status=7) /頻率加1,最大為10mscount=count+1000;if(count>=10000)count=10000;xianshi();else if(keyboard_status=8) /頻率減1,最小為1mscou

5、nt=count-1000;if(count<=1000)count=1000;xianshi();2、波形的輸出模塊信號發(fā)生器需要實現(xiàn)的是方波,三角波,鋸齒波和正弦波四種波形,我們采用的是取點法,在一個周期內(nèi)選擇64個點,并將其轉化為10位數(shù)字量送到DA轉換器中。void time (void) interrupt 1TH0=(65536-count)/256;TL0=(65536-count)%256;if(lx=0) for(m=0;m<64;m+) CP=0;qudianm=Asign*1024/5; P3=qudianm;D1=qudianm>>8;D2=qu

6、dianm>>9;CP=1;if(m>=32) CP=0;qudianm=0x00;P3=qudianm;D1=qudianm>>8;D2=qudianm>>9;CP=1;else if(lx=1)for(m=0;m<32;m+)qudianm=Asign*1024*m/64/5; CP=0;P3=qudianm;D1=qudianm>>8;D2=qudianm>>9;CP=1for(m=32;m>=1;m-) CP=0;P3=qudianm;D1=qudianm>>8;D2=qudianm>>

7、;9;CP=1; else if(lx=2)for(m=0;m<64;m+) qudianm=Asign*1024*m/64/5; CP=0;P3=qudianm;D1=qudianm>>8;D2=qudianm>>9;CP=1; else if(lx=3)for(m=0;m<64;m+) qudianm=Asign*1024*sin (0.09817477*m)/5;CP=0;P3=qudianm;D1=qudianm>>8;D2=qudianm>>9;CP=1; void main() EA=1;ET0=1;TR0=1;TMOD=

8、0x00;TH0=(65536-count)/256;TL0=(65536-count)%256;while(1)TH0=(65536-count)/256; TL0=(65536-count)%256;KeyDown(); /讀取按鍵a1=0;a2=0;a3=0;a4=0;a5=0;if( keyboard_status=0)/復位a1=0;a2=0;a3=0;a4=0;a5=0;count=1000;Asign=1;lx=0; else if(keyboard_status=1)/顯示方波 lx=0;Squarevalue(); else if(keyboard_status=2)/顯示三

9、角波 lx=1;Trianglevalue(); else if(keyboard_status=3)/顯示鋸齒波 lx=2;Sawtoothvalue(); else if(keyboard_status=4)/顯示正弦波 lx=3;Sinvalue();3.鍵盤掃描模塊利用鍵盤掃描來讀取鍵值,檢測到按鍵按下時,會進行相應的操作。void KeyDown() /按鍵檢測函數(shù)的定義 char a=0; KEY=0x0f; if(KEY!=0x0f) /讀取按鍵是否按下 Delay10ms(); /延時10ms進行消抖if(KEY!=0x0f) /再次檢測鍵盤是否按下 /測試列 KEY=0X0F

10、; switch(KEY) case(0X07):keyboard_status=0;break;case(0X0b): keyboard_status;break;case(0X0d): keyboard_status;break;case(0X0e):keyboard_status;break; /測試行KEY=0XF0;switch(KEY) case(0X70):keyboard_status=keyboard_status;break;case(0Xb0):keyboard_status=keyboard_status+4;break;case(0Xd0): keyboard_sta

11、tus=keyboard_status+8;break;case(0Xe0):keyboard_status=keyboard_status+12;break; while(a<50)&&(KEY!=0xf0) /檢測按鍵松手檢測 Delay10ms();a+; 4.延時函數(shù)void Delay10ms(void) /10ms延時函數(shù)定義 unsigned char a,b,c; for(c=1;c>0;c-) for(b=38;b>0;b-) for(a=130;a>0;a-); 5.計算各個波形的有效值顯示時顯示的為周期與有效值,因此需要將幅值進行轉

12、化,利用的為公式,定義的有效值為全局變量。void Sinvalue() /正弦波有效值 float sum1=0,sum2=0; for(i=0;i<64;i+) sum1=Asign*Asign*qudiani*qudiani+sum1;sum2=sum1/64;sum3=sqrt(sum2);a1=1,a2=0,a3=0,a4=0,a5=0;LED=LED_tab1;shu=10; while(shu-);LED=0x00; void Squarevalue()/方波有效值 float sum1=0,sum2=0; for(i=0;i<64;i+) sum1=Asign*As

13、ign*qudiani*qudiani+sum1;sum2=sum1/64;sum3=sqrt(sum2);a1=1,a2=0,a3=0,a4=0,a5=0;LED=LED_tab2;shu=10; while(shu-);LED=0x00 void Trianglevalue() /三角波有效值 float sum1=0,sum2=0; for(i=0;i<64;i+) sum1=Asign*Asign*qudiani*qudiani+sum1;sum2=sum1/64;sum3=sqrt(sum2);a1=1,a2=0,a3=0,a4=0,a5=0;LED=LED_tab3;shu=

14、10; while(shu-);LED=0x00; void Sawtoothvalue() /鋸齒波有效值 float sum1=0,sum2=0; for(i=0;i<64;i+)sum1=Asign*Asign*qudiani*qudiani+sum1;sum2=sum1/64;sum3=sqrt(sum2);a1=1,a2=0,a3=0,a4=0,a5=0;LED=LED_tab4;shu=10; while(shu-);LED=0x00; 6.顯示模塊通過5位數(shù)碼管進行顯示。第一位為波形的輸出,為1時,代表方波,為2時,代表三角波,為3時,代表鋸齒波,為4時,代表正弦波,第2.

15、3位顯示周期的十位與個位,第4.5位顯示有效值的十位與個位。void xianshi() /顯示函數(shù) if(p=1) shiwei=count/1000/10; gewei=count/1000%10; a1=0;a2=0;a3=0;a4=1;a5=0; LED=LED_tabshiwei; shu=10; while(shu-); LED=0x00; a1=0;a2=0;a3=0;a4=0;a5=1; LED=LED_tabgewei; shu=10; while(shu-); LED=0x00; if(a=1) shiwei=sum3/10; gewei=sum3%10; a1=0,a2=

16、1,a3=0,a4=0,a5=0; LED=LED_tabshiwei; shu=10; while(shu-); LED=0x00; a1=0,a2=0,a3=1,a4=0,a5=0; LED=LED_tabgewei; shu=10; while(shu-); LED=0x00; 7.主函數(shù)模塊主要是進行按鍵功能的實現(xiàn)void main() EA=1; ET0=1; TR0=1; TMOD=0x00; TH0=(65536-count)/256; TL0=(65536-count)%256; while(1) TH0=(65536-count)/256; TL0=(65536-count)

17、%256; KeyDown(); /讀取按鍵 a1=0;a2=0;a3=0;a4=0;a5=0; if( keyboard_status=0) /復位 a1=0;a2=0;a3=0;a4=0;a5=0; count=1000; Asign=1;lx=0; else if(keyboard_status=1) /方波顯示 lx=0;Squarevalue(); else if(keyboard_status=2) /三角波顯示 lx=1;Trianglevalue(); else if(keyboard_status=3) /鋸齒波顯示 lx=2;Sawtoothvalue(); else if

18、(keyboard_status=4) /正弦波顯示 lx=3;Sinvalue(); else if(keyboard_status=5) /幅值加1 Asign=Asign+1;xianshi(); if(Asign>=5) Asign=5; else if(keyboard_status=6) /幅值減1 Asign=Asign-1; if(Asign<=1)Asign=1; xianshi(); else if(keyboard_status=7) /周期加1ms count=count+1000; if(count>=10000)count=10000;xiansh

19、i(); else if(keyboard_status=8) /周期減1ms count=count-1000; if(count<=1000)count=1000;xianshi(); else if(keyboard_status=9) /顯示周期p=1;a=0;xianshi(); else if(keyboard_status=10) /顯示有效值 p=0;a=1;xianshi(); (二)硬件部分電路圖如下:(1)單片機最小系統(tǒng)為了讓單片機正常工作,需要給單片機加一個最小系統(tǒng),最小系統(tǒng)的設計很簡單,只需要復位電路和時鐘電路即可:(2)鍵盤部分采用4X4矩陣鍵盤用來輸入值,在

20、程序中定義按下某個按鍵的功能,可以實現(xiàn)波形的切換和頻率、幅值的更改,在鍵盤掃描時一旦發(fā)現(xiàn)有按鍵按下,需要進行消抖處理,消抖時間一般為5-10ms。(3)數(shù)碼管部分利用共陰極數(shù)碼管可以顯示波形和頻率、幅值,數(shù)碼管由5位位選(用來控制5個數(shù)碼管)和8位段選(A-G加小數(shù)點),數(shù)碼管還要連接五個電阻和三極管,同時要注意,在實驗中我們定義了P0口為數(shù)碼管輸出,但是P0口還要加8個上拉電阻才能正常工作。(4)數(shù)據(jù)鎖存部分因為單片機位寬8位,DA轉換器為10位位寬,在單片機里面不能實現(xiàn)10位數(shù)據(jù)同時變化,這樣會導致DA輸出不正確,所以需要鎖存器。利用74LS74和74LS573,將單片機的數(shù)據(jù)先輸出兩位,

21、再輸出八位,然后同步輸入到下一級,就可以正常工作了。(5)數(shù)模轉換部分將產(chǎn)生的數(shù)字信號轉換成模擬信號,就可以輸出為波形了。(6)放大、濾波系列因為前幾步產(chǎn)生的信號大小不能滿足題目的要求,所以要利用放大器對信號放大,又因為在波形編程的時候是取點得到的,所以產(chǎn)生的波形會有不平滑的紋波,需要用一個濾波電路進行處理。(三)器件介紹本次實驗會用到幾種比較重要或關鍵的器件,這里簡單地進行一下介紹:單片機單片機是一種集成電路芯片,是采用超大規(guī)模集成電路技術把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計數(shù)器等功能集成到一塊硅片上構成的一個小而完善的

22、微型計算機系統(tǒng),在工業(yè)控制領域廣泛應用。 本次實驗用到的單片機中有4個8位并行輸入/輸出端口,記作P0、P1、P2、P3,共32根線,每個并行IO口都能用作輸入和輸出,所以稱它們?yōu)殡p向I/O接口,通過定義每個端口輸入或輸出不同的數(shù)據(jù),在本次實驗中的應用是比較簡單的。鎖存器74LS74和74LS573 AD轉換器AD7520 AD7520 是十位 CMOS 數(shù)模轉換器,采用倒 T 形電阻網(wǎng)絡。模開關是 CMOS 型的 , 也同時集成在芯片上 ,但運算放大器是外接的 。AD7520 共有 16 個引腳,各引腳的功能如下。1 為模擬電流 輸出端,接到運算放大器的反相輸入端。2 為模擬電流 輸出端,一

23、般接 “ 地 ” 。3 為接 “ 地 ” 端。4 13 為十位數(shù)字量的輸入端。14 為 CMOS 模擬開關的 +UDD 電源接線端。15 為參考電壓電源接線端,可為正值或負值。16 為芯片內(nèi)部一個電阻 R 的引出端 , 該電阻作為運算放大器的反饋電阻 , 它的另一端在芯片內(nèi)部接端。六、設計成果電路板焊接展示:因為電路較為復雜,都從背面走線會導致電路板布局錯亂和跳線的產(chǎn)生,所以采用了部分端口使用杜邦線連接的方法,使電路板更加美觀、簡單。波形輸出展示:正弦波:方波:三角波:鋸齒波:七、故障排除及注意事項這是我們第一次接觸單片機,也是第一次進行這么復雜的實驗,在整個過程中遇到了不少問題,也學會了不少

24、東西,下面簡要記錄一下。1.鍵盤掃描部分,總是不能正確顯示按鍵值,檢查了很多遍線路都沒問題,后來用萬用表來檢測,發(fā)現(xiàn)原來是P1.2和P1.3口中間短路了,有一塊很小的飛濺的焊錫使兩個觸點連接在一起,然而用肉眼看是看不出來的,所以不要只相信自己的眼睛,要親手做一做,實踐才是檢驗真理的唯一標準。2.單片機的底座有一個管腳斷掉了,為了節(jié)約資源,我們用一根細導線代替了原來的管腳,用焊錫和金屬片固定,最后正常使用。3.在實驗過程中需要熟練地使用電烙鐵,一是為了焊出的電路不粗不細,美觀簡單,二是因為電烙鐵溫度可以達到好幾百度,一個不小心就有可能燙傷自己或引起事故。4.實驗結束后要記得關閉實驗臺電源,以及清

25、理自己產(chǎn)生的垃圾,自覺維護實驗室環(huán)境是基本的實驗素養(yǎng)。八、實驗總結本次實驗已經(jīng)結束,可是我們學到的卻有很多,在實驗開始之前,對51單片機的知識基本為0,而現(xiàn)在卻已經(jīng)編出了這么大的程序,這讓我們每一個人都感到無比欣慰。本次實驗,無論是搞硬件還是搞軟件的同學,都花費了巨大的心血,有的地方需要我們一遍遍的去圖書館和網(wǎng)上查找資料,比如搞硬件同學的電路圖原理,軟件同學的51單片機定時器應用。不僅如此,在實驗過程中,會遇到各種各樣的問題,程序不能成功運行,要一行行檢查源程序;數(shù)碼管不能正常顯示,要一遍遍的去檢查電路圖。這不僅培養(yǎng)了我們查找問題解決問題的能力,更培養(yǎng)了我們耐心、細心、專心的態(tài)度,所以通過這次

26、實驗,我們學會的不只是書本上的知識和本次實驗的內(nèi)容,也懂得了很多生活中的道理,同時我們還認識到有時候只憑一個人的力量是遠遠不夠的,所謂眾人拾柴火焰高,集體的力量是無窮的,要在自己思考的同時與同學討論,集思廣益,或許有更好的解決辦法。最后,感謝老師的悉心指導,這么多天麻煩老師給我們解決各種問題了,謝謝老師,祝您暑假愉快!附源程序:#include<reg52.h> #include<math.h> #include<INTRINS.H> #define uchar unsigned char #define uint unsigned int #define

27、LED P0 #define KEY P1 sbit D1=P21; /次高位 sbit D2=P22; /高位 sbit CP=P20; /控制端 sbit a1=P23; /數(shù)碼管位選 sbit a2=P24; sbit a3=P25; sbit a4=P26; sbit a5=P27; uchar lx=0; uchar p,a; uchar count=1000;/周期控制 uchar shu; uchar Asign=1; /默認幅值 uchar code LED_tab17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77

28、,0x7c,0x39,0x5e,0x79,0x71; int idata qudian64; /數(shù)組的長度需指明 int keyboard_status; /定義鍵值 int sum3; int m,i; uint gewei,shiwei; void Sinvalue();/ 正弦波有效值 void Squarevalue(); /方波有效值 void Trianglevalue();/三角波有效值 void Sawtoothvalue(); /鋸齒波有效值 void KeyDown(); /讀鍵值 void Delay10ms(); /延時子函數(shù) void xianshi(); /數(shù)碼管顯

29、示函數(shù) void time (void) interrupt 1 TH0=(65536-count)/256; TL0=(65536-count)%256;if(lx=0) for(m=0;m<64;m+) CP=0; qudianm=Asign*1024/5; P3=qudianm; D1=qudianm>>8; D2=qudianm>>9; CP=1;if(m>=32) CP=0; qudianm=0x00; P3=qudianm; D1=qudianm>>8; D2=qudianm>>9; CP=1; else if(lx=1)

30、 for(m=0;m<32;m+)qudianm=Asign*1024*m/64/5; CP=0;P3=qudianm;D1=qudianm>>8;D2=qudianm>>9;CP=1; for(m=32;m>=1;m-) CP=0;P3=qudianm;D1=qudianm>>8;D2=qudianm>>9;CP=1; else if(lx=2) for(m=0;m<64;m+) qudianm=Asign*1024*m/64/5; CP=0; P3=qudianm; D1=qudianm>>8; D2=qudia

31、nm>>9; CP=1; else if(lx=3)for(m=0;m<64;m+) qudianm=Asign*1024*sin (0.09817477*m)/5; CP=0; P3=qudianm; D1=qudianm>>8; D2=qudianm>>9; CP=1; void main() EA=1; ET0=1; TR0=1; TMOD=0x00; TH0=(65536-count)/256; TL0=(65536-count)%256; while(1) TH0=(65536-count)/256; TL0=(65536-count)%25

32、6; KeyDown(); /讀取按鍵 a1=0;a2=0;a3=0;a4=0;a5=0; if( keyboard_status=0) a1=0;a2=0;a3=0;a4=0;a5=0; count=1000; Asign=1;lx=0; else if(keyboard_status=1) lx=0;Squarevalue(); else if(keyboard_status=2) lx=1;Trianglevalue(); else if(keyboard_status=3) lx=2;Sawtoothvalue(); else if(keyboard_status=4) lx=3;Si

33、nvalue(); else if(keyboard_status=5) Asign=Asign+1;xianshi(); if(Asign>=5) Asign=5; else if(keyboard_status=6) Asign=Asign-1; if(Asign<=1)Asign=1; xianshi(); else if(keyboard_status=7) count=count+1000; if(count>=10000)count=10000;xianshi(); else if(keyboard_status=8) count=count-1000; if(c

34、ount<=1000)count=1000;xianshi(); else if(keyboard_status=9)p=1;a=0;xianshi(); else if(keyboard_status=10) p=0;a=1;xianshi(); void KeyDown() /按鍵檢測函數(shù)的定義 char a=0; KEY=0x0f; if(KEY!=0x0f) /讀取按鍵是否按下 Delay10ms(); /延時10ms進行消抖if(KEY!=0x0f) /再次檢測鍵盤是否按下 /測試列 KEY=0X0F; switch(KEY) case(0X07):keyboard_statu

35、s=0;break;case(0X0b): keyboard_status;break;case(0X0d): keyboard_status;break;case(0X0e):keyboard_status;break; /測試行KEY=0XF0;switch(KEY) case(0X70):keyboard_status=keyboard_status;break;case(0Xb0):keyboard_status=keyboard_status+4;break;case(0Xd0): keyboard_status=keyboard_status+8;break;case(0Xe0):keyboard_status=keyboard_status+12;break; while(a<50)&&(KEY!=0xf0) /檢測按鍵松手檢測 Delay10ms();a+; void Delay10ms(void) /10ms延時函數(shù)定義 unsigned char a,b,c; for(c=1;c>0;c-) for(b=38;b>0;b-) for(a=130;a>0;a-); void xianshi() /顯示函數(shù) if(p=1)

溫馨提示

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

評論

0/150

提交評論