久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 39405|回復: 12
打印 上一主題 下一主題
收起左側

基于51單片機信號發生器的設計論文

  [復制鏈接]
跳轉到指定樓層
樓主
ID:311212 發表于 2018-4-18 20:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

目  錄

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



摘  要

本文介紹一種用STC89C51RC單片機構成的波形發生器,可產生方波、三角波、正弦波、鋸齒波四種波形,波形的頻率可由按鍵改變,并可根據需要選擇單極性輸出或雙極性輸出,具有線路簡單、結構緊湊、性能優越等特點。文章給出了源代碼,通過仿真測試,其性能指標達到了設計要求。


引  言

21世紀,單片機的發展非常的迅速。單片機是把主要計算機功能部件都集成在一塊芯片上的微型計算機。它是一種集計數和多種接口于一體的微控制器,被廣泛應用在智能產品和工業自動化上,而51單片機是個單片機中最為典型和最有代表性的一種。

最近幾年來,隨著科技的飛速發展,單片機領域正在不斷的走向社會各個角落,還帶動傳統控制檢測日新月異更新。在實時運作和自動控制的單片機應用到系統中,單片機如今是作為一個核心部件來使用,僅掌握單片機方面知識是不夠的,還應根據其具體硬件結構,以及針對具體應用對象特點的軟件結合,加以完善。“單片機原理及應用課程設計”是電子類專業的學科基礎科,它是繼“匯編語言程序設計”,“接口技術”等課程之后開出的實踐環節課程。


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

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

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

第二章  硬件設計與原理

以AT89C52單片機為核心,起著控制作用。系統包括D/A轉換電路、復位電路、時鐘電路、按鍵電路。設計思路分為五個模塊:復位電路、晶振電路模塊、AT89C52、D/A轉換電路、按鍵電路這五個模塊。

2.1 總設計框圖

圖2-1 總設計框圖

2.2 硬件設計分析
2.2.1
電源的設計的選擇

   方案一:采用電池供電,但是耗費電源而且不節能環保顧不采用。

方案二:采用系統電源使用外接直流5伏。即就是usb數據線供電,才方案具有簡單方便節能高效等特點。

基于以上分析,本次設計我采用方案二。

2.2.2  核心控制的選擇

核心控制器主要用于對輸入,D/A轉換,信號輸出等模塊進行控制。相當于人的大腦故非常重要和復雜,控制器的選擇有以下兩種方案。

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

方案二:采用單片機作為系統控制器的作為其核心的方案。單片機算術運算功能強、軟件編程靈活、自由度大,可以用軟件編程實現各種算法和邏輯控制,并且由于其功耗低、體積小、技術成熟和成本低等優點,使其在各個領域應用廣泛。

基于以上分析,本次設計我采用方案二。

2.2.3  鍵盤的選擇

鍵盤是單片機不可缺少的輸入設備,是實現人機對話的紐帶。鍵盤按結構形式可以分為非編碼鍵盤和編碼鍵盤,前者用軟件方法產生鍵碼,而后者則用硬件方法來產生鍵碼。在單片機中使用的都是非編碼鍵盤,因為非編碼鍵盤結構簡單,成本低廉,非編碼鍵盤的類型很多,常用的有獨立式鍵盤,行列式鍵盤等。

方案一:獨立式鍵盤            

獨立式鍵盤接口中使用幾根I/O線,就有幾個按鍵,這種類型的鍵盤,其按鍵比較少,且鍵盤中各按鍵的工作互不干擾。因此可以根據實際需要對鍵盤中的按鍵靈活編碼。獨立式鍵盤的缺點是需要占用比較多的I/O口線,當單片機應用系統鍵盤中需要的按鍵比較少或I/O口線比較富余時,可以采用這樣類型的鍵盤。

方案二:行列式鍵盤

行列式鍵盤是用N條I/O線作為行線,M條I/O線作為列線組成的鍵盤,按鍵在行線和列線的每個交叉點上。這種形式的鍵盤結構,能夠有效地提高單片機系統中I/O的利用率。

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

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

2.3 單片機最小系統

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

一個8位CPU;一個片內振蕩器及時鐘電路;

8KB的ROM程序存儲器;

一個256B的RAM數據存儲器;

尋址64KB外部數據存儲器和64KB外部程序存儲空間的控制電路;

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

