找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 39482|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)信號(hào)發(fā)生器的設(shè)計(jì)論文

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:311212 發(fā)表于 2018-4-18 20:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

目  錄

摘  要
Abstract
引  言
第1章  緒  論
1.1  選題背景、意義
1.2基本功能簡(jiǎn)介
第二章  硬件設(shè)計(jì)與原理
2.1 總設(shè)計(jì)框圖
2.2 硬件設(shè)計(jì)分析
2.2.1 電源的設(shè)計(jì)的選擇
2.2.2  核心控制的選擇            
2.2.3  鍵盤的選擇
2.3 單片機(jī)最小系統(tǒng)
2.4按鍵輸入電路
2.5 D/A轉(zhuǎn)換電路
第三章  軟件設(shè)計(jì)與分析
3.1 軟件設(shè)計(jì)的組成
3.2定時(shí)程序設(shè)計(jì)            
3.3  各部分軟件分析
3.3.1  調(diào)節(jié)部分——頻率子函數(shù)
3.3.2  調(diào)節(jié)部分——方波的占空比子函數(shù)
3.3.3  波形發(fā)生子函數(shù)
3.3.4  定時(shí)器0中斷子函數(shù)
3.3.5  定時(shí)器1中斷處理子函數(shù)
3.3.6  主函數(shù)
3.4  總源程序
第四章 軟件介紹
4.1 PROTEUS簡(jiǎn)介
4.2 PROTEL 99 SE簡(jiǎn)介
4.2.1 電路工程設(shè)計(jì)部分
4.2.2 電路仿真與PLD部分
4.3 Protel 99 SE的功能特性
4.4 Protel99SE快捷鍵大全
第五章 系統(tǒng)調(diào)試與軟件仿真
5.1 硬件調(diào)試
5.2  Keil uVision2軟件調(diào)試
總結(jié)
致  謝
附錄
參考文獻(xiàn)



摘  要

本文介紹一種用STC89C51RC單片機(jī)構(gòu)成的波形發(fā)生器,可產(chǎn)生方波、三角波、正弦波、鋸齒波四種波形,波形的頻率可由按鍵改變,并可根據(jù)需要選擇單極性輸出或雙極性輸出,具有線路簡(jiǎn)單、結(jié)構(gòu)緊湊、性能優(yōu)越等特點(diǎn)。文章給出了源代碼,通過仿真測(cè)試,其性能指標(biāo)達(dá)到了設(shè)計(jì)要求。


引  言

21世紀(jì),單片機(jī)的發(fā)展非常的迅速。單片機(jī)是把主要計(jì)算機(jī)功能部件都集成在一塊芯片上的微型計(jì)算機(jī)。它是一種集計(jì)數(shù)和多種接口于一體的微控制器,被廣泛應(yīng)用在智能產(chǎn)品和工業(yè)自動(dòng)化上,而51單片機(jī)是個(gè)單片機(jī)中最為典型和最有代表性的一種。

最近幾年來,隨著科技的飛速發(fā)展,單片機(jī)領(lǐng)域正在不斷的走向社會(huì)各個(gè)角落,還帶動(dòng)傳統(tǒng)控制檢測(cè)日新月異更新。在實(shí)時(shí)運(yùn)作和自動(dòng)控制的單片機(jī)應(yīng)用到系統(tǒng)中,單片機(jī)如今是作為一個(gè)核心部件來使用,僅掌握單片機(jī)方面知識(shí)是不夠的,還應(yīng)根據(jù)其具體硬件結(jié)構(gòu),以及針對(duì)具體應(yīng)用對(duì)象特點(diǎn)的軟件結(jié)合,加以完善!皢纹瑱C(jī)原理及應(yīng)用課程設(shè)計(jì)”是電子類專業(yè)的學(xué)科基礎(chǔ)科,它是繼“匯編語言程序設(shè)計(jì)”,“接口技術(shù)”等課程之后開出的實(shí)踐環(huán)節(jié)課程。


第1章  緒  論
1.1  選題背景、意義

當(dāng)今時(shí)代是一個(gè)新技術(shù)層出不窮的時(shí)代,在電子領(lǐng)域尤其是自動(dòng)化智能控制領(lǐng)域,傳統(tǒng)的分立元件或數(shù)字邏輯電路構(gòu)成的控制系統(tǒng),正以前所未有的速度被單片機(jī)智能化控制所取代。單片機(jī)具有體積小、功能強(qiáng)、成本低、應(yīng)用面廣等優(yōu)點(diǎn),可以說智能化控制與自動(dòng)控制的核心就是單片機(jī)。本設(shè)計(jì)是以AT89C52芯片的電路為基礎(chǔ),外部加上輸入設(shè)備和顯示設(shè)備,以此來實(shí)現(xiàn)信號(hào)發(fā)生器的硬件電路,通過軟件程序來控制單片機(jī)實(shí)現(xiàn)波形的輸出。對(duì)于不同型號(hào)的單片機(jī)只需要相應(yīng)的改變一下地址即可。該軟、硬件系統(tǒng)具有很好的通用性,很高的實(shí)際使用價(jià)值,為廣大的單片機(jī)愛好者提供了很好的借鑒。

1.2基本功能簡(jiǎn)介
  • 方波
  • 三角波
  • 正弦波
  • 鋸齒波
  • 頻率可改變

第二章  硬件設(shè)計(jì)與原理

以AT89C52單片機(jī)為核心,起著控制作用。系統(tǒng)包括D/A轉(zhuǎn)換電路、復(fù)位電路、時(shí)鐘電路、按鍵電路。設(shè)計(jì)思路分為五個(gè)模塊:復(fù)位電路、晶振電路模塊、AT89C52、D/A轉(zhuǎn)換電路、按鍵電路這五個(gè)模塊。

2.1 總設(shè)計(jì)框圖

圖2-1 總設(shè)計(jì)框圖

2.2 硬件設(shè)計(jì)分析
2.2.1
電源的設(shè)計(jì)的選擇

   方案一:采用電池供電,但是耗費(fèi)電源而且不節(jié)能環(huán)保顧不采用。

方案二:采用系統(tǒng)電源使用外接直流5伏。即就是usb數(shù)據(jù)線供電,才方案具有簡(jiǎn)單方便節(jié)能高效等特點(diǎn)。

基于以上分析,本次設(shè)計(jì)我采用方案二。

