單片機(jī)原理及應(yīng)用課程設(shè)計(jì)--信號(hào)發(fā)生器_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  單片機(jī)原理及應(yīng)用課程設(shè)計(jì)</p><p><b>  2013年12月</b></p><p><b>  目錄</b></p><p>  1設(shè)計(jì)目的及要求3</p><p>  1-1設(shè)計(jì)目的3</p><p>  1-2設(shè)計(jì)要求3<

2、;/p><p><b>  2方案設(shè)計(jì)3</b></p><p>  2-1總體方案設(shè)計(jì)3</p><p>  2-1.1系統(tǒng)原理分析3</p><p>  2-2硬件電路設(shè)計(jì)4</p><p>  2-2.1主要芯片介紹4</p><p>  2-3軟件

3、設(shè)計(jì)7</p><p>  2-3.1軟件程序流程圖7</p><p>  2-3.2發(fā)送數(shù)據(jù)子程序8</p><p>  2-3.3波形產(chǎn)生過程8</p><p>  3 Protues仿真....................................................................

4、.................... 9</p><p>  4調(diào)試及實(shí)驗(yàn)結(jié)果10</p><p>  5實(shí)驗(yàn)中遇到的問題12</p><p><b>  5-1錯(cuò)誤12</b></p><p><b>  5-2不足12</b></p><p><

5、b>  6心得體會(huì)12</b></p><p><b>  7參考文獻(xiàn)13</b></p><p>  附錄 程序清單........................................................................................14</p><p>  

6、基于STC89C52的信號(hào)發(fā)生器課程設(shè)計(jì)報(bào)告</p><p><b>  設(shè)計(jì)目的及要求</b></p><p><b>  設(shè)計(jì)目的</b></p><p>  (1)掌握各個(gè)接口芯片(如DAC0832等)的功能特性及接口方法,并能運(yùn)用其實(shí)現(xiàn)一個(gè)簡單的微機(jī)應(yīng)用系統(tǒng)功能器件。</p><p>  

7、(2)以單片機(jī)為基礎(chǔ),設(shè)計(jì)并開發(fā)能輸出多種波形(正弦波、三角波、方波等)且頻率可變的函數(shù)發(fā)生器。</p><p>  (3)利用所學(xué)單片機(jī)的理論知識(shí)進(jìn)行軟硬件整體設(shè)計(jì),鍛煉我們理論聯(lián)系實(shí)際、提高我們的綜合應(yīng)用能力。</p><p>  (4)通過運(yùn)用相關(guān)芯片實(shí)現(xiàn)信號(hào)發(fā)生器的功能,從而達(dá)到熟練掌握各種器件的目的,同時(shí),鍛煉動(dòng)手能力及編程調(diào)試能力,更深地理解課上所學(xué)的單片機(jī)的知識(shí),增加電

8、子電路知識(shí),提升作為一個(gè)電子信息工程專業(yè)學(xué)生的專業(yè)素養(yǎng)</p><p><b>  設(shè)計(jì)要求</b></p><p>  (1)用單片機(jī)加之DAC芯片等器件,實(shí)現(xiàn)能產(chǎn)生方波,三角波,正弦波且頻率可變的信號(hào)發(fā)生器。</p><p>  (2)熟悉各個(gè)器件的性能和使用方法,特別是89c52,掌握他們之間的連接和數(shù)據(jù)傳輸方法,能夠熟練使用它們及編寫程

9、序。</p><p>  (3)完成單片機(jī)和DAC的選型,了解不同波形的產(chǎn)生原理和設(shè)計(jì)方案,畫出硬件電路圖,并編程完成軟件部分,最后調(diào)試觀察產(chǎn)生不同類型的波形信號(hào)。</p><p><b>  方案設(shè)計(jì)</b></p><p><b>  總體方案設(shè)計(jì)</b></p><p>  通過要求分析,以下