兩個16位定時/計數器;

一個可編程全雙工串行口;

5個中斷源、兩個優先級嵌套中斷結構。

如圖2-2-1所示為單片機基本構造,其基本性能介紹如下:

圖2-2-1單片機

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

主要特性如下表所示:

兼容MCS—51指令系統

32個可編程I/O線

8k字節可編程閃爍存儲器

可編程UARL通道

三個16位可編程定時/計數器中斷

時鐘頻率0-24MHz

2個外部中斷源,共8個中斷源

128×8bit內部RAM

2個讀寫中斷口線

可直接驅動LED

軟件設置睡眠和喚醒功能

低功耗空閑和掉電模式

表2-2-1  單片機主要功能描述

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

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

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

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

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

RST:復位輸入。當振蕩器工作時,RST引腳出現兩個機器周期以上高電平將使單片機復位。

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

PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當單片機由外部程序存儲器取指令(或數據)時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當訪問外部數據存儲器,將跳過兩次PSEN信號。

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

XTAL1:振蕩器反相放大器的及內部時鐘發生器的輸入端。

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

單片機最小原理圖如圖2-2-2所示。

圖2-2-2 單片機最小系統

單片機最小系統說明:

時鐘信號的產生:在MCS-51芯片內部有一個高增益反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。而在芯片的外部,XTAL1和XTAL2之間跨接晶體振蕩器和微調電容,從而構成一個穩定的自激振蕩器,這就是單片機的時鐘振蕩電路。

時鐘電路產生的振蕩脈沖經過觸發器進行二分頻之后,才成為單片機的時鐘脈沖信號。

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

圖2-2-2 晶振電路

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

圖2-2-2 復位電路

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

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

C51單片機與C52單片機比較:C52單片機有3個定時器,8KB的ROM程序存儲器,。

2.4按鍵輸入電路

按鍵是由一組按壓式或觸摸式開關構成的陣列,是一種常用的輸入設備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。

1.編碼鍵盤通過硬件電路產生被按按鍵的鍵碼,這種鍵盤所需程序簡單,但硬件電路復雜、價格昂貴通常不被單片機系統采用。

2.非編碼鍵盤常用一些按鍵排列成行列矩陣,其硬件邏輯與按鍵編碼不存在嚴格的對應關系,而要由所用的程序來決定。非編碼鍵盤的硬件接口簡單,但是要占用較多的CPU時間,通常采用可編程鍵盤管理芯片來克服這個缺點。

在接線時由于有四個引腳,連接時需要用萬用表進行測量,然后接通兩個引腳,原理圖如下。

要進行數據的計算就必須先進行數據的輸入,也就必須確定按鍵輸入的數值是什么,這就需要對鍵盤進行掃描,從而確定究竟是哪個鍵按下。

圖2-2-3 按鍵電路

這些常開開關組成了調節按鍵,硬件電路簡單,在程序設計上也不復雜,只要在程序中消除在按鍵過程中產生的“毛刺”現象就可以了。這里采用最常用的方法即延時法,其的原理為:因為“毛刺”脈沖一般持續時間短,約為幾ms,而按鍵的時間一般遠遠大于這個時間,所以當單片機檢測到有按鍵動靜后再延時一段時間(這里取10ms)后再判斷此電平是否保持原狀態,如果是則為有效按鍵,否則無效。

2.5 D/A轉換電路

DAC0832是8分辨率的D/A轉換集成芯片。與微處理器完全兼容。這個DA芯片以其價格低廉、接口簡單、轉換控制容易等優點,在單片機應用系統中得到廣泛的應用。D/A轉換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉換電路及轉換控制電路構成。

主要參數

* 分辨率為8位;

* 電流穩定時間1us;

* 可單緩沖、雙緩沖或直接數字輸入;

* 只需在滿量程下調整其線性度;

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

* 低功耗,20mW。

* D0~D7:8位數據輸入線,TTL電平,有效時間應大于90ns(否則鎖存器的數據會出錯);

* ILE:數據鎖存允許控制信號輸入線,高電平有效;

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

* WR1:數據鎖存器寫選通輸入線,負脈沖(脈寬應大于500ns)有效。由ILE、CS、WR1的邏輯組合產生LE1,當LE1為高電平時,數據鎖存器狀態隨輸入數據線變換,LE1的負跳變時將輸入數據鎖存;