2.2.2  核心控制的選擇

核心控制器主要用于對(duì)輸入,D/A轉(zhuǎn)換,信號(hào)輸出等模塊進(jìn)行控制。相當(dāng)于人的大腦故非常重要和復(fù)雜,控制器的選擇有以下兩種方案。

方案一:采用FPGA(現(xiàn)場(chǎng)可編程門列陣)作為系統(tǒng)的控制器。FPGA可以實(shí)現(xiàn)各種復(fù)雜的邏輯功能,規(guī)模大,密度高,它將所有器件集成在一塊芯片上,減小了體積,提高了穩(wěn)定性。但由于本設(shè)計(jì)對(duì)數(shù)據(jù)處理的速度要求不高,F(xiàn)PGA的高速處理的優(yōu)勢(shì)得不到充分體現(xiàn),并且由于其集成度高,使其成本偏高,同時(shí)由于芯片的引腳較多,實(shí)物硬件電路板布線復(fù)雜,加重了電路設(shè)計(jì)和實(shí)際焊接的工作。

方案二:采用單片機(jī)作為系統(tǒng)控制器的作為其核心的方案。單片機(jī)算術(shù)運(yùn)算功能強(qiáng)、軟件編程靈活、自由度大,可以用軟件編程實(shí)現(xiàn)各種算法和邏輯控制,并且由于其功耗低、體積小、技術(shù)成熟和成本低等優(yōu)點(diǎn),使其在各個(gè)領(lǐng)域應(yīng)用廣泛。

基于以上分析,本次設(shè)計(jì)我采用方案二。

2.2.3  鍵盤的選擇

鍵盤是單片機(jī)不可缺少的輸入設(shè)備,是實(shí)現(xiàn)人機(jī)對(duì)話的紐帶。鍵盤按結(jié)構(gòu)形式可以分為非編碼鍵盤和編碼鍵盤,前者用軟件方法產(chǎn)生鍵碼,而后者則用硬件方法來產(chǎn)生鍵碼。在單片機(jī)中使用的都是非編碼鍵盤,因?yàn)榉蔷幋a鍵盤結(jié)構(gòu)簡(jiǎn)單,成本低廉,非編碼鍵盤的類型很多,常用的有獨(dú)立式鍵盤,行列式鍵盤等。

方案一:獨(dú)立式鍵盤            

獨(dú)立式鍵盤接口中使用幾根I/O線,就有幾個(gè)按鍵,這種類型的鍵盤,其按鍵比較少,且鍵盤中各按鍵的工作互不干擾。因此可以根據(jù)實(shí)際需要對(duì)鍵盤中的按鍵靈活編碼。獨(dú)立式鍵盤的缺點(diǎn)是需要占用比較多的I/O口線,當(dāng)單片機(jī)應(yīng)用系統(tǒng)鍵盤中需要的按鍵比較少或I/O口線比較富余時(shí),可以采用這樣類型的鍵盤。

方案二:行列式鍵盤

行列式鍵盤是用N條I/O線作為行線,M條I/O線作為列線組成的鍵盤,按鍵在行線和列線的每個(gè)交叉點(diǎn)上。這種形式的鍵盤結(jié)構(gòu),能夠有效地提高單片機(jī)系統(tǒng)中I/O的利用率。

CPU對(duì)鍵盤的掃描可以采用取程序控制的隨機(jī)方式,即只有在CPU空閑是時(shí)才去掃描鍵盤,響應(yīng)操作人員的鍵盤輸入,即利用單片機(jī)內(nèi)部定時(shí)器每隔一定時(shí)間對(duì)鍵盤掃描一次,這樣控制方式,不管鍵盤上有無鍵閉合,CPU總是定時(shí)的關(guān)心鍵盤狀態(tài)。在大多數(shù)情況下,CPU對(duì)鍵盤可能進(jìn)行空掃描。

根據(jù)以上的論述,我們采用方案一。

2.3 單片機(jī)最小系統(tǒng)

51單片機(jī)是對(duì)目前所有兼容intel 8031指令系統(tǒng)的單片機(jī)的統(tǒng)稱。該系列單片機(jī)的始祖是intel的8031單片機(jī),后來隨著技術(shù)的發(fā)展,成為目前廣泛應(yīng)用的8為單片機(jī)之一。單片機(jī)是在一塊芯片內(nèi)集成了CPU、RAM、ROM、定時(shí)器/計(jì)數(shù)器和多功能I/O口等計(jì)算機(jī)所需要的基本功能部件的大規(guī)模集成電路,又稱為MCU。51系列單片機(jī)內(nèi)包含以下幾個(gè)部件:

一個(gè)8位CPU;一個(gè)片內(nèi)振蕩器及時(shí)鐘電路;

8KB的ROM程序存儲(chǔ)器;

一個(gè)256B的RAM數(shù)據(jù)存儲(chǔ)器;

尋址64KB外部數(shù)據(jù)存儲(chǔ)器和64KB外部程序存儲(chǔ)空間的控制電路;

32條可編程的I/O口線;

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

一個(gè)可編程全雙工串行口;

5個(gè)中斷源、兩個(gè)優(yōu)先級(jí)嵌套中斷結(jié)構(gòu)。

如圖2-2-1所示為單片機(jī)基本構(gòu)造,其基本性能介紹如下:

圖2-2-1單片機(jī)

該單片機(jī)本身內(nèi)含40個(gè)引腳,32個(gè)外部雙向輸入/輸出(I/O)端口,同時(shí)內(nèi)含2個(gè)外中端口,3個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,AT89C52可以按照常規(guī)方法進(jìn)行編程,但不可以在線編程。其將通用的微處理器和Flash存儲(chǔ)器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲(chǔ)器可有效地降低開發(fā)成本。

主要特性如下表所示:

兼容MCS—51指令系統(tǒng)

32個(gè)可編程I/O線

8k字節(jié)可編程閃爍存儲(chǔ)器

可編程UARL通道

三個(gè)16位可編程定時(shí)/計(jì)數(shù)器中斷

時(shí)鐘頻率0-24MHz

2個(gè)外部中斷源,共8個(gè)中斷源

128×8bit內(nèi)部RAM

2個(gè)讀寫中斷口線

可直接驅(qū)動(dòng)LED

軟件設(shè)置睡眠和喚醒功能

