標(biāo)題: 一個(gè)波形發(fā)生器的單片機(jī)課程設(shè)計(jì) 附帶仿真源碼和課設(shè)報(bào)告 [打印本頁(yè)]

作者: FHFHFHCC    時(shí)間: 2018-7-11 11:18
標(biāo)題: 一個(gè)波形發(fā)生器的單片機(jī)課程設(shè)計(jì) 附帶仿真源碼和課設(shè)報(bào)告
課程設(shè)計(jì)(論文)任務(wù)書(shū)
專(zhuān)業(yè)班級(jí):電子1302  
學(xué)生姓名:
指導(dǎo)教師(簽名):
一、課程設(shè)計(jì)(論文)題目
正弦波信號(hào)發(fā)生器設(shè)計(jì)
二、本次課程設(shè)計(jì)(論文)應(yīng)達(dá)到的目的
本次課程設(shè)計(jì)是自動(dòng)化專(zhuān)業(yè)學(xué)生在學(xué)習(xí)了《單片機(jī)原理及應(yīng)用》課程及《模擬電子線(xiàn)路》、《數(shù)字電子線(xiàn)路》等專(zhuān)業(yè)基礎(chǔ)課程之后進(jìn)行的一次綜合訓(xùn)練,其主要目的是加深學(xué)生對(duì)單片機(jī)軟硬件技術(shù)和相關(guān)理論知識(shí)的理解,進(jìn)一步熟悉51單片機(jī)系統(tǒng)設(shè)計(jì)的基本理論、方法和技能;掌握工程應(yīng)用的基本內(nèi)容和要求,力爭(zhēng)做到理論與實(shí)際的統(tǒng)一;同時(shí)培養(yǎng)學(xué)生分析問(wèn)題、解決問(wèn)題的能力和獨(dú)立完成系統(tǒng)設(shè)計(jì)的能力,并按要求編寫(xiě)相關(guān)的技術(shù)文檔和設(shè)計(jì)報(bào)告等。
三、本次課程設(shè)計(jì)(論文)任務(wù)的主要內(nèi)容和要求(包括原始數(shù)據(jù)、技術(shù)參數(shù)、設(shè)計(jì)要求等)
1.設(shè)計(jì)內(nèi)容
(1)選擇51單片機(jī),晶振采用12MHz。
(2)設(shè)計(jì)一個(gè)能產(chǎn)生0至50HZ正弦波信號(hào)。通過(guò)0832D/A芯片完成數(shù)模轉(zhuǎn)換。
(3)頻率值由鍵盤(pán)輸入。
(4)將頻率值由LED數(shù)碼管上顯示(兩位)。
2.設(shè)計(jì)要求
(1)按照任務(wù)書(shū)的要個(gè)求完成系統(tǒng)分析及方案設(shè)計(jì)。
(2)完成硬件原理圖的設(shè)計(jì),并選擇相關(guān)元器件。
(3)完成控制軟件流程圖的設(shè)計(jì),編寫(xiě)相應(yīng)的單片機(jī)控制程序。
(4)撰寫(xiě)設(shè)計(jì)報(bào)告。
3. 成果要求
(1)在proteus中實(shí)現(xiàn)仿真。
(2)提交課程設(shè)計(jì)報(bào)告。

信號(hào)發(fā)生器是一種常用的信號(hào)源,廣泛地應(yīng)用于電子電路、自動(dòng)控制系統(tǒng)和教學(xué)實(shí)驗(yàn)等領(lǐng)域。 本設(shè)計(jì)采用AT89C51單片機(jī)作為控制核心,外圍采用數(shù)字/模擬轉(zhuǎn)換電路(DAC0832)、運(yùn)放電路(LM324)、按鍵和LCD液晶顯示電路。電路采用單片機(jī)和一片DAC0832數(shù)模轉(zhuǎn)換器組成數(shù)字式低頻信號(hào)發(fā)生器,可產(chǎn)生正弦波、矩形波、鋸齒波和三角波四種波形。系統(tǒng)通過(guò)單片機(jī)產(chǎn)生數(shù)字信號(hào),通過(guò)DAC0832轉(zhuǎn)換為模擬信號(hào),再通過(guò)放大器LM324就可以得到雙極性的各種波形,最終由示波器顯示出來(lái)。通過(guò)鍵盤(pán)來(lái)控制四種波形的類(lèi)型選擇、頻率變化,并通過(guò)液晶1602顯示其各自的波形類(lèi)型以及頻率數(shù)值。

本設(shè)計(jì)硬件電路簡(jiǎn)單,軟件功能完善,控制系統(tǒng)可靠,性?xún)r(jià)比較高,具有一定的實(shí)用價(jià)值和參考價(jià)值。



1 系統(tǒng)總體設(shè)計(jì)              1

1.1 系統(tǒng)基本模塊設(shè)計(jì)與論證              1

1.1.1 信號(hào)發(fā)生模塊              1

1.1.2 鍵盤(pán)模塊              1

1.1.3 電路設(shè)計(jì)最終方案              2

1.2 系統(tǒng)原理及總體結(jié)構(gòu)圖              2

1.2.1 系統(tǒng)總體結(jié)構(gòu)圖              2

1.2.2 系統(tǒng)工作原理              2

2 系統(tǒng)硬件設(shè)計(jì)              3

2.1 系統(tǒng)硬件仿真原理圖              3

2.2 系統(tǒng)主要單元電路設(shè)計(jì)              4

2.2.1 主控制器AT89C51              4

2.2.2 數(shù)/模轉(zhuǎn)換電路              7

2.2.3 電流/電壓轉(zhuǎn)換放大電路

2.2.4 鍵盤(pán)電路

3 系統(tǒng)軟件設(shè)計(jì)

3.1 系統(tǒng)主程序流程框圖

3.2 信號(hào)產(chǎn)生子程序

3.2.1 正弦波發(fā)生子程序

3.2.2 矩形波發(fā)生子程序              18

3.2.3 三角波發(fā)生子程序              18

3.2.4 鋸齒波發(fā)生子程序              20

3.3按鍵處理子程序              20

3.4 INT0中斷子程序              1

4 系統(tǒng)調(diào)試

4.1 系統(tǒng)調(diào)試過(guò)程

4.2 調(diào)試中的問(wèn)題及解決方法

