工程科技基于51單片機和CPLD試驗開發(fā)板的設計_第1頁
工程科技基于51單片機和CPLD試驗開發(fā)板的設計_第2頁
工程科技基于51單片機和CPLD試驗開發(fā)板的設計_第3頁
工程科技基于51單片機和CPLD試驗開發(fā)板的設計_第4頁
工程科技基于51單片機和CPLD試驗開發(fā)板的設計_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、基于51單片機和CPLD試驗開發(fā)板的設計摘要闡述了設計的各部分硬件的原理和用于試驗的軟件設計,特別給出了RTC的設計在實驗板設計中的成功應用。單片機CPLD實驗板將單片機與CPLD 有機結合在一起,構建以51單片機為主,CPLD 為輔的電路系統(tǒng)設計方案,既可以獨立用于單片機實驗或CPLD實驗,也可以用于單片機和CPLD綜合應用的實驗。尤其,集成了具有ISP功能的CPLD和ISP功能的單片機,為初學者節(jié)約了昂貴的編程器成本。關鍵詞:51單片機 CPLD ISP 編程器 實驗板ABSTRACT In this paper,it was elaborated that the various par

2、ts of the design principles of hardware and software for test design, especially given the design of the RTC board in the successful application of design. The experiment of MCU and CPLD will be combined with the MCU-CPLD board,which mainly to build 51 single-chip, CPLD secondary circuit ystem desig

3、n, and both independent experiments or CPLD for the single-chip experiments can also be MCU and CPLD for the comprehensive application of the experiment. In particular, the integrated function of the CPLD and MCU with ISP for beginners saves the cost of expensive programmers.Key words: 51MCU CPLD IS

4、P programmer experiment board 目錄引言31 MiniB的目的及意義32 MiniB的硬件設計4 2.1單片機與 CPLD 接口電路4 2.2 USB及串行接口電路 6 2.3最小系統(tǒng)及外圍設備接口電路8 2.3.1電源電路8 2.3.2 單片機 P1 口擴展電路8 2.3.3顯示接口電路123 MiniB的軟件設計123.1由AVR單片機ATmega8實現(xiàn)USB轉串口的驅動設計和ISP(in-system-programming)的使用123.2RTC 設計實例(DS1302+LCD1602+復雜按鍵輸入+多模式蜂鳴器發(fā)聲+多任務輪循架構)13 3.2.1 任務解

5、析及人性化設計要求133.2.2 多任務程序架構14 3.2.3任務調度17 3.2.4任務設計184 調試26致謝27參考文獻28引言 單片機以其控制功能強體積小價格低耗電省可靠性高等特點,嵌入式應用很廣1。而單片機學習門檻較高,涉及單片機軟硬件知識,同時還要掌握幾種軟硬件工具平臺,初學者要想快速入門單片機領域,往往需要一個好的硬件平臺和大量易懂的實例。隨著電子技術的不斷發(fā)展,大規(guī)模集成電路的運用越來越普遍,用CPLD/FPGA 來開發(fā)新產(chǎn)品是電子技術發(fā)展必然趨勢。目前各高校逐步開設了單片機課程和可編程器件設計課程,而兩門課程往往是獨立開設,尤其是實驗,而實驗是檢驗理論正確與否的試金石,是學

6、好兩門課程的重要手段和方法。從而,切實滿足初學者需要的實驗板的開發(fā)成為了現(xiàn)實,而目前市場上針對初學者而開發(fā)的綜合實驗板價格高,體積大,操作煩瑣,不易學習掌握。1 MiniB的目的及意義現(xiàn)在市場上關于單片機和 CPLD的試驗開發(fā)板很多,總體上來說設計不專業(yè), 成本價格高,功能的單一,不能用于單片機和CPLD的 綜合應用試驗,操作復雜利用率不高,但對于在校學生和電子愛好者這些消費者來說需求還很大。1.1目的為單片機和CPLD初學者提供一款經(jīng)濟實用型實驗板,解決單片機和CPLD獨立學習的問題,設計過程中個人知識能力的提升,以消費者的切實需要為原則,市場的需求明顯。1.2意義 此款單片機加CPLD實驗