10、幾點(diǎn)是解題的關(guān)鍵:</p><p>  用單片機(jī)加之DA芯片,實(shí)現(xiàn)能產(chǎn)生方波,三角波,正弦波信號(hào)發(fā)生器</p><p>  掌握89c51和DAC0832轉(zhuǎn)換芯片之間的連接和數(shù)據(jù)傳輸方法,熟練使用它們及編寫程序</p><p><b>  系統(tǒng)原理分析</b></p><p>  數(shù)字信號(hào)可以通過數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信

11、號(hào),因此可通過產(chǎn)生數(shù)字信號(hào)再轉(zhuǎn)換成模擬信號(hào)的方法來獲得所需要的波形。89C52單片機(jī)本身就是一個(gè)完整的微型計(jì)算機(jī),具有組成微型計(jì)算機(jī)的各部分部件:中央處理器CPU、隨機(jī)存取存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、I/O接口電路、定時(shí)器/計(jì)數(shù)器以及串行通訊接口等,只要將89C51再配置鍵盤及、數(shù)模轉(zhuǎn)換及波形輸出、放大電路等部分,即可構(gòu)成所需的波形發(fā)生器,其信號(hào)發(fā)生器構(gòu)成系統(tǒng)框圖如下圖所示。</p><p><b>

12、;  圖1 系統(tǒng)框圖</b></p><p><b>  硬件電路設(shè)計(jì)</b></p><p><b>  主要芯片介紹</b></p><p>  1單片機(jī)STC89C52介紹</p><p>  STC89C52是STC公司生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,具有 8K

13、在系統(tǒng)可編程Flash存儲(chǔ)器。STC89C52使用經(jīng)典的MCS-51內(nèi)核,但做了很多的改進(jìn)使得芯片具有傳統(tǒng)51單片機(jī)不具備的功能。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時(shí)器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,3個(gè)16 位定時(shí)器/計(jì)數(shù)器,

14、4個(gè)外部中斷,一個(gè)7向量4級(jí)中斷結(jié)構(gòu)(兼容傳統(tǒng)51的5向量2級(jí)中斷結(jié)構(gòu)),全雙工串行口。另外 STC89C52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。最高運(yùn)作頻率35MHz,6T/12T可選。外形及引腳排列如下圖所示:</p>&l

15、t;p>  AT89C51管腳說明:</p><p>  VCC:供電電壓。 </p><p><b>  GND:接地。 </b></p><p>  P0口:P0口為一個(gè)8位漏級(jí)開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在

16、FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。 </p><p>  P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。 </p>&l

17、t;p>  P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢,當(dāng)對(duì)外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存

18、器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號(hào)和控制信號(hào)。 </p><p>  P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。</p><p>  RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)

19、器周期的高電平時(shí)間。 </p><p>  ALE/PROG:當(dāng)訪問外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率的1/6。因此它可用作對(duì)外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí), A

20、LE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 </p><p>  /PSEN:外部程序存儲(chǔ)器的選通信號(hào)。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信號(hào)將不出現(xiàn)。 </p><p>  /EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存

21、儲(chǔ)器(0000H-FFFFH),不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 </p><p>  XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。 </p><p>  XTAL2:來自反向振蕩器的輸出。</p><p&g

22、t;  圖2 STC89C52引腳圖</p><p>  2DAC0832介紹:</p><p>  1) DAC0832是8分辨率的D/A轉(zhuǎn)換集成芯片。與微處理器完全兼容。這個(gè)DA芯片以其價(jià)格低廉、接口簡單、轉(zhuǎn)換控制容易等優(yōu)點(diǎn),在單片機(jī)應(yīng)用系統(tǒng)中得到廣泛的應(yīng)用。D/A轉(zhuǎn)換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉(zhuǎn)換電路及轉(zhuǎn)換控制電路構(gòu)成。</p><p>

23、;  圖中,VDD和AGND為電源端和接地端,DIN,OUT 為數(shù)據(jù)輸入端和輸出端,REFIN應(yīng)給予2.7-5.5v的參考電壓,此電壓根據(jù)所需波形的復(fù)制而定。</p><p>  2) 5616的十六位數(shù)據(jù)值包括兩部分:</p><p>  D0~D7:8位數(shù)據(jù)輸入線,TTL電平,有效時(shí)間應(yīng)大于90ns(否則鎖存器的數(shù)據(jù)會(huì)出錯(cuò))</p><p>  ILE:數(shù)據(jù)鎖存

