函數(shù)信號發(fā)生器的設(shè)計_第1頁
函數(shù)信號發(fā)生器的設(shè)計_第2頁
函數(shù)信號發(fā)生器的設(shè)計_第3頁
函數(shù)信號發(fā)生器的設(shè)計_第4頁
函數(shù)信號發(fā)生器的設(shè)計_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

緒論1.1課題背景在電子信息時代的今天,不管是在科研、工藝生產(chǎn),還是教育事業(yè)方面,都有隨處可見的信號發(fā)生設(shè)備。因此,隨著技術(shù)的不斷成熟,使得函數(shù)信號發(fā)生器也在不斷的優(yōu)化。尤其是微處理器出現(xiàn)之后,更是得到了巨大的提高,具體表現(xiàn)在自動修正、自動錯誤診斷和自動波形生成等方面。就比如說在教學(xué)實驗室的實驗過程中,就常常需要用到信號發(fā)生設(shè)備,用于產(chǎn)生我們所需要的正弦波、方波、三角波和鋸齒波等信號。所以,設(shè)計并制作一個性能優(yōu)良的信號發(fā)生設(shè)備是非常有必要的。1.2函數(shù)信號發(fā)生器的研究進(jìn)展函數(shù)信號發(fā)生器是指可以根據(jù)需求生成指定參數(shù)的電測試信號的儀器。因為其種類繁多,特性各異而被應(yīng)用于各類領(lǐng)域。最主要的使用方面還是基本信號的產(chǎn)生,一開始是通過硬件設(shè)備設(shè)計出來的信號發(fā)生裝置,但是隨著技術(shù)的發(fā)展,當(dāng)前的信號設(shè)備已經(jīng)不能夠再滿足需求,因此,通過使用軟硬件相結(jié)合的技術(shù)制作出了波形更加穩(wěn)定、頻率精度更高的信號發(fā)生設(shè)備。除此之外,使用軟件來控制波形的產(chǎn)生比較于硬件控制會更加的方便,復(fù)雜度也會得到降低。1.3函數(shù)信號發(fā)生器的實現(xiàn)方法本次設(shè)計實現(xiàn)利用單片機AT89C52和8位D/A轉(zhuǎn)換芯片DAC0832共同實現(xiàn)方波、鋸齒波、三角波、正弦波這四種常用波形的發(fā)生。根據(jù)設(shè)計的要求,對各種波形的頻率和幅度進(jìn)行程序的編寫和控制,并且將所寫程序燒錄至52單片機的程序存儲器中。在程序運行中,當(dāng)接收到來自外界的指令時,需要輸出相對應(yīng)某種波形時再調(diào)用與之相對應(yīng)的中斷服務(wù)子程序和波形發(fā)生程序,此時,通過程序生成的數(shù)字波形信號經(jīng)電路的數(shù)/模轉(zhuǎn)換器DAC0832和運算放大器LM358處理后,從信號發(fā)生器的輸出端口輸出。并且可以通過液晶顯示模塊LCD1602對輸出波形的基本信息進(jìn)行查看和鍵盤輸入模塊實現(xiàn)對幾種波形的切換、調(diào)頻和頻率步進(jìn)值的調(diào)控。2函數(shù)信號發(fā)生器的設(shè)計實現(xiàn)2.1設(shè)計方案的描述本次設(shè)計中我要實現(xiàn)的是能夠輸出正弦波、方波、三角波和鋸齒波等基本波形的信號發(fā)生裝置。硬件方面,我采用的是AT89C52單片機模塊為核心處理模塊,用于處理數(shù)字信號波形的產(chǎn)生以及按鍵輸入模塊輸入的指令,除此之外,還有D/A轉(zhuǎn)換器模塊和運算放大器模塊,用于把數(shù)字信號波形轉(zhuǎn)變?yōu)槟M信號波形并且放大輸出到示波器。與此同時,我還使用了LCD液晶顯示模塊,用于顯示輸出信號波形的類型和頻率。軟件方面,我則是采用C語言編程,用于數(shù)字信號波形的產(chǎn)生和核心處理模塊和其他各個模塊之間的聯(lián)系。2.2設(shè)計思路本次設(shè)計通過使用C語言編程來控制AT89C52單片機實現(xiàn)數(shù)字信號波形輸出到硬件電路,再通過D/A轉(zhuǎn)換器以及放大器實現(xiàn)波形的輸出。在大學(xué)里,我第一次接觸到的單片機就是52單片機,它是一個很好入門并且功能強大的微型計算機,因此我選擇了它作為設(shè)計的核心控制器。我設(shè)計思路的原理框圖如圖2.1,總體原理為:系統(tǒng)一上電先進(jìn)行初始化,接下來可以通過按鍵輸入模塊進(jìn)行信號波形選擇,此時按鍵輸入的指令輸入AT89C52單片機,在程序的控制下找到對應(yīng)的取碼數(shù)組產(chǎn)生數(shù)字信號波形并且輸出象相應(yīng)的指令到52單片機的P0和P1端口,P0端的指令是用于控制LCD1602顯示波形的類型和頻率值,而P1端的指令是用于將產(chǎn)生的數(shù)字信號波形輸入到DAC0832模塊中進(jìn)行模數(shù)轉(zhuǎn)換,也就得到了所需要的模擬信號波形,最后通過運算放大器模塊放大輸出波形即可。LCDLCD1602顯示按鍵輸入AT89C52單片機數(shù)模轉(zhuǎn)換器DAC0832運算放大器LM358輸出波形按鍵輸入AT89C52單片機數(shù)模轉(zhuǎn)換器DAC0832運算放大器LM358圖2.1函數(shù)信號發(fā)生器原理框圖上圖描述的是函數(shù)信號發(fā)生器設(shè)計方案的主要模塊:按鍵輸入模塊、單片機模塊、D/A轉(zhuǎn)換模塊、LCD顯示模塊及運算放大器模塊。2.3設(shè)計方案的功能介紹當(dāng)程序燒錄至52單片機時經(jīng)過初始化,默認(rèn)為輸出正弦信號,LCD1602液晶屏上第一行顯示“Waveform:”和正弦信號波形圖,第二行顯示“Fout=10.0Hz”,當(dāng)開關(guān)四按一下是此時輸出波形為方波,按兩下時輸出為三角波,按三下時輸出為鋸齒波。第一個開關(guān)用于控制頻率的步進(jìn)值,另外兩個開關(guān)可以調(diào)節(jié)頻率。