7、板是總結單片機和CPLD學習的經(jīng)驗,站在初學者的角度上而開發(fā),將單片機與CPLD 有機結合在一起,構建以單片機為主,CPLD 為輔的電路系統(tǒng)設計方案,既可以獨立用于單片機實驗或CPLD實驗,也可以用于單片機和CPLD綜合應用的實驗,打造出袖珍單片機CPLD學習板。尤其,集成了具有ISP功能的CPLD和ISP功能的單片機,為初學者節(jié)約了昂貴的編程器成本。2 MiniB的硬件設計系統(tǒng)結構如圖2所示,該板采用單片機+CPLD 結構,單片機為主,CPLD 為輔。與單片機相連的模塊 有:P1 口接發(fā)光二極管、蜂鳴器、繼電器、AD/DA,P4 口(STC 單片機 PLCC-44 封裝特有)接實時時鐘 DS

8、1302、紅外接收器,P3 口接 232 電平轉換電路和 4 個按鍵,單片機 P0 口和 P2 口以及 P3.6、P3.7 作為 總線使用,CPLD 直接驅動 4 位數(shù)碼管,并給 LCD 提供使能信號,單片機和 CPLD 引腳分別有擴展接口, 板上集成 5V 穩(wěn)壓電源,可以外接 DC9V 電源,也可以從計算機 USB 口直接取 5V 電源,JTAG接口完全符合IEEE1149.1標準,提供完全的邊界掃描功能2。圖2 系統(tǒng)結構圖2.1 單片機與 CPLD 接口電路 現(xiàn)在所有單片機廠家都有支持 ISP 的單片機,由于 STC 公司推出的 STC 系列單片機具有較強的功能和較高的性價比,本設計采用

9、STC89C516RD+單片機作為系統(tǒng)的核心。單片機選 STC89C5X,該系列單片機內(nèi)部集成 MAX810/STC810 專用復位電路,內(nèi)置看門狗,超強抗 干擾,輕松過 2KV/4KV 快速脈沖干擾(EFT),加密性強,STC89C52RCSTC89C58RD+系列與 Intel 8051 管腳兼容,寬電壓,5.5V3.4V 給復位信號后能正常工作,PQFP-44,PLCC-44 封裝有 P4 口。STC89C51RC 有 3 個定時器/計數(shù)器,1280 字節(jié)大容量內(nèi)部數(shù)據(jù) RAM ,特別是該系列單片機支持 ISP 編程,開發(fā)無需高價的編程器,可實現(xiàn)遠程升級,在 ISP下載編程時可設置6或1

10、2 時鐘/機器周期模式,在 6 時鐘模式,比普通 51 速度快一倍。CPLD 有兩種型號可選,ALTERA 的 EPM7064 和 ATMEL 的 ATF1504。器件的參數(shù)特性可參閱相關資料。單片機和 CPLD 都選 擇 PLCC-44 腳封裝,占用 PCB 面積小,更換容易。圖2.1(a) 單片機與 CPLD 接口電路Mini51 板的 CPLD 選擇 Altera 公司的 EPM7064。單片機與CPLD總線接口如圖2.1(a) 所示。數(shù)據(jù)總 線既單片機 P0 口同CPLD一般 IO 口相連,完成數(shù)據(jù)和低 8 位地址傳送;控制總線包括單片機讀寫控制信號 Rd(P3.7)和 Wr(P3.6

11、),以及地址鎖存信號 ALE(Address Lock Enable)和高位地址線 A15(P2.7)通過 CPLD 的全局信號引腳輸入,包括全局時鐘輸入:INPUT/GCLK1,全局清零輸入 INPUT/GCLRn,全局使能輸入 INPUT/OE1,INPUT/OE2,這幾個信號有專用連線與 CPLD 中每個 宏單元相連,保證信號到每個宏單元的延時相同并且延時最短。 單片機與CPLD之間可以根據(jù)需要,采用多種不同的接口方式,這里提出一種總線接口方案,采用三總線(數(shù)據(jù)、 控制、地址)結構,如圖2.1(b)所示,雙向數(shù)據(jù)總線完成數(shù)據(jù)傳 輸,單向控制總線和地址總線通過 CPLD對外圍對象控制。圖2