4.3 系統(tǒng)仿真結(jié)果

5 結(jié)論              28

5.1 結(jié)論              28

參考文獻(xiàn)8

1



1 系統(tǒng)總體設(shè)計(jì)
1.1 系統(tǒng)基本模塊設(shè)計(jì)與論證
1.1.1 信號(hào)發(fā)生模塊

采用單片機(jī)和DAC0832數(shù)模轉(zhuǎn)換器生成波形。通過(guò)編程的方法來(lái)控制輸入到數(shù)模轉(zhuǎn)換電路的數(shù)字量,從而控制輸出信號(hào)的波形和頻率。它的特點(diǎn)是價(jià)格低、設(shè)計(jì)簡(jiǎn)單,在低頻范圍內(nèi)穩(wěn)定性好、操作方便、體積小、耗電少。

該既可滿(mǎn)足畢業(yè)設(shè)計(jì)的基本要求又能充分發(fā)揮其優(yōu)勢(shì),電路簡(jiǎn)單,易控制,性?xún)r(jià)比較高,所以采用該方案。

1.1.2 鍵盤(pán)模塊

采用矩陣式鍵盤(pán),鍵盤(pán)為4*4矩陣式行列掃描,優(yōu)點(diǎn)是當(dāng)按鍵較多時(shí)可降低占用單片機(jī)的I/O口數(shù)目。

1.1.3 電路設(shè)計(jì)最終方案

本系統(tǒng)包括主控模塊,顯示模塊,信號(hào)發(fā)生模塊,鍵盤(pán)模塊,運(yùn)放模塊,綜上各方案所述,確定最終設(shè)計(jì)方案為:采用AT89C51作為主控制系統(tǒng),獨(dú)立式按鍵作為鍵盤(pán)模塊,數(shù)模轉(zhuǎn)換芯片DAC0832作為信號(hào)發(fā)生模塊,LM324作為電流/電壓轉(zhuǎn)換放大模塊。

1.2 系統(tǒng)原理及總體結(jié)構(gòu)圖1.2.1 系統(tǒng)總體結(jié)構(gòu)圖

根據(jù)上述電路設(shè)計(jì)的最終方案,系統(tǒng)總體設(shè)計(jì)結(jié)構(gòu)如圖1所示。

圖1  系統(tǒng)總體結(jié)構(gòu)圖
1.2.2系統(tǒng)工作原理

數(shù)字信號(hào)可以通過(guò)數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號(hào),因此可通過(guò)產(chǎn)生數(shù)字信號(hào)再轉(zhuǎn)換成模擬信號(hào)的方法來(lái)獲得所需要的波形。在本設(shè)計(jì)中,AT89C51是整個(gè)波形發(fā)生器的核心部分,外圍電路包括數(shù)字/模擬轉(zhuǎn)換電路、電流/電壓轉(zhuǎn)換放大電路、按鍵電路和晶振電路。外接12MHz晶振電路為單片機(jī)提供工作脈沖。P0口接數(shù)模轉(zhuǎn)換芯片DAC0832的DI0~DI7,為數(shù)模轉(zhuǎn)換芯片提供數(shù)字信號(hào);P2.0~P2.4外接獨(dú)立鍵盤(pán),以控制信號(hào)的類(lèi)型、頻率等。

通過(guò)對(duì)單片機(jī)編寫(xiě)程序,控制從P0口輸出的數(shù)字信號(hào)類(lèi)型,P0口的數(shù)字信號(hào)再輸入到數(shù)模轉(zhuǎn)換芯片DAC0832中,從而轉(zhuǎn)換為模擬信號(hào)輸出。DAC0832輸出的模擬信號(hào)為電流信號(hào),所以用電流/電壓運(yùn)算放大器LM324將電流信號(hào)再轉(zhuǎn)換成電壓信號(hào)輸出。用兩片LM324可以得到輸出波形的雙極性輸出,將輸出的波形與示波器相連即可觀察輸出波形的特征。獨(dú)立式鍵盤(pán)可以控制從P0口輸出的數(shù)字信號(hào),按下不同的鍵可以使此輸出信號(hào)改變,從而使輸出的波形實(shí)現(xiàn)正弦波、矩形波、鋸齒波和三角波之間的轉(zhuǎn)變,并能夠改變波形輸出頻率的大小。

2 系統(tǒng)硬件設(shè)計(jì)2.1系統(tǒng)硬件仿真原理圖

硬件設(shè)計(jì)是系統(tǒng)設(shè)計(jì)的重點(diǎn)之一,選擇合適的元器件尤為重要。在本設(shè)計(jì)中,根據(jù)設(shè)計(jì)的總體方案,選擇AT89C51作為主控制器、DAC0832為數(shù)模轉(zhuǎn)換芯片、LM324為電流/電壓轉(zhuǎn)換元件、5個(gè)獨(dú)立式按鍵為按鍵模塊元件。本設(shè)計(jì)在Proteus軟件中繪制的硬件電路圖如圖2所示。

圖2  硬件仿真原理圖
2.2 系統(tǒng)主要單元電路設(shè)計(jì)2.2.1 主控制器AT89C51

AT89C51是美國(guó)ATMEL公司生產(chǎn)的低電壓、高性能CMOS 8位單片機(jī),片內(nèi)含4KB的可反復(fù)擦除的只讀程序存儲(chǔ)器(PEROM)和128B隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn)兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(CPU)和FLASH存儲(chǔ)單元,功能強(qiáng)大AT89C51單片機(jī)可為您提供許多高性?xún)r(jià)比的應(yīng)用場(chǎng)合。

主要性能參數(shù):

①與MCS-51產(chǎn)品指令系統(tǒng)完全兼容

②4K字節(jié)可重擦寫(xiě)FLASH閃速存儲(chǔ)器

③1000次擦寫(xiě)周期

④全靜態(tài)操作:0HZ-24MHZ

⑤三級(jí)加密程序存儲(chǔ)器

⑥1288字節(jié)內(nèi)部RAM

⑦32個(gè)可編程I/O口線(xiàn)

⑧2個(gè)16位定時(shí)/計(jì)數(shù)器

⑨6個(gè)中斷源

⑩可編程串行UART通道

                     

                       圖3   AT89C51 引腳封裝圖

