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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12805|回復: 0
收起左側

基于單片機的頻率計畢業設計論文(Word格式)

[復制鏈接]
ID:273205 發表于 2018-1-17 18:54 | 顯示全部樓層 |閱讀模式
目錄
1 引言
1.1 目的和意義
1.2 研究概況與發展趨勢
1.3 本系統主要功能
2. 總體方案論證與設計
2.1主控模塊的選型和論證
2.2顯示模塊的選型和論證
2.3放大電路的選型和論證
2.4系統整體設計概述
3.系統硬件電路設計
3.1主控模塊
3.1.1 STC89C52單片機主要特性
3.1.2 STC89C52單片機的中斷系統
3.1.3 單片機最小系統設計
3.2 LCD液晶顯示器簡介
3.2.1 液晶原理介紹
3.2.2液晶模塊簡介
3.2.3液晶顯示部分與STC89C52的接口
3.3三極管放大電路設計
3.4整形模塊設計
3.4.1施密特觸發器芯片介紹
3.4.2 74HC14電路設計
3.5分頻模塊設計
3.5.1 74HC390芯片介紹
3.5.2 74HC390分頻電路設計
4.系統軟件設計
4.1系統軟件總體設計
4.2程序設計原理
5.系統調試
5.1硬件調試
5.2軟件調試
6.結論
附錄
系統整體原理圖
系統仿真圖
元件清單
系統源程序
基于單片機的頻率計
摘要:數字頻率計是一種基本的測量儀器。它被廣泛應用于航天、電子、測控等領域,還被應用在計算機及各種數學儀表中。一般采用的是十進制數字,顯示被測信號頻率。基本功能是測量正弦信號,方波信號以及其他各種單位時間內變壞的物理量。由于其使用十進制數顯示,測量迅速精確,顯示直觀,所以經常被用來使用。
本文主要介紹數字頻率計的設計和調試,本作品是基于STC89C52單片機作為平臺,基本原理是通過STC89C52單片機進行頻率的采集和分析工作,在通過程序使其顯示在LCD1602的液晶顯示屏上,通過液晶顯示屏,讓使用者能夠直觀的看到當前的輸入頻率是多少。
由于STC89C52單片機只能處理數字信號因此系統需要先把信號放大成方波信號,再通過施密特觸發器整形方波,又由于單片機能處理的頻率有限,所以這次我們先用74HC390芯片對輸入的信號進行了分頻,使其降低了100倍,才送去給單片機處理,如果頻率高于200KHZ的時候就計算分頻后的頻率,得到數據再換算成真實的頻率。

1 引言
1.1 目的和意義
在電子測量領域中,頻率測量的精確度是最高的。因此,在生產過程中許多物理量,例如溫度、壓力、流量、液位、PH值、振動、位移、速度、加速度,乃至各種氣體的百分比成分等均用傳感器轉換成信號頻率,然后用數字頻率計來測量,以提高精確度。
國際上數字頻率計的分類很多。按功能分類,因計數式頻率計的測量功能很多,用途很廣。所以根據儀器具有的功能,電子計數器有通用和專用之分。一、通用型計數器:通用型計數器是一種具有多種測量功能、多種用途的萬能計數器。它可測量頻率、周期、多周期平均值、時間間隔、累加計數、計時等;若配上相應插件,就可測相位、電壓、電流、功率、電阻等電量;配上適當的傳感器,還可進行長度、重量、壓力、溫度、速度等非電量的測量。二、專用計數器:專用計數器指專門用來測量某種單一功能的計數器。如頻率計數器,只能專門用來測量高頻和微波頻率;時間計數器,是以測量時間為基礎的計數器,其測時分辨力和準確度很高,可達ns數量級;特種計數器,它具有特種功能,如可逆計數器、閾值計數器、差值計數器、倒數計數器等,用于工業和自控技術等方面。數字頻率計按頻段分類:①低速計數器:最高計數頻率<10MHz;②中速計數器:最高計數頻率10—100MHz;③高速計數器:最高計數頻率>100MHz;④微波頻率計數器:測頻范圍1—80GHz或更高。
由于大規模和超大規模數字集成電路技術、數據通信技術與單片機技術的結合,數字頻率計發展進入了智能化和微型化的新階段。其功能進一步擴大,除了測量頻率、頻率比、周期、時間、相位、相位差等基本功能外,還具有自撿、自校、自診斷、數理統計、計算方均根值、數據存儲和數據通信等功能。可見,頻率計是很有工業價值的。本作品即為一個基于單片機的數字頻率計,它通74HC390芯片進行分頻,克服了單片機難以處理高頻信號的困難,并使用LCD1602液晶顯示進行顯示。
1.2 研究概況與發展趨勢
由于當今社會的需要,對信息傳輸和處理的要求不斷提高,對頻率的測量的精度也需要更高更準確的時頻基準和更精密的測量技術。而頻率測量所能達到的精度,主要取決于作為標準頻率源的精度以及所使用的測量設備和測量方法。目前,測量頻頻的方法有直接測頻法、內插法、游標法、頻差倍增法等等。直接測頻的方法較簡單,但精度不高。頻差倍增多法和周期法是一種頻差倍增法和差拍法相結合的測量方法,這種方法是將被測信號和參考信號經頻差倍增使被測信號
的相位起伏擴大,再通過混頻器獲得差拍信號,用電子計數器在低頻下進行多周期測量,能在較少的倍增次數和同樣的取樣時間情況下,得到比測頻法更高的系統分辨率和測量精度,但是仍然存在著時標不穩而引入的誤差和一定的觸發誤差。
在電子系統廣泛的應用領域中,到處看見處理離散信息的數字電路。供消費用的冰箱和電視、航空通訊系統、交通控制雷達系統、醫院急救系統等在設計過程中都用到數字技術。 數字頻率計是現代通信測量設備系統中必不可少的測量儀器,不但要求電路產生頻率的準確度和穩定度都高的信號,也要能方便的改變頻率。
數字頻率計的實現方法主要有:直接式、鎖相式、直接數字式和混合式
(1)直接式
優點:速度快、相位噪聲低,但結構復雜、雜散多,一般只應用在地面雷達中。
(2)鎖相式
優點:相位同步的自動控制,制作頻率高,功耗低,容易實現系列化、小型化、模塊化和工程化。
(3)直接數字式
優點:電路穩定、精度高、容易實現系列化、小型化、模塊化和工程化。
1.3 本系統主要功能
本系統設計制作一個基于單片機的頻率計。能實現以下幾種功能:
(1)能夠對1HZ對10MHZ正弦波、三角波、方波信號等周期信號的頻率進行測量
(2)系統能夠把測量信號的頻率和周期顯示在液晶屏幕上。