12、.1(b) 單片機與 CPLD 接口電路框圖2.2 USB及串行接口電路 由AVR單片機ATmega8實現(xiàn)USB轉串口且實現(xiàn)ISP(in-system-programming)功能的接口電路,如圖2.2。USB接口使用方便,逐漸成為主流,計算機經(jīng)典接口串口,并口慢慢消失,于是出現(xiàn)USB轉串口,轉并口,專用IC很多,一般都很昂貴,USB方案成為最佳選擇。ATmega8是AVR高檔單片機中內(nèi)部接口豐富、功能齊全、性能價格比最好的品種2。通過燒寫USBASP固件和AVR-CDC固件分別實現(xiàn)兩種功能:一是實現(xiàn)AVR和S51 ISP編程,二是實現(xiàn)USB轉串口。這里串口輸出(圖中為uRxD和uTxD)為T

13、TL電平,可以直接接單片機。圖2.2 由AVR單片機ATmega8實現(xiàn)USB轉串口且實現(xiàn)ISP(in-system-programming)功能的接口電路ISP(in-system-programming)指系統(tǒng)在線可編程,是最先由Lattice 公司提出的一種技術,是通過同步 串行方式實現(xiàn)對同步串行方式實現(xiàn)對其可編程邏輯 器件的重配置。ISP 的實現(xiàn)比較簡單,通用做法是內(nèi) 部的存儲器可以由上位機的軟件通過串口來進行改 寫,對于單片機來講可以通過SPI 或其他的串行接口 接收上位機傳來的數(shù)據(jù)并寫入存儲器中。采用ISP技術,ISP技術的優(yōu)勢是不需要編程器就可以進行單片機的實驗和開發(fā), 按照STC

14、公司提供ISP下載線的接口標準,只要在 單片機與PC機之間加一個電平轉換電路,就可以實 現(xiàn)程序的在線下載,免去了調試時由于頻繁地拔插對 芯片和電路板帶來的損壞,這對于學生的實驗教學而 言顯得尤為重要。由于ISP技術具有的上述特點,本設計采用了ISP技術,其轉換電路如上圖。2.3 最小系統(tǒng)及外圍設備接口電路2.3.1電源電路該板提供兩種供電方式,一種從接口輸入 DC 9V 電源,板上集成 7805 穩(wěn)壓 IC,采用貼片封 裝,也可以從接口通過計算機 USB 接口取電。圖中按鈕為常閉開關,用來 斷開電源實現(xiàn)冷啟動用。其中 D3 用來防止電源極性接反,R4 為 4.7 歐電阻,這里起保護作用,防止實

15、驗 板短路,損壞計算機 USB 接口。圖2.3.1 電源電路2.3.2 單片機 P1 口擴展電路STC89C5X 系列單片機有 P4 口,因此將 P4.0P4.2 分配給 DS1302,P4.3端口,用于連接溫度傳感器DS18B20 電路如圖2.3.2(a)所示。DS1302是 DALLAS 公司推出的涓流充電時鐘芯片內(nèi)含有一個實時時鐘/日歷和 31 字節(jié)靜態(tài) RAM 通過簡單的串行接口與單片機進行通信實時時鐘/日歷電路提供秒分時日日期月年的信息每月的天數(shù)和閏 年的天數(shù)可自動調整時鐘操作可通過 AM/PM 指示決定采用 24 或 12 小時格式 DS1302 與單片機之間能 簡單地采用同步串行

16、的方式進行通信僅需用到三個口線 1 RES 復位 2 I/O 數(shù)據(jù)線 3 SCLK 串行時鐘時鐘/RAM 的讀/寫數(shù)據(jù)以一個字節(jié)或多達 31 個字節(jié)的字符組方式通信 DS1302 工作時功耗很低保持數(shù)據(jù)和時 鐘信息時功率小于 1mW。DS1302 和處理器接口一般為 3 線制,RST(CE)復位腳,讀寫操作時同步時序同步用,I/O 串行數(shù)據(jù) 輸入輸出腳,SCLK 串行時鐘輸入腳。圖2.3.2(a) DS18B20和DS1302接口電路單片機 P1 口帶鎖存功能,編程容易。Mini51 板上 P1 口被 LED、蜂鳴器、繼電器、串行 AD/DA 復用, 除 LED 直接與 P1 相連外,其它都可