AT89C51引腳封裝如圖3所示,其芯片引腳介紹如下:

(1)主電源引腳

VCC:+5 V電源   VSS:地線(xiàn)。

(2)時(shí)鐘電路引腳

XTAL1和XTAL2:外接晶體引線(xiàn)端。當(dāng)使用芯片內(nèi)部時(shí)鐘時(shí),此二引線(xiàn)端用于外接石英晶體和微調(diào)電容;當(dāng)使用外部時(shí)鐘時(shí),用于接外部時(shí)鐘脈沖信號(hào)。

(3)控制信號(hào)引腳

RST/VPD:復(fù)位信號(hào)。當(dāng)輸入的復(fù)位信號(hào)延續(xù)兩個(gè)機(jī)器周期以上的高電平時(shí)即為有效,用以完成單片機(jī)的復(fù)位初始化操作;當(dāng)單片機(jī)掉電時(shí),此引腳上可接備用電源,由VPD向片內(nèi)RAM提供備用電源,以保持片內(nèi)RAM中的數(shù)據(jù)不丟失。

ALE/PROG:地址鎖存控制信號(hào)。在系統(tǒng)擴(kuò)展時(shí),ALE用于控制把P0口輸出的低8位地址鎖存起來(lái),以實(shí)現(xiàn)低位地址和數(shù)據(jù)的隔離。此外,由于ALE是以晶振1/6的固定頻率輸出的正脈沖,因此,可作為外部時(shí)鐘或外部定時(shí)脈沖使用。

PSEN:片外程序存儲(chǔ)器讀選通信號(hào)輸出端。

EA/VPP:訪(fǎng)問(wèn)程序存儲(chǔ)控制信號(hào)。當(dāng)EA信號(hào)為低電平時(shí),對(duì)ROM的讀操作限定在外部程序存儲(chǔ)器;當(dāng)EA信號(hào)為高電平時(shí),對(duì)ROM的讀操作是從內(nèi)部程序存儲(chǔ)器開(kāi)始,并可延至外部程序存儲(chǔ)器。

              (4)I/O引腳

P0.0 ~ P0.7 :P0口8位雙向口線(xiàn);P1.0 ~ P1.7 :P1口8位雙向口線(xiàn);

P2.0 ~ P2.7 :P2口8位雙向口線(xiàn);P3.0 ~ P3.7 :P3口8位雙向口線(xiàn)。

P3口線(xiàn)的第二功能。P3的8條口線(xiàn)都定義有第二功能,詳見(jiàn)表1。

表1  P3口各引腳與第二功能表

引腳

第二功能

信號(hào)名稱(chēng)

P3.0

RXD

串行數(shù)據(jù)接收

P3.1

TXD

串行數(shù)據(jù)發(fā)送

P3.2

INT0

外部中斷0申請(qǐng)

P3.3

INT1

外部中斷1申請(qǐng)

P3.4

T0

定時(shí)/計(jì)數(shù)器0的外部輸入

P3.5

T1

定時(shí)/計(jì)數(shù)器1的外部輸入

P3.6

WR

外部RAM寫(xiě)選通

P3.7

RD

外部RAM讀選通

以上把8051單片機(jī)的全部信號(hào)引腳分別以第一功能和第二功能的形式列出。對(duì)于各種型號(hào)的芯片,其引腳的第一功能信號(hào)是相同的,所不同的只在引腳的第二功能信號(hào)。對(duì)于9、30和31三個(gè)引腳,由于第一功能信號(hào)與第二功能信號(hào)是單片機(jī)在不同工作方式下的信號(hào),因此不會(huì)發(fā)生使用上的矛盾。但是P3口的情況卻有所不同,它的第二功能信號(hào)都是單片機(jī)的重要控制信號(hào)。因此,在實(shí)際使用時(shí),都是先按需要選用第二功能信號(hào),剩下的才以第一功能的身份作數(shù)據(jù)位的輸入/輸出使用。

如圖4所示,本設(shè)計(jì)中單片機(jī)資源的分配情況如下:

(1)單片機(jī)使用外部電路來(lái)提供時(shí)鐘脈沖。引腳XTAL1和XTAL2之間接12MHz的石英晶體,使單片機(jī)的一個(gè)機(jī)器周期為1us。

(2)P0口與DAC0832的DI0-DI7數(shù)據(jù)輸入口相連,因?yàn)镻0口內(nèi)部沒(méi)有上拉電阻,不能輸出高電平,所以要接上拉電阻RESPACK-8; P2口的P2^0-P2^4分別與5個(gè)獨(dú)立按鍵相連。

圖4  單片機(jī)控制模塊

2.2.2 數(shù)模轉(zhuǎn)換電路

數(shù)模轉(zhuǎn)換電路是本設(shè)計(jì)的關(guān)鍵電路,它決定著將數(shù)字信號(hào)轉(zhuǎn)變?yōu)槟M信號(hào),從而得到各種所需要的波形。

1. 數(shù)模轉(zhuǎn)換器的工作原理

數(shù)模轉(zhuǎn)換器可將數(shù)字量信號(hào)轉(zhuǎn)換成與此數(shù)值成正比的模擬量信號(hào)。需要轉(zhuǎn)換的數(shù)字量由一個(gè)二進(jìn)制數(shù)字表示,每位二進(jìn)制數(shù)字都有一定的權(quán),在轉(zhuǎn)換中,應(yīng)將二進(jìn)制數(shù)的每一位按照權(quán)的大小轉(zhuǎn)換成相應(yīng)的模擬量輸出分量,然后將各個(gè)輸出分量疊加,總和就是與數(shù)字量成正比的模擬量數(shù)值。

上述的D/A轉(zhuǎn)換,常用如圖5所示的倒T形解碼網(wǎng)絡(luò)加以實(shí)現(xiàn)。

                                                                                   圖5  倒T形電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換器

電路設(shè)計(jì)如圖5所示,包括由R-2R組成的電阻網(wǎng)絡(luò)、模擬電子開(kāi)關(guān)和集成運(yùn)算放大器。

對(duì)于電阻網(wǎng)絡(luò),無(wú)論從哪個(gè)R-2R節(jié)點(diǎn)看,等效電阻都是R,因此,從參考電壓端輸入的電流為: IR=VREF/R