24、允許控制信號(hào)輸入線,高電平有效;</p><p>  CS:片選信號(hào)輸入線(選通數(shù)據(jù)鎖存器),低電平有效;</p><p>  WR1:數(shù)據(jù)鎖存器寫選通輸入線,負(fù)脈沖(脈寬應(yīng)大于500ns)有效。由ILE、CS、WR1的邏輯組合產(chǎn)生LE1,當(dāng)LE1為高電平時(shí),數(shù)據(jù)鎖存器狀態(tài)隨輸入數(shù)據(jù)線變換,LE1的負(fù)跳變時(shí)將輸入數(shù)據(jù)鎖存;</p><p>  XFER:數(shù)據(jù)傳輸控制

25、信號(hào)輸入線,低電平有效,負(fù)脈沖(脈寬應(yīng)大于500ns)有效;</p><p>  WR2:DAC寄存器選通輸入線,負(fù)脈沖(脈寬應(yīng)大于500ns)有效。由WR2、XFER的邏輯組合產(chǎn)生LE2,當(dāng)LE2為高電平時(shí),DAC寄存器的輸出隨寄存器的輸入而變化,LE2的負(fù)跳變時(shí)將數(shù)據(jù)鎖存器的內(nèi)容打入DAC寄存器并開始D/A轉(zhuǎn)換。</p><p>  IOUT1:電流輸出端1,其值隨DAC寄存器的內(nèi)容線

26、性變化;</p><p>  IOUT2:電流輸出端2,其值與IOUT1值之和為一常數(shù);</p><p>  Rfb:反饋信號(hào)輸入線,改變Rfb端外接電阻值可調(diào)整轉(zhuǎn)換滿量程精度;</p><p>  Vcc:電源輸入端,Vcc的范圍為+5V~+15V;</p><p>  VREF:基準(zhǔn)電壓輸入線,VREF的范圍為-10V~+10V;<

27、/p><p>  AGND:模擬信號(hào)地;</p><p>  DGND:數(shù)字信號(hào)地。</p><p>  圖3 DAC0832芯片引腳圖</p><p><b>  3)硬件連接</b></p><p>  如圖4,是DAC0832與51單片機(jī)的連接方式。</p><p>  

28、圖4 DAC0832與單片機(jī)連接圖</p><p>  3 LCD1602介紹</p><p>  工業(yè)字符型液晶,能夠同時(shí)顯示16x02即32個(gè)字符。(16列2行)</p><p>  1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位

29、之間有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形(用自定義CGRAM,顯示效果也不好)。</p><p>  1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。</p><p>  市面上字符液晶大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程

30、序可以很方便地應(yīng)用于市面上大部分的字符型液晶。</p><p>  圖5 LCD1602引腳圖</p><p>  4 LM324介紹</p><p>  LM324系列器件帶有差動(dòng)輸入的四運(yùn)算放大器。與單電源應(yīng)用場合的標(biāo)準(zhǔn)運(yùn)算放大器相比,它們有一些顯著優(yōu)點(diǎn)。該四放大器可以工作在低到3.0伏或者高到32伏的電源下,靜態(tài)電流為MC1741的靜態(tài)電流的五分之一。共

31、模輸入范圍包括負(fù)電源,因而消除了在許多應(yīng)用場合中采用外部偏置元件的必要性。每一組運(yùn)算放大器可用圖6所示的符號(hào)來表示,它有5個(gè)引出腳,其中“+”、“-”為兩個(gè)信號(hào)輸入端,“V+”、“V-”為正、負(fù)電源端,“Vo”為輸出端。兩個(gè)信號(hào)輸入端中,Vi-(-)為反相輸入端,表示運(yùn)放輸出端Vo的信號(hào)與該輸入端的位相反;Vi+(+)為同相輸入端,表示運(yùn)放輸出端Vo的信號(hào)與該輸入端的相位相同。</p><p>  圖6 LM32