* XFER:數據傳輸控制信號輸入線,低電平有效,負脈沖(脈寬應大于500ns)有效;

* WR2:DAC寄存器選通輸入線,負脈沖(脈寬應大于500ns)有效。由WR2、XFER的邏輯組合產生LE2,當LE2為高電平時,DAC寄存器的輸出隨寄存器的輸入而變化,LE2的負跳變時將數據鎖存器的內容打入DAC寄存器并開始D/A轉換。

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

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

* Rfb:反饋信號輸入線,改變Rfb端外接電阻值可調整轉換滿量程精度;

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

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

* AGND:模擬信號地;

* DGND:數字信號地。

工作方式

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

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

DAC0832引腳功能說明:

DI0~DI7:數據輸入線,TLL電平。

ILE:數據鎖存允許控制信號輸入線,高電平有效。

CS:片選信號輸入線,低電平有效。

WR1:為輸入寄存器的寫選通信號。

XFER:數據傳送控制信號輸入線,低電平有效。

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

Iout1:電流輸出線。當輸入全為1時Iout1最大。

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

Rfb:反饋信號輸入線,芯片內部有反饋電阻.

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

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

AGND:模擬地,摸擬信號和基準電源的參考地.

DGND:數字地,兩種地線在基準電源處共地比較好.

圖2-2-4 轉換電路

第三章  軟件設計與分析3.1 軟件設計的組成

該系統由調節部分——頻率子函數、調節部分——方波的占空比子函數、波形發生子函數、定時器0中斷子函數、定時器1中斷子函數、主函數和數據定義這幾部分組成。

在程序開始運行之后,首先是對單片機進行初始化,之后判斷信號頻率值,如符合所需的頻率,則重置時間常數,不符則返回。在中斷結束后,還要來判斷波形是否符合,如符合,則顯示其頻率,不符則返回,重新判斷。

在中斷服務子程序開始后,通過判斷來確定各種波形的輸出,當判斷選擇的不是方波后,則轉向對正弦波的判斷,如此反復。如果選擇的是方波,則用查表的方法求出相應的數據,并通過D/A轉換器將數據轉換成模擬信號,形成所需波形信號。

3.2定時程序設計
定時器T1用于倒計時,每次中斷為50ms,當計數標志為20時即為一秒,顯示數字減一。其流程圖如下






圖3-3-2  倒計時中斷流程圖




第五章 系統調試與軟件仿真

\系統調試包括硬件調試和軟件調試,二者密不可分。我們設計好的硬件電路和軟件程序必須經過聯合調試才能驗證其正確性。因為大家都清楚兩者相互結合才能發揮最佳功效。

5.1 硬件調試

硬件調試分為單元電路調試和聯機調試,單元電路調試在硬件電路設計中已經進行對電路進行檢驗。

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

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

5.2  Keil uVision2軟件調試

軟件調試是通過對用戶程序的匯編、連接、執行來發現程序中存在的語法錯誤與邏輯錯誤并加以排除糾正的過程。

本設計用到了Keil uVision2軟件,首先打開Keil uVision2,將程序輸入;然后進行調試,將程序中的語法錯誤和邏輯錯誤糾正,調試完畢后,創建HEX文件,HEX文件用于燒寫芯片,將制定程序寫入已設計好的電路板中,使其能根據我們的要求實現相應的功能;最后將HEX文件燒寫入芯片,運行電路,讓其實現信號發生器的功能         


總結

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

這次設計進一步端了我的學習態度,學會了實事求是,嚴謹的作風,對自己要嚴格要求,不能夠一知半解,要力求明明白白。急于求成是不好的,我有所感受。如果省略了那些必要的步驟,急于求成,不僅會浪費時間,還會適得其反。我覺得動手之前,頭腦里必須清楚該怎么做,這一點是很重要的。就目前來說,我的動手能力雖然差一點,但我想,通過我的不懈努力,在這方面,我總會得到提高。這一點,我堅信。因為別人能做到的,我也一定能做到。

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

本次畢業設計讓我學到了很多,也學會到了要怎么樣去面對困難,不要對知識一知半截,要有的求實的能力,通過老師的幫助我學到了很多在平時的沒有注意到的動東西及知識,更美沒有深入的的去理解,通過這次我要更加的明確自己。更要注重自己在各方面的鍛煉能力,把握機會。這次的設計非常的感謝老師們。