17、以斷開,只在需要用時連接。LED 電路如圖2.3.2(b)所示,低電平點亮, 因為 51 系列單片機 P1 口靠內(nèi)部上拉電阻輸出高電平,所以一般不用 P1 口輸出高電平驅動 LED,外部限 流電阻 RP 不宜太小,否則會影響到 P1 口狀態(tài),為以后 P1 口擴展留下隱患,如果用貼片發(fā)光二極管, RP甚至可以為 4.7k。圖2.3.2(b) LED接口電路該板還設計了繼電器電路,通過繼電器容易實現(xiàn)弱電到強電的開關控制,電路如圖2.3.2(c)所示,通過跳線P12控制,不用時請斷開,圖中IN4148為繼電器線圈續(xù)流用二極管,特別重要。Relay為直流5V驅動雙聯(lián)動繼電器,用螺栓接線柱擴展接口。圖2

18、.3.2(c) 雙聯(lián)動繼電器接口電路蜂鳴器電路如圖(d)所示,通過跳線與P10相連,不用時可以斷開。Bell為有源蜂鳴器, 接通5V 電就會發(fā)聲,單片機P10做開關控制,低電平開啟。圖 3.3.2(d) 蜂鳴器接口電路 此外P1口可以實現(xiàn)AD/DA電路的轉換,接口電路如圖(e)。其中,TLC1549為串行接口10位單通道A_D轉換器,TLC5615為串行接口10位單通道D_A轉換器,都只能實現(xiàn)單輸單出,而未使用ADC0809和DAC0832是為了縮小PCB的面積,能達到試驗效果是本設計的初衷。圖 3.3.2(e)AD/DA接口電路2.3.3顯示接口電路 本設計有三個顯示模塊,分別是:LCD16

19、02、LCD12864和 4位7段LED數(shù)碼管。點陣字符型液晶顯示器是專門用于顯示數(shù)字、字母、圖形符號及少量自定義符號的顯示器3 。2.3.3 顯示接口電路3 軟件設計3.1 由AVR單片機ATmega8實現(xiàn)USB轉串口的驅動設計和ISP(in-system-programming)的使用 在給ATmega8燒寫固件及驅動文件時,要注意熔絲位的設置,如果設置不對,則單片機不 能正常工作。熔絲位設置如圖3.1:圖3.1熔絲位設置3.2 RTC 設計實例(DS1302+LCD1602+復雜按鍵輸入+多模式蜂鳴器發(fā)聲+多任務輪循架構)“實時時鐘”是很多任務執(zhí)行的關鍵參數(shù),例如家居智能控制,室外信息發(fā)

20、布,路燈控制等,因此熟 悉一種實時時鐘芯片以及精通編程控制將是一件非常有意義的事情。這里結合 Mini51 板硬件資源,開發(fā) 出一款實用的實時時鐘萬年歷,特別是程序設計采用了定時中斷多任務輪詢思想,對初學者程序設計具有 重要的參考價值。這里使用C語言編程,那么Keil應該是首選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境,強大的軟件仿真調試工具也會令編程事半功倍5。3.2.1 任務解析及人性化設計要求 Mini51 板上可用硬件資源有實時時鐘芯片 DS1302 和備用電池,還有 LCD1602 顯示屏、按鍵和蜂鳴。 整合這些硬件資源,設計一個具有調時、鬧鐘功能,還要顯示美觀,易使

