版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p> 摘要………………………………………………………………………… 2</p><p> 第一章 課程設(shè)計(jì)任務(wù)書…………………………………………… 3</p><p> 第二章 系統(tǒng)的主要功能說明……………………………………… 4</p><p>
2、 2.1系統(tǒng)的主要功能…………………………………………………… 4 </p><p> 2.2系統(tǒng)的設(shè)計(jì)思路…………………………………………………… 4</p><p> 第三章 元器件介紹……………………………………………………5</p><p> 3.1單片機(jī)AT89C51…………………………………………………… 5</p><
3、p> 3.2數(shù)模轉(zhuǎn)換器DAC0832……………………………………………… 6</p><p> 3.3數(shù)碼管顯示器……………………………………………………… 8</p><p> 3.4 接口擴(kuò)展8255A…………………………………………………… 9</p><p> 3.5其他元器件說明…………………………………………………… 10</p&g
4、t;<p> 第四章 硬件設(shè)計(jì)………………………………………………………10</p><p> 4.1工作原理…………………………………………………………… 10</p><p> 4.2單片機(jī)及外圍電路設(shè)計(jì)…………………………………………… 11</p><p> 4.3輸入模塊設(shè)計(jì)……………………………………………………… 11<
5、/p><p> 4.4顯示模塊設(shè)計(jì)……………………………………………………… 12</p><p> 4.5系統(tǒng)硬件設(shè)計(jì)圖…………………………………………………… 12</p><p> 4.6硬件系統(tǒng)設(shè)計(jì)圖…………………………………………………… 14</p><p> 第五章 軟件設(shè)計(jì)………………………………………………………15
6、</p><p> 5.1程序分析…………………………………………………………… 15</p><p> 5.2程序流程圖………………………………………………………… 15</p><p> 5.3程序設(shè)計(jì)…………………………………………………………… 16</p><p> 5.4源程序……………………………………………………………
7、… 21</p><p> 參考文獻(xiàn)…………………………………………………………………… 27</p><p> 小結(jié)與體會(huì)………………………………………………………………… 27</p><p><b> 摘要</b></p><p> 本設(shè)計(jì)是一個(gè)基于單片機(jī)的簡(jiǎn)易函數(shù)發(fā)生器,函數(shù)信號(hào)發(fā)生器的設(shè)計(jì)方法有多種,利
8、用單片機(jī)設(shè)計(jì)的函數(shù)信號(hào)發(fā)生器具有編程靈活、顯示清楚等優(yōu)點(diǎn)。它能產(chǎn)生方波、正弦波、鋸齒波和三角波等波形,并實(shí)現(xiàn)對(duì)頻率的調(diào)節(jié)。在編程語(yǔ)言上,此處選擇了簡(jiǎn)便實(shí)用的C語(yǔ)言,在波形調(diào)試和與硬件配合時(shí)更加容易。經(jīng)過不斷改進(jìn),現(xiàn)在已實(shí)現(xiàn)了所有與其目標(biāo)。</p><p> 關(guān)鍵詞:?jiǎn)纹瑱C(jī) 函數(shù)發(fā)生 波形 C語(yǔ)言</p><p> 第一章 課程設(shè)計(jì)任務(wù)書</p><p
9、> 題 目: 簡(jiǎn)易函數(shù)信號(hào)發(fā)生器設(shè)計(jì)</p><p><b> 初始條件:</b></p><p> 1.采用MCS51作為主控芯片;</p><p> 2.采用D/A轉(zhuǎn)換和放大處理,輸出信號(hào);</p><p> 3.要求能輸出方波、三角波、鋸齒波和正弦波4種信號(hào),頻率可調(diào)。</p>&
10、lt;p> 要求完成的主要任務(wù): </p><p> 查閱參考資料,自學(xué)相關(guān)可編程接口芯片的內(nèi)部結(jié)構(gòu)、工作方式和初始化編程過程;</p><p> 根據(jù)設(shè)計(jì)系統(tǒng)的具體功能和性能參數(shù),明確設(shè)計(jì)目標(biāo);</p><p> 單片機(jī)系統(tǒng)及其擴(kuò)展接口電路設(shè)計(jì),繪制系統(tǒng)硬件原理圖;</p><p> 編制系統(tǒng)控制源程序,繪制源程序流程圖,包
11、括初始化和監(jiān)控程序;</p><p> 撰寫設(shè)計(jì)說明書(包括參考資料目錄,字?jǐn)?shù)不少于5000字)</p><p><b> 時(shí)間安排:(兩周)</b></p><p> 指導(dǎo)教師簽名: 2013年 1 月 3 日</p><p> 系主任(或責(zé)任教師)簽名:
12、 年 月 日</p><p> 第二章 系統(tǒng)的主要功能說明</p><p> 2.1系統(tǒng)的主要功能</p><p> 課程設(shè)計(jì)要求的內(nèi)容為:制作簡(jiǎn)易函數(shù)發(fā)生器,采用MCS51作為主控芯片;采用D/A轉(zhuǎn)換和放大處理,輸出信號(hào);要求能輸出方波、三角波、鋸齒波和正弦波4種信號(hào),頻率可調(diào)。</p><p> 該系統(tǒng)不但
13、滿足了課程設(shè)計(jì)題目的基本要求,而且增設(shè)了LED波形指示燈,數(shù)碼管頻率顯示器等原件,使操作更簡(jiǎn)單,使用界面更人性化。</p><p> 2.2系統(tǒng)的設(shè)計(jì)思路</p><p> 第三章 元器件介紹</p><p> 3.1單片機(jī)AT89C51</p><p><b> 1.基本組成</b></p>
14、<p> AT89C51內(nèi)部結(jié)構(gòu)</p><p><b> 1.運(yùn)算器</b></p><p> 運(yùn)算器由8 位算術(shù)邏輯運(yùn)算單元ALU (Arithmetic Logic Unit )、8 位累加器ACC (Accumulator )、8 位寄存器B 、 程序狀態(tài)字寄存器PSW (Program Status Word )、8 位暫存寄存器TMP1 和
15、TMP2 等組成。 </p><p><b> 2.控制器</b></p><p> 主要由程序計(jì)數(shù)器PC 、 指令寄存器IR 、 指令譯碼器ID 、 堆棧指針SP 、 數(shù)據(jù)指針DPTR 、 時(shí)鐘發(fā)生器及定時(shí)控制邏輯等組成。</p><p> 3.單片機(jī)芯片引腳描述</p><p><b> 單片機(jī)引腳
16、圖</b></p><p> (1)主電源引腳VCC</p><p> ?。?)外接晶振引腳XTAL1和XTAL2</p><p> (3)復(fù)位引腳RST,輸入高電平是AT89C51復(fù)位</p><p> (4)輸入/輸出引腳P0、P1、P2、P3(共32根)</p><p> ?。?)程序存儲(chǔ)器選擇
17、信號(hào)引腳EA</p><p> ?。?)外部程序存儲(chǔ)器讀選通信號(hào)引腳PSEN</p><p> ?。?)外部存儲(chǔ)器低8位地址鎖存信號(hào)引腳ALE</p><p> 3.2數(shù)模轉(zhuǎn)換器DAC0832 </p><p> DAC0832是8分辨率的D/A轉(zhuǎn)換集成芯片。與微處理器完全兼容。這個(gè)DA芯片以其價(jià)格低廉、接口簡(jiǎn)單、轉(zhuǎn)換控制容易等優(yōu)點(diǎn),在單
18、片機(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><b> DAC0832</b></p><p> (1)分辨率為8位;</p><p> (2)電流穩(wěn)定時(shí)間1us;</p><p> (3)可單緩沖、雙緩沖或直接數(shù)字輸入;&l
19、t;/p><p> (4)只需在滿量程下調(diào)整其線性度;</p><p> (5)單一電源供電(+5V~+15V);</p><p> (6)低功耗,20mW。</p><p> DAC0832結(jié)構(gòu):</p><p> (1) D0~D7:8位數(shù)據(jù)輸入線,TTL電平,有效時(shí)間應(yīng)大于90ns(否則鎖存器的數(shù)據(jù)會(huì)出錯(cuò))
20、;</p><p> (2) ILE:數(shù)據(jù)鎖存允許控制信號(hào)輸入線,高電平有效;</p><p> (3)CS:片選信號(hào)輸入線(選通數(shù)據(jù)鎖存器),低電平有效;</p><p> (4)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í)
21、將輸入數(shù)據(jù)鎖存;</p><p> (5)XFER:數(shù)據(jù)傳輸控制信號(hào)輸入線,低電平有效,負(fù)脈沖(脈寬應(yīng)大于500ns)有效;</p><p> (6) 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)換。
22、</p><p> (7)IOUT1:電流輸出端1,其值隨DAC寄存器的內(nèi)容線性變化;</p><p> (8)IOUT2:電流輸出端2,其值與IOUT1值之和為一常數(shù);</p><p> (9)Rfb:反饋信號(hào)輸入線,改變Rfb端外接電阻值可調(diào)整轉(zhuǎn)換滿量程精度;</p><p> (10) Vcc:電源輸入端,Vcc的范圍為+5V~
23、+15V;</p><p> (11) VREF:基準(zhǔn)電壓輸入線,VREF的范圍為-10V~+10V;</p><p> (12) AGND:模擬信號(hào)地</p><p> (13 )DGND:數(shù)字信號(hào)地</p><p><b> 3.3數(shù)碼管顯示器</b></p><p> LED數(shù)碼管
24、由7個(gè)發(fā)光二極管組成,此外,還有一個(gè)圓點(diǎn)型發(fā)光二極管(在圖中以dp表示),用于顯示小數(shù)點(diǎn)。通過七段發(fā)光二極管亮暗的不同組合,可以顯示多種數(shù)字、字母以及其它符號(hào)。</p><p> 本設(shè)計(jì)采用共陰極接法:把發(fā)光二極管的陰極連在一起構(gòu)成公共陰極。使用時(shí)公共陰極接地,這樣陽(yáng)極端輸入高電平的段發(fā)光二極管就導(dǎo)通點(diǎn)亮,而輸入低電平的則不點(diǎn)亮。各數(shù)字及部分字母代碼表如下:</p><p><b&
25、gt; 3.4 8255A</b></p><p> Intel 8086/8088 系列的可編程外設(shè)接口電路簡(jiǎn)稱 PPI,型號(hào)為8255(改進(jìn)型為8255A及8255A-5),具有24條輸入/輸出引腳、可編程的通用并行輸入/輸出接口電路。它是一片使用單一+5V電源的40腳雙列直插式大規(guī)模集成電路。8255A的通用性強(qiáng),使用靈活,通過它CPU可直接與外設(shè)相連接。</p><p&
26、gt; 8255A在使用前要寫入一個(gè)方式控制字,選擇A、B、C三個(gè)端口各自的工作方式,共有三種;</p><p> 方式0 :基本的輸入輸出方式,即無須聯(lián)絡(luò)就可以直接進(jìn)行的 I/O方式。其中A、B、C口的高四位或低四位可分別設(shè)置成輸入或輸出。</p><p> 方式1 :選通I/O,此時(shí)接口和外圍設(shè)備需聯(lián)絡(luò)信號(hào)進(jìn)行協(xié)調(diào),只有A口和B口可以工作在方式1,此時(shí)C口的某些線被規(guī)定為A口或B
27、口與外圍設(shè)備的聯(lián)絡(luò)信號(hào),余下的線只有基本的I/O功能,即只工作在方式0.</p><p> 方式2: 雙向I/O方式,只有A口可以工作在這種方式,該I/O線即可輸入又可輸出,此時(shí)C口有5條線被規(guī)定為A口和外圍設(shè)備的雙向聯(lián)絡(luò)線,C口剩下的三條線可作為B口方式1的聯(lián)絡(luò)線,也可以和B口一起方式0的I/O線。</p><p> 8255A是一個(gè)并行輸入、輸出器件,具有24個(gè)可編程設(shè)置的I/O口
28、,包括3組8位的I/O為PA口、PB口、PC口,又可分為2組12位的I/O口:A組包括A口及C口高4位,B組包括B口及C組的低4位。</p><p> A口可以設(shè)置為方式0、方式1、方式2,B口與C口只能設(shè)置為方式0或方式1.</p><p> 3.5其他元器件說明</p><p> 晶振電路使用12MHZ的晶體振蕩器,30PF的電容。復(fù)位電路采用10UF的電
29、容,10K的電阻。波形指示區(qū)采用四個(gè)綠色LED燈。頻率顯示器電路中除3個(gè)7段數(shù)碼管外還使用了3個(gè)三極管。波形信號(hào)的放大電路上采用了兩個(gè)放大器。</p><p><b> 主要元器件列表:</b></p><p> 第四章 硬件設(shè)計(jì)</p><p><b> 4.1工作原理</b></p><p
30、> 本系統(tǒng)由單片機(jī)AT89C51對(duì)不同的模塊進(jìn)行統(tǒng)一調(diào)配控制以達(dá)到設(shè)計(jì)目的。首先是輸入模塊,為節(jié)省引腳,此處設(shè)計(jì)為4×4矩陣鍵盤。軟件選用反轉(zhuǎn)法掃描。此功能由P1口控制。數(shù)據(jù)讀入后,經(jīng)單片機(jī)程序分析,分別控制三個(gè)輸出部分:.四個(gè)LED燈,通過其亮滅顯示當(dāng)前輸出的波形類型,此功能由P3.0、P3.1、P3.3、P3.4四個(gè)引腳控制;.三個(gè)共陰極數(shù)碼顯示管,用以顯示當(dāng)前波形的頻率,此功能由P0口輸出數(shù)據(jù),8255A擴(kuò)展接口
31、實(shí)現(xiàn);.示波器。P0口分時(shí)復(fù)用,控制數(shù)碼管顯示后對(duì)數(shù)模轉(zhuǎn)換器DAC0832輸出波形數(shù)據(jù),信號(hào)經(jīng)放大電路放大,然后送至示波器顯示。</p><p> 外圍原件此處省略不講,軟件部分見下章。</p><p> 4.2單片機(jī)及外圍電路設(shè)計(jì)</p><p> 如圖所示,單片機(jī)P口采用總線的連接形式。晶振頻率為12MHz,電容C1、C2均為10uF。復(fù)位電路中,電容C3
32、的作用是在按鈕按下時(shí)儲(chǔ)存電能,電阻R11用作在按鈕斷開時(shí)保護(hù)電路。P3.2口接高電平和按鈕,用來實(shí)現(xiàn)外部中斷的下降沿觸發(fā)。</p><p><b> 4.3輸入模塊設(shè)計(jì)</b></p><p> 為節(jié)省接口,鍵盤設(shè)計(jì)為4*4矩陣鍵盤,通過P1口的高四位和低四位分別對(duì)鍵盤的行和列進(jìn)行掃描,從而檢測(cè)出按下的鍵。具體工作情況詳見軟件部分。</p><
33、p><b> 4.4接口擴(kuò)展</b></p><p> 為了解決接口不足的問題,本設(shè)計(jì)中使用8255A芯片對(duì)P0口進(jìn)行擴(kuò)展,它采用工作方式0即最基本的輸入輸出方式。用鎖存器進(jìn)行地址鎖存,將P0口輸出的數(shù)據(jù)依次存放在A、B、C口,控制所接的三個(gè)數(shù)碼管持續(xù)顯示。</p><p><b> 4.5顯示模塊設(shè)計(jì)</b></p>
34、<p><b> 頻率顯示</b></p><p> 此處采用3個(gè)共陰極的數(shù)碼管顯示波形頻率,顯示方式為靜態(tài)顯示。提供數(shù)據(jù)的8255A芯片具有鎖存功能,故數(shù)據(jù)只需輸入一次便可持續(xù)顯示。次設(shè)計(jì)結(jié)構(gòu)簡(jiǎn)單又能實(shí)現(xiàn)所要求的功能,同時(shí)也是設(shè)計(jì)要求外的創(chuàng)新點(diǎn)。</p><p><b> 波形選擇</b></p><p>
35、; 此處為設(shè)計(jì)要求外的第二處創(chuàng)新點(diǎn),為了告訴操作者示波器當(dāng)前顯示波的波形,我采用了四個(gè)LED燈對(duì)相應(yīng)的波形進(jìn)行指示,通過觀察燈的亮滅就能加以區(qū)分。圖示狀態(tài)為:三角波正在顯示。</p><p><b> 波形顯示</b></p><p> 此處是整個(gè)系統(tǒng)的第二核心,當(dāng)P0口對(duì)頻率顯示信號(hào)輸出完畢后,數(shù)模轉(zhuǎn)換器開關(guān)打開,P0開始為其輸送波形信號(hào)。輸入的信號(hào)經(jīng)功率放大
36、器放大后送至示波器顯示</p><p> 4.6系統(tǒng)硬件設(shè)計(jì)圖</p><p> 第五章 軟件設(shè)計(jì)</p><p><b> 5.1程序分析</b></p><p> 本設(shè)計(jì)采用簡(jiǎn)單方便的C語(yǔ)言編寫程序。為了使編程時(shí)思路清晰,采用模塊化的編寫方式,即分功能編寫子程序,再由主函數(shù)根據(jù)需要依次調(diào)用。按照思路,程序
37、進(jìn)入主函數(shù)后需先對(duì)要用到的外部中斷和定時(shí)計(jì)數(shù)器進(jìn)行初始化,然后進(jìn)入波形輸出的無限循環(huán)中,在此過程中由中斷系統(tǒng)對(duì)輸出進(jìn)行控制,首先程序控制P1口掃描鍵盤,重新輸入波形和頻率的信息,輸入的數(shù)據(jù)經(jīng)程序處理后輸出數(shù)據(jù)送至LED波形指示燈和數(shù)碼管頻率顯示器對(duì)輸入信息進(jìn)行顯示。之后P0口為數(shù)模轉(zhuǎn)換器輸送波形數(shù)據(jù),使示波器顯示波形。</p><p><b> 5.2程序流程圖</b></p>
38、<p><b> 5.3程序設(shè)計(jì)</b></p><p><b> 主函數(shù)</b></p><p> void main() </p><p><b> { </b></p><p> chushihua();//調(diào)用初始化程序,對(duì)中斷和定時(shí)計(jì)數(shù)器初始化
39、</p><p><b> while(1)</b></p><p><b> {</b></p><p> {switch(old)</p><p> { case 33:fang(); break;//檢查按鍵的返回值并選擇輸出波形</p><p> case
40、44:tran(); break; </p><p> case 55:jvchi();break;</p><p> case 66:sin(); break;</p><p><b> } </b></p><p><b> }</b></p><p>&l
41、t;b> } </b></p><p><b> }</b></p><p><b> 初始化程序:</b></p><p> void chushihua()</p><p> {sled=0x80;//8255A控制寄存器初始化</p><p&
42、gt; IT0=1;//外部中斷0下降沿觸發(fā)</p><p> EX0=1;//外部中斷0中斷允許</p><p> EA=1;//CPU中斷允許打開</p><p> PX0=1;//外部中斷0優(yōu)先</p><p> TMOD=0x20;//</p><p><b> TR1=1;//</
43、b></p><p><b> }</b></p><p><b> 延時(shí)程序:</b></p><p> 因?yàn)镃語(yǔ)言編寫的程序必須經(jīng)過編譯才能應(yīng)用于單片機(jī),而不同的語(yǔ)句編譯后指令的周期不確定,故延時(shí)函數(shù)不宜使用簡(jiǎn)單的for語(yǔ)句或while語(yǔ)句。本處使用單片機(jī)的定時(shí)計(jì)數(shù)器計(jì)時(shí),在很大程度上提高了延時(shí)時(shí)間的精準(zhǔn)性
44、。</p><p> void delay()//延時(shí)</p><p><b> {</b></p><p> while(!TF1);</p><p><b> TF1=0;</b></p><p><b> }</b></p>
45、<p> void delayms(uint j)//</p><p> {uchar mm;</p><p> while(j--)</p><p> {for(mm=0;mm<216;mm++);}</p><p><b> }</b></p><p><b
46、> 顯示程序:</b></p><p> 此處的顯示程序?yàn)閿?shù)碼管頻率顯示提供數(shù)據(jù)。為了便于編程,顯示程序由顯示子程序和總顯示程序兩部分組成。顯示子程序設(shè)置了三個(gè)不同的參數(shù),通過總程序的調(diào)用及賦值,在數(shù)組中調(diào)用不用的數(shù)字對(duì)應(yīng)的代碼進(jìn)行顯示。</p><p> void xshz(uchar h,uchar m,uchar p)//顯示子程序</p>&l
47、t;p> {sled1=smg[h];</p><p> sled2=smg[m];</p><p> sled3=smg[p]; </p><p><b> }</b></p><p> void xsh()//總顯示</p><p> { if(k==3) xshz(a[0
48、],a[1],a[2]);</p><p> if(k==2) xshz(12,a[0],a[1]);</p><p> if(k==1) xshz(12,12,a[0]);</p><p> if(k==0) xshz(10,0,11);</p><p><b> }</b></p><p&
49、gt;<b> 鍵盤輸入程序:</b></p><p> 本處使用鍵盤的掃描方法為反轉(zhuǎn)法,其原理是給端口賦值兩次,通過檢測(cè)兩次的結(jié)果而得到按鍵的信息。例如:</p><p> 1.給P1口賦值0x0f,即00001111,假設(shè)第一個(gè)鍵按下了,則這時(shí)P1口的實(shí)際值為00001110;</p><p> 2.給P1口再賦值0xf0,即111
50、10000,如果第一個(gè)鍵按下了,則這時(shí)P1口的實(shí)際值為11100000;</p><p> 3.把兩次P1口的實(shí)際值相加得11101110,即0xee。</p><p> 由此我們便得到了按下第一個(gè)鍵時(shí)所對(duì)應(yīng)的數(shù)值0xee,以此類推可得出其他15個(gè)按鍵對(duì)應(yīng)的數(shù)值,有了這種對(duì)應(yīng)關(guān)系,矩陣鍵盤編程問題也就解決了,也就是程序的算法已經(jīng)有了。</p><p> uch
51、ar input() //輸入</p><p> { uchar hang,lie,rr;</p><p><b> rr=0;</b></p><p><b> P1=0xf0;</b></p><p> if((P1&0xf0)!=0xf0)//軟件消抖</p>&
52、lt;p> {delayms(20);</p><p> if((P1&0xf0)!=0xf0)</p><p> { hang=P1&0xf0;</p><p><b> P1=0x0f;</b></p><p> lie=P1&0x0f;</p><p>
53、; rr=hang+lie;</p><p><b> }</b></p><p><b> }</b></p><p> if(rr==table[0]) return(33);//對(duì)不同掃描結(jié)果返回不同的值</p><p> else if(rr==table[1]) return(4
54、4);</p><p> else if(rr==table[4]) return(1);</p><p> else if(rr==table[5]) return(2);</p><p> else if(rr==table[2]) return(55);</p><p> else if(rr==table[3])
55、 return(66);</p><p> else if(rr==table[6]) return(3);</p><p> else if(rr==table[7]) return(0);</p><p> else if(rr==table[8]) return(4);</p><p> else if(rr==table[9]
56、) return(5);</p><p> else if(rr==table[10]) return(6);</p><p> else if(rr==table[11]) return(11);</p><p> else if(rr==table[12]) return(7);</p><p> else if(rr==tabl
57、e[13]) return(8);</p><p> else if(rr==table[14]) return(9);</p><p> else if(rr==table[15]) return(22);</p><p> else return(12);</p><p><b> }</b></p&g
58、t;<p><b> 波形函數(shù):</b></p><p><b> 方波</b></p><p> void fang()</p><p> { uchar i;</p><p> DAC0832=0;</p><p> for(i=0;i<
59、128;i++)</p><p><b> delay();</b></p><p> DAC0832=0xff;</p><p> for(i=0;i<128;i++)</p><p><b> delay();</b></p><p><b>
60、}</b></p><p><b> 鋸齒波</b></p><p> void jvchi()</p><p> { unsigned char x;</p><p> for(x=0;x<255;x++)</p><p> {DAC0832=x;</p>
61、<p><b> delay();}</b></p><p><b> }</b></p><p><b> 三角波</b></p><p> void tran()//三角波</p><p> { unsigned char y;</p>
62、<p> for(y=0;y<128;y++)</p><p> {DAC0832=y;</p><p><b> delay();</b></p><p><b> }</b></p><p> for(y=128;y>0;y--)</p><
63、p> { DAC0832=y;</p><p><b> delay();</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 正弦波</b></p><p>
64、; void sin()</p><p> { unsigned char mm;</p><p> for(mm=0;mm<255;mm++)</p><p> {DAC0832=table2[mm];</p><p><b> delay();}</b></p><p><
65、;b> }</b></p><p><b> 中斷函數(shù):</b></p><p> void zhongduan() interrupt 0 //中斷</p><p> { uchar e,f=0;</p><p><b> f=0;</b></p>&
66、lt;p><b> k=0;</b></p><p> while(input()==12);</p><p> a[0]=input();</p><p> if(a[0]==33) {p30=0;p31=1;p33=1;p34=1;old=a[0];}</p><p> else if(a[0]==4
67、4) {p31=0;p30=1;p33=1;p34=1;old=a[0];}</p><p> else if(a[0]==55) {p33=0;p31=1;p30=1;p34=1;old=a[0];}</p><p> else if(a[0]==66) {p34=0;p30=1;p31=1;p33=1;old=a[0];}</p><p><b>
68、 else{ </b></p><p> for(e=0;e<3;e++)</p><p> { while(input()>9);</p><p> a[e]=input();</p><p> f=10*f+a[e];</p><p><b> k++;</b&
69、gt;</p><p><b> xsh();</b></p><p> delayms(100);</p><p><b> }</b></p><p> TH1=256-(1000000/f)/256;</p><p> TL1=256-(1000000/f)/
70、256;</p><p><b> }</b></p><p><b> }</b></p><p><b> 5.4源程序</b></p><p> #include<reg51.h></p><p> #include<a
71、bsacc.h></p><p> #define DAC0832 XBYTE[0x0200]</p><p> #define sled1 XBYTE[0x0100]</p><p> #define sled2 XBYTE[0x0101]</p><p> #define sled3 XBYTE[0x0102]</p&
72、gt;<p> #define sled XBYTE[0x0103]</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> uchar input();</p><p><b> uint f;<
73、;/b></p><p> sbit p30=P3^0;</p><p> sbit p31=P3^1;</p><p> sbit p33=P3^3;</p><p> sbit p34=P3^4;</p><p> sbit p35=P3^5;</p><p> sbit
74、p36=P3^6;</p><p> sbit p37=P3^7;</p><p> uchar old; </p><p> uchar a[4];</p><p> uchar k=0;</p><p> uchar code smg[]={0x3f,0x06,0x5b,0x
75、4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,</p><p> 0x3e,0x00}; </p><p> uchar code table[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,0xb7,0xbb,0xbd,</p><p> 0xbe,0x77,0x7b,0x7d,0x7e};
76、 </p><p> uchar code table2[]={</p><p> 0x80,0x83,0x85,0x88,0x8A,0x8D,0x8F,0x92,</p><p> 0x94,0x97,0x99,0x9B,0x9E,0xA0,0xA3,0xA5,</p><p> 0xA7,0xAA,0xAC,0xAE,0xB1,0
77、xB3,0xB5,0xB7,</p><p> 0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,</p><p> 0xC9,0xCB,0xCC,0xCE,0xD0,0xD1,0xD3,0xD4,</p><p> 0xD6,0xD7,0xD8,0xDA,0xDB,0xDC,0xDD,0xDE,</p><p
78、> 0xDF,0xE0,0xE1,0xE2,0xE3,0xE3,0xE4,0xE4,</p><p> 0xE5,0xE5,0xE6,0xE6,0xE7,0xE7,0xE7,0xE7,</p><p> 0xE7,0xE7,0xE7,0xE7,0xE6,0xE6,0xE5,0xE5,</p><p> 0xE4,0xE4,0xE3,0xE3,0xE2,
79、0xE1,0xE0,0xDF,</p><p> 0xDE,0xDD,0xDC,0xDB,0xDA,0xD8,0xD7,0xD6,</p><p> 0xD4,0xD3,0xD1,0xD0,0xCE,0xCC,0xCB,0xC9,</p><p> 0xC7,0xC5,0xC3,0xC1,0xBF,0xBD,0xBB,0xB9,</p><
80、p> 0xB7,0xB5,0xB3,0xB1,0xAE,0xAC,0xAA,0xA7,</p><p> 0xA5,0xA3,0xA0,0x9E,0x9B,0x99,0x97,0x94,</p><p> 0x92,0x8F,0x8D,0x8A,0x88,0x85,0x83,0x80,</p><p> 0x7D,0x7B,0x78,0x76,0x73
81、,0x71,0x6E,0x6C,</p><p> 0x69,0x67,0x65,0x62,0x60,0x5D,0x5B,0x59,</p><p> 0x56,0x54,0x52,0x4F,0x4D,0x4B,0x49,0x47,</p><p> 0x45,0x43,0x41,0x3F,0x3D,0x3B,0x39,0x37,</p><
82、;p> 0x35,0x34,0x32,0x30,0x2F,0x2D,0x2C,0x2A,</p><p> 0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,</p><p> 0x20,0x1F,0x1E,0x1D,0x1D,0x1C,0x1C,0x1B,</p><p> 0x1B,0x1A,0x1A,0x1A,0x1
83、9,0x19,0x19,0x19,</p><p> 0x19,0x19,0x19,0x19,0x1A,0x1A,0x1A,0x1B,</p><p> 0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1F,0x20,</p><p> 0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,</p>&l
84、t;p> 0x2A,0x2C,0x2D,0x2F,0x30,0x32,0x34,0x35,</p><p> 0x37,0x39,0x3B,0x3D,0x3F,0x41,0x43,0x45,</p><p> 0x47,0x49,0x4B,0x4D,0x4F,0x52,0x54,0x56,</p><p> 0x59,0x5B,0x5D,0x60,0x
85、62,0x65,0x67,0x69,</p><p> 0x6C,0x6E,0x71,0x73,0x76,0x78,0x7B,0x7D};</p><p> void chushihua()//初始化</p><p> { sled=0x80;</p><p><b> IT0=1;</b></p>
86、<p><b> EX0=1;</b></p><p><b> EA=1;</b></p><p><b> PX0=1;</b></p><p> TMOD=0x20;</p><p><b> TR1=1;</b></p
87、><p><b> }</b></p><p> void delay()//延時(shí)</p><p><b> {</b></p><p> while(!TF1);</p><p><b> TF1=0;</b></p><p&
88、gt;<b> }</b></p><p> void delayms(uint j)</p><p> {uchar mm;</p><p> while(j--)</p><p> {for(mm=0;mm<216;mm++);}</p><p><b> }&l
89、t;/b></p><p> void xshz(uchar h,uchar m,uchar p)//顯示子程序</p><p><b> {</b></p><p> sled1=smg[h];</p><p> sled2=smg[m];</p><p> sled3=smg[
90、p]; </p><p><b> }</b></p><p> void xsh()//顯示</p><p> { if(k==3) xshz(a[0],a[1],a[2]);</p><p> if(k==2) xshz(12,a[0],a[1]);</p><p> if(k==
91、1) xshz(12,12,a[0]);</p><p> if(k==0) xshz(10,0,11);</p><p><b> }</b></p><p> uchar input() //輸入</p><p> { uchar hang,lie,rr;</p><p><b&
92、gt; rr=0;</b></p><p><b> P1=0xf0;</b></p><p> if((P1&0xf0)!=0xf0)</p><p> {delayms(20);</p><p> if((P1&0xf0)!=0xf0)</p><p>
93、 { hang=P1&0xf0;</p><p><b> P1=0x0f;</b></p><p> lie=P1&0x0f;</p><p> rr=hang+lie;</p><p><b> }</b></p><p><b> }
94、</b></p><p> if(rr==table[0]) return(33);</p><p> else if(rr==table[1]) return(44); </p><p> else if(rr==table[4]) return(1);</p><p> else if(rr==t
95、able[5]) return(2);</p><p> else if(rr==table[2]) return(55);</p><p> else if(rr==table[3]) return(66);</p><p> else if(rr==table[6]) return(3);</p><p> else if(rr=
96、=table[7]) return(0);</p><p> else if(rr==table[8]) return(4);</p><p> else if(rr==table[9]) return(5);</p><p> else if(rr==table[10]) return(6);</p><p> else if(rr
97、==table[11]) return(11);</p><p> else if(rr==table[12]) return(7);</p><p> else if(rr==table[13]) return(8);</p><p> else if(rr==table[14]) return(9);</p><p> else
98、if(rr==table[15]) return(22);</p><p> else return(12);</p><p><b> }</b></p><p> void fang()//方波</p><p> { uchar i;</p><p> DAC0832=0;<
99、/p><p> for(i=0;i<128;i++)</p><p><b> delay();</b></p><p> DAC0832=0xff;</p><p> for(i=0;i<128;i++)</p><p><b> delay();</b>
100、</p><p><b> }</b></p><p> void jvchi()//鋸齒波</p><p> { unsigned char x;</p><p> for(x=0;x<255;x++)</p><p> {DAC0832=x;</p><p&
101、gt;<b> delay();}</b></p><p><b> }</b></p><p> void tran()//三角波</p><p> { unsigned char y;</p><p> for(y=0;y<128;y++)</p><p>
102、; {DAC0832=y;</p><p><b> delay();</b></p><p><b> }</b></p><p> for(y=128;y>0;y--)</p><p> { DAC0832=y;</p><p><b> de
103、lay();</b></p><p><b> }</b></p><p><b> }</b></p><p> void sin()//正弦波</p><p> { unsigned char mm;</p><p> for(mm=0;mm<
104、255;mm++)</p><p> {DAC0832=table2[mm];</p><p><b> delay();}</b></p><p><b> }</b></p><p> void zhongduan() interrupt 0 //中斷</p><p
105、> { uchar e,f=0;</p><p><b> f=0;</b></p><p><b> k=0;</b></p><p> while(input()==12);</p><p> a[0]=input();</p><p> if(a[0
106、]==33) {p30=0;p31=1;p33=1;p34=1;old=a[0];}</p><p> else if(a[0]==44) {p31=0;p30=1;p33=1;p34=1;old=a[0];}</p><p> else if(a[0]==55) {p33=0;p31=1;p30=1;p34=1;old=a[0];}</p><p> els
107、e if(a[0]==66) {p34=0;p30=1;p31=1;p33=1;old=a[0];}</p><p><b> else{ </b></p><p> for(e=0;e<3;e++)</p><p> { while(input()>9);</p><p> a[e]=input(
108、);</p><p> f=10*f+a[e];</p><p><b> k++;</b></p><p> if(a[e]==11) {f=f-a[e];e--;k--;}</p><p><b> xsh();</b></p><p> delayms(100
109、);</p><p><b> }</b></p><p> TH1=256-(1000000/f)/256;</p><p> TL1=256-(1000000/f)/256;</p><p><b> }</b></p><p><b> }</
110、b></p><p> void main() //主函數(shù)</p><p><b> { </b></p><p> chushihua();</p><p><b> while(1)</b></p><p><b> {</b><
111、;/p><p> switch(old)</p><p> { case 33:fang(); break;</p><p> case 44:tran(); break;</p><p> case 55:jvchi();break;</p><p> case 66:sin(); break;</p&g
112、t;<p><b> } </b></p><p><b> }</b></p><p><b> } </b></p><p><b> 參考文獻(xiàn)</b></p><p> 1.王賢勇 趙傳申 編著.單片機(jī)原理與接口技術(shù)
113、應(yīng)用教程.清華大學(xué)出版社.2010</p><p> 2.劉剛 秦永左 編著.單片機(jī)原理及應(yīng)用.中國(guó)林業(yè)出版社.2006</p><p> 3.肖婧 編著.單片機(jī)入門與趣味實(shí)驗(yàn)設(shè)計(jì).北京航空航天大學(xué)出版社.2008</p><p><b> 小結(jié)與體會(huì)</b></p><p> 通過這次單片機(jī)課程設(shè)計(jì),我不僅加深
114、了對(duì)單片機(jī)理論的理解,將課堂學(xué)到的知識(shí)應(yīng)用到實(shí)際設(shè)計(jì)中去,而且還學(xué)到了很多像以前沒有接觸過的知識(shí)。從布置題目開始老師就告訴我們?cè)O(shè)計(jì)中用到的原件都要自己去查找參數(shù),每使用一個(gè)原件都要有理論依據(jù),要明白它的作用和參數(shù)選擇的依據(jù)。所以,我們都認(rèn)真的在網(wǎng)上,在圖書館查找資料,每個(gè)人都想把自己的設(shè)計(jì)做到最好。</p><p> 我設(shè)計(jì)的簡(jiǎn)易函數(shù)發(fā)生器不但能夠符合題意,而且還在幾個(gè)地方增加了顯示功能,這是作品的一大亮點(diǎn)。這
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易波形發(fā)生器
- 單片機(jī)課程設(shè)計(jì)---函數(shù)波形發(fā)生器
- 單片機(jī)課程設(shè)計(jì)報(bào)告--- 函數(shù)發(fā)生器
- 簡(jiǎn)易信號(hào)發(fā)生器單片機(jī)課程設(shè)計(jì)報(bào)告
- 基于單片機(jī)的函數(shù)信號(hào)發(fā)生器課程設(shè)計(jì)
- 課程設(shè)計(jì)--基于單片機(jī)的函數(shù)信號(hào)發(fā)生器
- 基于單片機(jī)的函數(shù)信號(hào)發(fā)生器課程設(shè)計(jì)
- 課程設(shè)計(jì)-基于單片機(jī)的函數(shù)信號(hào)發(fā)生器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)(波形發(fā)生器)
- 單片機(jī)課程設(shè)計(jì)---波形發(fā)生器
- 單片機(jī)課程設(shè)計(jì)—波形發(fā)生器
- 課程設(shè)計(jì)--單片機(jī)波形發(fā)生器
- 單片機(jī)課程設(shè)計(jì)-波形發(fā)生器
- 單片機(jī)課程設(shè)計(jì)報(bào)告(信號(hào)發(fā)生器)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--波形發(fā)生器
- 單片機(jī)信號(hào)發(fā)生器課程設(shè)計(jì)論文
- 單片機(jī)課程設(shè)計(jì)--多波形發(fā)生器
- 單片機(jī)波形發(fā)生器課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告---基于單片機(jī)的波形發(fā)生器
- 單片機(jī)課程設(shè)計(jì)--波形發(fā)生器的設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論