低功耗空閑和掉電模式

表2-2-1  單片機(jī)主要功能描述

該單片機(jī)為40腳雙列直插封裝的8位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52相同,其主要用于會(huì)聚調(diào)整時(shí)的功能控制。功能包括對(duì)會(huì)聚主IC內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會(huì)聚調(diào)整控制,會(huì)聚測(cè)試圖控制,紅外遙控信號(hào)IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19腳)和XTAL2(18腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40腳)和VSS(20腳)為供電端口,分別接+5V電源的正負(fù)端。P0~P3 為可編程通用I/O腳,其功能用途由軟件定義,在本設(shè)計(jì)中,P0端口(32~39腳)被定義為N1功能控制端口,分別與N1的相應(yīng)功能管腳相連接,13腳定義為IR輸入端,10腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12腳、27腳及28腳定義為握手信號(hào)功能端口,連接主板CPU的相應(yīng)功能端,用于當(dāng)前制式的檢測(cè)及會(huì)聚調(diào)整狀態(tài)進(jìn)入的控制功能。

P0口:P0口是一組8位漏極開路型雙向I/O 口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時(shí),每位能吸收電流的方式驅(qū)動(dòng)8個(gè)TTL邏輯門電路,對(duì)端口P0寫“1”時(shí),可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲(chǔ)器或程序存儲(chǔ)器時(shí),這組口線分時(shí)轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在Flash 編程時(shí),P0口接收指令字節(jié),而在程序校驗(yàn)時(shí),輸出指令字節(jié),校驗(yàn)時(shí),要求外接上拉電阻。

P1口:P1是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對(duì)端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作輸入口。作輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流(IIL)。與AT89C51不同之處是,P1.0和P1.1還可分別作為定時(shí)/計(jì)數(shù)器2 的外部計(jì)數(shù)輸入(P1.0/T2)和輸入(P1.1/T2EX)。Flash編程和程序校驗(yàn)期間,P1接收低8位地址。

P2口:P2是一個(gè)帶有內(nèi)部上拉電阻的8 位雙向I/O口,P2的輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對(duì)端口P2寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作輸入口,作輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流(IIL)。在訪問外部程序存儲(chǔ)器或16位地址的外部數(shù)據(jù)存儲(chǔ)器(例如執(zhí)行MOVX @DPTR指令)時(shí),P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲(chǔ)器(如執(zhí)行MOVX @RI指令)時(shí),P2口輸出P2鎖存器的內(nèi)容。Flash編程或校驗(yàn)時(shí),P2亦接收高位地址和一些控制信號(hào)。

P3口:P3口是一組帶有內(nèi)部上拉電阻的8位雙向I/O口。P3口輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對(duì)P3口寫入“1”時(shí),它們被內(nèi)部上拉電阻拉高并可作為輸入端口。此時(shí),被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能P3口還接收一些用于Flash 閃速存儲(chǔ)器編程和程序校驗(yàn)的控制信號(hào)。

RST:復(fù)位輸入。當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期以上高電平將使單片機(jī)復(fù)位。

ALE/PROG:當(dāng)訪問外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時(shí)鐘振蕩頻率的1/6輸出固定的脈沖信號(hào),因此它可對(duì)外輸出時(shí)鐘或用于定時(shí)目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器時(shí)將跳過一個(gè)AL脈沖。對(duì)Flash存儲(chǔ)器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對(duì)特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條 MOVX 和MOVC指令才能將ALE激活。此外,該引腳會(huì)被微弱拉高,單片機(jī)執(zhí)行外部程序時(shí),應(yīng)設(shè)置ALE禁止位無效。

PSEN:程序儲(chǔ)存允許(PSEN)輸出是外部程序存儲(chǔ)器的讀選通信號(hào),當(dāng)單片機(jī)由外部程序存儲(chǔ)器取指令(或數(shù)據(jù))時(shí),每個(gè)機(jī)器周期兩次PSEN有效,即輸出兩個(gè)脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器,將跳過兩次PSEN信號(hào)。

EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲(chǔ)器(地址為0000H—FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復(fù)位時(shí)內(nèi)部會(huì)鎖存EA端狀態(tài)。如EA端為高電平(接Vcc端),CPU則執(zhí)行內(nèi)部程序存儲(chǔ)器中的指令。Flash存儲(chǔ)器編程時(shí),該引腳加上+12V的編程允許電源Vpp,當(dāng)然這必須是該器件是使用12V編程電壓Vpp。

XTAL1:振蕩器反相放大器的及內(nèi)部時(shí)鐘發(fā)生器的輸入端。

XTAL2:振蕩器反相放大器的輸出端。

單片機(jī)最小原理圖如圖2-2-2所示。

圖2-2-2 單片機(jī)最小系統(tǒng)

單片機(jī)最小系統(tǒng)說明:

時(shí)鐘信號(hào)的產(chǎn)生:在MCS-51芯片內(nèi)部有一個(gè)高增益反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。而在芯片的外部,XTAL1和XTAL2之間跨接晶體振蕩器和微調(diào)電容,從而構(gòu)成一個(gè)穩(wěn)定的自激振蕩器,這就是單片機(jī)的時(shí)鐘振蕩電路。

時(shí)鐘電路產(chǎn)生的振蕩脈沖經(jīng)過觸發(fā)器進(jìn)行二分頻之后,才成為單片機(jī)的時(shí)鐘脈沖信號(hào)。

一般地一般選用石英晶體振蕩器。此電路在加電大約延遲10ms后振蕩器起振,在XTAL2引腳產(chǎn)生幅度為3V左右的正弦波時(shí)鐘信號(hào),其振蕩頻率主要由石英晶振的頻率確定。電路中兩個(gè)電容 C3,C2的作用有兩個(gè):一是幫助振蕩器起振;二是對(duì)振蕩器的頻率進(jìn)行微調(diào)。C3,C2的典型值為30PF。

圖2-2-2 晶振電路

單片機(jī)復(fù)位使CPU和系統(tǒng)中的其他功能部件都處在一個(gè)確定的初始狀態(tài)下,并從這個(gè)狀態(tài)開始工作。單片機(jī)復(fù)位條件:必須使9腳加上持續(xù)兩個(gè)機(jī)器周期(即24個(gè)振蕩周期)的高電平。

圖2-2-2 復(fù)位電路

    利用單片機(jī)的ISP功能通過與電腦串口連接,在電腦端運(yùn)行ISP下載控制軟件STC-ISP.EXE(可到mcu-memory網(wǎng)站下載)即可對(duì)芯片進(jìn)行燒錄。需要注意的是單片機(jī)要上電復(fù)位即冷啟動(dòng)才會(huì)運(yùn)行其內(nèi)部已固化的系統(tǒng)ISP程序與電腦端ISP下載控制軟件通訊。另外由于是串口通訊,有讀者會(huì)認(rèn)為用戶系統(tǒng)目標(biāo)板上要用通訊標(biāo)準(zhǔn)晶振如11.0592M等與電腦端通訊。其實(shí)并非這樣,用戶系統(tǒng)目標(biāo)板上的晶振頻率選擇并沒有多大限制,只要不超過33M,理論上可選擇任一頻率的晶振。電腦端ISP下載控制軟件會(huì)自動(dòng)檢測(cè)出用戶系統(tǒng)目標(biāo)板上所使用晶振的頻率,并計(jì)算出合適的波特率,但不會(huì)超過用戶在ISP下載控制軟件中設(shè)定的最高波特率與之通信并開始燒錄。

由于該系列單片機(jī)EA管腳內(nèi)部已上拉到VCC,所以用戶程序如不在外部的存儲(chǔ)器中可懸空不接,晶振旁的電容C1最好去掉不接利于起振,C1可能造成用戶下載程序不成功。在編程方面,任何老的編譯器/匯編器均可使用,如果使用KEILC51編譯器,器件需選擇標(biāo)準(zhǔn)的Intel8052,頭文件包含標(biāo)準(zhǔn)的<reg52.h>,如果頭文件中未聲明新增的特殊功能寄存器可用“sfr”及“sbit”在頭文件中添加聲明地址,如果是匯編程序則用“DATA”或“EQU”在程序中聲明地址即可。

C51單片機(jī)與C52單片機(jī)比較:C52單片機(jī)有3個(gè)定時(shí)器,8KB的ROM程序存儲(chǔ)器,。

2.4按鍵輸入電路

按鍵是由一組按壓式或觸摸式開關(guān)構(gòu)成的陣列,是一種常用的輸入設(shè)備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。

1.編碼鍵盤通過硬件電路產(chǎn)生被按按鍵的鍵碼,這種鍵盤所需程序簡(jiǎn)單,但硬件電路復(fù)雜、價(jià)格昂貴通常不被單片機(jī)系統(tǒng)采用。

2.非編碼鍵盤常用一些按鍵排列成行列矩陣,其硬件邏輯與按鍵編碼不存在嚴(yán)格的對(duì)應(yīng)關(guān)系,而要由所用的程序來決定。非編碼鍵盤的硬件接口簡(jiǎn)單,但是要占用較多的CPU時(shí)間,通常采用可編程鍵盤管理芯片來克服這個(gè)缺點(diǎn)。

在接線時(shí)由于有四個(gè)引腳,連接時(shí)需要用萬用表進(jìn)行測(cè)量,然后接通兩個(gè)引腳,原理圖如下。

要進(jìn)行數(shù)據(jù)的計(jì)算就必須先進(jìn)行數(shù)據(jù)的輸入,也就必須確定按鍵輸入的數(shù)值是什么,這就需要對(duì)鍵盤進(jìn)行掃描,從而確定究竟是哪個(gè)鍵按下。

圖2-2-3 按鍵電路

這些常開開關(guān)組成了調(diào)節(jié)按鍵,硬件電路簡(jiǎn)單,在程序設(shè)計(jì)上也不復(fù)雜,只要在程序中消除在按鍵過程中產(chǎn)生的“毛刺”現(xiàn)象就可以了。這里采用最常用的方法即延時(shí)法,其的原理為:因?yàn)椤懊獭泵}沖一般持續(xù)時(shí)間短,約為幾ms,而按鍵的時(shí)間一般遠(yuǎn)遠(yuǎn)大于這個(gè)時(shí)間,所以當(dāng)單片機(jī)檢測(cè)到有按鍵動(dòng)靜后再延時(shí)一段時(shí)間(這里取10ms)后再判斷此電平是否保持原狀態(tài),如果是則為有效按鍵,否則無效。

2.5 D/A轉(zhuǎn)換電路

DAC0832是8分辨率的D/A轉(zhuǎn)換集成芯片。與微處理器完全兼容。這個(gè)DA芯片以其價(jià)格低廉、接口簡(jiǎn)單、轉(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)成。

主要參數(shù)

* 分辨率為8位;

* 電流穩(wěn)定時(shí)間1us;

* 可單緩沖、雙緩沖或直接數(shù)字輸入;

* 只需在滿量程下調(diào)整其線性度;

* 單一電源供電(+5V~+15V);

* 低功耗,20mW。

* D0~D7:8位數(shù)據(jù)輸入線,TTL電平,有效時(shí)間應(yīng)大于90ns(否則鎖存器的數(shù)據(jù)會(huì)出錯(cuò));

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

* CS:片選信號(hào)輸入線(選通數(shù)據(jù)鎖存器),低電平有效;

* 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ù)鎖存;

* XFER:數(shù)據(jù)傳輸控制信號(hào)輸入線,低電平有效,負(fù)脈沖(脈寬應(yīng)大于500ns)有效;

* 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)換。

* IOUT1:電流輸出端1,其值隨DAC寄存器的內(nèi)容線性變化;

* IOUT2:電流輸出端2,其值與IOUT1值之和為一常數(shù);

* Rfb:反饋信號(hào)輸入線,改變Rfb端外接電阻值可調(diào)整轉(zhuǎn)換滿量程精度;

* Vcc:電源輸入端,Vcc的范圍為+5V~+15V;

* VREF:基準(zhǔn)電壓輸入線,VREF的范圍為-10V~+10V;

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

* DGND:數(shù)字信號(hào)地。

工作方式

根據(jù)對(duì)DAC0832的數(shù)據(jù)鎖存器和DAC寄存器的不同的控制方式,DAC0832有三種工作方式:直通方式、單緩沖方式和雙緩沖方式。