21、用的電子萬年歷。 LCD 顯示要根據(jù) LCD 每行 16 字符的特點設計,如上,可以顯示年、月、日、星期、時間,還有鬧鐘 設定功能。顯示效果設計如下:第一行顯示:【2008-06-16 Week1】 第二行顯示:【14:52:35 AL07:00】 三鍵輸入:模式設定 set,加一 up,減一 down。 按鍵操作:長按 set 鍵進入時間設定模式,在進入設定模式以前,隨意短按任意鍵,不產(chǎn)生任何作用, 保證時間不被隨便修改;同一鍵短按鍵選擇設定對象;加減鍵長按直接退出設定模式。進入設定模式后, 長時間 10s 不按鍵,自動退出按鍵模式;以上所有的操作時鐘正常走鐘。聲音提示:所有按鍵操作伴隨聲音

22、提示,長短按鍵有不同的提示聲,按鍵手感好。 鬧鐘設置:鬧鐘設置信息寫入 DS1302 芯片的暫存 RAM,保證主電源掉電數(shù)據(jù)不丟失;鬧鐘精確到分鐘;鬧鐘可禁用,并有顯示提示;鬧鐘鬧鈴時,任意按鍵結束鬧鈴。3.2.2 多任務程序架構 為了程序移植性好,維護性好,易裁剪,我們有必要引入多任務編程思想,就是一個系統(tǒng)由多個任務 構成,各任務之間相對獨立。我在這里提出一種基于定時器中斷的多任務輪循程序架構,如圖 3.2.2(a)所示。在 主程序中,根據(jù)任務延時量判斷任務是否就緒,各任務輪循占用 CPU,由任務延時量控制任務執(zhí)行頻度及 CPU 關照度,而任務延時量又由定時器中斷控制。 關于任務實時性的理解

23、:從人機交互角度考慮,很多任務實時性要求是相對的,例如 LCD 顯示刷新, 就不需要很快的刷新頻度,即使被顯示的內(nèi)容更新足夠快,LCD 顯示刷新也不需要很快,因為 LCD 顯示 是給人看的,如果每秒刷新 20 次,已經(jīng)足夠了,這里結合數(shù)字鐘顯示任務,每秒 3 次就可以達到要求了; 又如按鍵掃描,掃描執(zhí)行頻度則不能太慢,太慢容易丟失有效鍵值,至少每秒應保持 50 次以上的執(zhí)行頻 度才行;同樣 DS1302 實時時鐘讀取頻度,每秒 3 次就可以了。不同任務,需要不同的執(zhí)行頻度(CPU 關照度),如果采用傳統(tǒng)大循環(huán)模式,各任務按一個頻度運行,顯然不適合本設計。這里還涉及到多種延時需要,例如按鍵去抖動

24、、蜂鳴器發(fā)聲等,如果采用傳統(tǒng) 循環(huán)延時法,不僅極大浪費 CPU 資源,而且造成不同任務之間相互影響,很難找到一個平衡點,特別不利于程序維護,我們形象稱這種程序為面條程序。圖3.2.2(a) 定時中斷的多任務輪循程序架構流程圖 基于定時器中斷的多任務輪循架構,各子任務必須設計成主動放棄 CPU 運行模式,子任務不能設計 成死循環(huán)流程,子任務的執(zhí)行依靠主程序任務調度來實現(xiàn)。正因為各任務不搶占 CPU,所以程序設計不用 考慮現(xiàn)場保護問題,簡化了程序設計。本設計程序整體架構如圖3.2.2(b) 所示,定時器固定節(jié)拍中斷,該節(jié)拍需 滿足最快任務執(zhí)行頻度需要,例如 50Hz,對于按鍵掃描程序,每秒按 50

25、 次頻度執(zhí)行即可,而 LCD1602 可以按每秒 3 次頻度執(zhí)行,實時時鐘數(shù)據(jù)讀取也只需按每秒 3 次頻度執(zhí)行一次。圖3.2.2(b) Mini51 板實時時鐘流程圖 任務執(zhí)行頻度由任務延時量 task_delayID控制,各任務延時量在定時中斷中減一,直到延時量為零, 相關相關任務就緒。務調度過程就是對任務延時量檢測過程,只有任務延時量為零時,CPU 從其它任務中 返回后立即執(zhí)行相應的任務,由于不同任務延時量不同,從而實現(xiàn)不同任務具有不同的執(zhí)行頻度而相互不受影響。這里還必須滿足一個條件,就是每個任務執(zhí)行一次的時間不能太長超過一次定時中斷時間,否則 任務之間執(zhí)行頻度會有影響,對于 50Hz 的