32、4芯片引腳圖 </p><p><b>  軟件設(shè)計(jì)</b></p><p>  軟件程序流程圖如下:</p><p>  需要明確的是,該設(shè)計(jì)最核心的部分是信號(hào)發(fā)生部分,要想完成此設(shè)計(jì),最先應(yīng)該設(shè)計(jì)的是怎樣產(chǎn)生各種波形,只有產(chǎn)生了波形,才會(huì)有后續(xù)進(jìn)行精確地調(diào)試,產(chǎn)生完波形后,需要完成單片機(jī)與DAC0832之間的數(shù)據(jù)通信,編寫程序,可以先編

33、寫該程序進(jìn)行數(shù)據(jù)傳送的調(diào)試。</p><p><b>  圖7 程序流程圖</b></p><p><b>  發(fā)送數(shù)據(jù)子程序:</b></p><p>  DAC0832單緩沖方式是控制輸入寄存器和DAC寄存器同時(shí)接收資料,或者只用輸入寄存器而把DAC寄存器接成直通方式。此方式適用只有一路模擬量輸出或幾路模擬量異步輸出的

34、情形。</p><p><b>  波形產(chǎn)生過程</b></p><p><b>  1)方波產(chǎn)生過程</b></p><p>  方波的實(shí)現(xiàn)只需開始的時(shí)候設(shè)置一個(gè)初值然后直接輸出這個(gè)值就行了,輸出一段時(shí)間后,然后再重新置一個(gè)數(shù)據(jù),然后再輸出這個(gè)數(shù)據(jù)一段時(shí)間,但是此時(shí)的時(shí)間一定要等于前面那段時(shí)間。這樣才是一個(gè)方波。由此可以

35、調(diào)節(jié)兩個(gè)電壓維持的時(shí)間,產(chǎn)生占空比不同的方波,相比于模擬電驢,這樣的方式輸出的方波占空比更加精確,且電壓更加穩(wěn)定。</p><p><b>  2)三角波產(chǎn)生過程</b></p><p>  三角波的輸出的基礎(chǔ)是鋸齒波,將鋸齒波的產(chǎn)生當(dāng)作是三角波的前半部分,然后再相反的舉行減法,逐漸減為零,如此循環(huán),即可產(chǎn)生三角波。類似的,通過改變延時(shí)時(shí)間可以改變輸出的頻率,通過改變

36、最大值,可以改變輸出的電壓。輸出的波形連續(xù)性好,且波形很光滑。</p><p><b>  3)正弦波產(chǎn)生過程</b></p><p>  正弦波的實(shí)現(xiàn)實(shí)際上是一個(gè)查表過程,所查的每一個(gè)值都對(duì)應(yīng)著一個(gè)電壓,并且對(duì)應(yīng)著的電壓匯成圖形即為正弦波,然后重復(fù)這樣一個(gè)過程即可產(chǎn)生連續(xù)的正弦波.產(chǎn)生的正弦波,波形光滑且頻率可調(diào)。</p><p><b

37、>  Protues仿真</b></p><p>  1 仿真連接圖</p><p><b>  圖8 仿真連接圖</b></p><p>  2 仿真波形圖</p><p><b>  圖9 三角波仿真圖</b></p><p><b&g

38、t;  圖10 方波仿真圖</b></p><p>  圖11 正弦波仿真圖</p><p><b>  調(diào)試及實(shí)驗(yàn)結(jié)果</b></p><p>  1 開始時(shí),我們并未接低通濾波電路。因此所得到的波形誤差很大,但是基本形狀大致一樣。</p><p>  圖12 實(shí)際方波圖1</p>&l

39、t;p>  圖13 實(shí)際三角波圖1</p><p>  圖14 實(shí)際正弦波圖1</p><p>  最終,我們加入低通濾波電路之后,所得到的波形圖得到了很大的改善,但是由于我們設(shè)計(jì)的波形頻率范圍在1000Hz以下,所以還是有一些誤差。</p><p>  圖15 修改后的實(shí)際三角波</p><p>  圖16 修改后的實(shí)際方波</