根據(jù)分流公式,各支路電流為:

I7=I/21I6 =I/22I5 =I/23I4 =I/24I3 =I/25I2 =I/26I1 =I/27I0 =I/28

于是,經(jīng)過(guò)運(yùn)算放大器輸出的模擬電壓VO為:

VO = - RF∑Ii= -Rfb VREF/R×28(D7×27 +D6×26 +D5×25+

D4×24+D3×23+D2×22+D1×21+D0×20)

其中VREF是進(jìn)行D/A轉(zhuǎn)換的系統(tǒng)提供的參考電壓,Rfb為集成運(yùn)算放大器的反饋電阻,D7 ~ D0取值為0或1,0表示切換開(kāi)關(guān)與地相連,1表示與參考電壓相連。通過(guò)上述電路,即完成了二進(jìn)制數(shù)字信號(hào)到模擬電壓信號(hào)的轉(zhuǎn)換。

2.?dāng)?shù)模轉(zhuǎn)換器的主要技術(shù)指標(biāo)

分辨率指輸入給D/A轉(zhuǎn)換器的單位數(shù)字量引起的模擬量輸出的變化,通常定義為輸出滿(mǎn)刻度值與2n之比(n為D/A轉(zhuǎn)換器的二進(jìn)制位數(shù))。顯然,二進(jìn)制位數(shù)越多,分辨率越高,即D/A轉(zhuǎn)換器對(duì)輸入量變化的敏感程度越高。例如,8位的D/A轉(zhuǎn)換器,若滿(mǎn)量程輸出為10V,根據(jù)分辨率定義,則分辨率為10V/2n,分辨率為10V/256=39.1mV,即輸入的二進(jìn)制最低位的變化可引起輸出的模擬電壓變化39.1mV,該值占滿(mǎn)量程的0.391%,常用1LSB表示。使用時(shí),應(yīng)根據(jù)對(duì)D/A轉(zhuǎn)換器分辨率的需要來(lái)選定D/A轉(zhuǎn)換器的位數(shù)。

相對(duì)精度是指在滿(mǎn)刻度已經(jīng)校準(zhǔn)的前提下,在整個(gè)刻度范圍內(nèi),對(duì)應(yīng)于任一數(shù)碼的模擬量輸出與它的理論值之差。通常用偏差幾個(gè)LSB來(lái)表示。

建立時(shí)間是描述D/A轉(zhuǎn)換器轉(zhuǎn)換快慢的一個(gè)參數(shù),用于表明轉(zhuǎn)換時(shí)間或轉(zhuǎn)換速度。其值為從輸入數(shù)字量到輸出達(dá)到總值誤差±(1/2)LSB(最低有效位)時(shí)所需的時(shí)間。電流輸出的轉(zhuǎn)換時(shí)間較短,而電壓輸出的轉(zhuǎn)換器,由于要加上完成I-V轉(zhuǎn)換的運(yùn)算放大器的延遲時(shí)間,因此轉(zhuǎn)換時(shí)間要長(zhǎng)一些。快速D/A轉(zhuǎn)換器的轉(zhuǎn)換時(shí)間可控制在1us以下。

通常用非線(xiàn)性誤差的大小表示D/A轉(zhuǎn)換器的線(xiàn)性度,輸入輸出特性的偏差與滿(mǎn)刻度輸出之比的百分?jǐn)?shù)表示非線(xiàn)性誤差。一定溫度下的最大非線(xiàn)性誤差一般為0.01%~0.03%。

3. DAC0832數(shù)模轉(zhuǎn)換芯片主要特性與結(jié)構(gòu)

DAC0832系列為美國(guó)國(guó)家半導(dǎo)體公司生產(chǎn)的具有2個(gè)數(shù)據(jù)寄存器的8位分辨率的D/A轉(zhuǎn)換芯片。此芯片與微處理器完全兼容,并且價(jià)格低廉,接口簡(jiǎn)單,轉(zhuǎn)換控制容易,在單片機(jī)應(yīng)用系統(tǒng)中得到了廣泛的應(yīng)用。

1.DAC0832的主要特性

2.DAC0832的內(nèi)部結(jié)構(gòu)

DAC0832的內(nèi)部結(jié)構(gòu)框圖如圖6所示。它由8位輸入鎖存器、8位DAC寄存器、8位D/A轉(zhuǎn)換器及轉(zhuǎn)換控制電路構(gòu)成,通過(guò)兩個(gè)輸入寄存器構(gòu)成兩級(jí)數(shù)據(jù)輸入鎖存。

                                                                                                  圖 6   DAC0832內(nèi)部邏輯框圖

              使用時(shí),數(shù)據(jù)輸入可以采用兩級(jí)鎖存(雙鎖存)、單級(jí)鎖存(一級(jí)鎖存,一級(jí)直通方式)或直接輸入(兩級(jí)直通)形式。上圖中,2個(gè)與門(mén)電路組成寄存器輸出控制邏輯電路,該邏輯電路的功能是進(jìn)行數(shù)據(jù)鎖存控制。

3.DAC0832的引腳功能

              DI0~DI7:8位數(shù)據(jù)輸入線(xiàn)。

              :片選信號(hào)輸入,低電平有效。

              ILE:數(shù)據(jù)鎖存允許控制信號(hào),高電平有效。

1:輸入寄存器寫(xiě)選通輸入信號(hào),低

平有效。                                                                                                                                                                        圖 7  DAC0832的引腳                                            

              2:DAC寄存器寫(xiě)選通輸入信號(hào),低電平有效。

              :數(shù)據(jù)傳送控制信號(hào),低電平有效。上述兩個(gè)信號(hào)控制DAC寄存器是否為數(shù)據(jù)直通方式。當(dāng)2=0和=0時(shí),為DAC寄存器直通方式;當(dāng)2=1或=1時(shí),為DAC寄存器鎖存方式。

              IOUT1、IOUT2:電流輸出,IOUT1+IOUT2=常數(shù)。

Rfb:反饋電阻輸入端。內(nèi)部接反饋電阻,外部通過(guò)該引腳接運(yùn)放輸出端。為了取得電壓輸出,需要在輸出端接運(yùn)算放大器,Rfb即為運(yùn)算放大器的反饋電阻端。

              Vref:基準(zhǔn)電壓,其值為-10V~+10V。

              AGND:模擬信號(hào)地。

              DGND:數(shù)字信號(hào)地,為工作電源地和數(shù)字邏輯地,可在基準(zhǔn)電源處進(jìn)行單點(diǎn)共地。

              VCC:電源輸入端,其值為+5V~+15V。

