




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
函數信號發生器設計摘要隨著科技的不斷發展,信號發生器已成為電子實驗室中不可或缺的一部分。信號發生器的設計和制作一直是電子愛好者和工程師們感興趣的課題。51單片機是一種高性能、低功耗的微控制器,它可以提供豐富的外設和功能,使得它非常適合用于信號發生器的設計。我們將利用51單片機的定時器和DAC模塊來實現信號的生成和輸出。本文研究一種基于51單片機的函數信號發生器設計,主要包括時鐘電路模塊,AD9910系統模塊,LCD顯示屏模塊,按鍵模塊。關鍵詞:51單片機;信號發生器;LCD顯示屏目錄TOC\o"1-3"\h\u第1章緒論 第6章總結基于51單片機的函數信號發生器的設計是一項復雜的工程,需要考慮到許多方面,包括硬件設計、軟件編程、功能需求等等。硬件設計方面,需要考慮到AD9910芯片的功能需求和連接方式,以及顯示屏和按鍵的類型和布局,同時需要進行良好的PCB布局設計,以確保信號質量和穩定性。軟件編程方面,需要編寫適配AD9910芯片的驅動程序,實現信號發生器的各種功能,同時還需要編寫相應的按鍵處理程序,以實現按鍵的正常使用和菜單選項的選擇。功能需求方面,需要考慮到信號發生器的各種參數和菜單選項,以滿足不同應用場景的需求。此次畢業設計,充分利用單片機開發上的靈活、快速的特點,來實現智能控制的設計。通過本次畢業論文的設計,使我認識到作為科技人員,重要的是思維縝密,知識經驗積累深厚,堅強的意志,同時還要有創新的精神,當你覺得一種做法可能可以實現的時候就應該勇于嘗試,遇到問題的時候應該多問多想,不輕易放棄。在以后的工.作和學習中,要勤奮踏實,善于思考,才能在競爭激烈的社會中提升自我的實用價值。這次的畢業設計給了我一個很好的學習機會,我在這里面學習到很多東西,受益匪淺。參考文獻梁狀.基于DDS的高頻函數信號發生器設計與實現[M].哈爾濱理工大學.2020.方淼.一種基于STC89C52的函數信號發生器實驗設計[C],洛陽師范學院學報.2022.居秋愷;朱立宇;趙可為;劉琪.基于DDS技術的簡易函數信號發生器的設計[C],電子制作.2020.陳華清.電子測量技術的發展及應用[J].電子測量,2022曹慧.淺談電子測量技術的發展及應用的因素與對策[J].工程技術,2019.李輝,饒睿楠,任亞欣.基于AD9910的通用雷達信號產生器[J].火控雷達技術,2021.崔建平.電子測量儀器行業發展回顧與展望[J].國外電子測量技術,2019.項川,王皓.基于DDS技術的信號源的設計與制作研究[J].自動化應用,2019.楊建華.基于FPGA和DDS技術的多通道信號源設計[J].計算機與數字工程,2021.任英杰;黃建清;郭凱;李亞軍.基于STC89C51單片機的簡單函數信號發生器設計[M].電子設計工程.2022.周江.51單片機原理及硬件電路設計研究[J].數字技術與應用,2018,000(011):1-1陳志遠,朱葉承,周卓泉,等.一種基于51智能家居控制系統[J].電子技術應用,2019,28(9):138-140.李洹.單片機控制的輕觸開關壽命試驗儀.電聲技術,2017(5):52-55.馬澤,張志杰,張潤哲.壓力傳感器動態校準系統的不確定度分析[J].測試報,2018,32(5):416-421.陳志遠,朱葉承,周卓泉,等.一種基于51智能家居控制系統[J].電子技術應用,2019,28(9):138-140.GozdeTektas;CuneytCeliktas.DesignofaVirtualFunctionGeneratorforSignalGeneration.2022.WanQianCheng;;YueJunGuo;;BiaoWang.DesignofProgramControlledFunctionSignalGeneratorBasedonLPC2138.2021. HuiLingSi.DesignofVirtualFunctionSignalGeneratorBasedonSoundCard.2020.ChunYingWang;JunZhang.BasedonFPGADesignandSimulationofFunctionSignalGenerator[J].ProcediaEngineering.2020.MeimeiLv;BinZhang;MengnanLi;DapengShen.DesignofFunctionSignalGeneratorBasedonDDFS[M].Newnes.2020.
附錄A總原理圖圖A-1總原理圖
附錄B程序#include<reg52.h> //包含頭文件#include<intrins.h>#defineucharunsignedchar //宏定義#defineuintunsignedintsbits1=P3^5; //定義按鍵的接口sbits2=P3^6;sbits3=P3^7;sbits4=P3^4;sbitled0=P3^0; //定義四個LED,分別表示不同的波形sbitled1=P3^1;sbitled2=P3^2;sbitled3=P3^3; sbitlcdrs=P2^7; //液晶控制引腳,還有一個控制腳是RW,因為我們只需要向液晶里寫數據系那是就好了,所以,我們直接將RW引腳接地sbitlcden=P2^6;charnum,boxing,u; //定義全局變量intpinlv=100,bujin=1,bujin1=1; //頻率初始值是10Hz,步進值默認是0.1,顯示步進值變量ucharcodetable[]="0123456789"; //定義顯示的數組ucharcodetable1[]="Fout=Waveform:"; //初始化顯示字符unsignedlongintm; //定義長整形變量minta,b,h,num1; //定義全局變量//自定義字符ucharcodezifu[]={ //此數組內數據為液晶上顯示波形符號的自定義字符 0x0e,0x11,0x11,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x00, //正弦波 01 0x00,0x07,0x04,0x04,0x04,0x04,0x1c,0x00, 0x00,0x1c,0x04,0x04,0x04,0x04,0x07,0x00, //矩形波 23 0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00, 0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00, //三角波 45 0x00,0x01,0x03,0x05,0x09,0x11,0x00,0x00, //鋸齒波 6};ucharcodesin[64]={ //此數組內的數據為,da輸出對應電壓值對應的數字量,0是0V,255是5V135,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}; //正弦波取碼ucharcodejuxing[64]={ //一個周期是采樣64個點,所以數組內是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}; //矩形波取碼ucharcodesanjiao[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}; //三角波取碼ucharcodejuchi[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}; //鋸齒波取碼voiddelay(uintxms) //延時函數{ inta,b; for(a=xms;a>0;a--) for(b=110;b>0;b--);}voidwrite_com(ucharcom) //寫命令函數{ lcdrs=0; P0=com; delay(1); lcden=1; delay(1); lcden=0;}voidwrite_date(uchardate) //寫數據函數{ lcdrs=1; P0=date; delay(1); lcden=1; delay(1); lcden=0;}//自定義字符集voidLcd_ram(){ uinti,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; }}voidinit_lcd() //初始化函數{ uchari; lcden=0; //默認開始狀態為關使能端,見時序圖 Lcd_ram(); write_com(0x0f); write_com(0x38); //顯示模式設置,默認為0x38,不用變。 write_com(0x01); //顯示清屏,將上次的內容清除,默認為0x01. write_com(0x0c); //顯示功能設置0x0f為開顯示,顯示光標,光標閃爍;0x0c為開顯示,不顯光標,光標不閃 write_com(0x06); //設置光標狀態默認0x06,為讀一個字符光標加1. write_com(0x80); //設置初始化數據指針,是在讀指令的操作里進行的 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'); //顯示初始的頻率值}voidinitclock() //定時器初始化函數{ TMOD=0x01; //定時器的工作方式 TH0=a; TL0=b; //定時器賦初值 EA=1; //打開中斷總開關 ET0=1; //打開定時器允許中斷開關 TR0=1; //打開定時器定時開關}voiddisplay() //顯示函數{ ucharqian,bai,shi,ge; //定義變量用于顯示 qian=pinlv/1000; //將頻率值拆成一位的數據,將數據除以1000,得到的商是一位數,賦值給qian bai=pinlv%1000/100; //將頻率除以1000的余數再除以100就得到了頻率的百位,賦值給bai shi=pinlv%1000%100/10; //同上,得到頻率的十位 ge=pinlv%1000%100%10; write_com(0x80+0x40+0x09);//選中第二行第九個位置 if(qian==0) //千位如果為0 write_date(''); //不顯示 else //千位不為0 write_date(table[qian]);//正常顯示千位 if(qian==0&&bai==0) //千位和百位都為0 write_date(''); //百位不顯示 else //不都為0 write_date(table[bai]); //百位正常顯示 write_date(table[shi]); //顯示十位數 write_date('.'); //顯示小數點 write_date(table[ge]); //顯示個位 write_date('H'); //顯示頻率的單位Hz 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; }}voidkeyscan() //頻率調節鍵盤檢測函數{ if(s1==0) //加按鍵是否按下 { EA=0; //關閉中斷 delay(2); //延時去抖 if(s1==0) //再次判斷 { while(!s1); //按鍵松開 pinlv+=bujin; //頻率以步進值加 if(pinlv>1000) //最大加到100Hz { pinlv=100; //100Hz } display(); //顯示函數 m=65536-(150000/pinlv);//計算頻率/*頻率值最小是10Hz,pinlv的值是100(因為要顯示小數點后一位),150000/100=1500,這個1500就是定時器需要計時的,單位是us,65536-1500得到的是定時器的初值,先不管初值,先看定時時間,1500us,一個波形的周期是由64個定時組成的,所以,一個波形周期就是64*1500us=96000,也就是96ms,約等于100ms,也就是10Hz的頻率*/ 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) //4種波形 { boxing=0; } display(); EA=1; } } }voidbujindisplay() //步進值設置界面顯示程序{ uintbai,shi,ge; //定義步進值百十個位 bai=bujin1/100; //將步進值除以100得到百位,也就是頻率值的十位,因為有一個小數位 shi=bujin1%100/10; //將步進值除以100的余數除以十得到十位 ge=bujin1%100%10; //取余10后得到個位,也就是頻率步進值的小數點后一位 write_com(0x80+11); //選中液晶第一行第十一列 if(bai==0) //百位是否為0 write_date(''); //百位不顯示 else //百位不為0 write_date(table[bai]); //顯示百位數據 write_date(table[shi]); //顯示十位數據 write_date('.'); //顯示小數點 write_date(table[ge]); //顯示個位,也就是小數點后一位}voidbujinjiance() //步進值設置鍵盤程序{ 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); //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; //步進值賦值給臨時變量 bujindisplay(); //顯示步進值 } if(h==2) //退出設置 { h=0; //清零 bujin=bujin1; //設置好的臨時步進值賦值給步進變量 init_lcd(); //初始化液晶顯示 initclock(); //定時器初始化 display(); //調用顯示程序 } } } if(h==1) //設置步進值時 { if(s1==0) //加按鍵按下 { delay(5); //延時去抖 if(s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 綠化維修及養護協議
- 2025年四川省綿陽市江油市八校中考物理一模試卷(含解析)
- 低碳材料采購合同示范
- 香港借款合同范本
- 菜籽油購銷合同范本
- 個人短期借款合同協議
- 江蘇省永豐初級中學2025年高三生物試題期末練習試卷含解析
- 云南省臨滄市鳳慶縣重點名校2024-2025學年初三下學期4月考生物試題試卷含解析
- 山東理工職業學院《畫法幾何與CAD制圖》2023-2024學年第二學期期末試卷
- 泰州職業技術學院《臨床室管理》2023-2024學年第二學期期末試卷
- 《初中生物實驗教學的創新與實踐》
- 企業合規管理體系建設與運行機制研究
- 寫字樓項目招商方案
- 期中檢測卷(試題)-2023-2024學年人教PEP版英語六年級下冊
- 擋墻橋墩沖刷計算表
- 胸痛基層診療指南
- 有限空間作業安全技術交底表
- 《如何有效組織幼兒開展體能大循環活動》課件
- 2024焊接工藝規程
- 市政夜景亮化施工方案
- 浙教版高中信息技術必修2 1.1“信息技術與信息系統”教學設計(PDF版)
評論
0/150
提交評論