40、p><p>  圖17 修改后的實(shí)際正弦波</p><p><b>  實(shí)驗(yàn)中遇到的問題</b></p><p><b>  錯(cuò)誤</b></p><p>  1) 最初LCD1602顯示錯(cuò)誤,總是一排黑方塊;后來通過搜索,終于知道是因?yàn)槌跏蓟绦蛴袉栴},改正之后正常顯示。</p><

41、;p>  2) 在實(shí)驗(yàn)室調(diào)試波形時(shí),最開始因?yàn)闆]有加低通濾波器,導(dǎo)致輸出波形失真嚴(yán)重;后來加了低通濾波電路后,效果大大改善。</p><p>  3) 開始復(fù)位電路不起作用,后來經(jīng)檢查是因?yàn)榫€路連接時(shí)出現(xiàn)問題,最后復(fù)位電路正常。</p><p><b>  不足</b></p><p>  1)由于我們設(shè)計(jì)的低通濾波電路截止頻率為1500

42、Hz,而信號(hào)發(fā)生器的頻率范圍在1000Hz以下,因此還是有噪聲的影響。</p><p>  2)由于運(yùn)放的參數(shù)是理想值,實(shí)際有差距,因此幅度誤差比較大。</p><p>  3)本設(shè)計(jì)只能頻率可調(diào),幅度無法調(diào)整。</p><p><b>  心得體會(huì)</b></p><p>  通過這次課程設(shè)計(jì),令我們對(duì)單片機(jī)有了更好的

43、掌握,鍛煉了我們的編程能力,在課程設(shè)計(jì)中,我們遇到的最大的挑戰(zhàn),就是對(duì)程序的調(diào)試,我們收獲最大的地方也在于此,我們需要逐條運(yùn)行每一小段調(diào)試程序,逐段逐句進(jìn)行編程調(diào)試,我們嘗試用匯編和C語言兩種語言進(jìn)行編程,將課上的學(xué)習(xí)的知識(shí)進(jìn)行了運(yùn)用。在此次試驗(yàn)中,我們還深刻體會(huì)到了理論與現(xiàn)實(shí)的差別。在Protues仿真中,只要將線路連接好后,所得的仿真結(jié)果便是理想中的波形,而現(xiàn)實(shí)中還必須考慮到電路中的噪聲,電磁干擾等。通過此次課程設(shè)計(jì),我們真的學(xué)到了

44、許多課堂上學(xué)不到的實(shí)戰(zhàn)經(jīng)驗(yàn)。</p><p><b>  參考文獻(xiàn)</b></p><p>  《單片機(jī)原理與應(yīng)用設(shè)計(jì)》 ,張毅剛, 電子工業(yè)出版社, 2011年。</p><p>  《單片微機(jī)原理及其接口技術(shù)》,胡漢才,清華大學(xué)出版社,2003年。</p><p>  《單片機(jī)原理與應(yīng)用》,孫亟芳,北京航空航天大學(xué)出

45、版社,2004年。</p><p>  《單片機(jī)程序設(shè)計(jì)基礎(chǔ)》,周航慈,北京航空航天大學(xué)出版社,2001年。</p><p><b>  附錄 程序清單</b></p><p>  1 波形生成數(shù)組(PLTABLE.H)</p><p>  #ifndef __PLTABLE_h__</p><p

46、>  #define __PLTABLE_h__</p><p>  /***********這兩組數(shù)組很重要,需要根據(jù)波形來調(diào)試,選擇合適的值,使輸出波形達(dá)到頻率要求************/</p><p>  uchar code waveTH[]={</p><p>  0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0

47、xff,0xff,</p><p>  0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,</p><p>  0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};</p><p>  uchar code waveTL[]={ </p><p&g

48、t;  0x16,0x9a,0x20,0x5e,0x88,0xa3,0xb8,0xc3,0xce,0xd6, //正弦波頻率調(diào)整中間值</p><p>  0xbc,0xce,0x58,0x8a,0xa9,0xbf,0xcb,0xd8,0xe0,0xee,//三角波頻率調(diào)整中間值</p><p>  0x98,0x60,0xa0,0x42,0x44,0xce,0x5a,0xb3,0xf5

49、,0x3c}; </p><p>  /*************************************************************************************************/</p><p>  uchar code triangle_tab[]={ //每隔數(shù)字8,采取一次</p><p>  0x0

50、0,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,</p><p>  0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,</p><p>  0xf8,0xf0,0x

51、e8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,</p><p>  0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00};</p><p>  uchar code sine_tab[256]=