26、中斷頻率,每個任務執(zhí)行時間最好不超過 20ms,既 CPU 光顧 一次任務時間要在 20ms 以內(nèi),這樣就可以保證任務之間相互完全不受影響。 定時中斷在這里就是心臟,依靠定時中斷完成任務延時量的修改,從而實現(xiàn)不同任務運行頻度控制。 定時器設置及初始化代碼如下:#define TIME_PER_SEC 50/定義定時中斷頻度,由執(zhí)行頻度要求最快的任務確定,太高會降低CPU 運行效率,太低任務頻度不好分配,一般 200Hz 以下,這里采用 50Hz。 #define CLOCK 22118400/定義時鐘晶振,單位 Hz,與硬件一致即可void OS_Init_Timer0(void)/定時器 0

27、 初始化uchar i;for(i=0;i<MAX_TASK;i+) task_delayi=0;/任務延時量初始化TMOD = (TMOD & 0xf0) | 0x01; /定時器 0 工作在模式 1,16Bit 定時器模式TH0 = 255-CLOCK/TIME_PER_SEC/12/256; TL0 = 255-CLOCK/TIME_PER_SEC/12%256; TR0 =1;/開啟定時器ET0 =1;/開啟定時器中斷 這里通過宏定義,把易變參數(shù)在頭文件中定義,這樣使得程序容易修改,便于移植。void OS_Timer0(void) interrupt 1 using 2

28、 /定時中斷服務uchar i;TH0=255-CLOCK/TIME_PER_SEC/12/256; TL0=255-CLOCK/TIME_PER_SEC/12%256;/每節(jié)拍對任務延時量減 1 ,減至 0 后,任務就緒。for(i=0;i<MAX_TASK;i+)if(task_delayi>0) task_delayi-;/任務延時量減一歸零,使任務就緒 在定時中斷服務中,執(zhí)行的任務必須很簡短,重置定時器初值,把大于 0 的任務延時量減 1,該定時 中斷作為心臟跳動,不斷進出運行,為了節(jié)省 CPU 時間,該中斷任務越簡單越好。3.2.3 任務調度 任務調度在主程序 main(

29、)中完成,系統(tǒng)初始化之后,在一個大循環(huán)中,對各任務的延時量是否為零 判斷,當任務延時量為零時,表示該任務就緒,當前一個任務主動放棄 CPU 之后,馬上啟動就緒的新任 務。各任務之間不具有搶占功能,因此不用考慮堆棧與保護,初學者也能夠完全掌握。 void main(void)sys_init(); /系統(tǒng)初始化,包含各子任務初始化 OS_Init_Timer0();/定時器初始化 INT_GLOBAL(1);/開總中斷 while(1)/根據(jù)任務延時量是否為零選擇執(zhí)就緒任務執(zhí)行,任務執(zhí)行完成后返回再恢復設定的延時量if(task_delay0=0) task0();task_delay0=TIM

30、E_PER_SEC/50; if(task_delay1=0) task1();task_delay1=TIME_PER_SEC/20; if(task_delay2=0) task2();task_delay2=TIME_PER_SEC/01; if(task_delay3=0) task3();task_delay3=TIME_PER_SEC/02; if(task_delay4=0) task4();task_delay4=TIME_PER_SEC/03; if(task_delay5=0) task5();task_delay5=TIME_PER_SEC/04; if(task_del

31、ay6=0) task6();task_delay6=TIME_PER_SEC/05; if(task_delay7=0) task7();task_delay7=TIME_PER_SEC/06; 紅色數(shù)字表示任務執(zhí)行的頻度,即每秒鐘執(zhí)行多少次。各個不同的任務,根據(jù)需要,設定不同的延時 量,延時量在定時中斷中逐步減一歸零,每個任務必須主動放棄 CPU,正因此,各任務執(zhí)行時間最好不要 超過定時中斷節(jié)拍時間單位,這里為 20ms,否則將影響其它任務運行。3.2.4任務設計 3.2.4.1 按鍵掃描 task0.C圖3.2.4.1 按鍵掃描任務流程圖 按鍵輸入需要要實現(xiàn)以下功能:按鍵去抖動,快速單次