4.DAC0832芯片與單片機(jī)的接口

DAC0832根據(jù)控制信號(hào)的接法可分為三種工作方式:直通方式、單緩沖方式、雙緩沖方式。

此時(shí)輸入鎖存器和DAC寄存器相應(yīng)的控制信號(hào)引腳分別連在一起,使數(shù)據(jù)直接寫(xiě)入DAC寄存器,立即進(jìn)行D/A轉(zhuǎn)換(這種情況下,輸入鎖存器不起鎖存作用)。此方式適用于只有一路模擬量輸出,或有幾路模擬量輸出但是并不要求同步的系統(tǒng)。            

2. 雙緩沖方式

對(duì)于多路D/A轉(zhuǎn)換輸出,如果要求同步進(jìn)行,可以采用雙緩沖同步方式。DAC0832工作于雙緩沖工作方式時(shí),數(shù)字量的輸入鎖存和D/A轉(zhuǎn)換是分兩步完成的。首先CPU的數(shù)據(jù)總線(xiàn)分時(shí)向各路D/A轉(zhuǎn)換器輸入要轉(zhuǎn)換的數(shù)字量,并將其鎖存在各自的輸入鎖存器中,然后CPU對(duì)所有的DAC發(fā)出控制信號(hào),使各個(gè)DAC輸入鎖存器中的數(shù)據(jù)打入DAC寄存器,實(shí)現(xiàn)同步轉(zhuǎn)換輸出。

              3. 直通工作方式

當(dāng)DAC0832芯片的片選信號(hào)、寫(xiě)信號(hào)1、2及傳送控制信號(hào)的引腳全部接地,允許輸入鎖存信號(hào)ILE引腳+5V時(shí),DAC0832芯片就處于直通工作方式,數(shù)字量一旦輸入,就直接進(jìn)入DAC寄存器,進(jìn)行D/A轉(zhuǎn)換,從輸出端得到轉(zhuǎn)換的模擬量。

本設(shè)計(jì)中,為了降低數(shù)模轉(zhuǎn)換建立的時(shí)間,數(shù)模轉(zhuǎn)換芯片DAC0832采用直通的工作方式。

2.2.3 電流/電壓轉(zhuǎn)換放大電路

由于從DAC0832轉(zhuǎn)換出來(lái)的模擬信號(hào)為電流信號(hào),為了方便觀測(cè)輸出信號(hào)的特征,特將DAC0832輸出的信號(hào)經(jīng)過(guò)電流/電壓轉(zhuǎn)換放大電路轉(zhuǎn)變?yōu)殡妷盒盘?hào)。本設(shè)計(jì)中使用的運(yùn)放為L(zhǎng)M324。LM324運(yùn)算放大器是價(jià)格便宜的帶差動(dòng)輸入功能的四運(yùn)算放大器。其引腳圖如圖8所示。

   LM324的特點(diǎn):

1.短路保護(hù)輸出

2.真差動(dòng)輸入級(jí)            

3.可單電源工作:3V-32V

4.低偏置電流:最大100nA(LM324A)

5.每封裝含四個(gè)運(yùn)算放大器。

6.具有內(nèi)部補(bǔ)償?shù)墓δ堋?/font>

7.共模范圍擴(kuò)展到負(fù)電源

8.行業(yè)標(biāo)準(zhǔn)的引腳排列

9.輸入端具有靜電保護(hù)功能                   圖8  LM324引腳


DAC0832輸出信號(hào)經(jīng)運(yùn)放電路轉(zhuǎn)變?yōu)殡妷汉笥袃煞N輸出方式。一種為單極性輸出方式。此方式中,DAC0832通過(guò)使用一片LM324運(yùn)算放大器將從單片機(jī)輸入的數(shù)字量Din轉(zhuǎn)換為電壓輸出,其輸出電壓為Uout=Din/28 *(-VREF)。當(dāng)VREF=5V時(shí),Uout的輸出范圍為-5V~0V。另一種為雙極性輸出方式。本設(shè)計(jì)中采用雙極性輸出方式,如圖9所示。其雙極性輸出原理為:因?yàn)閁1為-5V~0V,根據(jù)電流環(huán)路定理有

即:Uout=-VREF-2U1

所以當(dāng)VREF=5V,而U1為-5V~ 0V輸出時(shí),Uout的輸出為-5~+5V,即實(shí)現(xiàn)了雙極性輸出。

圖9  DAC0832和兩片LM324實(shí)現(xiàn)雙極性輸出

2.2.4鍵盤(pán)電路

該子系統(tǒng)是5個(gè)獨(dú)立鍵盤(pán)和一個(gè)2輸入與門(mén)組成,其中與門(mén)輸出端連接單片機(jī)的P3.2口以便形成外部中斷。5個(gè)按鍵分別連接單片機(jī)的P2.0~P2.4口。2輸入與門(mén)一引腳與K1按鍵相連,另一引腳接高電平。當(dāng)K1按下時(shí),INT0為低電平,可知外部中斷到了,系統(tǒng)執(zhí)行中斷程序。當(dāng)K2~K5按鍵某一個(gè)按下時(shí),對(duì)應(yīng)的P2.1~P2.4口中某個(gè)為低電平,系統(tǒng)可以感知此按鍵按下,從而執(zhí)行相應(yīng)的程序。每個(gè)按鍵的功能如表2所示。

表2 按鍵功能表

按鍵

功能

屬性

K1

波形選擇

自動(dòng)復(fù)位

K2

頻率升高

自動(dòng)復(fù)位

K3

頻率降低

自動(dòng)復(fù)位

K4

占空比升高

自動(dòng)復(fù)位

K5

占空比降低

自動(dòng)復(fù)位

按鍵電路的電路圖如圖15所示。

圖15 按鍵電路圖
3 系統(tǒng)軟件設(shè)計(jì)