3硬件設(shè)計3.1主要功能模塊3.1.1最小系統(tǒng)模塊最小系統(tǒng)模塊包括了52單片機、電源電路、晶振電路和復(fù)位電路。首先是電源電路,我采用的是5V的USB供電線。接下就是晶振電路,我們都知道晶振電路也叫時鐘電路,是用于產(chǎn)生時鐘信號的。復(fù)位電路,根據(jù)單片機原理可知,只需給RST引腳2US的持續(xù)高電平時間即可復(fù)位。圖3.1最小系統(tǒng)模塊3.1.2數(shù)模轉(zhuǎn)換電路模塊在這個將數(shù)字信號轉(zhuǎn)換成模擬信號的模塊,我采用的是DAC0832芯片。DAC0832是8分辨率的D/A轉(zhuǎn)換集成芯片,由8位輸入鎖存器、8位DAC寄存器、8位D/A轉(zhuǎn)換器及轉(zhuǎn)換控制電路四部分構(gòu)成。8位輸入鎖存器用于存放主機送來的數(shù)字量,使輸入數(shù)字得到緩沖和鎖存,并加以控制;8位DAC寄存器用于存放存放待轉(zhuǎn)換的數(shù)字量,并加以控制;8位D/A轉(zhuǎn)換器輸出與數(shù)字量成正比的模擬電流,由與門、與非門組成的輸入控制的輸入電路來控制2個寄存器的選通或鎖存狀態(tài)。DAC0832的主要特性參數(shù):分辨率為8位;電流穩(wěn)定時間1us;可單緩沖、雙緩沖或直接數(shù)字輸入;只需在滿量程下調(diào)整其線性度;單一電源供電(+5V~+15V);低功耗,20mW。圖3.2數(shù)模轉(zhuǎn)換電路圖3.3DAC0832內(nèi)部結(jié)構(gòu)圖3.1.3運算放大電路模塊運算放大電路模塊我選擇的芯片是LM358,通過該芯片將取出的模擬量得到對應(yīng)的電壓值。圖3.4運算放大電路3.1.4液晶顯示模塊液晶顯示模塊是用于顯示輸出波形的類型和頻率值,在這個模塊中我采用的芯片是LCD1602,LCD1602的八位數(shù)據(jù)端接單片機的P0口,RW接地,另外兩個使能端E、RS分別接單片機的P2.6—P2.7。具體的芯片資料如圖3.5。VSS為電源地;VDD接5V電源;VO需要與地短接顯示屏工作;RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器;RW為讀寫信號線,高電平1時進(jìn)行讀操作,低電平0時進(jìn)行寫操作;E端是液晶的使能端;D0~D7為8位雙向數(shù)據(jù)端;VCC電源;GND地。圖3.5LCD1602顯示電路3.1.5按鍵接口以及LED電路模塊按鍵模塊是是用于控制信號輸入的類型,當(dāng)按鍵按下時,可以通過單片機編程讀取閉合的鍵號,實現(xiàn)相應(yīng)的信號輸出。其步驟主要是a、判斷是否有鍵按下;b、去抖動,延時20ms左右;c、識別被按下的鍵號;d、處理,實現(xiàn)功能。如圖3.6所示,常用的按鍵電路一般為矩陣式,但是對于此設(shè)計,為了方便程序的簡單化,我們采用了一般的按鍵接口,按鍵輸出信號。除此之外,我還設(shè)計使用了一個LED指示電路,通過不同顏色的LED標(biāo)識不同的波形。具體為:KEY1-KEY4表示為波形選擇、頻率加、頻率減、頻率的步進(jìn)值,led0-led3表示為正弦波、方波、三角波、鋸齒波。圖3.6按鍵接口電路及LED顯示電路3.2硬件原理框圖對于該函數(shù)信號發(fā)生器的設(shè)計,我采用的是以AT89C52單片機芯片作為核心處理器,通過編程實現(xiàn)各種不同類型信號的產(chǎn)生,然后通過D/A轉(zhuǎn)換將數(shù)字信號轉(zhuǎn)換成模擬信號,接下來通過運算放大器,最終輸出到示波器。結(jié)構(gòu)簡單,思路井井有條,按照設(shè)計的基本要求,我們又可以把整個原理圖細(xì)分為不同的功能模塊,各個功能模塊之間相互聯(lián)系,相互作用,而其中最重要的就是通過單片機程序?qū)⒏鱾€功能模塊構(gòu)成了一個統(tǒng)一的整體,其整體電路原理框圖如圖3.7所示:按鍵按鍵輸入LCD1602顯示LCD1602顯示單片機AT89C52晶振電路晶振電路波形輸出端口LM358放大波形輸出端口LM358放大器電路D/A轉(zhuǎn)換時鐘復(fù)位時鐘復(fù)位圖3.7硬件原理框圖4軟件設(shè)計本次設(shè)計通過將四種波形的數(shù)據(jù)通過P0.0口選擇,送往在單片機的程序儲存器里,接下來通過調(diào)節(jié)P0.1和P0.2兩個端口來改變這個波形的頻率,然后再計算該波形頻率的技術(shù)初值,開啟中斷模塊,通過DAC0832數(shù)模轉(zhuǎn)換器以及LM358運算放大器輸出波形。整個電路系統(tǒng)結(jié)構(gòu)緊湊,較為簡單,成本較低。4.1主函數(shù)設(shè)計流程本設(shè)計的核心控制芯片采用的是AT89C52單片機,通過編程的方法來產(chǎn)生四種波形,并通過程序來控制四種波形的切換和波形頻率的改變。具體功能有:(1)四種波形之間的切換;(2)波形頻率參數(shù)以及頻率步進(jìn)值參數(shù)的設(shè)定;(3)頻率增減等。軟件調(diào)試完成后,通過程序下載軟件將.hex文件下載到AT89C52芯片中,然后插到焊接好的多功能函數(shù)信號發(fā)生器系統(tǒng)中即可獨立完成所有功能的控制。開始首先程序下載后,會對整個系統(tǒng)進(jìn)行初始化,再判斷是否有按鍵按下,如果有,則會根據(jù)編寫好的程序計算相關(guān)參數(shù),一方面利用定時中斷查表輸出波形,另一方面送段選口和位選口數(shù)據(jù),使LCD1602顯示對應(yīng)波形類型和頻率值,最后反饋回去構(gòu)成循環(huán),判斷按鍵相關(guān)信息,如圖4.1。開始系統(tǒng)系統(tǒng)初始化判斷是否有按鍵按下?判斷是否有按鍵按下?S3按下,S3按下,boxing++S2按下S1按下boxing=0boxing=3boxing=2boxing=1延時增f減小延時boxing=0boxing=3boxing=2boxing=1延時增f減小延時減f增大輸出正弦波,LCD顯示波形輸出鋸齒波,LCD顯示波形輸出三角波,LCD顯示波形輸出正弦波,LCD顯示波形輸出鋸齒波,LCD顯示波形輸出三角波,LCD顯示波形輸出方波,LCD顯示波形LCD顯示fLCD顯示fLCD顯示f圖4.1主函數(shù)程序流程圖4.2LCD顯示程序設(shè)計LCD1602在使用之前需要對他進(jìn)行初始化,也就是復(fù)位操作。具體的初始化操作步驟是根據(jù)該芯片的使用說明進(jìn)行的,操作流程如圖4.2所示。開始開始寫指令38H,顯示模式設(shè)置寫指令38H,顯示模式設(shè)置寫指令01H,顯示清屏寫指令01H,顯示清屏寫指令0CH,顯示開及光標(biāo)設(shè)置寫指令0CH,顯示開及光標(biāo)設(shè)置寫指令06H,顯示光標(biāo)移動設(shè)置寫指令06H,顯示光標(biāo)移動設(shè)置寫指令80H,初始化數(shù)據(jù)指針寫指令80H,初始化數(shù)據(jù)指針初始化顯示為正弦波,頻率值為10Hz初始化顯示為正弦波,頻率值為10Hz圖4.2LCD初始化函數(shù)程序流程圖voidinit_lcd()//LCD初始化函數(shù){ uchari; 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');}4.3按鍵掃描程序設(shè)計按鍵掃描模塊是用于接收外界輸入的頻率值增加或者減小指令、波形類型的切換指令的模塊,要接收外界的指令,就需要明確按鍵的功能。首先要明確的是按鍵掃描模塊控制的是波形的類型選擇和頻率值的改變。而在主函數(shù)中系統(tǒng)初始化部分,我定義的就是,系統(tǒng)初始化時,LCD液晶顯示屏默認(rèn)顯示的是波形的類型和頻率值顯示畫面,當(dāng)按鍵s1按下時,頻率值進(jìn)行自增,頻率值+步進(jìn)值為新的頻率值;當(dāng)按鍵s2按下時,頻率值進(jìn)行自減,頻率值-步進(jìn)值為新的頻率值;當(dāng)按鍵s3按下時,進(jìn)行波形的類型的切換。開始開始按鍵掃描按鍵掃描s1按下s2按下s3按下s1按下s2按下s3按下Boxing++Pinlv--Pinlv++Boxing++Pinlv--Pinlv++調(diào)用display()調(diào)用display()圖4.3按鍵掃描函數(shù)程序流程圖voidkeyscan()//按鍵檢測函數(shù){ if(s1==0)//按鍵頻率+按下,+bujin { EA=0;//關(guān)閉總中斷 delay(2);//延時消抖 if(s1==0)//判斷按鍵s1是否還為按下狀態(tài) { while(!s1);//判斷按鍵是否松開,若還是按下狀態(tài),在此則為等待 pinlv+=bujin;//頻率值=頻率值+步進(jìn)值 if(pinlv>10000)//若頻率值達(dá)到1000Hz,則重新設(shè)置值為10Hz { pinlv=100; } display();//調(diào)用顯示函數(shù),將所輸入的波形類型和頻率值顯示在LCD上 m=65536-(150000/pinlv); a=m/256;//記錄定時器高八位的值 b=m%256;//記錄定時器低八位的值 EA=1;//開啟總中斷 } } if(s2==0)//按鍵頻率-按下,-bujin { delay(5); if(s2==0) { EA=0;//關(guān)閉總中斷 while(!s2); pinlv-=bujin; if(pinlv<100) { pinlv=10000; } display(); m=65536-(150000/pinlv); a=m/256; b=m%256; EA=1;//開啟總中斷 } } if(s3==0)//按鍵波形切換按下 { delay(5); if(s3==0) { EA=0;//關(guān)閉總中斷 while(!s3); boxing++;//波形類型指示變量 if(boxing>=4)//當(dāng)boxing值為4時,重新賦值為0 { boxing=0; } display(); EA=1;//開啟總中斷 } } }4.3步進(jìn)檢測程序設(shè)計步進(jìn)檢測函數(shù)是用于處理外界指令對步進(jìn)值的設(shè)置而編寫的。通過這個步進(jìn)檢測函數(shù)可以實現(xiàn)步進(jìn)值的調(diào)整,從而控制較大或者較小步幅的頻率變化。整個步進(jìn)檢測函數(shù)的主控制按鍵就是s4,通過這個按鍵進(jìn)行波形的類型顯示和頻率的步進(jìn)值顯示兩個畫面之間的切換。當(dāng)處于頻率的步進(jìn)值設(shè)置畫面時,通過按鍵s1和s2進(jìn)行步進(jìn)值的增大或者減小。開始開始按鍵s4按下按鍵s4按下h==2h==1h==2h==1LCD顯示波形選擇畫面LCD顯示步進(jìn)值設(shè)置畫面LCD顯示波形選擇畫面LCD顯示步進(jìn)值設(shè)置畫面調(diào)用display()調(diào)用bujindisplay()調(diào)用display()調(diào)用bujindisplay()圖4.3步進(jìn)檢測函數(shù)程序流程圖voidbujinjiance()//步進(jìn)檢測函數(shù){ if(s4==0)//步進(jìn)值按鍵按下 { delay(5);//延時消抖 if(s4==0)//判斷按鍵s4是否還為按下狀態(tài) { while(!s4);//判斷按鍵是否松開,若還是按下狀態(tài),在此則為等待 h++;//h變量的值用于指示步進(jìn)值設(shè)置畫面和波形顯示畫面 if(h==1)//h==1,LCD顯示步進(jìn)值設(shè)置畫面 { write_com(0x01); write_com(0x80); write_date('S');delay(1); //stepvalue 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;//將初始的步進(jìn)值賦值給步進(jìn)值變量 bujindisplay();//調(diào)用步進(jìn)值顯示函數(shù),顯示初始的步進(jìn)值 } if(h==2)//h==2,LCD顯示波形顯示畫面 { h=0;//將h變量的值重新賦初值為0 bujin=bujin1;//將重新設(shè)置好的步進(jìn)值賦值給步進(jìn)值變量 init_lcd();//初始化LCD initclock();//初始化時鐘信號 display();//調(diào)用波形顯示函數(shù) } } } if(h==1)//h==1,說明通過s4按鍵已將顯示畫面設(shè)置為步進(jìn)值設(shè)置畫面 { if(s1==0)//按鍵+按下,+0.1 { delay(5);//延時消抖 if(s1==0)//判斷按鍵s1是否還為按下狀態(tài) { while(!s1);//判斷按鍵是否松開,若還是按下狀態(tài),在此則為等待 bujin1++;//步進(jìn)值自增,+1 if(bujin1>=101)//步進(jìn)值為101時,賦初值為1 { bujin1=1; } bujindisplay();//調(diào)用步進(jìn)值顯示函數(shù),顯示設(shè)置好的步進(jìn)值 } } if(s2==0)//按鍵-按下,-0.1 { delay(5); if(s2==0)//判斷按鍵s2是否還為按下狀態(tài) { while(!s2);//判斷按鍵是否松開,若還是按下狀態(tài),在此則為等待 bujin1--;//步進(jìn)值自減,-1 if(bujin1<=0)//步進(jìn)值為0時,賦初值為100 { bujin1=100; } bujindisplay();//調(diào)用步進(jìn)值顯示函數(shù),顯示設(shè)置好的步進(jìn)值 } } }}4.4步進(jìn)顯示程序設(shè)計在上個步進(jìn)檢測函數(shù)模塊,已經(jīng)將初始化的或者設(shè)置好的步進(jìn)值通過變量bujin1進(jìn)行保存。因為在LCD1602上顯示時是一位一位的顯示,所以在這個步進(jìn)顯示模塊中,我需要對該變量進(jìn)行處理,將步進(jìn)值按照位數(shù)的方式進(jìn)行分離并且保存。關(guān)于分離方式,我采用的是取整和取模方式。bujin1的取值范圍為1-100,通過bujin1對100取整將百位的值保存,bujin1對100取余再對10取整將十位的值保存,bujin1對100取余再對10取余將個位的值保存。其中還有一些細(xì)節(jié)問題,就是位數(shù)不一定有三位,就必然會出現(xiàn)有的值高位為0,所以在對LCD寫數(shù)據(jù)時需要對高位進(jìn)行判斷,為0時則將LCD上顯示該數(shù)據(jù)的位置寫空,不為0時則正常顯示。開始開始定義無符號整型變量bai,shi,ge定義無符號整型變量bai,shi,gege=bujin1%100%10shi=bujin1%100/10bai=bujin1/100ge=bujin1%100%10shi=bujin1%100/10bai=bujin1/100bai==0?bai==0?正常顯示百位為空,其他正常顯示正常顯示百位為空,其他正常顯示圖4.4步進(jìn)顯示函數(shù)程序流程圖voidbujindisplay()//步進(jìn)顯示函數(shù){uintbai,shi,ge;bai=bujin1/100;shi=bujin1%100/10;ge=bujin1%100%10;write_com(0x80+11);if(bai==0)write_date('');elsewrite_date(table[bai]);write_date(table[shi]); write_date('.'); write_date(table[ge]);}4.5波形顯示程序設(shè)計在按鍵檢測模塊中對頻率值的設(shè)置和波形的切換進(jìn)行了明確的控制,并且也使用了pinlv和boxing這兩個變量對頻率值和波形指示值進(jìn)行了保存。在這個波形顯示模塊,我就是要對保存的這兩個值進(jìn)行處理。關(guān)于頻率值的處理方式和步進(jìn)顯示模塊中步進(jìn)值的處理方式是一模一樣的,都是采用了取整和取余方式,將頻率值的各個位進(jìn)行分離并保存到指定的變量。除此之外,高位值為空的細(xì)節(jié),在這個模塊中也是有的,而且位數(shù)更多,所以在一個或者多個高位為0時,需要通過使用&&運算符來實現(xiàn)不同條件下的寫數(shù)據(jù)方式。在波形類型切換上使用的就是對變量boxing的值進(jìn)行判斷,從而寫不同波形的數(shù)據(jù)到LCD1602上。除此之外,在這個模塊中還使用到了兩個關(guān)于LCD1602數(shù)據(jù)顯示的函數(shù),就是write_com()寫數(shù)據(jù)地址指令函數(shù)和write_date()寫數(shù)據(jù)函數(shù),要想將數(shù)據(jù)顯示到LCD1602上是不可能缺少這兩個函數(shù)的。開始開始定義無符號字符型變量wan,qian,bai,shi,ge定義無符號字符型變量wan,qian,bai,shi,gebai=pinlv/100%10shi=pinlv/10%10wan=pinlv/10000qian=pinlv/1000%10ge=pinlv%10bai=pinlv/100%10shi=pinlv/10%10wan=pinlv/10000qian=pinlv/1000%10ge=pinlv%10wan位為空,其他正常顯示wan,qian位為空,其他正常顯示wan,qian,bai位為空,其他正常顯示正常顯示wan位為空,其他正常顯示wan,qian位為空,其他正常顯示wan,qian,bai位為空,其他正常顯示正常顯示boxing=3,顯示鋸齒波boxing=2,顯示三角波boxing=1,顯示方波boxing=0,顯示正弦波boxing=3,顯示鋸齒波boxing=2,顯示三角波boxing=1,顯示方波boxing=0,顯示正弦波圖4.5波形顯示函數(shù)程序流程圖voiddisplay()//波形顯示函數(shù){ ucharwan,qian,bai,shi,ge;//定義無符號字符型變量來保存頻率的各個位的值 wan=pinlv/10000;//pinlv對10000取整 qian=pinlv/1000%10;//pinlv對1000取整,再對10取余 bai=pinlv/100%10;//pinlv對100取整,再對10取余 shi=pinlv/10%10;//pinlv對10取整,再對10取余 ge=pinlv%10;//pinlv對10取余 write_com(0x80+0x40+0x08);//設(shè)置數(shù)據(jù)地址指針,即為寫數(shù)據(jù)的位置 if(wan==0)//判斷萬位是否為0 write_date('');//為0,則將該位寫空 else//不為0,萬位數(shù)據(jù)正常寫 write_date(table[wan]); if(qian==0&&wan==0)//通過&&實現(xiàn)兩個條件的結(jié)合 write_date(''); else write_date(table[qian]); if(wan==0&&qian==0&&bai==0) write_date(''); else //write_date(table[qian]); write_date(table[bai]); write_date(table[shi]); write_date('.'); write_date(table[ge]); write_date('H'); write_date('z'); if(boxing==0)//對boxing的值進(jìn)行判斷,正弦波 { write_com(0x80+10);//指定LCD1602上寫數(shù)據(jù)的位置 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)//對boxing的值進(jìn)行判斷,方波 { write_com(0x80+10);//指定LCD1602上寫數(shù)據(jù)的位置 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)//對boxing的值進(jìn)行判斷,三角波 { write_com(0x80+10);//指定LCD1602上寫數(shù)據(jù)的位置 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)//對boxing的值進(jìn)行判斷,鋸齒波 { write_com(0x80+10);//指定LCD1602上寫數(shù)據(jù)的位置 write_date(6); write_date(6); write_date(6); write_date(6); write_date(6); write_date(6); led2=1; led3=0; }}5系統(tǒng)仿真與電路測試本次設(shè)計的函數(shù)信號發(fā)生器系統(tǒng)硬件的調(diào)試采用的是Proteus仿真,將編寫好的程序燒錄并運行,使用示波器對輸出信號波形進(jìn)行觀察。5.1軟件仿真對于按鍵模塊,首先確定的是每個按鍵的功能,只有在確定按鍵功能之后,才可以將我們所需要設(shè)置的按鍵的功能通過C語言程序真正做到軟硬件相結(jié)合在一起,實現(xiàn)我們設(shè)計的目標(biāo)功能。對于設(shè)計的四個按鍵及其功能見表5.1。表5.1KEY作用KEY1波形選擇KEY2頻率/步進(jìn)值加KEY3頻率/步進(jìn)值減KEY4步進(jìn)值5.1.1方波仿真圖如圖5.1(a)所示如圖5.1(b)所示輸出幅值為1V輸出幅值為2V周期為250ms周期為250ms時間檔為100ms時間檔為100ms幅值檔為1V幅值檔為1V圖5.1(a) 圖5.1(b)如圖5.1(c)所示如圖5.1(d)所示輸出幅值為3V輸出幅值為4V周期為250ms周期為250ms時間檔為100ms時間檔為100ms幅值檔為1V幅值檔為1V圖5.1(c) 圖5.1(d)如圖5.1(e)所示輸出幅值為5V周期為250ms時間檔為100ms幅值檔為1V圖5.1(e)5.1.2三角波仿真圖如圖5.2(a)所示如圖5.2(b)所示輸出幅值為1V輸出幅值為2V周期為2.5ms周期為2.5ms時間檔為1ms時間檔為1ms幅值檔為1V幅值檔為1V圖5-2(a) 圖5-2(b)如圖5.2(c)所示如圖5.2(d)所示輸出幅值為3V輸出幅值為4V周期為2.5ms周期為2.5ms時間檔為1ms時間檔為1ms幅值檔為1V/格幅值檔為1V圖5.2(c) 圖5.2(d)如圖5.2(e)所示輸出幅值為5V周期為2.5ms時間檔為1ms幅值檔為1V圖5.2(e)5.1.3正弦波仿真圖如圖5.3(a)所示如圖5.3(b)所示輸出幅值為1V輸出幅值為2V周期為0.5ms周期為0.5ms時間檔為0.2ms時間檔為0.2ms幅值檔為1V幅值檔為1V圖5.3(a) 圖5.3(b)如圖5.3(c)所示如圖5.3(d)所示輸出幅值為3V輸出幅值為4V周期為0.5ms周期為0.5ms時間檔為0.2ms時間檔為0.2ms幅值檔為1V幅值檔為1V圖5.3(c)圖5.3(d)如圖5.3(e)所示輸出幅值為5V周期為0.5ms時間檔為0.2ms幅值檔為1V圖5.3(e)5.1.4鋸齒波仿真圖如圖5.3(a)所示如圖5.3(b)所示輸出幅值為1V輸出幅值為2V周期為50ms周期為50ms時間檔為20ms時間檔為20ms幅值檔為1V幅值檔為1V圖5.4(a)圖5.4(b)如圖5.3(a)所示如圖5.3(b)所示輸出幅值為3V輸出幅值為4V周期為50ms周期為50ms時間檔為0.2ms時間檔為0.2ms幅值檔為1V幅值檔為1V圖5.4(c)圖5.4(d)如圖5.3(a)所示輸出幅值為5V周期為50ms時間檔為0.2ms幅值檔為1V 圖5.4(e)5.2硬件電路測試5.2.1函數(shù)信號發(fā)生器實物圖5.2.2示波器測試圖實驗方波如圖5.4(a)所示 實驗三角波如圖5.4(b)所示圖5.4(a) 圖5.4(b) 實驗正弦波如圖5.4(c)所示實驗鋸齒波如圖5.4(d)所示圖5.4(c) 圖5.4(d) 5.3結(jié)果分析從本次設(shè)計的仿真實驗結(jié)果分析,有一些非可控的誤差,從而導(dǎo)致了輸出波形存在一定的失真,存在這些問題的主要方面是跟程序的設(shè)計有關(guān),數(shù)字信號的波形沒有做到那么精確,再者就是Proteus仿真軟件本身也會給測試的結(jié)果帶來一定的誤差問題。在進(jìn)行數(shù)字信號轉(zhuǎn)換模擬信號的實驗過程中,只使用了一個D/A轉(zhuǎn)換器時,圖形只出現(xiàn)了一點點失真。從這個角度來說,整體的問題也可能和增加了D/A轉(zhuǎn)換器是有關(guān)系的。

結(jié)論理論上來說,設(shè)計制作多功能智能函數(shù)信號發(fā)生器的思路不同,具有多種方法可以實現(xiàn),本次設(shè)計只是采用一種比較符合自身實際能力可能實現(xiàn)的方法。本次設(shè)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論