版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 . . . 基于51單片機(jī)和CPLD試驗(yàn)開發(fā)板的設(shè)計(jì)摘 要 闡述了設(shè)計(jì)的各部分硬件的原理和用于試驗(yàn)的軟件設(shè)計(jì),特別給出了RTC的設(shè)計(jì)在實(shí)驗(yàn)板設(shè)計(jì)中的成功應(yīng)用。單片機(jī)CPLD實(shí)驗(yàn)板將單片機(jī)與CPLD 有機(jī)結(jié)合在一起,構(gòu)建以51單片機(jī)為主,CPLD 為輔的電路系統(tǒng)設(shè)計(jì)方案,既可以獨(dú)立用于單片機(jī)實(shí)驗(yàn)或CPLD實(shí)驗(yàn),也可以用于單片機(jī)和CPLD綜合應(yīng)用的實(shí)驗(yàn)。尤其,集成了具有ISP功能的CPLD和ISP功能的單片機(jī),為初學(xué)者節(jié)約了昂貴的編程器成本。關(guān)鍵詞:51單片機(jī) CPLD ISP 編程器 實(shí)驗(yàn)板ABSTRACT In this paper,it was elaborated that the va
2、rious parts 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 ys
3、tem design, 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: 51MC
4、U CPLD ISP programmer experiment board 目 錄引言3 1 MiniB的目的與意義32 MiniB的硬件設(shè)計(jì)4 2.1單片機(jī)與 CPLD 接口電路4 2.2 USB與串行接口電路 6 2.3最小系統(tǒng)與外圍設(shè)備接口電路8 2.3.1電源電路8 2.3.2 單片機(jī) P1 口擴(kuò)展電路8 2.3.3顯示接口電路123 MiniB的軟件設(shè)計(jì)123.1由AVR單片機(jī)ATmega8實(shí)現(xiàn)USB轉(zhuǎn)串口的驅(qū)動設(shè)計(jì)和ISP(in- system-programming)的使用12 3.2 RTC 設(shè)計(jì)實(shí)例(DS1302+LCD1602+復(fù)雜按鍵輸入+多模式蜂鳴 器發(fā)聲+多任務(wù)輪循
5、架構(gòu))13 3.2.1 任務(wù)解析與人性化設(shè)計(jì)要求133.2.2 多任務(wù)程序架構(gòu)14 3.2.3任務(wù)調(diào)度17 3.2.4任務(wù)設(shè)計(jì)184 調(diào)試26致27 參考文獻(xiàn)28引言 單片機(jī)以其控制功能強(qiáng)體積小價格低耗電省可靠性高等特點(diǎn),嵌入式應(yīng)用很廣1。而單片機(jī)學(xué)習(xí)門檻較高,涉與單片機(jī)軟硬件知識,同時還要掌握幾種軟硬件工具平臺,初學(xué)者要想快速入門單片機(jī)領(lǐng)域,往往需要一個好的硬件平臺和大量易懂的實(shí)例。隨著電子技術(shù)的不斷發(fā)展,大規(guī)模集成電路的運(yùn)用越來越普遍,用CPLD/FPGA 來開發(fā)新產(chǎn)品是電子技術(shù)發(fā)展必然趨勢。目前各高校逐步開設(shè)了單片機(jī)課程和可編程器件設(shè)計(jì)課程,而兩門課程往往是獨(dú)立開設(shè),尤其是實(shí)驗(yàn),而實(shí)驗(yàn)是
6、檢驗(yàn)理論正確與否的試金石,是學(xué)好兩門課程的重要手段和方法。從而,切實(shí)滿足初學(xué)者需要的實(shí)驗(yàn)板的開發(fā)成為了現(xiàn)實(shí),而目前市場上針對初學(xué)者而開發(fā)的綜合實(shí)驗(yàn)板價格高,體積大,操作煩瑣,不易學(xué)習(xí)掌握。1 MiniB的目的與意義現(xiàn)在市場上關(guān)于單片機(jī)和 CPLD的試驗(yàn)開發(fā)板很多,總體上來說設(shè)計(jì)不專業(yè), 成本價格高,功能的單一,不能用于單片機(jī)和CPLD的 綜合應(yīng)用試驗(yàn),操作復(fù)雜利用率不高,但對于在校學(xué)生和電子愛好者這些消費(fèi)者來說需求還很大。1.1目的 為單片機(jī)和CPLD初學(xué)者提供一款經(jīng)濟(jì)實(shí)用型實(shí)驗(yàn)板,解決單片機(jī)和CPLD獨(dú)立學(xué)習(xí)的問題,設(shè)計(jì)過程中個人知識能力的提升,以消費(fèi)者的切實(shí)需要為原則,市場的需求明顯。1.
7、2意義 此款單片機(jī)加CPLD實(shí)驗(yàn)板是總結(jié)單片機(jī)和CPLD學(xué)習(xí)的經(jīng)驗(yàn),站在初學(xué)者的角度上而開發(fā),將單片機(jī)與CPLD 有機(jī)結(jié)合在一起,構(gòu)建以單片機(jī)為主,CPLD 為輔的電路系統(tǒng)設(shè)計(jì)方案,既可以獨(dú)立用于單片機(jī)實(shí)驗(yàn)或CPLD實(shí)驗(yàn),也可以用于單片機(jī)和CPLD綜合應(yīng)用的實(shí)驗(yàn),打造出袖珍單片機(jī)CPLD學(xué)習(xí)板。尤其,集成了具有ISP功能的CPLD和ISP功能的單片機(jī),為初學(xué)者節(jié)約了昂貴的編程器成本。2 MiniB的硬件設(shè)計(jì)系統(tǒng)結(jié)構(gòu)如圖2所示,該板采用單片機(jī)+CPLD 結(jié)構(gòu),單片機(jī)為主,CPLD 為輔。與單片機(jī)相連的模塊 有:P1 口接發(fā)光二極管、蜂鳴器、繼電器、AD/DA,P4 口(STC 單片機(jī) PLCC-
8、44 封裝特有)接實(shí)時時鐘 DS1302、紅外接收器,P3 口接 232 電平轉(zhuǎn)換電路和 4 個按鍵,單片機(jī) P0 口和 P2 口以與 P3.6、P3.7 作為 總線使用,CPLD 直接驅(qū)動 4 位數(shù)碼管,并給 LCD 提供使能信號,單片機(jī)和 CPLD 引腳分別有擴(kuò)展接口, 板上集成 5V 穩(wěn)壓電源,可以外接 DC9V 電源,也可以從計(jì)算機(jī) USB 口直接取 5V 電源,JTAG接口完全符合IEEE1149.1標(biāo)準(zhǔn),提供完全的邊界掃描功能2。圖2 系統(tǒng)結(jié)構(gòu)圖2.1 單片機(jī)與 CPLD 接口電路 現(xiàn)在所有單片機(jī)廠家都有支持 ISP 的單片機(jī),由于 STC 公司推出的 STC 系列單片機(jī)具有較強(qiáng)的
9、功能和較高的性價比,本設(shè)計(jì)采用 STC89C516RD+單片機(jī)作為系統(tǒng)的核心。單片機(jī)選 STC89C5X,該系列單片機(jī)部集成 MAX810/STC810 專用復(fù)位電路,置看門狗,超強(qiáng)抗 干擾,輕松過 2KV/4KV 快速脈沖干擾(EFT),加密性強(qiáng),STC89C52RCSTC89C58RD+系列與 Intel 8051 管腳兼容,寬電壓,5.5V3.4V 給復(fù)位信號后能正常工作,PQFP-44,PLCC-44 封裝有 P4 口。STC89C51RC 有 3 個定時器/計(jì)數(shù)器,1280 字節(jié)大容量部數(shù)據(jù) RAM ,特別是該系列單片機(jī)支持 ISP 編程,開發(fā)無需高價的編程器,可實(shí)現(xiàn)遠(yuǎn)程升級,在 I
10、SP下載編程時可設(shè)置6或12 時鐘/機(jī)器周期模式,在 6 時鐘模式,比普通 51 速度快一倍。 CPLD 有兩種型號可選,ALTERA 的 EPM7064 和 ATMEL 的 ATF1504。 器件的參數(shù)特性可參閱相關(guān)資料。單片機(jī)和 CPLD 都選 擇 PLCC-44 腳封裝,占用 PCB 面積小,更換容易。圖2.1(a) 單片機(jī)與 CPLD 接口電路 Mini51 板的 CPLD 選擇 Altera 公司的 EPM7064。單片機(jī)與CPLD總線接口如圖2.1(a) 所示。數(shù)據(jù)總 線既單片機(jī) P0 口同CPLD一般 IO 口相連,完成數(shù)據(jù)和低 8 位地址傳送;控制總線包括單片機(jī)讀寫控制信號 R
11、d(P3.7)和 Wr(P3.6),以與地址鎖存信號 ALE(Address Lock Enable)和高位地址線 A15(P2.7)通過 CPLD 的全局信號引腳輸入,包括全局時鐘輸入:INPUT/GCLK1,全局清零輸入 INPUT/GCLRn,全局使能輸入 INPUT/OE1,INPUT/OE2,這幾個信號有專用連線與 CPLD 中每個 宏單元相連,保證信號到每個宏單元的延時一樣并且延時最短。 單片機(jī)與CPLD之間可以根據(jù)需要,采用多種不同的接口方式,這里提出一種總線接口方案,采用三總線(數(shù)據(jù)、 控制、地址)結(jié)構(gòu),如圖2.1(b)所示,雙向數(shù)據(jù)總線完成數(shù)據(jù)傳 輸,單向控制總線和地址總線通
12、過 CPLD對外圍對象控制。圖2.1(b) 單片機(jī)與 CPLD 接口電路框圖2.2 USB與串行接口電路 由AVR單片機(jī)ATmega8實(shí)現(xiàn)USB轉(zhuǎn)串口且實(shí)現(xiàn)ISP(in-system-programming)功能的接口電路,如圖2.2。USB接口使用方便,逐漸成為主流,計(jì)算機(jī)經(jīng)典接口串口,并口慢慢消失,于是出現(xiàn)USB轉(zhuǎn)串口,轉(zhuǎn)并口,專用IC很多,一般都很昂貴,USB方案成為最佳選擇。ATmega8是AVR高檔單片機(jī)中部接口豐富、功能齊全、性能價格比最好的品種2。通過燒寫USBASP固件和AVR-CDC固件分別實(shí)現(xiàn)兩種功能:一是實(shí)現(xiàn)AVR和S51 ISP編程,二是實(shí)現(xiàn)USB轉(zhuǎn)串口。這里串口輸出(
13、圖中為uRxD和uTxD)為TTL電平,可以直接接單片機(jī)。圖2.2 由AVR單片機(jī)ATmega8實(shí)現(xiàn)USB轉(zhuǎn)串口且實(shí)現(xiàn)ISP(in-system-programming)功能的接口電路ISP(in-system-programming)指系統(tǒng)在線可編程,是最先由Lattice 公司提出的一種技術(shù),是通過同步 串行方式實(shí)現(xiàn)對同步串行方式實(shí)現(xiàn)對其可編程邏輯 器件的重配置。ISP 的實(shí)現(xiàn)比較簡單,通用做法是 部的存儲器可以由上位機(jī)的軟件通過串口來進(jìn)行改 寫,對于單片機(jī)來講可以通過SPI 或其他的串行接口 接收上位機(jī)傳來的數(shù)據(jù)并寫入存儲器中。采用ISP技術(shù),ISP技術(shù)的優(yōu)勢是不需要編程器就可以進(jìn)行單片
14、機(jī)的實(shí)驗(yàn)和開發(fā), 按照STC公司提供ISP下載線的接口標(biāo)準(zhǔn),只要在 單片機(jī)與PC機(jī)之間加一個電平轉(zhuǎn)換電路,就可以實(shí) 現(xiàn)程序的在線下載,免去了調(diào)試時由于頻繁地拔插對 芯片和電路板帶來的損壞,這對于學(xué)生的實(shí)驗(yàn)教學(xué)而 言顯得尤為重要。由于ISP技術(shù)具有的上述特點(diǎn),本設(shè)計(jì)采用了ISP技術(shù),其轉(zhuǎn)換電路如上圖。2.3 最小系統(tǒng)與外圍設(shè)備接口電路2.3.1電源電路 該板提供兩種供電方式如圖2.3.1,一種從接口輸入 DC 9V 電源,板上集成 7805 穩(wěn)壓 IC,采用貼片封 裝,也可以從接口通過計(jì)算機(jī) USB 接口取電。圖中按鈕為常閉開關(guān),用來 斷開電源實(shí)現(xiàn)冷啟動用。其中 D3 用來防止電源極性接反,R4
15、 為 4.7 歐電阻,這里起保護(hù)作用,防止實(shí)驗(yàn) 板短路,損壞計(jì)算機(jī) USB 接口。圖2.3.1 電源電路2.3.2 單片機(jī) P1 口擴(kuò)展電路 STC89C5X 系列單片機(jī)有 P4 口,因此將 P4.0P4.2 分配給 DS1302,P4.3端口,用于連接溫度傳感器DS18B20 電路如圖2.3.2(a)所示。DS1302是 DALLAS 公司推出的涓流充電時鐘芯片含有一個實(shí)時時鐘/日歷和 31 字節(jié)靜態(tài) RAM 通過簡單的串行接口與單片機(jī)進(jìn)行通信實(shí)時時鐘/日歷電路提供秒分時日日期月年的信息每月的天數(shù)和閏 年的天數(shù)可自動調(diào)整時鐘操作可通過 AM/PM 指示決定采用 24 或 12 小時格式 DS
16、1302 與單片機(jī)之間能 簡單地采用同步串行的方式進(jìn)行通信僅需用到三個口線 1 RES 復(fù)位 2 I/O 數(shù)據(jù)線 3 SCLK 串行時鐘時鐘/RAM 的讀/寫數(shù)據(jù)以一個字節(jié)或多達(dá) 31 個字節(jié)的字符組方式通信 DS1302 工作時功耗很低保持?jǐn)?shù)據(jù)和時 鐘信息時功率小于 1mW。DS1302 和處理器接口一般為 3 線制,RST(CE)復(fù)位腳,讀寫操作時同步時序同步用,I/O 串行數(shù)據(jù) 輸入輸出腳,SCLK 串行時鐘輸入腳。圖2.3.2(a) DS18B20和DS1302接口電路單片機(jī) P1 口帶鎖存功能,編程容易。Mini51 板上 P1 口被 LED、蜂鳴器、繼電器、串行 AD/DA 復(fù)用,
17、 除 LED 直接與 P1 相連外,其它都可以斷開,只在需要用時連接。LED 電路如圖2.3.2(b)所示,低電平點(diǎn)亮, 因?yàn)?51 系列單片機(jī) P1 口靠部上拉電阻輸出高電平,所以一般不用 P1 口輸出高電平驅(qū)動 LED,外部限 流電阻 RP 不宜太小,否則會影響到 P1 口狀態(tài),為以后 P1 口擴(kuò)展留下隱患,如果用貼片發(fā)光二極管, RP甚至可以為 4.7k。圖2.3.2(b) LED接口電路 該板還設(shè)計(jì)了繼電器電路,通過繼電器容易實(shí)現(xiàn)弱電到強(qiáng)電的開關(guān)控制,電路如圖2.3.2(c)所示,通過跳線P12控制,不用時請斷開,圖中IN4148為繼電器線圈續(xù)流用二極管,特別重要。Relay為直流5V
18、驅(qū)動雙聯(lián)動繼電器,用螺栓接線柱擴(kuò)展接口。圖2.3.2(c) 雙聯(lián)動繼電器接口電路 蜂鳴器電路如圖3.3.2(d)所示,通過跳線與P10相連,不用時可以斷開。Bell為有源蜂鳴器, 接通5V 電就會發(fā)聲,單片機(jī)P10做開關(guān)控制,低電平開啟。圖 3.3.2(d) 蜂鳴器接口電路 此外P1口可以實(shí)現(xiàn)AD/DA電路的轉(zhuǎn)換,接口電路如圖3.3.2(e)。其中,TLC1549為串行接口10位單通道A_D轉(zhuǎn)換器,TLC5615為串行接口10位單通道D_A轉(zhuǎn)換器,都只能實(shí)現(xiàn)單輸單出,而未使用ADC0809和DAC0832是為了縮小PCB的面積,能達(dá)到試驗(yàn)效果是本設(shè)計(jì)的初衷。圖 3.3.2(e) AD/DA接口
19、電路2.3.3顯示接口電路 本設(shè)計(jì)有三個顯示模塊,分別是:LCD1602、LCD12864和 4位7段LED數(shù)碼管。點(diǎn)陣字符型液晶顯示器是專門用于顯示數(shù)字、字母、圖形符號與少量自定義符號的顯示器3 。2.3.3 顯示接口電路3 軟件設(shè)計(jì)3.1 由AVR單片機(jī)ATmega8實(shí)現(xiàn)USB轉(zhuǎn)串口的驅(qū)動設(shè)計(jì)和ISP(in-system-programming)的使用 在給ATmega8燒寫固件與驅(qū)動文件時,要注意熔絲位的設(shè)置,如果設(shè)置不對,則單片機(jī)不 能正常工作。熔絲位設(shè)置如圖3.1:圖3.1 熔絲位設(shè)置3.2 RTC 設(shè)計(jì)實(shí)例(DS1302+LCD1602+復(fù)雜按鍵輸入+多模式蜂鳴器發(fā)聲+多任務(wù)輪循架
20、構(gòu))“實(shí)時時鐘”是很多任務(wù)執(zhí)行的關(guān)鍵參數(shù),例如家居智能控制,室外信息發(fā)布,路燈控制等,因此熟 悉一種實(shí)時時鐘芯片以與精通編程控制將是一件非常有意義的事情。這里結(jié)合 Mini51 板硬件資源,開發(fā) 出一款實(shí)用的實(shí)時時鐘萬年歷,特別是程序設(shè)計(jì)采用了定時中斷多任務(wù)輪詢思想,對初學(xué)者程序設(shè)計(jì)具有 重要的參考價值。這里使用C語言編程,那么Keil應(yīng)該是首選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境,強(qiáng)大的軟件仿真調(diào)試工具也會令編程事半功倍5。3.2.1 任務(wù)解析與人性化設(shè)計(jì)要求 Mini51 板上可用硬件資源有實(shí)時時鐘芯片 DS1302 和備用電池,還有 LCD1602 顯示屏、按鍵和蜂
21、鳴。 整合這些硬件資源,設(shè)計(jì)一個具有調(diào)時、鬧鐘功能,還要顯示美觀,易使用的電子萬年歷。 LCD 顯示要根據(jù) LCD 每行 16 字符的特點(diǎn)設(shè)計(jì),如上,可以顯示年、月、日、星期、時間,還有鬧鐘 設(shè)定功能。顯示效果設(shè)計(jì)如下:第一行顯示:2008-06-16 Week1 第二行顯示:14:52:35 AL07:00 三鍵輸入:模式設(shè)定 set,加一 up,減一 down。 按鍵操作:長按 set 鍵進(jìn)入時間設(shè)定模式,在進(jìn)入設(shè)定模式以前,隨意短按任意鍵,不產(chǎn)生任何作用, 保證時間不被隨便修改;同一鍵短按鍵選擇設(shè)定對象;加減鍵長按直接退出設(shè)定模式。進(jìn)入設(shè)定模式后, 長時間 10s 不按鍵,自動退出按鍵模
22、式;以上所有的操作時鐘正常走鐘。聲音提示:所有按鍵操作伴隨聲音提示,長短按鍵有不同的提示聲,按鍵手感好。 鬧鐘設(shè)置:鬧鐘設(shè)置信息寫入 DS1302 芯片的暫存 RAM,保證主電源掉電數(shù)據(jù)不丟失;鬧鐘精確到分鐘;鬧鐘可禁用,并有顯示提示;鬧鐘鬧鈴時,任意按鍵結(jié)束鬧鈴。3.2.2 多任務(wù)程序架構(gòu) 為了程序移植性好,維護(hù)性好,易裁剪,我們有必要引入多任務(wù)編程思想,就是一個系統(tǒng)由多個任務(wù) 構(gòu)成,各任務(wù)之間相對獨(dú)立。我在這里提出一種基于定時器中斷的多任務(wù)輪循程序架構(gòu),如圖 3.2.2(a)所示。在 主程序中,根據(jù)任務(wù)延時量判斷任務(wù)是否就緒,各任務(wù)輪循占用 CPU,由任務(wù)延時量控制任務(wù)執(zhí)行頻度與 CPU
23、關(guān)照度,而任務(wù)延時量又由定時器中斷控制。 關(guān)于任務(wù)實(shí)時性的理解:從人機(jī)交互角度考慮,很多任務(wù)實(shí)時性要相對的,例如 LCD 顯示刷新, 就不需要很快的刷新頻度,即使被顯示的容更新足夠快,LCD 顯示刷新也不需要很快,因?yàn)?LCD 顯示 是給人看的,如果每秒刷新 20 次,已經(jīng)足夠了,這里結(jié)合數(shù)字鐘顯示任務(wù),每秒 3 次就可以達(dá)到要求了; 又如按鍵掃描,掃描執(zhí)行頻度則不能太慢,太慢容易丟失有效鍵值,至少每秒應(yīng)保持 50 次以上的執(zhí)行頻 度才行;同樣 DS1302 實(shí)時時鐘讀取頻度,每秒 3 次就可以了。不同任務(wù),需要不同的執(zhí)行頻度(CPU 關(guān)照度),如果采用傳統(tǒng)大循環(huán)模式,各任務(wù)按一個頻度運(yùn)行,顯
24、然不適合本設(shè)計(jì)。這里還涉與到多種延時需要,例如按鍵去抖動、蜂鳴器發(fā)聲等,如果采用傳統(tǒng) 循環(huán)延時法,不僅極大浪費(fèi) CPU 資源,而且造成不同任務(wù)之間相互影響,很難找到一個平衡點(diǎn),特別不利于程序維護(hù),我們形象稱這種程序?yàn)槊鏃l程序。圖3.2.2(a) 定時中斷的多任務(wù)輪循程序架構(gòu)流程圖 基于定時器中斷的多任務(wù)輪循架構(gòu),各子任務(wù)必須設(shè)計(jì)成主動放棄 CPU 運(yùn)行模式,子任務(wù)不能設(shè)計(jì) 成死循環(huán)流程,子任務(wù)的執(zhí)行依靠主程序任務(wù)調(diào)度來實(shí)現(xiàn)。正因?yàn)楦魅蝿?wù)不搶占 CPU,所以程序設(shè)計(jì)不用 考慮現(xiàn)場保護(hù)問題,簡化了程序設(shè)計(jì)。本設(shè)計(jì)程序整體架構(gòu)如圖3.2.2(b) 所示,定時器固定節(jié)拍中斷,該節(jié)拍需 滿足最快任務(wù)執(zhí)行
25、頻度需要,例如 50Hz,對于按鍵掃描程序,每秒按 50 次頻度執(zhí)行即可,而 LCD1602 可以按每秒 3 次頻度執(zhí)行,實(shí)時時鐘數(shù)據(jù)讀取也只需按每秒 3 次頻度執(zhí)行一次。圖3.2.2(b) Mini51 板實(shí)時時鐘流程圖 任務(wù)執(zhí)行頻度由任務(wù)延時量 task_delayID控制,各任務(wù)延時量在定時中斷中減一,直到延時量為零, 相關(guān)相關(guān)任務(wù)就緒。務(wù)調(diào)度過程就是對任務(wù)延時量檢測過程,只有任務(wù)延時量為零時,CPU 從其它任務(wù)中 返回后立即執(zhí)行相應(yīng)的任務(wù),由于不同任務(wù)延時量不同,從而實(shí)現(xiàn)不同任務(wù)具有不同的執(zhí)行頻度而相互不受影響。這里還必須滿足一個條件,就是每個任務(wù)執(zhí)行一次的時間不能太長超過一次定時中斷
26、時間,否則 任務(wù)之間執(zhí)行頻度會有影響,對于 50Hz 的中斷頻率,每個任務(wù)執(zhí)行時間最好不超過 20ms,既 CPU 光顧 一次任務(wù)時間要在 20ms 以,這樣就可以保證任務(wù)之間相互完全不受影響。 定時中斷在這里就是心臟,依靠定時中斷完成任務(wù)延時量的修改,從而實(shí)現(xiàn)不同任務(wù)運(yùn)行頻度控制。 定時器設(shè)置與初始化代碼如下:#define TIME_PER_SEC 50/定義定時中斷頻度,由執(zhí)行頻度要求最快的任務(wù)確定,太高會降低CPU 運(yùn)行效率,太低任務(wù)頻度不好分配,一般 200Hz 以下,這里采用 50Hz。 #define CLOCK 22118400/定義時鐘晶振,單位 Hz,與硬件一致即可void
27、 OS_Init_Timer0(void)/定時器 0 初始化uchar i;for(i=0;i<MAX_TASK;i+) task_delayi=0;/任務(wù)延時量初始化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_Timer
28、0(void) interrupt 1 using 2 /定時中斷服務(wù)uchar i;TH0=255-CLOCK/TIME_PER_SEC/12/256; TL0=255-CLOCK/TIME_PER_SEC/12%256;/每節(jié)拍對任務(wù)延時量減 1 ,減至 0 后,任務(wù)就緒。for(i=0;i<MAX_TASK;i+)if(task_delayi>0) task_delayi-;/任務(wù)延時量減一歸零,使任務(wù)就緒 在定時中斷服務(wù)中,執(zhí)行的任務(wù)必須很簡短,重置定時器初值,把大于 0 的任務(wù)延時量減 1,該定時 中斷作為心臟跳動,不斷進(jìn)出運(yùn)行,為了節(jié)省 CPU 時間,該中斷任務(wù)越簡單越
29、好。3.2.3 任務(wù)調(diào)度 任務(wù)調(diào)度在主程序 main()中完成,系統(tǒng)初始化之后,在一個大循環(huán)中,對各任務(wù)的延時量是否為零 判斷,當(dāng)任務(wù)延時量為零時,表示該任務(wù)就緒,當(dāng)前一個任務(wù)主動放棄 CPU 之后,馬上啟動就緒的新任 務(wù)。各任務(wù)之間不具有搶占功能,因此不用考慮堆棧與保護(hù),初學(xué)者也能夠完全掌握。 void main(void)sys_init(); /系統(tǒng)初始化,包含各子任務(wù)初始化 OS_Init_Timer0();/定時器初始化 INT_GLOBAL(1);/開總中斷 while(1)/根據(jù)任務(wù)延時量是否為零選擇執(zhí)就緒任務(wù)執(zhí)行,任務(wù)執(zhí)行完成后返回再恢復(fù)設(shè)定的延時量if(task_delay0
30、=0) task0();task_delay0=TIME_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=T
31、IME_PER_SEC/04; if(task_delay6=0) task6();task_delay6=TIME_PER_SEC/05; if(task_delay7=0) task7();task_delay7=TIME_PER_SEC/06; 紅色數(shù)字表示任務(wù)執(zhí)行的頻度,即每秒鐘執(zhí)行多少次。各個不同的任務(wù),根據(jù)需要,設(shè)定不同的延時 量,延時量在定時中斷中逐步減一歸零,每個任務(wù)必須主動放棄 CPU,正因此,各任務(wù)執(zhí)行時間最好不要 超過定時中斷節(jié)拍時間單位,這里為 20ms,否則將影響其它任務(wù)運(yùn)行。3.2.4任務(wù)設(shè)計(jì) 3.2.4.1 按鍵掃描 task0.C圖3.2.4.1 按鍵掃描任務(wù)流
32、程圖 按鍵輸入需要要實(shí)現(xiàn)以下功能:按鍵去抖動,快速單次觸發(fā),長按單次觸發(fā),長按多次連續(xù)觸發(fā),同 一按鍵既有長按又有短按功能。流程圖如圖3.2.4.1所示。 由于該任務(wù)在一定的頻度執(zhí)行,通過定義狀態(tài)機(jī)記錄該任務(wù)的歷史運(yùn)行狀態(tài),由于一次按鍵不能立 即確定鍵值,需要去抖動處理,我可以用狀態(tài)機(jī)把首次按鍵記住,在二次按鍵時確認(rèn)鍵值,同樣,長短按 鍵也是用狀態(tài)機(jī)和計(jì)數(shù)器控制,通過任務(wù)多次調(diào)用積累時間,從而實(shí)現(xiàn)長延時而又不占用 CPU 資源,這 就是此種定時器中斷的多任務(wù)輪循架構(gòu)程序設(shè)計(jì)的精髓所在。 以 50Hz 的頻度掃描鍵盤,基本不會出現(xiàn)按鍵丟失現(xiàn)象。通過狀態(tài)機(jī)計(jì)數(shù)器控制,去抖動,長短按鍵,單次多次按鍵
33、等各種復(fù)雜的控制,部分程序解讀如下:#define KEY_PORTP3 /定義按鍵接口#define KEY_VALKEY_PORT | 0xc3 /Mini51 板 P3.2-P3.5 有效,有鍵按下則對應(yīng)位為 0#define KEY00xfb /P3.2#define KEY10xf7 /P3.3#define KEY20xef /P3.4#define KEY30xdf /P3.5 以上對硬件接口進(jìn)行定義,這樣做的好處是當(dāng)硬件接口改變后,程序容易修改,這種程序設(shè)計(jì)思想很 重要。#define KEY0_UP 0x15#define KEY1_UP 0x16#define KEY2_U
34、P 0x17#define KEY3_UP 0x18 以上定義按鍵彈起對應(yīng)按鍵的關(guān)聯(lián)狀態(tài),數(shù)據(jù)本身沒有實(shí)際意義,只要不重復(fù)就行,由于在程序中多 處使用,如果使用常數(shù),程序可讀性差,容易出錯。#define LONG_DN_TIME 50*2;/長按鍵時間設(shè)置,2s,其中 50 為本任務(wù)執(zhí)行頻度#define WAIT_DN_TIME 50*1;/長按鍵過度到連續(xù)任務(wù)執(zhí)行時間間隔 1s#define CONU_DO_TIME 50*0.2;/長按鍵連續(xù)執(zhí)行頻度,時間間隔 0.2Svoid task0_init(void)/任務(wù)初始化,在主程序 sys_init()中調(diào)用KEY_PORT = 0x
35、ff;/按鍵端口初始化 本任務(wù)開始時需要執(zhí)行一次的任務(wù)初始化函數(shù),在主程序 sys_init()中調(diào)用,僅僅執(zhí)行一次。void task0(void)static uchar state_dn = 0;/有鍵按下狀態(tài)機(jī)變量static uchar state_up = 0;/按鍵釋放狀態(tài)機(jī)變量static uchar key_ldn_cnt = 0;/長按鍵計(jì)數(shù)器,控制長按鍵時間uchar key_num;/鍵值變量key_num = KEY_VAL;/一次性讀取鍵值if(key_num != 0xff)/判斷是否有鍵按下switch (state_dn)/采用狀態(tài)機(jī)記住前后按鍵變化情況els
36、e /按鍵釋放觸發(fā)任務(wù)執(zhí)行switch (state_up)3.2.4.2 LCD 顯示 task1.C圖3.2.4.2 LCD 顯示刷新流程圖 LCD 顯示刷新流程圖如圖 4 所示,給 LCD 分配全局變量顯示緩沖區(qū)并在獨(dú)立任務(wù)中周期刷新顯示, 這樣做的好處是程序設(shè)計(jì)思路清晰,各任務(wù)獨(dú)立,程序可讀性好,缺點(diǎn)是占用太多存,沒有更新的數(shù)據(jù) 也不斷刷新,浪費(fèi)了 CPU 資源。 LCD 驅(qū)動程序在頭文件 lcd1602.h 中,其他任務(wù)通過全局變量 str_buff 和 fly_space 控制該模塊運(yùn)行效 果。閃爍控制原理是根據(jù)閃爍控制標(biāo)志位,周期替換顯示容為空白字符符。部分程序解讀如下:#inc
37、lude "main.h"#include "lcd1602.h"uchar str_buff32; /定義全局顯示緩沖區(qū)uchar fly_space;/定義全局閃爍位置控制變量,其它任務(wù)要用該變量需要加前綴 extern 聲明void task1_init(void)/本任務(wù)初始化,在主程序中調(diào)用一次unsigned char i;lcd1602_init();for(i=0;i<32;i+) str_buffi=' 'fly_space = 0xff;/首先關(guān)閉閃爍標(biāo)志void task1(void)static uchar
38、fly_cnt=0;/閃爍頻度控制if(fly_space!=0xff)fly_cnt+;if(fly_cnt < 3)str_bufffly_space=' '/將顯示容用空白字符替換,產(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 實(shí)時時鐘讀取 task3.C圖3.2.4.3 時鐘讀取描任務(wù)流程
39、圖 實(shí)時時鐘讀取任務(wù)相對簡單,由于秒鐘每秒更新一次,為了實(shí)現(xiàn)較好的顯示效果,每秒至少讀 3 次以 上,所以本任務(wù)的執(zhí)行頻度設(shè)定為 3 次,與時間相關(guān)的控制任務(wù),如鬧鐘,整點(diǎn)報時都放在這里。3.2.4.4 蜂鳴器發(fā)聲 task4.C 蜂鳴器是 IO 口驅(qū)動的簡單開關(guān)控制,Mini51 板上的蜂鳴器是采用的有源蜂鳴器,接通電源就發(fā)出單 音頻聲音,單片機(jī)的控制只是控制其發(fā)聲時長和開關(guān)頻度,從而產(chǎn)生不同的效果,看似“接通”“延時”“斷 開”如此簡單的控制,如果考慮多任務(wù)模式,不用常規(guī)死循環(huán)延時(那樣極大的浪費(fèi) CPU 資源,不適合 多任務(wù)模式),還要實(shí)現(xiàn)多種發(fā)聲模式可選擇,這就需要我們突破傳統(tǒng)程序設(shè)計(jì)
40、思路,這里還是基于定時 器中斷任務(wù)輪詢的思路,采用狀態(tài)機(jī)控制,程序流程圖如圖所示,這里實(shí)現(xiàn)了單次短發(fā)聲,單次長發(fā)聲, 連續(xù)短發(fā)聲,連續(xù)長發(fā)聲,根據(jù)需要還可以添加更多種發(fā)聲模式,這樣在其它需要發(fā)聲處,只要給出發(fā)聲模式即可。蜂鳴發(fā)聲主要用在按鍵響應(yīng),鬧鐘提示,整點(diǎn)報時處。圖3.2.4.4 蜂鳴器多模式發(fā)聲任務(wù)流程圖部分程序解讀如下:#include "main.h"/*蜂鳴器模式定義*/#define BM0 0x01#define BM1 0x02#define BM2 0x11#define BM3 0x22#define ON 0#define OFF 1#define
41、BUZZR(x) BUZZR=(x)sbit BUZZR = P10;/蜂鳴器接口定義uchar beep_modle;/發(fā)聲模式選擇全局變量,其它任務(wù)過該變量啟動蜂鳴器發(fā)聲void task3_init(void)beep_modle = BM0;/初始蜂鳴器模式 1,系統(tǒng)復(fù)位啟動發(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 =
42、 0;break;case BM1: /模式 1,單次長聲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; br
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 3903.6-2024鞋類整鞋試驗(yàn)方法防滑性能
- 客戶答謝會致辭(15篇)
- 感恩父母演講稿(19篇)
- 堅(jiān)持新發(fā)展說課
- 當(dāng)幸福來敲門觀后感集合15篇
- 初級會計(jì)實(shí)務(wù)-初級會計(jì)《初級會計(jì)實(shí)務(wù)》模擬試卷93
- 智研咨詢發(fā)布-2024年中國智能物聯(lián)網(wǎng)(AIOT)行業(yè)市場競爭格局、行業(yè)政策及需求規(guī)模預(yù)測報告
- 2025年有機(jī)肥行業(yè)發(fā)展趨勢分析報告
- 二零二五年度駕駛員勞務(wù)派遣合同協(xié)議書3篇
- 應(yīng)急預(yù)案的知識普及
- 2023-2024年員工三級安全培訓(xùn)考試題及參考答案(綜合題)
- 對口升學(xué)語文模擬試卷(6)-江西?。ń馕霭妫?/a>
- 招標(biāo)采購基礎(chǔ)知識培訓(xùn)
- 五年級口算題卡每天100題帶答案
- 2025屆新高考英語復(fù)習(xí)閱讀理解說明文解題策略
- 《社區(qū)康復(fù)》課件-第一章 總論
- 上海中考英語考綱詞匯
- 【工商管理專業(yè)畢業(yè)綜合訓(xùn)練報告2600字(論文)】
- 2024年全國初中數(shù)學(xué)聯(lián)合競賽試題參考答案及評分標(biāo)準(zhǔn)
- 《幼兒園健康》課件精1
- 22S803 圓形鋼筋混凝土蓄水池
評論
0/150
提交評論