系統(tǒng)軟件主要是用來(lái)控制信號(hào)發(fā)生器系統(tǒng)按照設(shè)計(jì)的邏輯進(jìn)行運(yùn)行。在軟件設(shè)計(jì)上,根據(jù)功能分成了多個(gè)模塊編程,主要包括:主程序模塊、四種不同的波形產(chǎn)生模塊、按鍵處理模塊、外部中斷模塊等。

3.1 系統(tǒng)主程序流程框圖

系統(tǒng)主程序流程圖如圖16所示,源程序見(jiàn)附件。











圖16  系統(tǒng)主程序流程圖

3.2 信號(hào)產(chǎn)生子程序

本系統(tǒng)采用編程的方法,來(lái)輸出四種不同的波形即正弦波、矩形波、三角波、鋸齒波。各種波形的產(chǎn)生方法如下。

3.2.1 正弦波發(fā)生子程序

正弦波的產(chǎn)生比較特殊,它不能由單片機(jī)直接產(chǎn)生,只能由如圖17所示的階梯波來(lái)向正弦波逼近。很顯然,在一個(gè)周期內(nèi)階梯波的階梯數(shù)目越多,單片機(jī)輸出的波形也就越接近正弦波。

圖17 正弦波信號(hào)的產(chǎn)生

先假定正弦波的振幅是2.56 V,則波谷對(duì)應(yīng)的數(shù)字量為最小值00H,波峰對(duì)應(yīng)的數(shù)字量為最大值FFH。將正弦波的第一個(gè)周期的波形按角度均分為若干等份,并計(jì)算出各點(diǎn)對(duì)應(yīng)的電壓值,電壓值計(jì)算方法:Vx=2.5·(1+sinθ),因?yàn)?0H~FFH對(duì)應(yīng)的數(shù)字量為0~255,所以根據(jù)算出的電壓就可直接寫(xiě)出各點(diǎn)所對(duì)應(yīng)的數(shù)字量。單片機(jī)將一個(gè)周期的數(shù)字量存入一定的存儲(chǔ)區(qū)域中,然后依次循環(huán)取出這些數(shù)字量,并送D/A電路轉(zhuǎn)換成階梯波,即近似的正弦波輸出。圖18為正弦波產(chǎn)生的流程圖。

圖18 正弦波產(chǎn)生的流程圖
3.2.2 矩形波發(fā)生子程序

如圖19所示,矩形波的實(shí)現(xiàn)比較簡(jiǎn)單。首先定義一個(gè)無(wú)符號(hào)字符型變量i=0,使自變量i不斷的自動(dòng)加1,若i的值小于squa_num,將P0口賦值為0xFF;若i的值大于squa_num,則將P0口賦值為0x00。當(dāng)i自加到256后又自動(dòng)變?yōu)?,以此循環(huán),即可得到矩形波。當(dāng)squa_num=128時(shí),此時(shí)輸出的為方波。調(diào)節(jié)squa_num的大小,即可實(shí)現(xiàn)矩形波占空比的調(diào)節(jié);調(diào)節(jié)延時(shí)時(shí)間的大小,即可實(shí)現(xiàn)矩形波頻率的改變。

圖19 矩形波產(chǎn)生流程圖
3.2.3 三角波發(fā)生子程序

三角波中的斜線(xiàn)用一個(gè)個(gè)小臺(tái)階來(lái)逼近,當(dāng)臺(tái)階間隔很小時(shí),波形基本上近似一直線(xiàn)。首先定義一個(gè)無(wú)符號(hào)字符型變量i=0,使自變量i不斷的自動(dòng)加1,若i的值小于128,將P0口賦值為i;若i的值大于128,則將P0口賦值為256-i。當(dāng)i自加到256后又自動(dòng)變?yōu)?,以此循環(huán),從而P0口實(shí)現(xiàn)了周期性的數(shù)字量變換,在經(jīng)過(guò)數(shù)模轉(zhuǎn)換后轉(zhuǎn)變成模擬信號(hào),經(jīng)運(yùn)算放大電路后就得到了周期性的三角波。三角波產(chǎn)生流程圖如圖20所示。

圖20 三角波發(fā)生流程圖
3.2.4 鋸齒波發(fā)生子程序

鋸齒波的實(shí)現(xiàn)過(guò)程與三角波類(lèi)似,也是定義一個(gè)變量i=0,并使P0=i,自變量i不斷的自動(dòng)加1,直到加到255,然后i又可以自動(dòng)歸為0,再不斷的重復(fù)上過(guò)程。在此過(guò)程中,P0口的值也隨著i一樣變化,經(jīng)數(shù)模轉(zhuǎn)換DAC0832后,周期性逐一變化的數(shù)字量就轉(zhuǎn)換為鋸齒波輸出了。通過(guò)調(diào)節(jié)P0口每相鄰兩個(gè)值之間的延遲時(shí)間,就可以改變鋸齒波的頻率。圖21為鋸齒波發(fā)生流程圖。

圖21 鋸齒波發(fā)生流程圖
3.3按鍵處理子程序

在本設(shè)計(jì)中,主要是通過(guò)按鍵來(lái)調(diào)節(jié)輸出波形的類(lèi)型、頻率的大小及矩形波的占空比,采用程序控制掃描方式,時(shí)刻監(jiān)視著有無(wú)按鍵按下。為了能夠更準(zhǔn)確的判斷按鍵的情況,一旦有按鍵按下時(shí),先延時(shí)去除按鍵的抖動(dòng),再判斷是哪個(gè)按鍵按下,從而單片機(jī)對(duì)應(yīng)的執(zhí)行相應(yīng)的程序。圖22為按鍵處理流程圖。

圖22 按鍵處理流程圖
3.4 INT0中斷子程序

中斷子程序是用來(lái)控制輸出波形的選擇。當(dāng)波形選擇按鍵K1按下時(shí),進(jìn)入中斷程序中,此時(shí)波形選擇標(biāo)識(shí)WaveChoice加1,中斷結(jié)束后,主程序中根據(jù)WaveChoice的值輸出相應(yīng)的波形。圖24為INT0中斷流程圖。

圖24 INT0中斷流程圖

4 系統(tǒng)調(diào)試
4.1
系統(tǒng)調(diào)試過(guò)程

1.編譯、連接項(xiàng)目,形成目標(biāo)文件

打開(kāi)Keil新建工程文件,然后添加源程序文件,保存時(shí)把文件后綴名改成“.c”,再直接導(dǎo)入新建的工程中。