32、觸發(fā),長按單次觸發(fā),長按多次連續(xù)觸發(fā),同 一按鍵既有長按又有短按功能。流程圖如所示。 由于該任務在一定的頻度內(nèi)執(zhí)行,通過定義狀態(tài)機記錄該任務的歷史運行狀態(tài),由于一次按鍵不能立 即確定鍵值,需要去抖動處理,我可以用狀態(tài)機把首次按鍵記住,在二次按鍵時確認鍵值,同樣,長短按 鍵也是用狀態(tài)機和計數(shù)器控制,通過任務多次調用積累時間,從而實現(xiàn)長延時而又不占用 CPU 資源,這 就是此種定時器中斷的多任務輪循架構程序設計的精髓所在。 以 50Hz 的頻度掃描鍵盤,基本不會出現(xiàn)按鍵丟失現(xiàn)象。通過狀態(tài)機計數(shù)器控制,去抖動,長短按鍵,單次多次按鍵等各種復雜的控制,部分程序解讀如下:#define KEY_PORT

33、P3 /定義按鍵接口#define KEY_VALKEY_PORT | 0xc3 /Mini51 板 P3.2-P3.5 有效,有鍵按下則對應位為 0#define KEY00xfb /P3.2#define KEY10xf7 /P3.3#define KEY20xef /P3.4#define KEY30xdf /P3.5 以上對硬件接口進行定義,這樣做的好處是當硬件接口改變后,程序容易修改,這種程序設計思想很 重要。#define KEY0_UP 0x15#define KEY1_UP 0x16#define KEY2_UP 0x17#define KEY3_UP 0x18 以上定義按鍵彈

34、起對應按鍵的關聯(lián)狀態(tài),數(shù)據(jù)本身沒有實際意義,只要不重復就行,由于在程序中多 處使用,如果使用常數(shù),程序可讀性差,容易出錯。#define LONG_DN_TIME 50*2;/長按鍵時間設置,2s,其中 50 為本任務執(zhí)行頻度#define WAIT_DN_TIME 50*1;/長按鍵過度到連續(xù)任務執(zhí)行時間間隔 1s#define CONU_DO_TIME 50*0.2;/長按鍵連續(xù)執(zhí)行頻度,時間間隔 0.2Svoid task0_init(void)/任務初始化,在主程序 sys_init()中調用KEY_PORT = 0xff;/按鍵端口初始化 本任務開始時需要執(zhí)行一次的任務初始化函數(shù),在

35、主程序 sys_init()中調用,僅僅執(zhí)行一次。void task0(void)static uchar state_dn = 0;/有鍵按下狀態(tài)機變量static uchar state_up = 0;/按鍵釋放狀態(tài)機變量static uchar key_ldn_cnt = 0;/長按鍵計數(shù)器,控制長按鍵時間uchar key_num;/鍵值變量key_num = KEY_VAL;/一次性讀取鍵值if(key_num != 0xff)/判斷是否有鍵按下switch (state_dn)/采用狀態(tài)機記住前后按鍵變化情況else /按鍵釋放觸發(fā)任務執(zhí)行switch (state_up)3.2.

36、4.2 LCD 顯示 task1.C圖3.2.4.2 LCD 顯示刷新流程圖 LCD 顯示刷新流程圖如圖 4 所示,給 LCD 分配全局變量顯示緩沖區(qū)并在獨立任務中周期刷新顯示, 這樣做的好處是程序設計思路清晰,各任務獨立,程序可讀性好,缺點是占用太多內(nèi)存,沒有更新的數(shù)據(jù) 也不斷刷新,浪費了 CPU 資源。 LCD 驅動程序在頭文件 lcd1602.h 中,其他任務通過全局變量 str_buff 和 fly_space 控制該模塊運行效 果。閃爍控制原理是根據(jù)閃爍控制標志位,周期替換顯示內(nèi)容為空白字符符。部分程序解讀如下:#include "main.h"#include