52、{</p><p>  //輸出電壓從0到最大值(正弦波1/4部分)</p><p>  0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,</p><p>  0xbf,0xc2,0xc5,0xc7,0xc

53、a,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,</p><p>  0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,</

54、p><p>  //輸出電壓從最大值到0(正弦波1/4部分)</p><p>  0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,</p><p>  0xee,0xec,0xea,0xe9,0xe7,0xe5

55、,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,</p><p>  0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,</p>

56、<p>  //輸出電壓從0到最小值(正弦波1/4部分)</p><p>  0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,</p><p>  0x40,0x3d,0x3a,0x38,0x35,0x33,0x30

57、,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,</p><p>  0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,</p><

58、;p>  //輸出電壓從最小值到0(正弦波1/4部分)</p><p>  0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,</p><p>  0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x

59、1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,</p><p>  0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80}; </p><

60、p><b>  #endif</b></p><p>  2 鍵盤控制子程序(KEY.H)</p><p>  #ifndef __KEY_h__</p><p>  #define __KEY_h__</p><p>  #include "adc0832.h"</p><

61、;p>  #include "delay.h"</p><p>  #include "lcd1602.h"</p><p><b>  bit ST=0;</b></p><p>  bit DUQU=0;</p><p>  sbit key=P3^2;</p>

62、;<p>  unsigned char keytemp;</p><p>  unsigned int total_freq; //總頻率</p><p>  void key_int0() interrupt 0</p><p><b>  {</b></p><p>  EA=0; TR0=0;

63、 //關(guān)總中斷與定時(shí)器</p><p>  delay(50); //延時(shí)夠嗎</p><p>  if(key==0) //確實(shí)有按鍵按下而引發(fā)中斷</p><p>  {delay(50);</p><p>  if (key==0)</p><p><b>  {<

64、;/b></p><p>  keytemp=P3&0xf8; </p><p>  switch(keytemp)</p><p><b>  {</b></p><p>  case 0xf0://選擇波形</p><p>  waveform++;</p>&l

65、t;p>  if(waveform>2) waveform=0;</p><p><b>  break;</b></p><p>  case 0xe8: //頻率按規(guī)定單位依次增加</p><p>  wavefreq[waveform]++;</p><p>  if(wavefreq[wavefor

66、m]>10) wavefreq[waveform]=1;</p><p>  break;</p><p>  case 0xd8: //頻率按規(guī)定單位依次衰減</p><p>  wavefreq[waveform]--;</p><p>  if(wavefreq[waveform]<1) wavefr

67、eq[waveform]=10; </p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  } </b></p><p>  THtemp=waveTH[waveform*10+(wavefreq[waveform

68、]-1)]; //方括號(hào)中選取第幾個(gè)數(shù)后,并把該值賦給T_temp</p><p>  TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];</p><p>  total_freq= wavefreq[waveform] * freq_unit[waveform]; //求輸出頻率(個(gè)數(shù)*單位)</p><p>  

69、lcd_hang2[5]=total_freq%10+0x30;lcd_hang3[5]=total_freq%10+0x30; //在液晶中顯示個(gè)位,(0x30 在液晶顯示中表示數(shù)字0)</p><p>  total_freq/=10; lcd_hang2[4]=total_freq%10+0x30;lcd_hang3[4]=total_freq%10+0x30; //在液晶中

70、顯示時(shí)十位</p><p>  total_freq/=10; lcd_hang2[3]=total_freq%10+0x30;lcd_hang3[3]=total_freq%10+0x30; //在液晶中顯示時(shí)百位</p><p>  total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; lcd_hang3[2]=total_freq%10+0