DAC0832引腳功能電路應(yīng)用原理圖DAC0832是采樣頻率為八位的D/A轉(zhuǎn)換芯片,集成電路內(nèi)有兩級(jí)輸入寄存器,使DAC0832芯片具備雙緩沖、單緩沖和直通三種輸入方式,以便適于各種電路的需要(如要求多路D/A異步輸入、同步轉(zhuǎn)換等)。所以這個(gè)芯片的應(yīng)用很廣泛,關(guān)于DAC0832應(yīng)用的一些重要資料見下圖: D/A轉(zhuǎn)換結(jié)果采用電流形式輸出。若需要相應(yīng)的模擬電壓信號(hào),可通過一個(gè)高輸入阻抗的線性運(yùn)算放大器實(shí)現(xiàn)。運(yùn)放的反饋電阻可通過RFB端引用片內(nèi)固有電阻,也可外接。DAC0832邏輯輸入滿足TTL電平,可直接與TTL電路或微機(jī)電路連接。

DAC0832引腳功能說明:

DI0~DI7:數(shù)據(jù)輸入線,TLL電平。

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

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

WR1:為輸入寄存器的寫選通信號(hào)。

XFER:數(shù)據(jù)傳送控制信號(hào)輸入線,低電平有效。

WR2:為DAC寄存器寫選通輸入線。

Iout1:電流輸出線。當(dāng)輸入全為1時(shí)Iout1最大。

Iout2: 電流輸出線。其值與Iout1之和為一常數(shù)。

Rfb:反饋信號(hào)輸入線,芯片內(nèi)部有反饋電阻.

Vcc:電源輸入線 (+5v~+15v)

Vref:基準(zhǔn)電壓輸入線 (-10v~+10v)

AGND:模擬地,摸擬信號(hào)和基準(zhǔn)電源的參考地.

DGND:數(shù)字地,兩種地線在基準(zhǔn)電源處共地比較好.

圖2-2-4 轉(zhuǎn)換電路

第三章  軟件設(shè)計(jì)與分析3.1 軟件設(shè)計(jì)的組成

該系統(tǒng)由調(diào)節(jié)部分——頻率子函數(shù)、調(diào)節(jié)部分——方波的占空比子函數(shù)、波形發(fā)生子函數(shù)、定時(shí)器0中斷子函數(shù)、定時(shí)器1中斷子函數(shù)、主函數(shù)和數(shù)據(jù)定義這幾部分組成。

在程序開始運(yùn)行之后,首先是對(duì)單片機(jī)進(jìn)行初始化,之后判斷信號(hào)頻率值,如符合所需的頻率,則重置時(shí)間常數(shù),不符則返回。在中斷結(jié)束后,還要來判斷波形是否符合,如符合,則顯示其頻率,不符則返回,重新判斷。

在中斷服務(wù)子程序開始后,通過判斷來確定各種波形的輸出,當(dāng)判斷選擇的不是方波后,則轉(zhuǎn)向?qū)φ也ǖ呐袛啵绱朔磸?fù)。如果選擇的是方波,則用查表的方法求出相應(yīng)的數(shù)據(jù),并通過D/A轉(zhuǎn)換器將數(shù)據(jù)轉(zhuǎn)換成模擬信號(hào),形成所需波形信號(hào)。

3.2定時(shí)程序設(shè)計(jì)
定時(shí)器T1用于倒計(jì)時(shí),每次中斷為50ms,當(dāng)計(jì)數(shù)標(biāo)志為20時(shí)即為一秒,顯示數(shù)字減一。其流程圖如下






圖3-3-2  倒計(jì)時(shí)中斷流程圖




第五章 系統(tǒng)調(diào)試與軟件仿真

\系統(tǒng)調(diào)試包括硬件調(diào)試和軟件調(diào)試,二者密不可分。我們?cè)O(shè)計(jì)好的硬件電路和軟件程序必須經(jīng)過聯(lián)合調(diào)試才能驗(yàn)證其正確性。因?yàn)榇蠹叶记宄䞍烧呦嗷ソY(jié)合才能發(fā)揮最佳功效。

5.1 硬件調(diào)試

硬件調(diào)試分為單元電路調(diào)試和聯(lián)機(jī)調(diào)試,單元電路調(diào)試在硬件電路設(shè)計(jì)中已經(jīng)進(jìn)行對(duì)電路進(jìn)行檢驗(yàn)。

線路檢查:根據(jù)硬件邏輯設(shè)計(jì)圖,仔細(xì)檢查電路是否正確,并且核對(duì)元器件的型號(hào)、規(guī)格和安裝是否符合要求,必要時(shí)可用萬用表檢測(cè)線路通斷情況。先用萬用表檢查各管腳之間是否有短路、虛焊、漏焊現(xiàn)象。檢查無誤后,測(cè)試各個(gè)芯片是否有損,待檢查完畢后,將各個(gè)芯片插入各自的槽位。

電源調(diào)試:電路的第一次通電測(cè)試很重要,調(diào)試方法有兩種:一種是斷開電路穩(wěn)壓電源的輸出端,檢查空載時(shí)電源的工作情況;另一種是拔下電路上的主要繼承芯片,檢查電源的負(fù)載能力。確保電源無故障并符合性能要求。

5.2  Keil uVision2軟件調(diào)試

軟件調(diào)試是通過對(duì)用戶程序的匯編、連接、執(zhí)行來發(fā)現(xiàn)程序中存在的語法錯(cuò)誤與邏輯錯(cuò)誤并加以排除糾正的過程。

本設(shè)計(jì)用到了Keil uVision2軟件,首先打開Keil uVision2,將程序輸入;然后進(jìn)行調(diào)試,將程序中的語法錯(cuò)誤和邏輯錯(cuò)誤糾正,調(diào)試完畢后,創(chuàng)建HEX文件,HEX文件用于燒寫芯片,將制定程序?qū)懭胍言O(shè)計(jì)好的電路板中,使其能根據(jù)我們的要求實(shí)現(xiàn)相應(yīng)的功能;最后將HEX文件燒寫入芯片,運(yùn)行電路,讓其實(shí)現(xiàn)信號(hào)發(fā)生器的功能         


總結(jié)