2. 總體方案論證與設計
              根據所要實現的功能劃分,系統一共需要以下幾個模塊:主控模塊、顯示模塊、時鐘模塊、溫度檢測模塊,以下就針對這幾個模塊的選型和論證進行討論。
2.1主控模塊的選型和論證
方案一:
              采用MSP430系列單片機,該單片機是TI公司1996年開始推向市場的一種16位超低功耗的混合信號處理器。其內部集成了很多模擬電路、數字電路和微處理器,提供強大的功能。不過該芯片昂貴不適合一般的設計開發。
方案二
              采用51系列的單片機,該單片機是一個高可靠性,超低價,無法解密,高性能的8位單片機,32個IO口,且STC系列的單片機可以在線編程、調試,方便地實現程序的下載與整機的調試。
因此選用方案二中的51系列單片機作為主控芯片。
2.2顯示模塊的選型和論證
方案一:
              采用點陣式數碼管顯示,點陣式數碼管是由八行八列的發光二極管組成,對于顯示文字比較合適,如采用在顯示數字顯得太浪費,且價格也相對較高,所以不用此種作為顯示。
方案二:
              采用LED數碼管動態掃描,LED數碼管價格雖適中,對于顯示數字也最合適,而且采用動態掃描法與單片機連接時,占用單片機口線少。但是由于數碼管動態掃描需要借助74LS164移位寄存器進行移位,該芯片在電路調試時往往有很多障礙,所以不采用LED數碼管作為顯示。
方案三:
              采用LCD液晶顯示屏,液晶顯示屏的顯示功能強大,可顯示大量文字,圖形,顯示多樣,清晰可見,對于本設計而言一個LCD1602的液晶屏即可,價格也還能接受,需要的借口線較多,但會給調試帶來諸多方便。
所以本設計中方案三中的LCD1602液顯示屏作為顯示模塊。
2.3放大電路的選型和論證
方案一:
              采用集成運放作為放大電路,該電路只需要在外部配置少量電阻電容則能完成放大功能,十分方便設計,但是本設計需要放大1HZ到10MHZ的信號,通頻帶比較寬,因此對集成運放的要求較高,一般能處理寬帶信號的集成運放成本比較高。
方案二:
              采用三極管或者場效應管作為放大電路,三極管放大電路所需要原件較為簡單容易購置,而且電路較為成熟,三極管的價格也十分低廉,而且三極管電路性能優越,是作為一個低成本的放大電路的不二之選。
              所以本設計中選用三極管為放大電路中使用。
2.4系統整體設計概述
本系統以單片機為控制核心,對系統進行初始化,主要完成液晶顯示、頻率測量、放大整形濾波等功能的控制,起到總控和協調各模塊之間工作的作用。
圖2-1系統結構框圖
本系統結構如圖2-1所示,本設計可分為以下模塊:三極管放大電路、整形電路、分頻電路、液晶模塊。下面對各個模塊的設計方案逐一進行論證分析。