71、x30;//在液晶中顯示時(shí)千位</p><p>  disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行顯示</p><p>  disp_lcd(0xc0,lcd_hang2); //在第二行顯示 </p><p><b>  } </b></p><p>

72、  wavecount=0; //'抽點(diǎn)'計(jì)數(shù)清零</p><p>  while(!key);</p><p>  EA=1; TR0=1; //開啟總中斷與定時(shí)器</p><p><b>  }</b></p><p><b>  #endif</b></p>

73、<p>  3 DAC0832數(shù)模轉(zhuǎn)換子程序(DAC0832.H)</p><p>  #ifndef __ADC0832_H__</p><p>  #define __ADC0832_H__</p><p>  #define DAdata P1//DA數(shù)據(jù)端口</p><p>  uchar wavecount;

74、 //'抽點(diǎn)'計(jì)數(shù)</p><p>  uchar THtemp,TLtemp;//傳遞頻率的中間變量</p><p>  uchar judge=1; //在方波輸出函數(shù)中用于簡單判別作用</p><p>  uchar waveform; //當(dāng)其為0、1、2時(shí),分別代表三種波</p><p>  uc

75、har code freq_unit[3]={5,25,100}; //三種波的頻率單位</p><p>  uchar idata wavefreq[3]={1,1,1}; //給每種波定義一個(gè)數(shù)組單元,用于存放單位頻率的個(gè)數(shù)</p><p>  sbit DA_S1= P2^7; // 控制DAC0832的8位輸入寄存器,僅當(dāng)都為0時(shí),可以輸出數(shù)據(jù)(處于直通狀態(tài)),否則,輸出

76、將被鎖存</p><p>  void triangle_out()//三角波輸出</p><p><b>  {</b></p><p>  DAdata=triangle_tab[wavecount++];</p><p>  if(wavecount>64) wavecount=0;</p>

77、<p>  DA_S1=0; //打開8位輸入寄存器</p><p>  DA_S1=1; //關(guān)閉8位輸入寄存器</p><p><b>  }</b></p><p>  void sine_out() //正弦波輸出</p><p><b>  {</b></p>

78、;<p>  DAdata=sine_tab[wavecount++];</p><p>  DA_S1=0; //打開8位輸入寄存器</p><p>  DA_S1=1; //關(guān)閉8位輸入寄存器</p><p><b>  }</b></p><p>  void square_out() //方波