致謝

三年的大學生活接近尾聲,我的畢業設計也順利的完成了,這里首先向我的指導老師陳東鳳表示最誠摯的感謝,同時也感謝那些幫助過我的同學們。

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

在此向所有畢業設計的過程中給予我幫助的老師和同學最誠摯的謝意。

附錄

原理圖



元件清單



3.3  各部分軟件分析
3.3.1
  調節部分——頻率子函數


單片機源程序如下:
  1. //調節部分——頻率子函數
  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;  //方波,三角波默認為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.                             //正弦波 三角波默認周期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  調節部分——方波的占空比子函數

  24. //調節部分——方波的占空比子函數
  25. void duty_ud()  //方波也采用512次中斷構成一個周期。
  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  波形發生子函數

  33. //波形發生子函數
  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  定時器0中斷子函數

  106. //定時器0中斷子函數
  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;所有數據從新開始,保證波形的完整性
  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  定時器1中斷處理子函數

  130. //定時器1中斷處理子函數
  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.                                                         }              //方波   //為了提高方波的最高頻率,只有犧牲占空比的最小可調值。分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  主函數

  163. //主函數
  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. //主函數
  186. void main()
  187. {
  188.               TMOD=0x01;
  189.               TH0=0xff;
  190.               TL0=0xd9;
  191.               IT0=1;    //設置中斷觸發方式,下降沿
  192.               EA=1;
  193.               EX0=1;
  194.               ET0=1;
  195.               IP=0X01;  //鍵盤中斷級別高
  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,默認值50
  207. uchar cho=0;         //0:正弦波。1:方波。2:三角波。3:鋸齒波。
  208. uchar num=0;
  209. uchar TIME0_H=0xff,TIME0_L=0xd9;      //定時器0的初值設置;全局變量.對應正弦波,鋸齒波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. //調節部分——頻率子函數
  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;  //方波,三角波默認為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.                             //正弦波 三角波默認周期50hz  65536-10^6//(512*FREQ)
  235.                                temp=0xffff-1953/FREQ;
  236.                                TIME0_H=temp/256;
  237.                                TIME0_L=temp%256;
  238.                  }
  239. }
  240. //調節部分——方波的占空比子函數
  241. void duty_ud()  //方波也采用512次中斷構成一個周期。
  242. {
  243.               if(k5==0&sqar_num>0)
  244.                             sqar_num--;
  245.                  else if(k4==0&sqar_num<255)
  246.                               sqar_num++;
  247. }
  248. //波形發生子函數
  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處理子函數
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整的Word格式文檔51黑下載地址:
基于51單片機信號發生器的設計.doc (1001.5 KB, 下載次數: 266)


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

使用道具 舉報

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

使用道具 舉報

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

感謝分享
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

你好,你有沒有把庫函數弄好,可以給我發一下嗎?還有我這邊程序有兩個錯誤
回復

使用道具 舉報

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

你好,不知道你現在弄好沒?可以給我發一下嗎??而且我這邊有錯誤,能幫忙解釋一下嗎
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91极品欧美视频 | 一呦二呦三呦国产精品 | 成人免费网视频 | 久草a√ | 国内av在线| 国产偷自视频区视频 | 国产精品久久久久久久久久久久久 | 色婷婷亚洲国产女人的天堂 | 一区二区三区亚洲 | 超碰97人人人人人蜜桃 | 日韩av.com| 99re国产视频 | 中文在线一区二区 | 久久久久国产精品午夜一区 | 精品视频导航 | 久久久国产精品入口麻豆 | 国产精品久久av | 午夜不卡福利视频 | 亚洲一区| 国产精品视频一区二区三区 | 日韩中文不卡 | 北条麻妃视频在线观看 | 午夜视频在线观看视频 | 亚洲国产成人av | 亚洲综合色自拍一区 | www国产成人 | 日韩精品成人免费观看视频 | av超碰| 日韩免费一区二区 | 在线精品亚洲欧美日韩国产 | 日韩91在线 | 美日韩免费 | 91原创视频在线观看 | 欧美一级网站 | 久久伦理电影 | 九九精品在线 | 成人免费网站 | 欧美一区二区三区在线播放 | 久久99精品国产自在现线小黄鸭 | 亚洲精品无| 亚洲美女网站 |