3.系統硬件電路設計
3.1主控模塊
主控模塊模塊在整個系統中起著統籌的作用,需要檢測鍵盤,溫度傳感器等各種參數,同時驅動液晶顯示相關參數,在這里我們選用了51系列單片機中的STC89C52單片機作為系統的主控芯片。
51系列單片機最初是由Intel 公司開發設計的,但后來Intel 公司把51 核的設計方案賣給了幾家大的電子設計生產商,譬如 SST、Philip、Atmel 等大公司。因此市面上出現了各式各樣的均以51 為內核的單片機。這些各大電子生產商推出的單片機都兼容51 指令、并在51 的基礎上擴展一些功能而內部結構是與51一致的。
STC89C52有40個引腳,4個8位并行I/O口,1個全雙工異步串行口,同時內含5個中斷源,2個優先級,2個16位定時/計數器。STC89C52的存儲器系統由4K的程序存儲器(掩膜ROM),和128B的數據存儲器(RAM)組成。
STC89C52單片機的基本組成框圖見圖3-1。
圖3-1 STC89C52單片機結構圖
3.1.1 STC89C52單片機主要特性
1. 一個8 位的微處理器(CPU)。
2. 片內數據存儲器RAM(128B),用以存放可以讀/寫的數據,如運算的中間結果、最終結果以及欲顯示的數據等,SST89 系列單片機最多提供1K 的RAM。
3. 片內程序存儲器ROM(4KB),用以存放程序、一些原始數據和表格。但也有一些單片機內部不帶ROM/EPROM,如8031,8032,80C31 等。目前單片機的發展趨勢是將RAM 和ROM 都集成在單片機里面,這樣既方便了用戶進行設計又提高了系統的抗干擾性。SST 公司推出的89 系列單片機分別集成了16K、32K、64K Flash 存儲器,可供用戶根據需要選用。
4. 四個8 位并行I/O 接口P0~P3,每個口既可以用作輸入,也可以用作輸出。
5. 兩個定時器/計數器,每個定時器/計數器都可以設置成計數方式,用以對外部事件進行計數,也可以設置成定時方式,并可以根據計數或定時的結果實現計算機控制。為方便設計串行通信,目前的52 系列單片機都會提供3 個16 位定時器/計數器。
6. 五個中斷源的中斷控制系統。現在新推出的單片機都不只5 個中斷源,例如SST89E58RD 就有9 個中斷源。
7. 一個全雙工UART(通用異步接收發送器)的串行I/O 口,用于實現單片機之間或單機與微機之間的串行通信。
8. 片內振蕩器和時鐘產生電路,但石英晶體和微調電容需要外接。最高允許振蕩頻率為12MHz。SST89V58RD 最高允許振蕩頻率達40MHz,因而大大的提高了指令的執行速度。
圖3-2 STC89C52單片機管腳圖
部分引腳說明:
1.時鐘電路引腳XTAL1 和XTAL2:
XTAL2(18 腳):接外部晶體和微調電容的一端;片內它是振蕩電路反相放大器的輸出端,振蕩電路的頻率就是晶體固有頻率。若需采用外部時鐘電路時,該引腳輸入外部時鐘脈沖。
要檢查振蕩電路是否正常工作,可用示波器查看XTAL2 端是否有脈沖信號輸出。
XTAL1(19 腳):接外部晶體和微調電容的另一端;在片內它是振蕩電路反相放大器的輸入端。在采用外部時鐘時,該引腳必須接地。
2.控制信號引腳RST,ALE,PSEN 和EA:
RST/VPD(9 腳):RST 是復位信號輸入端,高電平有效。當此輸入端保持備用電源的輸入端。當主電源Vcc 發生故障,降低到低電平規定值時,將+5V 電源自動兩個機器周期(24個時鐘振蕩周期)的高電平時,就可以完成復位操作。RST 引腳的第二功能是VPD,即接入RST 端,為RAM 提供備用電源,以保證存儲在RAM 中的信息不丟失,從而合復位后能繼續正常運行。
ALE/PROG(30 腳):地址鎖存允許信號端。當8051 上電正常工作后,ALE 引腳不斷向外輸出正脈沖信號,此頻率為振蕩器頻率fOSC 的1/6。CPU 訪問片外存儲器時,ALE 輸出信號作為鎖存低8 位地址的控制信號。
平時不訪問片外存儲器時,ALE 端也以振蕩頻率的1/6 固定輸出正脈沖,因而ALE 信號可以用作對外輸出時鐘或定時信號。如果想確定8051/8031 芯片的好壞,可用示波器查看ALE端是否有脈沖信號輸出。如有脈沖信號輸出,則8051/8031 基本上是好的。
ALE 端的負載驅動能力為8 個LS 型TTL(低功耗甚高速TTL)負載。
此引腳的第二功能PROG 在對片內帶有4KB EPROM 的8751 編程寫入(固化程序)時,作為編程脈沖輸入端。
PSEN(29 腳):程序存儲允許輸出信號端。在訪問片外程序存儲器時,此端定時輸出負脈沖作為讀片外存儲器的選通信號。此引肢接EPROM 的OE 端(見后面幾章任何一個小系統硬件圖)。PSEN 端有效,即允許讀出EPROM/ROM 中的指令碼。PSEN 端同樣可驅動8 個LS 型TTL 負載。要檢查一個8051/8031 小系統上電后CPU 能否正常到EPROM/ROM 中讀取指令碼,也可用示波器看PSEN 端有無脈沖輸出。如有則說明基本上工作正常。
EA/Vpp(31 腳):外部程序存儲器地址允許輸入端/固化編程電壓輸入端。當EA 引腳接高電平時,CPU只訪問片內EPROM/ROM并執行內部程序存儲器中的指令,但當PC(程序計數器)的值超過0FFFH(對8751/8051 為4K)時,將自動轉去執行片外程序存儲器內的程序。輸入信號EA 引腳接低電平(接地)時,CPU 只訪問外部EPROM/ROM 并執行外部程序存儲器中的指令,而不管是否有片內程序存儲器。對于無片內ROM 的8031 或8032,需外擴EPROM,此時必須將EA 引腳接地。此引腳的第二功能是Vpp 是對8751 片內EPROM固化編程時,作為施加較高編程電壓(一般12V~21V)的輸入端。
3.輸入/輸出端口P0/P1/P2/P3:
P0口(P0.0~P0.7,39~32 腳):P0口是一個漏極開路的8 位準雙向I/O口。作為漏極開路的輸出端口,每位能驅動8 個LS 型TTL 負載。當P0 口作為輸入口使用時,應先向口鎖存器(地址80H)寫入全1,此時P0 口的全部引腳浮空,可作為高阻抗輸入。作輸入口使用時要先寫1,這就是準雙向口的含義。在CPU 訪問片外存儲器時,P0口分時提供低8 位地址和8 位數據的復用總線。在此期間,P0口內部上拉電阻有效。
P1口(P1.0~P1.7,1~8 腳):P1口是一個帶內部上拉電阻的8 位準雙向I/O口。P1口每位能驅動4 個LS 型TTL 負載。在P1口作為輸入口使用時,應先向P1口鎖存地址(90H)寫入全1,此時P1口引腳由內部上拉電阻拉成高電平。
P2口(P2.0~P2.7,21~28 腳):P2口是一個帶內部上拉電阻的8 位準雙向I/O口。P口每位能驅動4個LS 型TTL 負載。在訪問片外EPROM/RAM 時,它輸出高8 位地址。
P3口(P3.0~P3.7,10~17 腳):P3口是一個帶內部上拉電阻的8 位準雙向I/O口。P3口每位能驅動4個LS型TTL負載。P3口與其它I/O 端口有很大的區別,它的每個引腳都有第二功能,如下:
P3.0:(RXD)串行數據接收。
P3.1:(RXD)串行數據發送。
P3.2:(INT0#)外部中斷0輸入。
P3.3:(INT1#)外部中斷1輸入。
P3.4:(T0)定時/計數器0的外部計數輸入。
P3.5:(T1)定時/計數器1的外部計數輸入。
P3.6:(WR#)外部數據存儲器寫選通。
P3.7:(RD#)外部數據存儲器讀選通。
3.1.2 STC89C52單片機的中斷系統
STC89C52系列單片機的中斷系統有5個中斷源,2個優先級,可以實現二級中斷服務嵌套。由片內特殊功能寄存器中的中斷允許寄存器IE控制CPU是否響應中斷請求;由中斷優先級寄存器IP安排各中斷源的優先級;同一優先級內各中斷同時提出中斷請求時,由內部的查詢邏輯確定其響應次序。
在單片機應用系統中,常常會有定時控制需求,如定時輸出、定時檢測、定時掃描等;也經常要對外部事件進行計數。STC89C52單片機內集成有兩個可編程的定時/計數器:T0和T1,它們既可以工作于定時模式,也可以工作于外部事件計數模式,此外,T1還可以作為串行口的波特率發生器。
3.1.3 單片機最小系統設計
圖3-3 單片機最小系統電路圖
              圖3-3為單片機最小系統電路圖,單片機最小系統有單片機、時鐘電路、復位電路組成,時鐘電路選用了12MHZ的晶振提供時鐘,作用為給單片機提供一個時間基準,其中執行一條基本指令需要的時間為一個機器周期,單片機的復位電路,按下復位按鍵之后可以使單片機進入剛上電的起始狀態。圖中10K排阻為P0口的上拉電阻,由于P0口跟其他IO結構不一樣為漏極開路的結構,因此要加上拉電阻才能正常使用。
3.2 LCD液晶顯示器簡介
由于本設計中要求顯示界面顯示一些參數,因此這里選用了LCD1602作為界面顯示,可以把一些相關的參數進行顯示。
3.2.1 液晶原理介紹
液晶顯示器(LCD)英文全稱為Liquid Crystal Display,它一種是采用了液晶控制透光度技術來實現色彩的顯示器。和CRT顯示器相比,LCD的優點是很明顯的。由于通過控制是否透光來控制亮和暗,當色彩不變時,液晶也保持不變,這樣就無須考慮刷新率的問題。
顯示接口用來顯示系統的狀態,命令或采集的電壓數據。本系統顯示部分用的是LCD液晶模塊,采用一個16×2的字符型液晶顯示模塊。
點陣圖形式液晶由 M 行×N 列個顯示單元組成,假設 LCD 顯示屏有64行,每行有 128列,每 8列對應 1 個字節的 8 個位,即每行由 16 字節,共 16×8=128個點組成,屏上 64×16 個顯示單元和顯示 RAM 區 1024 個字節相對應,每一字節的內容和屏上相應位置的亮暗對應。一個字符由 6×8 或 8×8點陣組成,即要找到和屏上某幾個位置對應的顯示 RAM區的 8 個字節,并且要使每個字節的不同的位為‘1’,其它的為‘0’,為‘1’的點亮,為‘0’的點暗,這樣一來就組成某個字符。但對于內帶字符發生器的控制器來說,顯示字符就比較簡單了,可讓控制器工作在文本方式,根據在LCD 上開始顯示的行列號及每行的列數找出顯示 RAM對應的地址,設立光標,在此送上該字符對應的代碼即可。
3.2.2液晶模塊簡介
LCD1602液晶模塊采用HD44780控制器,hd44780具有簡單而功能較強的指令集,可以實現字符移動,閃爍等功能,LM016L與單片機MCU通訊可采用8位或4位并行傳輸兩種方式,hd44780控制器由兩個8位寄存器,指令寄存器(IR)和數據寄存器(DR)忙標志(BF),顯示數RAM(DDRAM),字符發生器ROMA(CGOROM)字符發生器RAM(CGRAM),地址計數器RAM(AC)。IR用于寄存指令碼,只能寫入不能讀出,DR用于寄存數據,數據由內部操作自動寫入DDRAM和CGRAM,或者暫存從DDRAM和CGRAM讀出的數據,BF為1時,液晶模塊處于內部模式,不響應外部操作指令和接受數據,DDTAM用來存儲顯示的字符,能存儲80個字符碼,CGROM由8位字符碼生成5*7點陣字符160中和5*10點陣字符32種.8位字符編碼和字符的對應關系, CGRAM是為用戶編寫特殊字符留用的,它的容量僅64字節,可以自定義8個5*7點陣字符或者4個5*10點陣字符,AC可以存儲DDRAM和CGRAM的地址,如果地址碼隨指令寫入IR,則IR自動把地址碼裝入AC,同時選擇DDRAM或CGRAM,LCD1602液晶模塊的引腳圖如圖3-4所示。
圖3-4 LCD1602引腳圖
液晶寄存器選擇控制如表3-1。
表3-1寄存器選擇控制
RS
R/W
操作說明
0
0
寫入指令寄存器(清除屏等)
0
1
讀busy flag(DB7),以及讀取位址計數器(DB0~DB6)值
1
0
寫入數據寄存器(顯示各字型等)
1
1
從數據寄存器讀取數據
3.2.3液晶顯示部分與STC89C52的接口
如圖3-5所示。用STC89C52的P0口作為數據線,用P1.2、P1.1、P1.0分別作為LCD的EN、R/W、RS。其中EN是下降沿觸發的片選信號,R/W是讀寫信號,RS是寄存器選擇信號本模塊設計要點如下:顯示模塊初始化:首先清屏,再設置接口數據位為8位,顯示行數為1行,字型為5×7點陣,然后設置為整體顯示,取消光標和字體閃爍,最后設置為正向增量方式且不移位。向LCD的顯示緩沖區中送字符,程序中采用2個字符數組,一個顯示字符,另一個顯示電壓數據,要顯示的字符或數據被送到相應的數組中,完成后再統一顯示.首先取一個要顯示的字符或數據送到LCD的顯示緩沖區,程序延時2.5ms,判斷是否夠顯示的個數,不夠則地址加一取下一個要顯示的字符或數據。
圖3-5 LCD1602與STC89C52的接口
3.3三極管放大電路設計
圖3-6 三極管放大電路
              由于單片機只能讀取數字信號,當輸入的信號比較小的時候單片機不能直接讀取,因此這里使用了一級三極管放大電路對輸入的信號進行放大,其中電路中的R4和R5給三極管的基極提供和合適偏置。基極電壓可以由以下公式求得。
              由于三極管的基極和發射極之間的壓降為0.65V,因此發射機的電壓可以由以下公式求得:
              由于IC≈IE,IE=Ve/R6≈0.88ma,因此Vc=VCC-Ie*R3=2.64V。因此三極管放大電路的集電極輸出端的直流靜態工作點為2.64V。
              因為本設計只處理信號,因此三極管放大電路的輸入端采用的大電容進行交流耦合進而隔絕交流成分,為了使整個頻率計能測量更小幅值的周期信號,這個電路用旁路電容對發射極電阻進行旁路從而提高其交流放大倍數,放大倍數A可以由以下公式求得。
A≈R3/(R6//RC4//RC5)
              其中RC4為C4交流等效阻抗,RC5為C4交流等效阻抗。但是放大倍數最終會受限于三極管的β(三極管的電流放大系數)。因此最終放大倍數會限制在數百倍,由于這里只需要把輸入的周期信號放大到足夠大就可以通過整形電路整形成方波,因此這里放大倍數不需要很精確,放大后的波形出現截止失真也不會對測量結果造成。
3.4整形模塊設計
3.4.1施密特觸發器芯片介紹
施密特觸發器也有兩個穩定狀態,但與一般觸發器不同的是,施密特觸發器采用電位觸發方式,其狀態由輸入信號電位維持;對于負向遞減和正向遞增兩種不同變化方向的輸入信號,施密特觸發器有不同的閾值電壓。
門電路有一個閾值電壓,當輸入電壓從低電平上升到閾值電壓或從高電平下降到閾值電壓時電路的狀態將發生變化。施密特觸發器是一種特殊的門電路,與普通的門電路不同,施密特觸發器有兩個閾值電壓,分別稱為正向閾值電壓和負向閾值電壓。在輸入信號從低電平上升到高電平的過程中使電路狀態發生變化的輸入電壓稱為正向閾值電壓,在輸入信號從高電平下降到低電平的過程中使電路狀態發生變化的輸入電壓稱為負向閾值電壓。正向閾值電壓與負向閾值電壓之差稱為回差電壓。原理示意圖如圖3-7所示。
圖3-7 施密特觸發器原理示意圖
74HC14是一款高速CMOS器件,74HC14引腳兼容低功耗肖特基TTL(LSTTL)系列。74HC14遵循JEDEC標準no.7A。74HC14實現了6路施密特觸發反相器,可將緩慢變化的輸入信號轉換成清晰、無抖動的輸出信號。其芯片引腳圖如圖3-8所示,芯片真值表如圖3-9所示。
圖3-8 74HC14芯片引腳圖
Input輸入
output輸出
A
Y
L
H
H
L

圖3-9 74HC14真值表
3.4.2 74HC14電路設計
              由于三極管放大電路輸出的信號不是標準的方波信號,存在著上升沿不夠陡峭,波形類似于正弦波等問題,為了使單片機對信號更好的采集,這里使用了施密特觸發器74HC14對三極管放大電路輸出的信號進行整形。電路圖如圖3-10所示。
圖3-10施密特觸發器電路原理圖
              其中輸入信號從芯片的1號腳輸入,74HC14本身是一個芯片內部帶有6個施密特觸發器,我這里為了充分利用芯片使用了其中三個,實際上可以只使用一個。整形后的信號從芯片的6號腳輸出。
3.5分頻模塊設計
3.5.1 74HC390芯片介紹
分頻電路一般采用十進制計數器如74HC290、74HC390等來實現時間計數單元的計數功能。本次設計中選擇74HC390。由其內部邏輯框圖(如圖3)可知,其為雙2-5-10異步計數器,并每一計數器均有一個異步清零端(高電平有效)。由于我們要設計的是100分頻電路,因此74HC390內部兩個計數器都用上,分別都設置成10計數器。
圖3-11 74HC390內部邏輯框圖
3.5.2 74HC390分頻電路設計
由于單片機運行速度有限,單片機運行一條基礎指令需要1個機器周期即12個是時鐘周期,換算成時間為1us。因此當頻率過高的時候單片機就不能很精確的換算出頻率。為了解決這個問題,這設計加入了一個100分頻的計數器。當頻率高于200KHZ的時候單片機計算分頻后的信號,當頻率低于200KHZ的時候計算分頻前的信號。這樣高低搭配可以擴大單片機的測量頻率。最終換算出其真實對應的頻率并在液晶上顯示。其中電路圖如圖3-12所示。
圖3-12 74HC390分頻電路原理圖

4.系統軟件設計
4.1系統軟件總體設計
4-1系統主流程圖
              單片機上電后會先進行一個初始化把設置的變量的值清0,然后開啟定時器首先對100分頻后的輸入信號進行1S內計數,當測量到頻率大于200KHZ的時候,單片機會顯示出當前測量的頻率和周期,然后進行下一次計數,當測量到的頻率少于200KHZ的時候,單片機會重新采集分頻前的數據,把測量到的數據顯示出來,然后再進入到下一次的計數。
圖4-2 LCD1602初始化子函數流程圖
首先先調用液晶自定義的字庫,設置好DDRAM地址后在第一行顯示,根據程序中的數據設置顯示數據的首地址并設置循環量,在循環過程中不斷的取字符代碼直到終止,第二行的顯示過程同一行的顯示過程一樣,兩行顯示完畢后便結束子程序。
4.2程序設計原理            
軟件任務分析和硬件電路設計結合進行,哪些功能由硬件完成,哪些任務由軟件完成,在硬件電路設計基本定型后,也就基本上決定下來了。
軟件任務分析環節是為軟件設計做一個總體規劃。從軟件的功能來看可分為兩大類:一類是執行軟件,它能完成各種實質性的功能,如測量,計算,顯示,打印,輸出控制和通信等,另一類是監控軟件,它是專門用來協調各執行模塊和操作者的關系,在系統軟件中充當組織調度角色的軟件。這兩類軟件的設計方法各有特色,執行軟件的設計偏重算法效率,與硬件關系密切,千變萬化。
軟件任務分析時,應將各執行模塊一一列出,并為每一個執行模塊進行功能定義和接口定義(輸入輸出定義)。在各執行模塊進行定義時,將要牽扯到的數據結構和數據類型問題也一并規劃好。
各執行模塊規劃好后,就可以監控程序了。首先根據系統功能和鍵盤設置選擇一種最適合的監控程序結構。相對來講,執行模塊任務明確單純,比較容易編程,而監控程序較易出問題。這如同當一名操作工人比較容易,而當一個廠長就比較難了。
軟件任務分析的另一個內容是如何安排監控軟件和各執行模塊。整個系統軟件可分為后臺程序(背景程序)和前臺程序。后臺程序指主程序及其調用的子程序,這類程序對實時性要求不是太高,延誤幾十ms甚至幾百ms也沒關系,故通常將監控程序(鍵盤解釋程序),顯示程序和打印程序等與操作者打交道的程序放在后臺程序中執行;而前臺程序安排一些實時性要求較高的內容,如定時系統和外部中斷(如掉電中斷)。也可以將全部程序均安排在前臺,后臺程序為“使系統進入睡眠狀態”,以利于系統節電和抗干擾。

5.系統調試
5.1硬件調試
頻率計的電路較為復雜,涉及的模塊比較多,其中包含三極管放大模塊,整形模塊,單片機最小系統模塊,液晶模塊和分頻模塊,因此對于焊接方面更是不可輕視,龐大的電路系統中只要出于一處的錯誤,則會對檢測造成很大的不便,而且電路的交線較多,對于各種鋒利的引腳要注意處理,否則會刺破帶有包皮的導線,則會對電路造成短路現象。
在制作硬件電路之前,我們先根據實際需要的功能劃分硬件模塊,并且在PROTEL里面畫出其硬件原理圖和PCB圖,檢查無誤后開始在萬用板上焊接。
在本頻率計的硬件調試中遇到了很多的問題。回想這些問題只要認真多思考都是可以避免的,以下為主要的問題:
問題1:一開始三極管放大電路總是不能放大交流信號,輸出總是一個直流電壓
解決:經過查找相關資料,發現三極管的1腳和3腳焊接反了剛好轉了180度,改正后便可正常工作。
問題2:開始的時候液晶屏幕總是顯示方格,不能正常顯示內容
              解決: 經過查找芯片手冊,知道LCD1602有一個管腳是專門負責調解對比度的,一開始的時候直接接高電平因此不能正常顯示,后來因引腳連接到一個電位計的中間抽頭,通過電位器就可以改變液晶的對比度。
5.2軟件調試
頻率計系統是一個比較復雜的數字型系統,所以對于它的程序也較為復雜,所以在編寫程序和調試時出現了相對較多的問題。首先為了更好的測試效果,我最開始是直接在PROTUES軟件下進行仿真,在確定無誤后,再把程序燒錄到實物中運行。最后經過多次的模塊子程序的修改,一步一步的完成,最終解決了軟件上的各種問題。在軟件的調試過程中主要遇到的問題如下:
問題:燒入程序后,LCD液晶顯示閃動,而且亮度不均勻。
解決:首先對調用的延時進行逐漸修改,可以解決顯示閃動問題。其次,由于本作品使作動態掃描方式顯示的數字,動態掃描很快,人的肉眼是無法看出,但是調用的顯示程序時,如果不在反回時屏蔽掉最后的附值,則會出現很亮的現象,所以在顯示的后面加了屏蔽子令,最后解決了此問題。


6.結論
通過這次畢業設計,我學到了不少課本上沒有的知識,也鍛煉了自己的動手能力,將以前學過的零散的知識串到一起。經過我長時間的設計及調試,本系統基本能實現頻率計系統的所有功能。不足之處有:1.硬件的穩定性有待進一步提高2.系統界面人性化還不足。
我的綜合設計主要涉及硬件和軟件兩方面的內容,通過這些我的硬件和軟件開發能力都獲得了提高。首先硬件方面,基本了解了電子產品的開發流程和所要做的工作。基本掌握了Protel99SE原理圖的方法,并設計了一個單片機最小系統。通過開發板的設計和硬件搭建的過程,使我對51系單片機的接口有了更深層次的理解,熟悉了一些單片機常用的外圍電路引腳和連接方法,如LCD液晶等。并且我學會了分析問題解決問題的能力,加深了對所學理論知識的理解和運用。我的動手能力得到了很大的提高,創新意識得到了鍛煉。
參考文獻
[1] 彭偉.單片機C語言程序設計實訓100例.電子工業出版社.2009年
[2] 吳運昌.模擬電子線路基礎.廣州:華南理工大學出版社,2004年
[3] 閻石.數字電子技術基礎.北京:高等教育出版社,1997年
[4] 張曉麗等.數據結構與算法.北京:機械工業出版社,2002年
[5] 馬忠梅等. ARM&Linux嵌入式系統教程.北京:北京航空航天大學出版社,2004年
[6] 李建忠.單片機原理及應用.西安:西安電子科技大學,2002年
[7] 韓志軍等.單片機應用系統設計[M].機械工業出版社,2004
[8] 周潤景等. Proteus在MCS-51&ARM7系統中的應用百例[M].電子工業出版社,2006
[9] 馬忠梅等.單片機的C語言應用程序設計[M].北京航空航天大學出版社,2006
[10]劉樹中,孫書膺,王春平.單片機和液晶顯示驅動器串行接口的實現[J].微計算機信息,2007
1



附錄
系統整體原理圖
系統仿真圖

元件清單
名字
數量
STC89C52
1
30PF電容
2
10K電阻
1
1K電阻
1
0.1uf電容
3
10K排阻
1
DIP40插座
1
DIP14插座
1
DIP16插座
1
排針
1排
9018三極管
1
300歐姆電阻
1
68歐姆電阻
1
3K電阻
1
74HC14
1
輕觸按鍵
1
12M晶振
1
USB供電座子
1
1000UF電容
1
銅柱及螺帽
4
板子
1
LCD1602
1
74hc390
1
10K電位器
1




單片機源程序如下:
  1. //******************************************************************************************
  2. //連接框圖:       ___________________
  3. //                |              P1.0 |->RS
  4. //                |              P1.1 |->RW
  5. //                |              P1.2 |->E
  6. //                |              P0   |->DB
  7. //                |                        P3.4 |->1~9999hz的輸入
  8. //                |              P3.5 |->1~9999KHZ輸入 (分頻后)
  9. //******************************************************************************************
  10. #include <reg52.h>
  11. unsigned long int fre;
  12. unsigned char time;
  13. unsigned int count;
  14. unsigned int count1;

  15. //端口及函數說明----------------------------------------------------------------------------

  16. sbit   LCD_RS=P1^0;                //片選信號
  17. sbit   LCD_RW=P1^1;                //讀寫信號
  18. sbit   LCD_E=P1^2;                 //使能信號

  19. #define LCD_DB     P0              //數據信號
  20. unsigned char character[10]={0};//在屏幕上顯示的字符串
  21. unsigned char character_1[]={"fre= Hz"};
  22. unsigned char FLAG = 0;

  23. void LCD_init(void);//初始化函數  
  24. void LCD_write_command(unsigned char command);//寫指令函數            
  25. void LCD_write_data(unsigned char dat);//寫數據函數               
  26. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
  27. void delay_n40us(unsigned int n);//延時函數

  28. void timer_init();            //中斷初始化函數


  29. //-------------------------------------------------------------------------------

  30. void delay_n40us(unsigned int n)                              //延時函數
  31. {
  32.               unsigned int i;
  33.               unsigned char j;           
  34.               for(i=n;i>0;i--)
  35.               for(j=0;j<2;j++);         
  36. }

  37. void delay_1s()
  38. {
  39.               unsigned int i,j;
  40.               for(i = 0;i<100;i++)
  41.                             for(j = 0;j<1000;j++);
  42. }                                    

  43. void LCD_init(void)              //液晶初始化函數
  44. {
  45.               LCD_write_command(0x38);//設置8位格式,2行,5x7
  46.               LCD_write_command(0x38);//設置8位格式,2行,5x7
  47.               LCD_write_command(0x38);//設置8位格式,2行,5x7              切記要寫三遍!!!!
  48.               LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  49.               LCD_write_command(0x06);//設定輸入方式,增量不移位
  50.               LCD_write_command(0x01);//清除屏幕顯示               
  51.               delay_n40us(100);//清屏延時
  52. }

  53. void LCD_write_command(unsigned char dat)  //寫命令函數
  54. {
  55.               LCD_DB=dat;
  56.               LCD_RS=0;//指令            
  57.               LCD_RW=0;//寫入            
  58.               LCD_E=1; //使能              
  59.               LCD_E=0;
  60.               delay_n40us(1);//寫命令延時  
  61. }            

  62. void LCD_write_data(unsigned char dat)                //寫數據函數
  63. {
  64.               LCD_DB=dat;
  65.               LCD_RS=1;//數據               
  66.               LCD_RW=0;//寫入               
  67.               LCD_E=1;//使能
  68.               LCD_E=0;
  69.               delay_n40us(1);              //寫數據延時
  70. }

  71. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個字符
  72. {
  73.               unsigned char address;
  74.               if(y==1)
  75.                        address=0x80+x;              //顯示在第一排的時候的x的地址
  76.               else
  77.                        address=0xc0+x;              //顯示在第二排的時候的x的地址
  78.               LCD_write_command(address);              //輸入地址
  79.               LCD_write_data(dat);                            //輸入數據
  80. }
  81. void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個數字
  82. {
  83.               unsigned char address;
  84.               if(y==1)
  85.                        address=0x80+x;              //顯示在第一排的時候的x的地址
  86.               else
  87.                        address=0xc0+x;              //顯示在第二排的時候的x的地址
  88.               LCD_write_command(address);              //輸入地址
  89.               LCD_write_data(dat+48);                            //輸入數據
  90. }

  91. void dis_num(void)
  92. {
  93.               unsigned char i=0,j=0,k=0;
  94.               LCD_write_command(0x01);//清除屏幕顯示
  95.             
  96.               character[0] = fre/1000000;
  97.               character[1] = fre/100000%10;
  98.               character[2] = fre/10000%10;
  99.               character[3] = fre/1000%10;
  100.               character[4] = fre/100%10;
  101.               character[5] = fre/10%10;
  102.               character[6] = fre%10;
  103.     character[7] = 'H';
  104.               character[8] = 'z';
  105.             
  106.               for(i = 0;i<4;i++)                            //顯示fre
  107.               {
  108.                             LCD_disp_char(i+0,1,character_1[i]);
  109.               }
  110.               for(i = 0;i<10;i++)              //判斷第一個不為0的數
  111.               {
  112.                             if(character[i]!=0)
  113.                                           break;
  114.               }
  115.               k = 10-i-2;
  116.               for(j = 0;j<k;j++)              //顯示所有的數字
  117.               {
  118.                                           LCD_disp_num(4+j,1,character[i++]);            
  119.               }
  120.             
  121.     for(i = 5;i<7;i++)              //顯示Hz
  122.               {
  123.                             LCD_disp_char(j+4,1,character_1[i]);
  124.                             j++;
  125.               }
  126. }



  127. void main()
  128. {
  129.               unsigned char i;
  130.               LCD_init();
  131.               timer_init();             //定時/計數器初始化

  132.               for(i = 0;i<4;i++)
  133.               {
  134.                             LCD_disp_char(i+0,1,character_1[i]);
  135.               }
  136.               while(1)
  137.               {
  138.                             dis_num();         //顯示
  139.                             delay_1s();
  140.                                          
  141.               }                                                                                   
  142. }

  143. void timer_init(void)         //定時/計數器初始化
  144. {
  145.               TMOD=0x66;                //計數器0工作工作方式2,自動重裝初值
  146.               TH0=0;                    //計數器初值為0
  147.               TL0=0;
  148.               TR0=1;                    //計數器開始計數                 
  149.               ET0=1;                    //打開計數器0中斷  

  150.               TH1=0;                    //計數器初值為0
  151.               TL1=0;
  152.               TR1=1;                    //計數器開始計數                 
  153.               ET1=1;                    //打開計數器0中斷  

  154.               RCAP2H=(65536-62500)/256; //在程序初始化的時候給RCAP2L和RCAP2H賦值,
  155.               RCAP2L=(65536-62500)%256; //TH2和TL2將會在中斷產生時自動使TH2=RCAP2H,TL2=RCAP2L。
  156.               TH2=RCAP2H;               //12M晶振下每次中斷62.5ms
  157.               TL2=RCAP2L;
  158.               ET2=1;                    //打開定時器2中斷            
  159.               TR2=1;                    //定時器2開始計時
  160.               EA=1;                     //開總中斷  
  161. }
  162. //----------------------------------------------------------------
  163. void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
  164. {
  165.               double temp;
  166.               time++;
  167.               TF2=0;                    //定時器2的中斷標志位TF2不能夠由硬件清零,所以要在中斷服務程序中將其清零
  168.               if (time==16)             //定時1s時間到
  169.               {
  170.                  time=0;                //計時清0                           
  171. ……………………

  172. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整的Word格式文檔51黑下載地址:
頻率計.docx (538.27 KB, 下載次數: 40)


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品在线观看网站 | 91精品国产乱码久久蜜臀 | 一区二区三区国产好的精 | 久久婷婷av| 精品国产免费一区二区三区五区 | 99免费在线观看视频 | 电影91久久久 | 亚洲精品久久视频 | 成人影音| 最新国产精品视频 | 国产 欧美 日韩 一区 | 天天躁日日躁xxxxaaaa | 中文亚洲字幕 | 五月激情婷婷六月 | 日韩在线观看一区 | 国产精品成人免费 | 欧美日韩国产精品激情在线播放 | av中文字幕在线 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 99久久婷婷国产综合精品电影 | 欧美日韩在线高清 | 91精品在线看 | 99re在线视频 | 看一级毛片视频 | 欧美成人精品一区二区男人看 | 一区二区三区欧美在线 | 99精品国产一区二区三区 | 久久综合九九 | 成人综合在线视频 | 一级毛片大全免费播放 | 国产综合第一页 | 国产人成在线观看 | 日韩欧美国产一区二区三区 | 成年人在线 | 中文字幕在线观看 | 日本不卡一区二区三区在线观看 | 午夜大片| 成人激情免费视频 | 求毛片 | 亚洲一区二区三区四区在线观看 | 国产亚洲一区二区三区 |