把源程序全部錄入后,先粗略的檢查一遍,主要改正明顯的各種錯(cuò)誤,這樣可以減少之后的修改工作量。接著Options for Target “Target 1”,點(diǎn)擊Output ,勾選Create Hex 那個(gè)選項(xiàng),生成可執(zhí)行的文件。然后點(diǎn)擊Project菜單下的Built Target命令然后再進(jìn)行編譯、連接,形成目標(biāo)文件。編譯、連接用Project菜單下的Built Target命令(或快捷鍵F7),也可以直接點(diǎn)擊工具欄中相對(duì)應(yīng)的圖標(biāo)。

編譯、連接時(shí),如果程序存在語(yǔ)法有錯(cuò),則不會(huì)通過(guò)編譯,并在下面的信息窗口給出相應(yīng)的出錯(cuò)提示信息,其中錯(cuò)誤是一定得改正的,警告可以忽略。雙擊下面顯示錯(cuò)誤信息的那一行,可以直接定位錯(cuò)誤所在的行,用戶(hù)可以方便的對(duì)程序進(jìn)行修改。修改后再編譯、連接,繼續(xù)進(jìn)行調(diào)試,這個(gè)過(guò)程可能會(huì)重復(fù)多次。如果沒(méi)有任何語(yǔ)法上的錯(cuò)誤,則編譯、連接成功,并且信息窗口給出提示信息。

2.運(yùn)行調(diào)試

在Proteus軟件中先從元件庫(kù)中加載要使用的那些元件,然后把元件放在圖紙上一個(gè)一個(gè)的接線(xiàn),盡量不讓線(xiàn)交錯(cuò),便于查看、分析,有必要時(shí),使用接線(xiàn)標(biāo)號(hào)法。完成所有元器件的接線(xiàn)后,在單片機(jī)上右擊選Edit Properties,在Program file 那一行右側(cè)點(diǎn)擊,然后選擇前面生成的以“.hex”為后綴名的文件,為單片機(jī)AT89C51添加可執(zhí)行文件。然后點(diǎn)擊左下角的相關(guān)按鍵,開(kāi)始進(jìn)行仿真。

4.2 調(diào)試中的問(wèn)題及解決方法

在設(shè)計(jì)方案確定后,為了更好的調(diào)試,可以先分別對(duì)不同模塊進(jìn)行調(diào)試,最后在進(jìn)行整體調(diào)試。在整個(gè)調(diào)試的過(guò)程中,遇到了不少的問(wèn)題,經(jīng)自己查閱資料,并向老師、同學(xué)請(qǐng)教后,這些問(wèn)題基本已解決。調(diào)試中遇到的問(wèn)題及解決方法如下:

(1) 在調(diào)試波形產(chǎn)生過(guò)程中,波形選擇按鍵按下時(shí),沒(méi)有波形輸出或只輸出一種波形。

解決方法:若無(wú)波形輸出,則要先檢查硬件原理圖是否連接好,再檢查程序是否出現(xiàn)問(wèn)題。若僅有一種波形輸出,則要檢查程序中是否出現(xiàn)了死循環(huán),還應(yīng)檢查按鍵控制程序是否符合邏輯要求。

(2) 當(dāng)個(gè)個(gè)模塊的功能都可以實(shí)現(xiàn)時(shí),就可以進(jìn)行總體的調(diào)試。在總體的調(diào)試中,發(fā)現(xiàn)波形選擇按鍵按下時(shí),液晶顯示波形類(lèi)型變化和輸出波形的變化并不能同時(shí)實(shí)現(xiàn)。

解決方法:當(dāng)波形選擇按鍵按下時(shí),液晶上的顯示只要做一次就可以,而信號(hào)波形的輸出則是連續(xù)著的。所以使用外部中斷INT0,當(dāng)有按鍵按下時(shí),先響應(yīng)中斷程序,然后再回到主程序中,輸出對(duì)應(yīng)的波形。

(4) 系統(tǒng)使用的是控制延時(shí)的方法來(lái)改變輸出信號(hào)的頻率,故頻率值的大小不好計(jì)算。

解決方法:設(shè)定不同的延時(shí)時(shí)間,從示波器顯示的輸出波形來(lái)計(jì)算其對(duì)應(yīng)的頻率,并記錄下來(lái)。再根據(jù)每條指令大約的執(zhí)行時(shí)間,來(lái)粗略的估計(jì)出輸出信號(hào)的頻率與延時(shí)時(shí)間的函數(shù)關(guān)系。當(dāng)然,這種方法所測(cè)得的頻率與實(shí)際頻率的誤差還是很大的,此問(wèn)題并沒(méi)得到完美的解決。

4.3 系統(tǒng)仿真結(jié)果

經(jīng)以上調(diào)試,確認(rèn)程序沒(méi)有問(wèn)題時(shí),加載到Proteus軟件中進(jìn)行仿真,所得仿真結(jié)果如下。

(1)剛開(kāi)始運(yùn)行程序,沒(méi)有按鍵操作時(shí),仿真結(jié)果如圖25所示。




圖25 仿真初始化結(jié)果
(2)當(dāng)K1鍵按下進(jìn)行波形四種波形選擇時(shí),每種波形的仿真結(jié)果如下。





圖26 正弦波



圖27 方波

圖28 三角波

圖29 鋸齒波

(3)波形為正弦波,K2鍵按下時(shí),輸出波形的頻率增大仿真如圖30 所示。

圖30 正弦波頻率增加仿真


(4)當(dāng)波形為矩形波且K4鍵按下后,矩形波的占空比增加。其仿真結(jié)果如圖31所示。

圖31 矩形波占空比增加仿真
5 結(jié)論

(1)通過(guò)查閱大量資料使自己對(duì)信號(hào)發(fā)生器的研究現(xiàn)狀、原理、工作方式等的基本概念及技術(shù)發(fā)展有了更好的理解。

(2)針對(duì)設(shè)計(jì)的任務(wù)和要求,確定信號(hào)發(fā)生器的設(shè)計(jì)方案,并逐步來(lái)實(shí)現(xiàn)。

(3)本系統(tǒng)使用了單片機(jī)作為主控制器,直接由軟件產(chǎn)生不同波形信號(hào)的輸出,因此在如何編寫(xiě)程序方面下了很大的功夫,也收獲了很多知識(shí)。