經(jīng)過近一個(gè)月的努力,終于順利完成了畢業(yè)設(shè)計(jì)。剛開始,我們頭緒不是很清楚,不知道從哪里入手,但通過老師的耐心指導(dǎo)并和同學(xué)認(rèn)真研究設(shè)計(jì)課題,跑圖書館查資料、確定基本設(shè)計(jì)方案、對(duì)所用芯片功能進(jìn)行查找、調(diào)試、上機(jī)仿真等,經(jīng)歷了一次次的困難,卻積累了很多寶貴的經(jīng)驗(yàn)。在整個(gè)設(shè)計(jì)的過程中遇到的問題主要有以下三點(diǎn),第一:基礎(chǔ)知識(shí)掌握的不牢固,主要表現(xiàn)在一些常用的電路的形式和功能不清楚,對(duì)書本上的內(nèi)容理解不夠透徹。第二:對(duì)一些常用的應(yīng)用軟件缺少應(yīng)用,體現(xiàn)在畫電路圖和系統(tǒng)的仿真的時(shí)候,對(duì)這些軟件的操作不熟練,浪費(fèi)了很多時(shí)間。第三:相關(guān)知識(shí)掌握的不夠全面,缺少系統(tǒng)設(shè)計(jì)的經(jīng)驗(yàn)。

這次設(shè)計(jì)進(jìn)一步端了我的學(xué)習(xí)態(tài)度,學(xué)會(huì)了實(shí)事求是,嚴(yán)謹(jǐn)?shù)淖黠L(fēng),對(duì)自己要嚴(yán)格要求,不能夠一知半解,要力求明明白白。急于求成是不好的,我有所感受。如果省略了那些必要的步驟,急于求成,不僅會(huì)浪費(fèi)時(shí)間,還會(huì)適得其反。我覺得動(dòng)手之前,頭腦里必須清楚該怎么做,這一點(diǎn)是很重要的。就目前來說,我的動(dòng)手能力雖然差一點(diǎn),但我想,通過我的不懈努力,在這方面,我總會(huì)得到提高。這一點(diǎn),我堅(jiān)信。因?yàn)閯e人能做到的,我也一定能做到。

在此次的畢業(yè)設(shè)計(jì)中我最大的體會(huì)就是進(jìn)一步認(rèn)識(shí)到了理論聯(lián)系實(shí)踐的重要性。一份耕耘,一份收獲。通過這段時(shí)間的設(shè)計(jì),讓我明白科學(xué)的思維方法和學(xué)習(xí)方法是多么重要,只有這樣才能夠有很高的效率,才能夠讓自己的工作更完美。總而言之,此次畢業(yè)設(shè)計(jì)讓我學(xué)到了好多平時(shí)在課堂上學(xué)不到的東西,增加了我的知識(shí)運(yùn)用能力,增強(qiáng)我的實(shí)際操作能力。謝謝老師給我們提供這么好的機(jī)會(huì),為我們之后走向社會(huì)奠定了一個(gè)好的基礎(chǔ)。

本次畢業(yè)設(shè)計(jì)讓我學(xué)到了很多,也學(xué)會(huì)到了要怎么樣去面對(duì)困難,不要對(duì)知識(shí)一知半截,要有的求實(shí)的能力,通過老師的幫助我學(xué)到了很多在平時(shí)的沒有注意到的動(dòng)?xùn)|西及知識(shí),更美沒有深入的的去理解,通過這次我要更加的明確自己。更要注重自己在各方面的鍛煉能力,把握機(jī)會(huì)。這次的設(shè)計(jì)非常的感謝老師們。


致謝

三年的大學(xué)生活接近尾聲,我的畢業(yè)設(shè)計(jì)也順利的完成了,這里首先向我的指導(dǎo)老師陳東鳳表示最誠摯的感謝,同時(shí)也感謝那些幫助過我的同學(xué)們。

在本次的畢業(yè)設(shè)計(jì)中陳老師給我提供了極大的幫助,首先在一開始的選題中我便遇到了難題,由于當(dāng)時(shí)選題的時(shí)候過于疏忽大意,沒有認(rèn)真的加以分析,所選擇的題目并不是自己愛好的方向,陳老師便告訴我,最重要的就是找對(duì)方向找準(zhǔn)目標(biāo),選擇一個(gè)自己擅長(zhǎng)和喜歡的方向不僅能夠促使我們積極的完成設(shè)計(jì),而且對(duì)于自己來說也是充滿著興趣,這樣做出來的東西會(huì)更加完美和輕松,所以我毅然的改題,選擇了一個(gè)自己喜歡的方向,其次,在畢業(yè)設(shè)計(jì)的過程中,陳老師不厭其煩的為我們講解了畢業(yè)設(shè)計(jì)中可能出現(xiàn)的問題,并為我們提供了完整的畢業(yè)設(shè)計(jì)模板無論我遇到什么樣的問題,她總能很耐心的為我們講解,同時(shí)她每個(gè)周一要求見面一次,督促我們抓緊時(shí)間完成畢業(yè)設(shè)計(jì),每次見面她都要求我詳解上周所做的東西以及自己下周要做的東西,有問題或者不合理的地方她便為我指出來,加以指導(dǎo)。陳老師認(rèn)真負(fù)責(zé)的態(tài)度讓我倍受感激。同時(shí)在此也感謝胡銀飛同學(xué),他解決了許多我在畢業(yè)設(shè)計(jì)中遇到的問題,特別是剛開始軟件的學(xué)習(xí)中,他給了我很大的幫助。

在此向所有畢業(yè)設(shè)計(jì)的過程中給予我?guī)椭睦蠋熀屯瑢W(xué)最誠摯的謝意。

附錄

原理圖



元件清單



3.3  各部分軟件分析
3.3.1
  調(diào)節(jié)部分——頻率子函數(shù)