79、輸出</p><p><b>  {</b></p><p>  judge=~judge;</p><p>  if(judge==1) DAdata=0xff;</p><p>  else DAdata=0x00;</p><p>  DA_S1=0; //打開8位輸入寄存器</

80、p><p>  DA_S1=1; //關(guān)閉8位輸入寄存器</p><p><b>  }</b></p><p><b>  #endif</b></p><p>  4 LCD1602顯示子程序(LCD1602.H)</p><p>  #ifndef __LCD1602_

81、h__</p><p>  #define __LCD1602_h__</p><p>  #include "delay.h"</p><p>  uchar code lcd_hang1[]={"ZX Wave " "SJ Wave " "JX Wav

82、e " "System Is Ready! " "Now to switch.." "SAVE ...... " "Finish! " "Reading ... " };</p><p>  uchar idata lcd_hang2[16]={"F=

83、 Hz "};</p><p>  uchar idata lcd_hang3[16]={"F= Hz . V"};</p><p>  /************1602液晶的相關(guān)函數(shù)*************/</p><p>  sbit rs=P2^0;</p><p> 

84、 sbit rw=P2^1;</p><p>  sbit lcden=P2^2;</p><p>  sbit lcdbf=P0^7;</p><p>  //sbit st=P2^1;</p><p>  //sbit sh=P2^2;</p><p>  //sbit ds=P2^0;</p>&l

85、t;p>  unsigned char i,j; </p><p>  /*void LCD_Wait(void)//讀忙狀態(tài)</p><p><b>  {</b></p><p><b>  rs=0;</b></p><p><b>  rw=1;</b><

86、;/p><p>  lcden=1;lcden=0;//下降沿</p><p>  while(lcdbf);</p><p><b>  {</b></p><p>  lcden=0;lcden=1; //仿真才需要此語句,實(shí)際硬件中不需要</p><p><b>  }&l

87、t;/b></p><p>  delay(10);</p><p><b>  }*/</b></p><p>  void write_com(uchar dat)</p><p><b>  {</b></p><p>  //LCD_Wait();</p&

88、gt;<p><b>  lcden=0;</b></p><p><b>  rs=0;</b></p><p><b>  rw=0;</b></p><p>  lcden=1;</p><p><b>  P0=dat;</b>

89、</p><p>  lcden=0;</p><p>  delay(10);</p><p><b>  }</b></p><p>  void write_date(uchar date)</p><p><b>  {</b></p><p

90、>  //LCD_Wait();</p><p><b>  lcden=0;</b></p><p><b>  rs=1;</b></p><p><b>  rw=0;</b></p><p>  lcden=1;</p><p><

91、;b>  P0=date;</b></p><p>  lcden=0;</p><p>  delay(10);</p><p><b>  }</b></p><p>  void disp_lcd(uchar addr,uchar *temp1) reentrant</p>

92、<p>  {</p><p>  uchar num;</p><p>  write_com(addr);</p><p>  delay(1); //延時(shí)一會(huì)兒???</p><p>  for(num=0;num<16;num++)</p><p><b>  

93、{</b></p><p>  write_date(temp1[num]);//或者這樣寫write_date(*(temp1+num));</p><p><b>  delay(1);</b></p><p><b>  }</b></p><p><b>  }<

94、/b></p><p>  void init_lcd()</p><p><b>  {</b></p><p>  //uchar num;</p><p>  lcden=0; //可有可無???</p><p>  rw=0; //初始化一定要設(shè)置為零,表示寫數(shù)據(jù)</p&g

95、t;<p>  write_com(0x38); //使液晶顯示點(diǎn)陣,為下面做準(zhǔn)備</p><p>  write_com(0x38);</p><p>  write_com(0x0c); //初始設(shè)置</p><p>  write_com(0x06); //初始設(shè)置</p><p>  write_com(0x01)

96、; //清零</p><p>  delay(10);</p><p>  write_com(0x80); //使指針指向第一行第一格</p><p>  disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行顯示</p><p>  disp_lcd(0xc0,&lcd_hang1[4*16]

97、); //在第二行顯示</p><p><b>  }</b></p><p>  /********************1602液晶函數(shù)聲明結(jié)束*********************/</p><p><b>  #endif</b></p><p>  5 延時(shí)子程序(DELAY.

98、H)</p><p>  #ifndef __DELAY_h__</p><p>  #define __DELAY_h__</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  void delay(uc

99、har z) </p><p><b>  {</b></p><p>  uchar x,y;</p><p>  for(x=z;x>0;x--)</p><p>  for(y=110;y>0;y--);</p><p><b>  }</b></

100、p><p>  void delay5us()</p><p>  { uchar i;</p><p>  for(i=1;i>0;i--);</p><p><b>  }</b></p><p><b>  #endif</b></p><p&

101、gt;  6 主程序(main.c)</p><p>  #include<reg52.h></p><p>  #include "lcd1602.h"</p><p>  #include "delay.h"</p><p>  #include "pltable.h&quo

102、t;</p><p>  #include "key.h"</p><p>  #include "adc0832.h"</p><p>  void timer0() interrupt 1</p><p><b>  {</b></p><p>  TH

103、0=THtemp;</p><p>  TL0=TLtemp;</p><p>  if(waveform==0) sine_out();</p><p>  else if(waveform==1) triangle_out();</p><p>  else if(waveform==2) square_out();<

104、/p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p><b>  DAdata=0;</b></p><p>  DA_S1=1; //關(guān)閉8位輸入寄存器</p&

105、gt;<p>  init_lcd();</p><p>  TMOD=0x01; //設(shè)置定時(shí)器0為16位工作方式</p><p>  IT0=1; //設(shè)置外部中斷0為下降沿觸發(fā)</p><p>  ET0=1; //開定時(shí)器中斷</p><p><b>  EX0=1; </b>

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論