(4)在Keil中編寫(xiě)仿真程序,在Proteus中繪制硬件仿真圖,并實(shí)現(xiàn)聯(lián)調(diào)仿真。從仿真的結(jié)果來(lái)看,基本完成了設(shè)計(jì)的要求。

經(jīng)過(guò)此次設(shè)計(jì)學(xué)會(huì)了很多關(guān)于電子方面的軟件:如Proteus、Keil51等。了解到了一個(gè)模型從項(xiàng)目選擇、方案選擇和論證電路設(shè)計(jì)、元器件選擇等到軟硬件的設(shè)計(jì)及實(shí)現(xiàn),再到最終的整機(jī)測(cè)試和調(diào)試整個(gè)工作過(guò)程,為以后工作打下了堅(jiān)實(shí)的基礎(chǔ)。其次,經(jīng)過(guò)這次畢業(yè)設(shè)計(jì),使我深刻地認(rèn)識(shí)到學(xué)好專(zhuān)業(yè)知識(shí)的重要性,也理解了理論聯(lián)系實(shí)際的含義,提升了我對(duì)電子設(shè)計(jì)和制作的興趣。




  1. #include <reg51.h>
  2. #include<string.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5.   uchar code tosin[256]=
  6. {0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,
  7. 0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
  8. 0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,
  9. 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
  10. 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,
  11. 0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,
  12. 0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,
  13. 0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
  14. 0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,
  15. 0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,
  16. 0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,
  17. 0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,
  19. 0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,
  20. 0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,
  21. 0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,
  22. 0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; //正弦波碼

  23. //--按鍵
  24. sbit K1=P2^0;
  25. sbit K2=P2^1;
  26. sbit K3=P2^2;
  27. sbit K4=P2^3;
  28. sbit K5=P2^4;

  29. uchar WaveChoice=0;
  30. uchar ys=30;
  31. uchar i,a=0;
  32. uchar sqar_num=128;


  33. //--延時(shí)MS          輸入一個(gè)確切的值用于鍵盤(pán)輸入時(shí)消除按鍵抖動(dòng)
  34. void DelayMS(uchar ms)
  35. {
  36.         uchar i;
  37.         while(ms--) for(i=0;i<120;i++);
  38. }
  39. //--延時(shí)y*9us    改變ys的值進(jìn)而利用該函數(shù)達(dá)到調(diào)頻率的目的
  40. void Delay1(uint y)
  41. {
  42.         uint i;
  43.         for(i=y;i>0;i--);
  44. }


  45. //---輸出波形
  46. void Out_Wave(uchar i)
  47. {         uchar j;       
  48.         switch(i)
  49.         {
  50.                 case 0:        P0=0x00;break;
  51.                 case 1:
  52.                                 //---正弦波
  53.                                 for (j=0;j<255;j++)
  54.                                 {
  55.                                         P0=tosin[j];
  56.                                         Delay1(ys);
  57.                                 }
  58.                                  break;
  59.                 case 2:
  60.                                 //----矩形波
  61.                                 {
  62.                                         if(a<sqar_num)
  63.                                                 {
  64.                                                         P0=0xff;
  65.                                                         Delay1(ys);
  66.                                                 }
  67.                                         else  
  68.                                                 {
  69.                                                         P0=0x00;
  70.                                                         Delay1(ys);
  71.                                                 }
  72.                                                 a++;
  73.                                 }  break;
  74.                 case 3:
  75.                                 //----三角波
  76.                                 {
  77.                                         if(a<128)
  78.                                                 {
  79.                                                         P0=a;
  80.                                                         Delay1(ys);
  81.                                                 }
  82.                                         else  
  83.                                                 {
  84.                                                         P0=255-a;
  85.                                                         Delay1(ys);
  86.                                                 }
  87.                                                 a++;
  88.                                 }   break;
  89.                 case 4:
  90.                            //----鋸齒波
  91.                                 {
  92.                                          if(a<255)
  93.                                         {
  94.                                                 P0=a;
  95.                                                 Delay1(ys);
  96.                                         }
  97.                                
  98.                                 a++;
  99.                         if(a==255)
  100.                                 {
  101.                                         a=0;
  102.                                 }   break;
  103.                 }
  104.         }
  105. }
  106. //----按鍵掃描
  107. void keyscanf()
  108. {       
  109.         if(K2==0)
  110.         {
  111.                 DelayMS(5);
  112.                 if(K2==0)
  113.                 {
  114.                         while(!K2);
  115.                         ys--;
  116.                         if(ys==0)
  117.                         ys=30;
  118.                 }
  119.         }
  120.         if(K3==0)
  121.         {
  122.                 DelayMS(5);
  123.                 if(K3==0)
  124.                 {
  125.                         while(!K3);
  126.                         ys++;
  127.                         if(ys>60)
  128.                         ys=30;
  129.                 }
  130.         }
  131.         if(K4==0)
  132.         {
  133.                 DelayMS(5);
  134.                 if(K4==0)
  135.                 {
  136.                         while(!K4);
  137.                         if(WaveChoice==2)
  138.                         sqar_num=sqar_num+2;
  139.                         if(sqar_num==238)
  140.                                 sqar_num=128;
  141.                 }
  142.         }
  143.         if(K5==0)
  144.         {
  145.                 DelayMS(5);
  146.                 if(K5==0)
  147.                 {
  148.                         while(!K5);
  149.                         if(WaveChoice==2)
  150.                         sqar_num=sqar_num-2;
  151.                         if(sqar_num==18)
  152.                                 sqar_num=128;                       
  153.                 }
  154.         }
  155. }

  156. //----主程序---
  157. void main()
  158. {

  159. ……………………

  160. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

全部資料51hei下載地址:

單片機(jī)課程設(shè)計(jì)波形發(fā)生器.rar (1.45 MB, 下載次數(shù): 160)



作者: FHFHFHCC    時(shí)間: 2018-7-11 11:19
好啊  真的很好
作者: 925210000@qq.co    時(shí)間: 2019-12-23 12:13
很好 不錯(cuò)
作者: liu1234111    時(shí)間: 2020-5-30 16:08
點(diǎn)贊,謝謝分享




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1