37、"lcd1602.h"uchar str_buff32; /定義全局顯示緩沖區(qū)uchar fly_space;/定義全局閃爍位置控制變量,其它任務要用該變量需要加前綴 extern 聲明void task1_init(void)/本任務初始化,在主程序中調用一次unsigned char i;lcd1602_init();for(i=0;i<32;i+) str_buffi=' 'fly_space = 0xff;/首先關閉閃爍標志void task1(void)static uchar fly_cnt=0;/閃爍頻度控制if(fly_space!=0

38、xff)fly_cnt+;if(fly_cnt < 3)str_bufffly_space=' '/將顯示內(nèi)容用空白字符替換,產(chǎn)生閃爍效果if(fly_space!=15) str_bufffly_space+1=' 'else if(fly_cnt > 12) fly_cnt=0; lcd_put_xyns(1,1,16,str_buff); lcd_put_xyns(1,2,16,str_buff+16);3.2.4.3 實時時鐘讀取 task3.C圖3.2.4.3 時鐘讀取描任務流程圖 實時時鐘讀取任務相對簡單,由于秒鐘每秒更新一次,為了實現(xiàn)較

39、好的顯示效果,每秒至少讀 3 次以 上,所以本任務的執(zhí)行頻度設定為 3 次,與時間相關的控制任務,如鬧鐘,整點報時都放在這里。3.2.4.4 蜂鳴器發(fā)聲 task4.C 蜂鳴器是 IO 口驅動的簡單開關控制,Mini51 板上的蜂鳴器是采用的有源蜂鳴器,接通電源就發(fā)出單 音頻聲音,單片機的控制只是控制其發(fā)聲時長和開關頻度,從而產(chǎn)生不同的效果,看似“接通”“延時”“斷 開”如此簡單的控制,如果考慮多任務模式,不用常規(guī)死循環(huán)延時(那樣極大的浪費 CPU 資源,不適合 多任務模式),還要實現(xiàn)多種發(fā)聲模式可選擇,這就需要我們突破傳統(tǒng)程序設計思路,這里還是基于定時 器中斷任務輪詢的思路,采用狀態(tài)機控制,

40、程序流程圖如圖所示,這里實現(xiàn)了單次短發(fā)聲,單次長發(fā)聲, 連續(xù)短發(fā)聲,連續(xù)長發(fā)聲,根據(jù)需要還可以添加更多種發(fā)聲模式,這樣在其它需要發(fā)聲處,只要給出發(fā)聲模式即可。蜂鳴發(fā)聲主要用在按鍵響應,鬧鐘提示,整點報時處。圖3.2.4.4 蜂鳴器多模式發(fā)聲任務流程圖部分程序解讀如下:#include "main.h"/*蜂鳴器模式定義*/#define BM0 0x01#define BM1 0x02#define BM2 0x11#define BM3 0x22#define ON 0#define OFF 1#define BUZZR(x) BUZZR=(x)sbit BUZZR =

41、P10;/蜂鳴器接口定義uchar beep_modle;/發(fā)聲模式選擇全局變量,其它任務中通過該變量啟動蜂鳴器發(fā)聲void task3_init(void)beep_modle = BM0;/初始蜂鳴器模式 1,系統(tǒng)復位啟動發(fā)聲一次void task3(void)static uchar beep_time = 0;/蜂鳴器發(fā)聲時間長度控制變量switch (beep_modle)case 0:break;case BM0:/模式 0,單次短聲 BUZZR(ON);/開蜂鳴器 beep_time = BM0; beep_modle = 0;break;case BM1: /模式 1,單次長聲

42、BUZZR(ON); beep_time = BM1; beep_modle = 0; break;case BM2: /模式 2,連續(xù)短聲BUZZR(ON);beep_time = BM2 & 0x0f; beep_modle = BM2+0x10; break;case BM2+0x10: /模式 2 的 2 狀態(tài)if(beep_time=0) beep_modle = BM2;break;case BM3: /模式 3,連續(xù)長聲BUZZR(ON);beep_time = BM3 & 0x0f; beep_modle = BM3+0x10; break;case BM3+0x10: /模式 3 的 2 狀態(tài)if(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論