單片機(jī)源程序如下:
  1. //調(diào)節(jié)部分——頻率子函數(shù)
  2. void freq_ud()
  3. {
  4.               uint temp;
  5.                  if(k3==0)
  6.                             FREQ--;            
  7.                  else if(k2==0)
  8.                             FREQ++;
  9.                  if(cho==1|cho==3) //鋸齒波256次中斷一周期,特殊處理下。否則他的頻率是100(+\-)n*2Hz.
  10.               {
  11.                             temp=0xffff-3906/FREQ;  //方波,三角波默認(rèn)為100hz,切換后頻率也為50HZ 65336-10^6/(256*FREQ)
  12.                             TIME0_H=temp/256;
  13.                             TIME0_L=temp%256;
  14.               }
  15.                  else if(cho==0|cho==3)
  16.               {            
  17.                             //正弦波 三角波默認(rèn)周期50hz  65536-10^6//(512*FREQ)
  18.                                temp=0xffff-1953/FREQ;
  19.                                TIME0_H=temp/256;
  20.                                TIME0_L=temp%256;
  21.                  }
  22. }
  23. 3.3.2  調(diào)節(jié)部分——方波的占空比子函數(shù)

  24. //調(diào)節(jié)部分——方波的占空比子函數(shù)
  25. void duty_ud()  //方波也采用512次中斷構(gòu)成一個(gè)周期。
  26. {
  27.               if(k5==0&sqar_num>0)
  28.                             sqar_num--;
  29.                  else if(k4==0&sqar_num<255)
  30.                               sqar_num++;
  31. }
  32. 3.3.3  波形發(fā)生子函數(shù)

  33. //波形發(fā)生子函數(shù)
  34. void sint()
  35. {
  36.               if(!flag)
  37.               {
  38.                             CS=0;
  39.                             P2=sin_num[num++];
  40.                             CS=1;
  41.                             if(num==0)
  42.                             {
  43.                                           num=255;
  44.                                           flag=1;
  45.                             }
  46.               }
  47.               else if(flag)
  48.               {
  49.                             CS=0;
  50.                             P2=sin_num[num--];
  51.                             CS=1;
  52.                             if(num==255)
  53.                             {
  54.                                           num=0;
  55.                                           flag=0;
  56.                             }            
  57.               }
  58. }
  59. void square()
  60. {
  61.               if(i++<sqar_num)
  62.               {
  63.                             CS=0;
  64.                             P2=0xff;
  65.                             CS=1;
  66.               }
  67.               else
  68.               {
  69.                             CS=0;
  70.                             P2=0x00;
  71.                             CS=1;
  72.               }
  73. }
  74. void triangle()
  75. {
  76.                 CS=0;
  77.               P2=num++;
  78.               CS=1;
  79. }
  80. void stw()
  81. {
  82.                  if(~flag)
  83.                  {
  84.                   CS=0;
  85.                             P2=num++;
  86.                             CS=1;
  87.                             if(num==0)
  88.                             {
  89.                                           num=255;
  90.                                           flag=1;
  91.                             }
  92.               }
  93.                  else if(flag)
  94.                  {
  95.                                CS=0;
  96.                             P2=num--;
  97.                             CS=1;
  98.                             if(num==255)
  99.                             {
  100.                                           num=1;
  101.                                           flag=0;
  102.                             }
  103.               }
  104. }
  105. 3.3.4  定時(shí)器0中斷子函數(shù)

  106. //定時(shí)器0中斷子函數(shù)
  107. void t0() interrupt 1
  108. {
  109.               TH0=0;
  110.               TL0=0;
  111.               if(k1==0)
  112.               {
  113.                             if(++cho==4)
  114.                             {
  115.                                           cho=0;
  116.                                           num=0;
  117.                             }            
  118.               }              //num=0;所有數(shù)據(jù)從新開始,保證波形的完整性
  119.                  else if(k2==0|k3==0)
  120.     {
  121.                             freq_ud();
  122.               }
  123.                  else if(cho==1&(k5==0|k4==0))
  124.     {
  125.                             duty_ud();
  126.               }
  127.                  else ;
  128. }
  129. 3.3.5  定時(shí)器1中斷處理子函數(shù)

  130. //定時(shí)器1中斷處理子函數(shù)
  131. void t1() interrupt 3
  132. {
  133.                 switch(cho)
  134.                 {
  135.                               case 0:              {
  136.                                                                       TH1=TIME0_H;
  137.                                                                       TL1=TIME0_L;
  138.                                                                       sint();
  139.                                                                       break;
  140.                                                         }  //正弦波//每半周期256取樣。
  141.                             case 1:              {
  142.                                                                       TH1=TIME0_H;
  143.                                                                       TL1=TIME0_L;
  144.                                                                       square();
  145.                                                                       break;
  146.                                                         }              //方波   //為了提高方波的最高頻率,只有犧牲占空比的最小可調(diào)值。分100份 每次1%。
  147.                             case 2:              {
  148.                                                                       TH1=TIME0_H;
  149.                                                                       TL1=TIME0_L;
  150.                                                                       triangle();
  151.                                                                       break;
  152.                                                         }              //三角波
  153.                               case 3:              {
  154.                                                                       TH1=TIME0_H;
  155.                                                                       TL1=TIME0_L;
  156.                                                                       stw();   
  157.                                                                       break;
  158.                                                         }              //鋸齒波
  159.                             default: ;
  160.                 }
  161. }
  162. 3.3.6  主函數(shù)

  163. //主函數(shù)
  164. void main()
  165. {
  166.               TMOD=0x11;
  167.               TH1=0xff;
  168.               TL1=0xd9;
  169.               TH0=0;
  170.               TL0=0;
  171.               EA=1;
  172.               ET1=1;
  173.               TR1=1;
  174.               ET0=1;
  175.               TR0=1;
  176.               while(1)
  177.               {
  178.                               ;
  179.               }
  180. }

  181. 3.4  總源程序

  182. #include<reg51.h>
  183. #include<001.h>
  184. #include<DAC0832.h>
  185. //主函數(shù)
  186. void main()
  187. {
  188.               TMOD=0x01;
  189.               TH0=0xff;
  190.               TL0=0xd9;
  191.               IT0=1;    //設(shè)置中斷觸發(fā)方式,下降沿
  192.               EA=1;
  193.               EX0=1;
  194.               ET0=1;
  195.               IP=0X01;  //鍵盤中斷級(jí)別高
  196.               TR0=1;
  197.               while(1)
  198.               {
  199.                               ;
  200.               }
  201. }
  202. #ifndef __DAC0832_h__
  203. #define __DAC0832_h__
  204. typedef unsigned char uchar;
  205. typedef unsigned int  uint;
  206. uchar i,sqar_num=128; //最大值100,默認(rèn)值50
  207. uchar cho=0;         //0:正弦波。1:方波。2:三角波。3:鋸齒波。
  208. uchar num=0;
  209. uchar TIME0_H=0xff,TIME0_L=0xd9;      //定時(shí)器0的初值設(shè)置;全局變量.對(duì)應(yīng)正弦波,鋸齒波50HZ
  210. sbit k1=P1^0;                                                                                                     //三角波100Hz.
  211. sbit k2=P1^1;
  212. sbit k3=P1^2;
  213. sbit k4=P1^3;
  214. sbit k5=P1^4;
  215. sbit CS=P3^7;
  216. bit flag=0;
  217. uint FREQ=50;//初始化頻率,50HZ
  218. //調(diào)節(jié)部分——頻率子函數(shù)
  219. void freq_ud()
  220. {
  221.               uint temp;
  222.                  if(k3==0)
  223.                             FREQ--;            
  224.                  else if(k2==0)
  225.                             FREQ++;
  226.                  if(cho==1|cho==3) //鋸齒波256次中斷一周期,特殊處理下。否則他的頻率是100(+\-)n*2Hz.
  227.               {
  228.                             temp=0xffff-3906/FREQ;  //方波,三角波默認(rèn)為100hz,切換后頻率也為50HZ 65336-10^6/(256*FREQ)
  229.                             TIME0_H=temp/256;
  230.                             TIME0_L=temp%256;
  231.               }
  232.                  else if(cho==0|cho==3)
  233.               {            
  234.                             //正弦波 三角波默認(rèn)周期50hz  65536-10^6//(512*FREQ)
  235.                                temp=0xffff-1953/FREQ;
  236.                                TIME0_H=temp/256;
  237.                                TIME0_L=temp%256;
  238.                  }
  239. }
  240. //調(diào)節(jié)部分——方波的占空比子函數(shù)
  241. void duty_ud()  //方波也采用512次中斷構(gòu)成一個(gè)周期。
  242. {
  243.               if(k5==0&sqar_num>0)
  244.                             sqar_num--;
  245.                  else if(k4==0&sqar_num<255)
  246.                               sqar_num++;
  247. }
  248. //波形發(fā)生子函數(shù)
  249. void sint()
  250. {
  251.               if(!flag)
  252.               {
  253.                             CS=0;
  254.                             P2=sin_num[num++];
  255.                             CS=1;
  256.                             if(num==0)
  257.                             {
  258.                                           num=255;
  259.                                           flag=1;
  260.                             }
  261.               }
  262.               else if(flag)
  263.               {
  264.                             CS=0;
  265.                             P2=sin_num[num--];
  266.                             CS=1;
  267.                             if(num==255)
  268.                             {
  269.                                           num=0;
  270.                                           flag=0;
  271.                             }            
  272.               }
  273. }
  274. void square()
  275. {
  276.               if(i++<sqar_num)
  277.               {
  278.                             CS=0;
  279.                             P2=0xff;
  280.                             CS=1;
  281.               }
  282.               else
  283.               {
  284.                             CS=0;
  285.                             P2=0x00;
  286.                             CS=1;
  287.               }
  288. }
  289. void triangle()
  290. {
  291.                 CS=0;
  292.               P2=num++;
  293.               CS=1;
  294. }
  295. void stw()
  296. {
  297.                  if(~flag)
  298.                  {
  299.                   CS=0;
  300.                             P2=num++;
  301.                             CS=1;
  302.                             if(num==0)
  303.                             {
  304.                                           num=255;
  305.                                           flag=1;
  306.                             }
  307.               }
  308.                  else if(flag)
  309.                  {
  310.                                CS=0;
  311.                             P2=num--;
  312.                             CS=1;
  313.                             if(num==255)
  314.                             {
  315.                                           num=1;
  316.                                           flag=0;
  317.                             }
  318.               }
  319. }
  320. //外部中斷0處理子函數(shù)
  321. void wb0() interrupt 0
  322. {
  323.                  if(k1==0)
  324.               {
  325.                             if(++cho==4)
  326.                             {
  327.                                           cho=0;
  328.                                           num=0;
  329.                             }            
  330. ……………………

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

完整的Word格式文檔51黑下載地址:
基于51單片機(jī)信號(hào)發(fā)生器的設(shè)計(jì).doc (1001.5 KB, 下載次數(shù): 266)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:327447 發(fā)表于 2019-6-4 16:50 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:570500 發(fā)表于 2019-6-24 10:17 | 只看該作者

感謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:570631 發(fā)表于 2019-6-24 11:05 | 只看該作者
朋友前面的定義沒得啊
回復(fù)

使用道具 舉報(bào)

5#
ID:580896 發(fā)表于 2019-7-15 10:21 | 只看該作者
同問,能不能把前面的定義也發(fā)一下。
回復(fù)

使用道具 舉報(bào)

6#
ID:627964 發(fā)表于 2019-10-21 23:15 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

7#
ID:662569 發(fā)表于 2019-12-13 15:04 來自手機(jī) | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

8#
ID:671476 發(fā)表于 2019-12-29 15:12 | 只看該作者
對(duì)于一個(gè)菜鳥來說,這個(gè)真的很有幫助!!感謝大佬。!
回復(fù)

使用道具 舉報(bào)

9#
ID:671476 發(fā)表于 2020-1-3 10:30 | 只看該作者
有兩個(gè)庫函數(shù)莫得呀?可以發(fā)一下或者解釋一下嗎?
回復(fù)

使用道具 舉報(bào)

10#
ID:688139 發(fā)表于 2020-2-8 13:01 來自手機(jī) | 只看該作者
Lily-lemon 發(fā)表于 2020-1-3 10:30
有兩個(gè)庫函數(shù)莫得呀?可以發(fā)一下或者解釋一下嗎?

你好,你有沒有把庫函數(shù)弄好,可以給我發(fā)一下嗎?還有我這邊程序有兩個(gè)錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

11#
ID:688139 發(fā)表于 2020-2-8 13:02 來自手機(jī) | 只看該作者
SpringMean 發(fā)表于 2019-7-15 10:21
同問,能不能把前面的定義也發(fā)一下。

你好,不知道你現(xiàn)在弄好沒?可以給我發(fā)一下嗎??而且我這邊有錯(cuò)誤,能幫忙解釋一下嗎
回復(fù)

使用道具 舉報(bào)

12#
ID:688139 發(fā)表于 2020-2-8 13:37 來自手機(jī) | 只看該作者
可以回復(fù)一下嗎?很著急
回復(fù)

使用道具 舉報(bào)

13#
ID:255945 發(fā)表于 2021-1-10 18:26 | 只看該作者
厲害啊,不用網(wǎng)上查資料了,謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表