|

第一章、 總述
本智能小車(chē)采用80C51單片機(jī)為控制核心,利用超聲波傳感器檢測(cè)道路上的障礙,控制電動(dòng)小汽車(chē)的自動(dòng)避障,快慢速行駛,以及自動(dòng)停車(chē),并可以自動(dòng)記錄時(shí)間、里程和速度,自動(dòng)尋跡和尋光功能。整個(gè)系統(tǒng)的電路結(jié)構(gòu)簡(jiǎn)單,可靠性能高。本文著重介紹了該系統(tǒng)的硬件設(shè)計(jì)方法及測(cè)試結(jié)果分析。
采用的技術(shù)主要有:
(1)通過(guò)編程來(lái)控制小車(chē)的速度;
(2)傳感器的有效應(yīng)用;
(3)新型顯示芯片的采用.
具體實(shí)現(xiàn):在現(xiàn)有玩具電動(dòng)車(chē)的基礎(chǔ)上,加裝光電、紅外線(xiàn)、超聲波傳感器及金屬探測(cè)器,實(shí)現(xiàn)對(duì)電動(dòng)車(chē)的速度、位置、運(yùn)行狀況的實(shí)時(shí)測(cè)量,并將測(cè)量數(shù)據(jù)傳送至單片機(jī)進(jìn)行處理,然后由單片機(jī)根據(jù)所檢測(cè)的各種數(shù)據(jù)實(shí)現(xiàn)對(duì)電動(dòng)車(chē)的智能控制。這種方案能實(shí)現(xiàn)對(duì)電動(dòng)車(chē)的運(yùn)動(dòng)狀態(tài)進(jìn)行實(shí)時(shí)控制,控制靈活、可靠,精度高,可滿(mǎn)足對(duì)系統(tǒng)的各項(xiàng)要求。本設(shè)計(jì)采用MCS-51系列中的80C51單片機(jī)。以80C51為控制核心,利用超聲波傳感器檢測(cè)道路上的障礙,控制電動(dòng)小汽車(chē)的自動(dòng)避障,快慢速行駛,以及自動(dòng)停車(chē),并可以自動(dòng)記錄時(shí)間、里程和速度,自動(dòng)尋跡和尋光功能。80C51引腳如下所示:
80C51芯片資料:
80C51英文資料.pdf
(368.61 KB, 下載次數(shù): 15)
2019-7-17 01:35 上傳
點(diǎn)擊文件名下載附件
一 、直流調(diào)速系統(tǒng) 方案一:串電阻調(diào)速系統(tǒng)。 方案二:靜止可控整流器。簡(jiǎn)稱(chēng)V-M系統(tǒng)。
方案三:脈寬調(diào)速系統(tǒng)。
- 旋轉(zhuǎn)變流系統(tǒng)由交流發(fā)電機(jī)拖動(dòng)直流電動(dòng)機(jī)實(shí)現(xiàn)變流,由發(fā)電機(jī)給需要調(diào)速的直流電動(dòng)機(jī)供電,調(diào)節(jié)發(fā)電機(jī)的勵(lì)磁電流即可改變其輸出電壓,從而調(diào)節(jié)電動(dòng)機(jī)的轉(zhuǎn)速。改變勵(lì)磁電流的方向則輸出電壓的極性和電動(dòng)機(jī)的轉(zhuǎn)向都隨著改 變,所以G-M系統(tǒng)的可逆運(yùn)行是很容易實(shí)現(xiàn)的。該系統(tǒng)需要旋轉(zhuǎn)變流機(jī)組,至少包含兩臺(tái)與調(diào)速電動(dòng)機(jī)容量相當(dāng)?shù)男D(zhuǎn)電機(jī),還要一臺(tái)勵(lì)磁發(fā)電機(jī),設(shè)備多、體積大、費(fèi)用高、效率低、維護(hù)不方便且技術(shù)落后,因此擱置不用。
- V-M系統(tǒng)是當(dāng)今直流調(diào)速系統(tǒng)的主要形式。它可以是單相、三相或更多相數(shù),半波、全波、半控、全控等類(lèi)型,可實(shí)現(xiàn)平滑調(diào)速。V-M系統(tǒng)的缺點(diǎn)是晶閘管的單向?qū)щ娦裕辉试S電流反向,給系統(tǒng)的可逆運(yùn)行造成困難。它的另一個(gè)缺點(diǎn)是運(yùn)行條件要求高,維護(hù)運(yùn)行麻煩。最后,當(dāng)系統(tǒng)處于低速運(yùn)行時(shí),系統(tǒng)的功率因數(shù)很低,并產(chǎn)生較大的諧波電流危害附近的用電設(shè)備。
- 采用晶閘管的直流斬波器基本原理與整流電路不同的是,在這里晶閘管不受相位控制,而是工作在開(kāi)關(guān)狀態(tài)。當(dāng)晶閘管被觸發(fā)導(dǎo)通時(shí),電源電壓加到電動(dòng)機(jī)上,當(dāng)晶閘管關(guān)斷時(shí),直流電源與電動(dòng)機(jī)斷開(kāi),電動(dòng)機(jī)經(jīng)二極管續(xù)流,兩端電壓接近于零。脈沖寬度調(diào)制(Pulse Width Modulation),簡(jiǎn)稱(chēng)PWM。脈沖周期不變,只改變晶閘管的導(dǎo)通時(shí)間,即通過(guò)改變脈沖寬度來(lái)進(jìn)行直流調(diào)速。
與V-M系統(tǒng)相比,PWM調(diào)速系統(tǒng)有下列優(yōu)點(diǎn):
(1)由于PWM調(diào)速系統(tǒng)的開(kāi)關(guān)頻率較高,僅靠電樞電感的濾波作用就可以獲得脈動(dòng)很小的直流電流,電樞電流容易連續(xù),系統(tǒng)的低速運(yùn)行平穩(wěn),調(diào)速范圍較寬,可達(dá)1:10000左右。由于電流波形比V-M系統(tǒng)好,在相同的平均電流下,電動(dòng)機(jī)的損耗和發(fā)熱都比較小。
(2)同樣由于開(kāi)關(guān)頻率高,若與快速響應(yīng)的電機(jī)相配合,系統(tǒng)可以獲得很寬的頻帶,因此快速響應(yīng)性能好,動(dòng)態(tài)抗擾能力強(qiáng)。
(3)由于電力電子器件只工作在開(kāi)關(guān)狀態(tài),主電路損耗較小,裝置效率較高。
根據(jù)以上綜合比較,以及本設(shè)計(jì)中受控電機(jī)的容量和直流電機(jī)調(diào)速的發(fā)展方向,本設(shè)計(jì)采用了H型單極型可逆PWM變換器進(jìn)行調(diào)速。脈寬調(diào)速系統(tǒng)的主電路采用脈寬調(diào)制式變換器,簡(jiǎn)稱(chēng)PWM變換器。脈寬調(diào)速也可通過(guò)單片機(jī)控制繼電器的閉合來(lái)實(shí)現(xiàn),但是驅(qū)動(dòng)能力有限。為順利實(shí)現(xiàn)電動(dòng)小汽車(chē)的前行與倒車(chē),本設(shè)計(jì)采用了可逆PWM變換器?赡鍼WM變換器主電路的結(jié)構(gòu)式有H型、T型等類(lèi)型。在設(shè)計(jì)中采用了常用的雙極式H型變換器,它是由4個(gè)三極電力晶體管和4個(gè)續(xù)流二極管組成的橋式電路。
二 、檢測(cè)系統(tǒng) 檢測(cè)系統(tǒng)主要實(shí)現(xiàn)光電檢測(cè),即利用各種傳感器對(duì)電動(dòng)車(chē)的避障、位置、行車(chē)狀態(tài)進(jìn)行測(cè)量。
1.行車(chē)起始、終點(diǎn)及光線(xiàn)檢測(cè):
本系統(tǒng)采用反射式紅外線(xiàn)光電傳感器用于檢測(cè)路面的起始、終點(diǎn)(2cm寬的黑線(xiàn)),玩具車(chē)底盤(pán)上沿黑線(xiàn)放置一套,以適應(yīng)起始的記數(shù)開(kāi)始和終點(diǎn)的停車(chē)的需要。利用超聲波傳感器檢測(cè)障礙。光線(xiàn)跟蹤,采用光敏三極管接收燈泡發(fā)出的光線(xiàn),當(dāng)感受到光線(xiàn)照射時(shí),其c-e間的阻值下降,檢測(cè)電路輸出高電平,經(jīng)LM393電壓比較器和74LS14施密特觸發(fā)器整形后送單片機(jī)控制。
本系統(tǒng)共設(shè)計(jì)兩個(gè)光電三極管,分別放置在電動(dòng)車(chē)車(chē)頭的左、右兩個(gè)方向,用來(lái)控制電動(dòng)車(chē)的行走方向,當(dāng)左側(cè)光電管受到光照時(shí),單片機(jī)控制轉(zhuǎn)向電機(jī)向左轉(zhuǎn);當(dāng)右側(cè)光電管受到光照時(shí),單片機(jī)控制轉(zhuǎn)向電機(jī)向右轉(zhuǎn);當(dāng)左、右兩側(cè)光電管都受到光照時(shí),單片機(jī)控制直行。見(jiàn)圖2.1 電動(dòng)車(chē)的方向檢測(cè)電路(a)。
行車(chē)方向檢測(cè)電路(見(jiàn)圖2.2 電動(dòng)車(chē)的方向檢測(cè)電路(b))采用反射接收原理配置了一對(duì)紅外線(xiàn)發(fā)射、接收傳感器。該電路包括一個(gè)紅外發(fā)光二極管、一個(gè)紅外光敏三極管及其上拉電阻。紅外發(fā)光二極管發(fā)射一定強(qiáng)度的紅外線(xiàn)照射物體,紅外光敏三極管在接收到反射回來(lái)的紅外線(xiàn)后導(dǎo)通,發(fā)出一個(gè)電平跳變信號(hào)。
此套紅外光電傳感器固定在底盤(pán)前沿,貼近地面。正常行駛時(shí),發(fā)射管發(fā)射紅外光照射地面,光線(xiàn)經(jīng)白紙反射后被接收管接收,輸出高電平信號(hào);電動(dòng)車(chē)經(jīng)過(guò)黑線(xiàn)時(shí),發(fā)射端發(fā)射的光線(xiàn)被黑線(xiàn)吸收,接收端接收不到反射光線(xiàn),傳感器輸出低電平信號(hào)后送80C51單片機(jī)處理,判斷執(zhí)行哪一種預(yù)先編制的程序來(lái)控制玩具車(chē)的行駛狀態(tài)。前進(jìn)時(shí),驅(qū)動(dòng)輪直流電機(jī)正轉(zhuǎn),進(jìn)入減速區(qū)時(shí),由單片機(jī)控制進(jìn)行PWM變頻調(diào)速,通過(guò)軟件改變脈沖調(diào)寬波形的占空比,實(shí)現(xiàn)調(diào)速。最后經(jīng)反接制動(dòng)實(shí)現(xiàn)停車(chē)。前行與倒車(chē)控制電路的核心是橋式電路和繼電器。電橋上設(shè)置有兩組開(kāi)關(guān),一組常閉,另一組常開(kāi)。電橋一端接電源,另一端接了一個(gè)三極管。三極管導(dǎo)通時(shí),電橋通過(guò)三極管接地,電機(jī)電樞中有電流通過(guò);三極管截止時(shí),電橋浮空,電機(jī)電樞中沒(méi)有電流通過(guò)。系統(tǒng)通過(guò)電橋的輸出端為轉(zhuǎn)向電機(jī)供電。通過(guò)對(duì)繼電器開(kāi)閉的控制即可控制電機(jī)的開(kāi)斷和轉(zhuǎn)速方向進(jìn)而達(dá)到控制玩具車(chē)前行與倒車(chē)的目的,實(shí)現(xiàn)隨動(dòng)控制系統(tǒng)的糾偏功能。如圖2.3 前行與倒車(chē)控制電路所示。
圖2.1電動(dòng)車(chē)的方向檢測(cè)電路(a)
圖2.2電動(dòng)車(chē)的方向檢測(cè)電路(b)
圖2.3前行與倒車(chē)控制電路
檢測(cè)放大器方案:
方案一:使用普通單級(jí)比例放大電路。其特點(diǎn)是結(jié)構(gòu)簡(jiǎn)單、調(diào)試方便、價(jià)格低廉。但是也存在著許多不足。如抗干擾能力差、共模抑制比低等。
方案二:采用差動(dòng)放大電路。選擇優(yōu)質(zhì)元件構(gòu)成比例放大電路,雖然可以達(dá)到一定的精度,但有時(shí)仍不能滿(mǎn)足某些特殊要求。例如,在測(cè)量本設(shè)計(jì)中的光電檢測(cè)信號(hào)時(shí)需要把檢測(cè)過(guò)來(lái)的電平信號(hào)放大并濾除干擾,而且要求對(duì)共模干擾信號(hào)具有相當(dāng)強(qiáng)的抑制能力。這種情況下須采用差動(dòng)放大電路,并應(yīng)設(shè)法減小溫漂。但在實(shí)際操作中,往往滿(mǎn)足了高共模抑制比的要求,卻使運(yùn)算放大器輸出飽和;為獲得單片機(jī)能識(shí)別的TTL電平卻又無(wú)法抑制共模干擾。
方案三:電壓比較器方案。電壓比較器的功能是比較兩個(gè)電壓的大小,例如將一個(gè)信號(hào)電壓Ui和一個(gè)參考電壓Ur進(jìn)行比較,在Ui>Ur和Ui<Ur兩種不同情況下,電壓比較器輸出兩個(gè)不同的電平,即高電平和低電平。而Ui變化經(jīng)過(guò)Ur時(shí),比較器的輸出將從一個(gè)電壓跳變到另一個(gè)電平。比較器有各種不同的類(lèi)型。對(duì)它的要求是:鑒別要準(zhǔn)確,反應(yīng)要靈敏,動(dòng)作要迅速,抗干擾能力要強(qiáng),還應(yīng)有一定的保護(hù)措施,以防止因過(guò)電壓或過(guò)電流而造成器件損壞。
比較器的特點(diǎn):
⑴ 工作在開(kāi)環(huán)或正反饋狀態(tài)。放大、運(yùn)算電路為了實(shí)現(xiàn)性能穩(wěn)定并滿(mǎn)足
一定的精度要求,這些電路中的運(yùn)放均引入了深度負(fù)反饋;而為了提高比較器的反應(yīng)速度和靈敏度,它所采用的運(yùn)放不但沒(méi)有引入負(fù)反饋,有時(shí)甚至還加正反饋。因此比較器的性能分析方法與放大、運(yùn)算電路是不同的。
⑵ 非線(xiàn)性。由于比較器中運(yùn)放處于開(kāi)環(huán)或正反饋狀態(tài),它的兩個(gè)輸入端之間的電位差與開(kāi)環(huán)電壓放大倍數(shù)的乘積通常超過(guò)最大輸出電壓,使其內(nèi)部某些管子進(jìn)入飽和區(qū)或截止區(qū),因此在絕大多數(shù)情況下輸出與輸入不成線(xiàn)性關(guān)系,即在放大、運(yùn)算等電路中常用的計(jì)算方法對(duì)于比較器不再適用。
⑶ 開(kāi)關(guān)特性。比較器的輸出通常只有高電平和低電平兩種穩(wěn)定狀態(tài),因此它相當(dāng)與一個(gè)受輸入信號(hào)控制的開(kāi)關(guān),當(dāng)輸入電壓經(jīng)過(guò)閾值時(shí)開(kāi)關(guān)動(dòng)作,使輸出從一個(gè)電平跳變到另一個(gè)電平。由于比較器的輸入信號(hào)是模擬量,而它的輸出電平是離散的,因此電壓比較器可作為模擬電路與數(shù)字電路之間的過(guò)渡電路。
由于比較器的上述特點(diǎn),在分析時(shí)既不能象對(duì)待放大電路那樣去計(jì)算放大倍數(shù),也不能象分析運(yùn)算電路那樣去求解輸出與輸入的函數(shù)關(guān)系,而應(yīng)當(dāng)著重抓住比較器的輸出從一個(gè)電平跳變到另一個(gè)電平的臨界條件所對(duì)應(yīng)的輸入電壓值(閾值)來(lái)分析輸入量與輸出量之間的關(guān)系。
如果在比較器的輸入端加理想階躍信號(hào),那么在理想情況下比較器的輸出也應(yīng)當(dāng)是理想的階躍電壓,而且沒(méi)有延遲。但實(shí)際集成運(yùn)放的最大轉(zhuǎn)換速率總是有限的,因此比較器輸出電壓的跳變不可能是理想的階躍信號(hào)。電壓比較器的輸出從低電平變?yōu)楦唠娖剿毜臅r(shí)間稱(chēng)為響應(yīng)時(shí)間。響應(yīng)時(shí)間越短,響應(yīng)速度越快。
減小比較器響應(yīng)時(shí)間的主要方法有:
(1) 盡可能使輸入信號(hào)接近理想情況,使它在閾值附近的變化接近理想階躍
且幅度足夠大。
(2) 選用集成電壓比較器。
(3) 如果選用集成運(yùn)放構(gòu)成比較器,為了提高響應(yīng)速度可以加限幅措施,以避免集成運(yùn)放內(nèi)部的管子進(jìn)入深飽和區(qū)。具體措施多為在集成運(yùn)放的兩個(gè)輸入端并聯(lián)二極管。如圖2.4 電壓比較器電路所示:
圖2.4 電壓比較器電路
在本設(shè)計(jì)中,光電傳感器只輸出一種高低電平信號(hào)且伴有外界雜波干擾,所以我們嘗試采用了一種滯回比較器。簡(jiǎn)單電壓比較器結(jié)構(gòu)簡(jiǎn)單,而且靈敏度高,但它的抗干擾能力差,也就是說(shuō)如果輸入信號(hào)因受干擾在閾值附近變化,則比較器輸出就會(huì)反復(fù)的從一個(gè)電平跳到另一個(gè)電平。如果用這樣的輸出電壓控制電機(jī)或繼電器,將出現(xiàn)頻繁動(dòng)作或起停現(xiàn)象。這種情況,通常是不允許的。而滯回比較器則解決了這個(gè)問(wèn)題。滯回比較器有兩個(gè)數(shù)值不同的閾值,當(dāng)輸入信號(hào)因受干擾或其他原因發(fā)生變化時(shí),只要變化量不超過(guò)兩個(gè)閾值之差,滯回比較器的輸出電壓就不會(huì)來(lái)回變化。所以抗干擾能力強(qiáng)。但是,滯回比較器畢竟是模擬器件,溫度的漂移是它無(wú)法消除的。
方案四:施密特觸發(fā)器。綜合考慮系統(tǒng)的各項(xiàng)性能,最后我們決定采用數(shù)字器件——施密特觸發(fā)器。施密特觸發(fā)器是雙穩(wěn)態(tài)觸發(fā)器的變形,它有兩個(gè)穩(wěn)定狀態(tài),觸發(fā)方式為電平觸發(fā),只要外加觸發(fā)信號(hào)的幅值增加到足夠大,它就從一個(gè)穩(wěn)定狀態(tài)翻轉(zhuǎn)到另一個(gè)穩(wěn)定狀態(tài)。施密特觸發(fā)器具有與滯回比較器相類(lèi)似的滯回特性,但施密特觸發(fā)器的抗干擾能力比滯回比較器更強(qiáng)。
2.行車(chē)距離檢測(cè)
由于紅外檢測(cè)具有反應(yīng)速度快、定位精度高,可靠性強(qiáng)以及可見(jiàn)光傳感器所不能比擬的優(yōu)點(diǎn),故采用紅外光電碼盤(pán)測(cè)速方案。具體電路同圖2.5 行車(chē)距離檢測(cè)電路所示:
圖2.5 行車(chē)距離檢測(cè)電路
紅外測(cè)距儀由測(cè)距輪,遮光盤(pán),紅外光電耦合器及凹槽型支架組成的。測(cè)長(zhǎng)輪的周長(zhǎng)為記數(shù)的單位,最好取有效值為單一的數(shù)值(如本設(shè)計(jì)中采用0.1米),精度根據(jù)電動(dòng)車(chē)控制的需要確定。測(cè)距輪安裝在車(chē)輪上,這樣能使記數(shù)值準(zhǔn)確一些。遮光盤(pán)有一缺口,盤(pán)下方的凹形物為槽型光電耦合器,其兩端高出部分的里面分別裝有紅外發(fā)射管和紅外接收管。遮光盤(pán)在凹槽中轉(zhuǎn)動(dòng)時(shí),缺口進(jìn)入凹槽時(shí),紅外線(xiàn)可以通過(guò),缺口離開(kāi)凹槽紅外線(xiàn)被阻擋。由此可見(jiàn),測(cè)距輪每轉(zhuǎn)一周,紅外光接收管均能接收到一個(gè)脈沖信號(hào)經(jīng)過(guò)整形器后送入計(jì)數(shù)器或直接送入單片機(jī)中。
為實(shí)現(xiàn)可逆記數(shù)功能,我們?cè)跍y(cè)距儀中并列放置了兩個(gè)槽型光電耦合器,遮光盤(pán)先后通過(guò)凹槽可產(chǎn)生兩個(gè)脈沖信號(hào)。根據(jù)兩個(gè)脈沖信號(hào)發(fā)生的先后順序與兩個(gè)光電耦合器的位置關(guān)系,即可計(jì)算出玩具車(chē)的行駛方向(前進(jìn)或后退)。
遮光盤(pán)及槽型光電耦合器均安裝在不透光的盒子里,以避免外界光線(xiàn)的干擾,使電路不能正常工作。
測(cè)距原理:將光柵安裝在電機(jī)軸上,當(dāng)電機(jī)轉(zhuǎn)動(dòng)時(shí),光柵也隨之轉(zhuǎn)動(dòng),同時(shí)安裝在光柵一側(cè)的紅外發(fā)光二極管點(diǎn)亮,在光柵的另一側(cè)設(shè)有紅外三極管,用于接收紅外發(fā)光二極管發(fā)出的紅外線(xiàn)信號(hào)。由于光柵隨電機(jī)高速轉(zhuǎn)動(dòng),則紅外線(xiàn)三極管接收到的就是一系列脈沖信號(hào)。將該信號(hào)傳輸?shù)?0C51單片機(jī)的內(nèi)部計(jì)數(shù)器計(jì)數(shù),根據(jù)預(yù)先實(shí)測(cè)的數(shù)據(jù)換算關(guān)系即可計(jì)算出電動(dòng)機(jī)車(chē)的行車(chē)距離。
三、顯示電路
本設(shè)計(jì)中用兩片4位八段數(shù)碼作顯示器,并具有雙重功能,在小車(chē)不行駛時(shí)其中一片顯示年、月,另一片顯示時(shí)、分; 當(dāng)小車(chē)行駛時(shí),分別顯示時(shí)間和行駛距離。
四 、系統(tǒng)原理圖 簡(jiǎn)易智能電動(dòng)車(chē)采用80C51單片機(jī)進(jìn)行智能控制。開(kāi)始由手動(dòng)啟動(dòng)小車(chē),并復(fù)位,當(dāng)經(jīng)過(guò)規(guī)定的起始黑線(xiàn),由超聲波傳感器和紅外光電傳感器檢測(cè),通過(guò)單片機(jī)控制小車(chē)開(kāi)始記數(shù)顯示并避障、調(diào)速;系統(tǒng)的自動(dòng)避障功能通過(guò)超聲波傳感器正前方檢測(cè)和紅外光電傳感器左右側(cè)檢測(cè),由單片機(jī)控制實(shí)現(xiàn);在電動(dòng)車(chē)進(jìn)駛過(guò)程中,采用雙極式H型PWM脈寬調(diào)制技術(shù),以提高系統(tǒng)的靜動(dòng)態(tài)性能;采用動(dòng)態(tài)共陰顯示行駛時(shí)間和里程。 系統(tǒng)原理圖如圖2.6所示。 圖2.6 系統(tǒng)原理圖
第三章、 硬件設(shè)計(jì)
單片機(jī)應(yīng)用系統(tǒng)的硬件電路設(shè)計(jì)包含有兩部分內(nèi)容: 一是系統(tǒng)擴(kuò)展,即單片機(jī)內(nèi)部的功能單元,如ROM﹑RAM﹑I/O口﹑定時(shí)/記數(shù)器﹑中斷系統(tǒng)等能量不能滿(mǎn)足應(yīng)用系統(tǒng)的要求時(shí),必須在片外進(jìn)行擴(kuò)展,選擇適當(dāng)?shù)男酒,設(shè)計(jì)相應(yīng)的電路。 二是系統(tǒng)配置,既按照系統(tǒng)功能要求配置外圍設(shè)備,如鍵盤(pán)顯示器﹑打印機(jī)﹑A/D﹑D/A轉(zhuǎn)換器等,要設(shè)計(jì)合適的接口電路。
一 、80C51單片機(jī)硬件結(jié)構(gòu) 80C51單片機(jī)是把那些作為控制應(yīng)用所必需的基本內(nèi)容都集成在一個(gè)尺寸有限的集成電路芯片上[2]。如果按功能劃分,它由如下功能部件組成,即微處理器、數(shù)據(jù)存儲(chǔ)器、程序存儲(chǔ)器、并行I/O口、串行口、定時(shí)器/計(jì)數(shù)器、中斷系統(tǒng)及特殊功能寄存器。它們都是通過(guò)片內(nèi)單一總線(xiàn)連接而成,其基本結(jié)構(gòu)依舊是CPU加上外圍芯片的傳統(tǒng)結(jié)構(gòu)模式。但對(duì)各種功能部件的控制是采用特殊功能寄存器的集中控制方式。 - 1、微處理器:該單片機(jī)中有一個(gè)8位的微處理器,與通用的微處理器基本相同,同樣包括了運(yùn)算器和控制器兩大部分,只是增加了面向控制的處理功能,不僅可處理數(shù)據(jù),還可以進(jìn)行位變量的處理。
- 2、數(shù)據(jù)存儲(chǔ)器:片內(nèi)為128個(gè)字節(jié),片外最多可外擴(kuò)至64k字節(jié),用來(lái)存儲(chǔ)程序在運(yùn)行期間的工作變量、運(yùn)算的中間結(jié)果、數(shù)據(jù)暫存和緩沖、標(biāo)志位等,所以稱(chēng)為數(shù)據(jù)存儲(chǔ)器。
- 3、程序存儲(chǔ)器:由于受集成度限制,片內(nèi)只讀存儲(chǔ)器一般容量較小,如果片內(nèi)的只讀存儲(chǔ)器的容量不夠,則需用擴(kuò)展片外的只讀存儲(chǔ)器,片外最多可外擴(kuò)至64k字節(jié)。
- 4、中斷系統(tǒng):具有5個(gè)中斷源,2級(jí)中斷優(yōu)先權(quán)。
- 5、定時(shí)器/計(jì)數(shù)器:片內(nèi)有2個(gè)16位的定時(shí)器/計(jì)數(shù)器, 具有四種工作方式。
- 6、串行口:1個(gè)全雙工的串行口,具有四種工作方式。可用來(lái)進(jìn)行串行通訊,擴(kuò)展并行I/O口,甚至與多個(gè)單片機(jī)相連構(gòu)成多機(jī)系統(tǒng),從而使單片機(jī)的功能更強(qiáng)且應(yīng)用更廣。
- 7、P1口、P2口、P3口、P4口為4個(gè)并行8位I/O口。
- 8、特殊功能寄存器:共有21個(gè),用于對(duì)片內(nèi)的個(gè)功能的部件進(jìn)行管理、控制、監(jiān)視。實(shí)際上是一些控制寄存器和狀態(tài)寄存器,是一個(gè)具有特殊功能的RAM區(qū)。
由上可見(jiàn),80C51單片機(jī)的硬件結(jié)構(gòu)具有功能部件種類(lèi)全,功能強(qiáng)等特點(diǎn)。特別值得一提的是該單片機(jī)CPU中的位處理器,它實(shí)際上是一個(gè)完整的1位微計(jì)算機(jī),這個(gè)一位微計(jì)算機(jī)有自己的CPU、位寄存器、I/O口和指令集。1位機(jī)在開(kāi)關(guān)決策、邏輯電路仿真、過(guò)程控制方面非常有效;而8位機(jī)在數(shù)據(jù)采集,運(yùn)算處理方面有明顯的長(zhǎng)處。MCS-51單片機(jī)中8位機(jī)和1位機(jī)的硬件資源復(fù)合在一起,二者相輔相承,它是單片機(jī)技術(shù)上的一個(gè)突破,這也是MCS-51單片機(jī)在設(shè)計(jì)的精美之處。
二 、最小應(yīng)用系統(tǒng)設(shè)計(jì) 80C51是片內(nèi)有ROM/EPROM的單片機(jī),因此,這種芯片構(gòu)成的最小系統(tǒng)簡(jiǎn)單﹑可靠。用80C51單片機(jī)構(gòu)成最小應(yīng)用系統(tǒng)時(shí),只要將單片機(jī)接上時(shí)鐘電路和復(fù)位電路即可,如圖3.1 80C51單片機(jī)最小系統(tǒng)所示。由于集成度的限制,最小應(yīng)用系統(tǒng)只能用作一些小型的控制單元。其應(yīng)用特點(diǎn): (1)有可供用戶(hù)使用的大量I/O口線(xiàn)。 (2)內(nèi)部存儲(chǔ)器容量有限。 (3)應(yīng)用系統(tǒng)開(kāi)發(fā)具有特殊性。
圖3.1 80C51單片機(jī)最小系統(tǒng)
1、時(shí)鐘電路
80C51雖然有內(nèi)部振蕩電路,但要形成時(shí)鐘,必須外部附加電路。80C51單片機(jī)的時(shí)鐘產(chǎn)生方法有兩種。內(nèi)部時(shí)鐘方式和外部時(shí)鐘方式。
本設(shè)計(jì)采用內(nèi)部時(shí)鐘方式,利用芯片內(nèi)部的振蕩電路,在XTAL1、XTAL2引腳上外接定時(shí)元件,內(nèi)部的振蕩電路便產(chǎn)生自激振蕩。本設(shè)計(jì)采用最常用的內(nèi)部時(shí)鐘方式,即用外接晶體和電容組成的并聯(lián)諧振回路。振蕩晶體可在1.2MHZ到12MHZ之間選擇。電容值無(wú)嚴(yán)格要求,但電容取值對(duì)振蕩頻率輸出的穩(wěn)定性、大小、振蕩電路起振速度有少許影響,CX1、CX2可在20pF到100pF之間取值,但在60pF到70pF時(shí)振蕩器有較高的頻率穩(wěn)定性。所以本設(shè)計(jì)中,振蕩晶體選擇6MHZ,電容選擇65pF。在設(shè)計(jì)印刷電路板時(shí),晶體和電容應(yīng)盡可能靠近單片機(jī)芯片安裝,以減少寄生電容,更好的保證振蕩器穩(wěn)定和可靠地工作。為了提高溫度穩(wěn)定性,應(yīng)采用NPO電容。
2、復(fù)位電路
80C51的復(fù)位是由外部的復(fù)位電路來(lái)實(shí)現(xiàn)的。復(fù)位引腳RST通過(guò)一個(gè)斯密特觸發(fā)器用來(lái)抑制噪聲,在每個(gè)機(jī)器周期的S5P2,斯密特觸發(fā)器的輸出電平由復(fù)位電路采樣一次,然后才能得到內(nèi)部復(fù)位操作所需要的信號(hào)。
復(fù)位電路通常采用上電自動(dòng)復(fù)位和按鈕復(fù)位兩種方式。
最簡(jiǎn)單的上電自動(dòng)復(fù)位電路中上電自動(dòng)復(fù)位是通過(guò)外部復(fù)位電路的電容充電來(lái)實(shí)現(xiàn)的。只要Vcc的上升時(shí)間不超過(guò)1ms,就可以實(shí)現(xiàn)自動(dòng)上電復(fù)位。時(shí)鐘頻率用6MHZ時(shí)C取22uF,R取1KΩ。
除了上電復(fù)位外,有時(shí)還需要按鍵手動(dòng)復(fù)位。本設(shè)計(jì)就是用的按鍵手動(dòng)復(fù)位。按鍵手動(dòng)復(fù)位有電平方式和脈沖方式兩種。其中電平復(fù)位是通過(guò)RST端經(jīng)電阻與電源Vcc接通而實(shí)現(xiàn)的。按鍵手動(dòng)復(fù)位電路見(jiàn)圖3.2。時(shí)鐘頻率選用6MHZ時(shí),C取22uF,Rs取200Ω,RK取1KΩ。
圖3.2 80C51復(fù)位電路
三、 前向通道設(shè)計(jì)
單片機(jī)用與測(cè)控系統(tǒng)時(shí),總要有與被測(cè)對(duì)象相聯(lián)系的前向通道。因此,前向通道設(shè)計(jì)與被測(cè)對(duì)象的狀態(tài)、特征、所處環(huán)境密切相關(guān)。在前向通道設(shè)計(jì)時(shí)要考慮到傳感器或敏感元件選擇、通道結(jié)構(gòu)、信號(hào)調(diào)節(jié)、電源配置、抗干擾設(shè)計(jì)等。在通道電路設(shè)計(jì)中還涉及到模擬電路諸多問(wèn)題。
1﹑前向通道的含義
當(dāng)將單片機(jī)用作測(cè)﹑控系統(tǒng)時(shí),系統(tǒng)中總要有被測(cè)信號(hào)輸入通道,有計(jì)算機(jī)拾取必要的輸入信息。作為測(cè)試系統(tǒng),對(duì)被測(cè)對(duì)象拾取必要的原始參量信號(hào)是系統(tǒng)的核心任務(wù),對(duì)控制系統(tǒng)來(lái)說(shuō),對(duì)被控對(duì)象狀態(tài)的測(cè)試以及對(duì)控制條件的監(jiān)測(cè)也是不可缺少的環(huán)節(jié)。對(duì)被測(cè)對(duì)象狀態(tài)的測(cè)試一般都離不開(kāi)傳感器或敏感元件,這是因?yàn)楸粶y(cè)對(duì)象的狀態(tài)參數(shù)常常是一些非電物理量,如溫度、壓力、載荷、位移等,而計(jì)算機(jī)是一個(gè)數(shù)字電路系統(tǒng)。因此,在前向通道中,傳感器、敏感元件及其相關(guān)電路占有重要地位。
對(duì)被測(cè)對(duì)象的信號(hào)的拾取其主要任務(wù)就是最忠實(shí)地反映被測(cè)對(duì)象的真實(shí)狀態(tài),它包括實(shí)時(shí)性與測(cè)量精度。同時(shí)使這些測(cè)量信號(hào)能滿(mǎn)足計(jì)算機(jī)輸入接口的電平要求。
因此,單片機(jī)應(yīng)用系統(tǒng)中的前向通道體現(xiàn)了被測(cè)對(duì)象與系統(tǒng)相互聯(lián)系的信號(hào)輸入通道,原始參數(shù)輸入通道。由于在該通道中主要是傳感器與傳感器有關(guān)的信號(hào)調(diào)節(jié)、變換電路,故也可稱(chēng)為傳感器接口通道。
在單片機(jī)應(yīng)用系統(tǒng)中,對(duì)信號(hào)輸入、傳感、變換應(yīng)作廣義理解,例如開(kāi)關(guān)量的檢測(cè)及信號(hào)輸入,在單片機(jī)的各種應(yīng)用系統(tǒng)中有著廣泛的應(yīng)用。最簡(jiǎn)單的開(kāi)關(guān)量輸入通道就是一個(gè)具有TTL電平的狀態(tài)開(kāi)關(guān),如水銀溫度觸點(diǎn)、溫度晶閘管、時(shí)間繼電器、限位開(kāi)關(guān)等。故只要反映外界狀態(tài)的信號(hào)輸入通道都可稱(chēng)為前向通道。并不是所有單片機(jī)應(yīng)用系統(tǒng)都有前向通道,例如時(shí)序控制系統(tǒng),只根據(jù)系統(tǒng)內(nèi)部的時(shí)間序列來(lái)控制外部的運(yùn)行狀態(tài);分布式測(cè)控系統(tǒng)中的智能控制總站完成上級(jí)主計(jì)算機(jī)與現(xiàn)場(chǎng)測(cè)、控子站計(jì)算機(jī)之間的指令、數(shù)據(jù)傳送。這些應(yīng)用系統(tǒng)沒(méi)有被測(cè)對(duì)象,故不需要前向通道。
2﹑前向通道的設(shè)計(jì)
(1)傳感器的比較如下識(shí)別障礙的首要問(wèn)題是傳感器的選擇,下面對(duì)幾種傳感器的優(yōu)缺點(diǎn)進(jìn)行說(shuō)。探測(cè)障礙的最簡(jiǎn)單的方法是使用超聲波傳感器,它是利用向目標(biāo)發(fā)射超聲波脈沖,計(jì)算其往返時(shí)間來(lái)判定距離的。該方法被廣泛應(yīng)用于移動(dòng)機(jī)器人的研究上。其優(yōu)點(diǎn)是價(jià)格便宜,易于使用,且在10m以?xún)?nèi)能給出精確的測(cè)量。不過(guò)在ITS系統(tǒng)中除了上文提出的場(chǎng)景限制外,還有以下問(wèn)題。首先因其只能在10m以?xún)?nèi)有效使用,所以并不適合ITS系統(tǒng)。另外超聲波傳感器的工作原理基于聲,即使可以使之測(cè)達(dá)100m遠(yuǎn),但其更新頻率為2Hz,而且還有可能在傳輸中受到它信號(hào)的干擾,所以在CW/ICC系統(tǒng)中使用是不實(shí)際的。
視覺(jué)傳感器在CW系統(tǒng)中使用得非常廣泛。其優(yōu)點(diǎn)是尺寸小,價(jià)格合理,在一定的寬度和視覺(jué)域內(nèi)可以測(cè)量定多個(gè)目標(biāo),并且可以利用測(cè)量的圖像根據(jù)外形和大小對(duì)目標(biāo)進(jìn)行分類(lèi)。但是算法復(fù)雜,處理速度慢。雷達(dá)傳感器在軍事和航空領(lǐng)域已經(jīng)使用了幾十年。主要優(yōu)點(diǎn)是可以魯棒地探測(cè)到障礙而不受天氣或燈光條件限制。近十年來(lái)隨著尺寸及價(jià)格的降低,在汽車(chē)行業(yè)開(kāi)始被使用。但是仍存在性?xún)r(jià)比的問(wèn)題。
(2)超聲波障礙檢測(cè) 超聲波是一種在彈性介質(zhì)中的機(jī)械振蕩,其頻率超過(guò)20KHz,分橫向振蕩和縱向振蕩兩種,超聲波可以在氣體、液體及固體中傳播,其傳播速度不同。它有折射和反射現(xiàn)象,且在傳播過(guò)程中有衰減。利用超聲波的特性,可做成各種超聲波傳感器,結(jié)合不同的電路,可以制成超聲波儀器及裝置,在通訊、醫(yī)療及家電中獲得廣泛應(yīng)用。 作為超聲波傳感器的材料,主要為壓電晶體。壓電晶體組成的超聲波傳感器是一種可逆?zhèn)鞲衅,它可以將電能轉(zhuǎn)變成機(jī)械振蕩而產(chǎn)生超聲波,同時(shí)它接收到超聲波時(shí),也能轉(zhuǎn)變成電能,故它分為發(fā)送器和接收器。超聲波傳感器有透射型、反射型兩種類(lèi)型,常用于防盜報(bào)警器、接近開(kāi)關(guān)、測(cè)距及材料探傷、測(cè)厚等。 本設(shè)計(jì)采用T/R-40-12小型超聲波傳感器作為探測(cè)前方障礙物體的檢測(cè)元件,其中心頻率為40Hz,由80C51發(fā)出的40KHz脈沖信號(hào)驅(qū)動(dòng)超聲波傳感器發(fā)送器發(fā)出40KHz的脈沖超聲波,如電動(dòng)車(chē)前方遇到有障礙物時(shí),此超聲波信號(hào)被障礙物反射回來(lái),由接收器接收,經(jīng)LM318兩級(jí)放大,再經(jīng)帶有鎖相環(huán)的音頻解碼芯片LM567解碼,當(dāng)LM567的輸入信號(hào)大于25mV時(shí),輸出端由高電平變?yōu)榈碗娖,?0C51單片機(jī)處理。超聲波檢測(cè)如圖3.3超聲波檢測(cè)電路所示。
圖 3.3 超聲波檢測(cè)電路
四、后向通道設(shè)計(jì)
在工業(yè)控制系統(tǒng)中,單片機(jī)總要對(duì)控制對(duì)象實(shí)現(xiàn)操作,因此,在這樣的系統(tǒng)中,總要有后向通道。后向通道是計(jì)算機(jī)實(shí)現(xiàn)控制運(yùn)算處理后,對(duì)控制對(duì)象的輸出通道接口。
根據(jù)單片機(jī)的輸出和控制對(duì)象實(shí)現(xiàn)控制信號(hào)的要求,后向通道具有以下特點(diǎn):
(1) 小信號(hào)輸出、大功率控制。根據(jù)目前單片機(jī)輸出功率的限制,不能輸出控制對(duì)象所要求的功率信號(hào)。
(2) 是一個(gè)輸出通道。輸出伺服驅(qū)動(dòng)系統(tǒng)控制信號(hào),而伺服驅(qū)動(dòng)系統(tǒng)中的狀態(tài)反饋信號(hào)通常是作為檢測(cè)信號(hào)輸入前向通道。
(3) 接近控制對(duì)象,環(huán)境惡劣。控制對(duì)象多為大功率伺服驅(qū)動(dòng)機(jī)構(gòu),電磁、機(jī)械干擾較為嚴(yán)重。但后向通道是一個(gè)輸出通道,而且輸出電平較高,不易受到直接損害。但這些干擾易從系統(tǒng)的前向通道竄入。
單片機(jī)在完成控制處理后,總是以數(shù)字信號(hào)通過(guò)I/O口或數(shù)據(jù)總線(xiàn)送給控制對(duì)象。這些數(shù)字信號(hào)形態(tài)主要有開(kāi)關(guān)量、二進(jìn)制數(shù)字量和頻率量,可直接用于開(kāi)關(guān)量、數(shù)字量系統(tǒng)及頻率調(diào)制系統(tǒng),但對(duì)于一些模擬量控制系統(tǒng),則應(yīng)通過(guò)數(shù)/模轉(zhuǎn)換成模擬量控制信號(hào)。
根據(jù)單片機(jī)輸出信號(hào)形態(tài)及控制對(duì)象要求,后向通道應(yīng)解決:
(1} 功率驅(qū)動(dòng)。將單片機(jī)輸出信號(hào)進(jìn)行功率放大,以滿(mǎn)足伺服驅(qū)動(dòng)的功率要求。
(2)干擾防治。主要防治伺服驅(qū)動(dòng)系統(tǒng)通過(guò)信號(hào)通道﹑電源以及空間電磁場(chǎng)對(duì)計(jì)算機(jī)系統(tǒng)的干擾。通常采用信號(hào)隔離﹑電源隔離和對(duì)功率開(kāi)關(guān)實(shí)現(xiàn)過(guò)零切換等方法進(jìn)行干擾防治。
(3)數(shù)/模轉(zhuǎn)換。對(duì)于二進(jìn)制輸出的數(shù)字量采用D/A變換器;對(duì)于頻率量輸出則可以采用本設(shè)計(jì)調(diào)速采用PWM調(diào)速:
為順利實(shí)現(xiàn)電動(dòng)小汽車(chē)的左轉(zhuǎn)和右轉(zhuǎn),本設(shè)計(jì)采用了可逆PWM變換器?赡鍼WM變換器主電路的結(jié)構(gòu)式有H型、T型等類(lèi)型。我們?cè)谠O(shè)計(jì)中采用了常用的雙極式H型變換器,它是由4個(gè)三極電力晶體管和4個(gè)續(xù)流二極管組成的橋式電路。圖3.4為雙極式H型可逆PWM變換器的電路原理圖。4個(gè)電力晶體管的基極驅(qū)動(dòng)電壓分為兩組。VT1和VT4同時(shí)導(dǎo)通和關(guān)斷,其驅(qū)動(dòng)電路中Ub1=Ub4;VT2和VT3同時(shí)動(dòng)作,其驅(qū)動(dòng)電壓Ub2=Ub3= -Ub1。
雙極式PWM變換器的優(yōu)點(diǎn)如下:
(1)電流一定連續(xù);
(2)可使電動(dòng)機(jī)在四象限中運(yùn)行;
(3)電機(jī)停止時(shí)有微振電流,能消除靜摩擦死區(qū);
(4)低速時(shí),每個(gè)晶體管的驅(qū)動(dòng)脈沖仍較寬,有利于保證晶體管可靠導(dǎo)通;
(5)低速平穩(wěn)性好,調(diào)速范圍可達(dá)20000左右。
圖3.4 雙極式H型可逆PWM變換器電路原理圖
1、脈寬調(diào)制原理:
脈寬調(diào)制器本身是一個(gè)由運(yùn)算放大器和幾個(gè)輸入信號(hào)組成的電壓比較器。運(yùn)算放大器工作在開(kāi)換狀態(tài),稍微有一點(diǎn)輸入信號(hào)就可使其輸出電壓達(dá)到飽和值,當(dāng)輸入電壓極性改變時(shí),輸出電壓就在正、負(fù)飽和值之間變化,這樣就完成了把連續(xù)電壓變成脈沖電壓的轉(zhuǎn)換作用。加在運(yùn)算放大器反相輸入端上的有三個(gè)輸入信號(hào)。一個(gè)輸入信號(hào)是鋸齒波調(diào)制信號(hào),另一個(gè)是控制電壓,其極性大小可隨時(shí)改變,與鋸齒波調(diào)制信號(hào)相減,從而在運(yùn)算放大器的輸出端得到周期不變、脈寬可變的調(diào)制輸出電壓。只要改變控制電壓的極性,也就改變了PWM變換器輸出平均電壓的極性,因而改變了電動(dòng)機(jī)的轉(zhuǎn)向.改變控制電壓的大小,則調(diào)節(jié)了輸出脈沖電壓的寬度,從而調(diào)節(jié)電動(dòng)機(jī)的轉(zhuǎn)速.只要鋸齒波的線(xiàn)性度足夠好,輸出脈沖的寬度是和控制電壓的大小成正比的.
2、邏輯延時(shí)環(huán)節(jié):
在可逆PWM變換器中,跨接在電源兩端的上下兩個(gè)晶體管經(jīng)常交替工作.由于晶體管的關(guān)斷過(guò)程中有一段存儲(chǔ)時(shí)間和電流下降時(shí)間,總稱(chēng)關(guān)斷時(shí)間,在這段時(shí)間內(nèi)晶體管并未完全關(guān)斷.如果在此期間另一個(gè)晶體管已經(jīng)導(dǎo)通,則將造成上下兩管之通,從而使電源正負(fù)極短路.為避免發(fā)生這種情況,設(shè)置了由RC電路構(gòu)成的延時(shí)環(huán)節(jié).
3、電源的設(shè)計(jì)
本設(shè)計(jì)的電源為車(chē)載電源。為保證電源工作可靠,單片機(jī)系統(tǒng)與動(dòng)力伺服系統(tǒng)的電源采用了大功率、大容量的蓄電池;而傳感器的工作電源則采用了小巧輕便的干電池。
五、 顯示電路設(shè)計(jì)
本設(shè)計(jì)中用兩片4位八段數(shù)碼管gem4561ae作顯示器,并具有雙重功能,在小車(chē)不行駛時(shí)其中一片顯示年月,另一片顯示時(shí).分. 當(dāng)小車(chē)行駛時(shí),分別顯示時(shí)間和行駛距離原理圖如圖1.
本設(shè)計(jì)中采用新型芯片EM78P458作為顯示驅(qū)動(dòng)器,它的管腳如圖3.5 EM78P458管腳介紹所示,用單片機(jī)的并行口控制,一個(gè)數(shù)碼顯示電路用4個(gè)口線(xiàn),用專(zhuān)用驅(qū)動(dòng)芯片控制可以減少對(duì)CPU的利用時(shí)間,單片機(jī)將有更多的時(shí)間去完成其他功能.
圖3.5 EM78P458的管腳
- 該芯片共有20個(gè)管腳,管腳LED1﹑LED2﹑LED3﹑LED4分別接10k電阻和三極管后與4位八段數(shù)碼管5461中的a1﹑a2﹑a3﹑a4四個(gè)數(shù)位選擇端相連,這四個(gè)數(shù)位選擇端用來(lái)產(chǎn)生LED選通信號(hào)。
- 管腳a﹑b﹑c﹑d﹑e﹑f﹑g﹑dp分別接680歐電阻后與四位八段數(shù)碼管5461中的a﹑b﹑c﹑d﹑e﹑f﹑g﹑dp相連,分別控制各段碼和小數(shù)點(diǎn)。
- 管腳d0﹑d1﹑d2﹑d3接單片機(jī)并行口,通過(guò)對(duì)單片機(jī)對(duì)芯片進(jìn)行控制。管腳vss串上10k電阻后與vcc管腳相接后再接+5v電源,管腳gnd接地。
該芯片所驅(qū)動(dòng)的顯示電路如圖3.6 EM78P458集成顯示電路所示 顯示驅(qū)動(dòng)器支持動(dòng)態(tài)顯示,其顯示功能如表4.2真值表所示,0000-1001顯示從0-9數(shù)字,1010是未進(jìn)位時(shí)是小數(shù)點(diǎn)清位,1011是進(jìn)位后加小數(shù)點(diǎn),1100-1111是八段共陰數(shù)碼管的位選。
圖3.6 EM78P458集成顯示電路
第四章、軟件設(shè)計(jì)
系統(tǒng)軟件設(shè)計(jì)說(shuō)明
在進(jìn)行微機(jī)控制系統(tǒng)設(shè)計(jì)時(shí),除了系統(tǒng)硬件設(shè)計(jì)外,大量的工作就是如何根據(jù)每個(gè)生產(chǎn)對(duì)象的實(shí)際需要設(shè)計(jì)應(yīng)用程序。因此,軟件設(shè)計(jì)在微機(jī)控制系統(tǒng)設(shè)計(jì)中占重要地位。對(duì)于本系統(tǒng),軟件更為重要。
在單片機(jī)控制系統(tǒng)中,大體上可分為數(shù)據(jù)處理、過(guò)程控制兩個(gè)基本類(lèi)型。數(shù)據(jù)處理包括:數(shù)據(jù)的采集、數(shù)字濾波、標(biāo)度變換等。過(guò)程控制程序主要是使單片機(jī)按一定的方法進(jìn)行計(jì)算,然后再輸出,以便控制生產(chǎn)。
為了完成上述任務(wù),在進(jìn)行軟件設(shè)計(jì)時(shí),通常把整個(gè)過(guò)程分成若干個(gè)部分,每一部分叫做一個(gè)模塊。所謂“模塊”,實(shí)質(zhì)上就是所完成一定功能,相對(duì)獨(dú)立的程序段,這種程序設(shè)計(jì)方法叫模塊程序設(shè)計(jì)法。
模塊程序設(shè)計(jì)法的主要優(yōu)點(diǎn)是:
1、單個(gè)模塊比起一個(gè)完整的程序易編寫(xiě)及調(diào)試;
2、模塊可以共存,一個(gè)模塊可以被多個(gè)任務(wù)在不同條件下調(diào)用;
3、模塊程序允許設(shè)計(jì)者分割任務(wù)和利用已有程序,為設(shè)計(jì)者提供方便。
本系統(tǒng)軟件采用模塊化結(jié)構(gòu),由主程序﹑定時(shí)子程序、避障子程序﹑中斷子程序顯示子程序﹑調(diào)速子程序﹑算法子程序構(gòu)成。
一 、主程序設(shè)計(jì) 程序清單如下:
- limiw equ 30h ;厘米位
- miao equ 31h ;秒位
- fenmi equ 32h ;分米位
- fmiao equ 33h ;分秒位
- meter equ 34h ;米位
- fenzh equ 35h ;分位
- point equ 36h ;小數(shù)點(diǎn)位
- shimi equ 37h ;十米位
- shifn equ 38h ;十分位
- sudu equ 39h ;速度控制
- jishk equ 3ah ;記時(shí)開(kāi)始
- zhond equ 3bh
- zhodu equ 3ch
- zhon equ 3eh
- maicho equ 3fh
- jinweb equ 40h
- bhcs equ 41h
- dpan equ 42h
- fenchu equ 43h
- fencun equ 44h
- pand equ 45h
- fenmc equ 51h
- org 0000h
- ajmp main
- org 000bh
- ajmp st0
- org 001bh
- ajmp st1
- org 0100h
- main:
- mov limiw,#00h
- mov miao,#00h
- mov fenmi,#00h
- mov fmiao,#00h
- mov meter,#00h
- mov fenzh,#00h
- mov point,#0bh
- mov shimi,#00h
- mov shifn,#00h
- mov jishk,#00h
- mov zhond,#00h
- mov zhodu,#00h
- mov zhon,#00h
- mov maicho,#00h
- mov jinweb,#03h
- mov bhcs,#00h
- mov sp,#6fh
- mov tmod,#21h
- mov th0,#3ch
- mov tl0,#0b0h
- mov th1,#9ch
- mov tl1,#9ch
- setb ea
- setb et0
- setb et1
- mov p1,#0aah
- acall xianshi
復(fù)制代碼 二、 顯示子程序設(shè)計(jì)
程序清單如下:
- xianshi:
- mov p1,#0aah
- mov p1,#0cch
- mov a,limiw
- swap a
- add a,miao
- mov p1,a
- nop
- nop
- mov p1,#0ddh
- mov a,fenmi
- swap a
- add a,fmiao
- mov p1,a
- nop
- nop
- mov p1,#0eeh
- mov a,#0b0h
- add a,point
- mov p1,a
- nop
- nop
- mov p1,#0eeh
- mov a,meter
- swap a
- add a,fenzh
- mov p1,a
- nop
- nop
- mov p1,#0ffh
- mov a,shimi
- swap a
- add a,shifn
- mov p1,a
- ret
復(fù)制代碼
三 、避障子程序設(shè)計(jì)
程序清單如下:
- <font face="黑體">zhangai:
- jb 25h,stop
- jnb 22h,youzhuan
- jnb 23h,youzhuan
- jnb 24h,zuozhuan
- jnb 26h,zuozhuan
- ajmp jiance
- zuozhuan:
- clr p0.5
- clr p0.4
- mov sudu,#05h
- acall delaa
- setb p0.4
- setb p0.5
- mov sudu,#07h
- ajmp jiance
- youzhuan:
- clr p0.6
- clr p0.7
- mov sudu,#05h
- acall delaa
- setb p0.7
- setb p0.6
- mov sudu,#07h
- ajmp jiance
- stop:
- acall delay
- jnb 25h,zhangai
- clr tr0
- mov a,fenmi
- mov fenmc,a
- mov a,#02h
- add a,fenmc
- mov fenmc,a
- here: cjne a,fenmi,here
- clr tr1
- setb p2.6
- acall delaa
- setb p2.7
- ajmp $
- </font>
復(fù)制代碼
四、 整體程序設(shè)計(jì)如下所示:
程序清單如下:
- limiw equ 30h ;厘米位
- miao equ 31h ;秒位
- fenmi equ 32h ;分米位
- fmiao equ 33h ;分秒位
- meter equ 34h ;米位
- fenzh equ 35h ;分位
- point equ 36h ;小數(shù)點(diǎn)位
- shimi equ 37h ;十米位
- shifn equ 38h ;十分位
- sudu equ 39h ;速度控制
- jishk equ 3ah ;記時(shí)開(kāi)始
- zhond equ 3bh
- zhodu equ 3ch
- zhon equ 3eh
- maicho equ 3fh
- jinweb equ 40h
- bhcs equ 41h
- dpan equ 42h
- fenchu equ 43h
- fencun equ 44h
- pand equ 45h
- fenmc equ 51h
- org 0000h
- ajmp main
- org 000bh
- ajmp st0
- org 001bh
- ajmp st1
- org 0100h
- main:
- mov limiw,#00h
- mov miao,#00h
- mov fenmi,#00h
- mov fmiao,#00h
- mov meter,#00h
- mov fenzh,#00h
- mov point,#0bh
- mov shimi,#00h
- mov shifn,#00h
- mov jishk,#00h
- mov zhond,#00h
- mov zhodu,#00h
- mov zhon,#00h
- mov maicho,#00h
- mov jinweb,#03h
- mov bhcs,#00h
- mov sp,#6fh
- mov tmod,#21h
- mov th0,#3ch
- mov tl0,#0b0h
- mov th1,#9ch
- mov tl1,#9ch
- setb ea
- setb et0
- setb et1
- mov p1,#0aah
- acall xianshi
- qidong:
- jb p0.0,qidong
- acall delay
- jb p0.0,qidong
- mov sudu,#03h
- clr p2.6
- clr p2.7
- setb tr1
- start:
- jnb p2.3,start
- acall delay
- jnb p2.3,start
- mov sudu,#07h
- setb tr0
- mov jishk,#01h
- call delaa
- call delaa
- call delaa
- call delaa
- call delaa
- jiance:
- mov c,p2.0
- mov 22h,c
- mov c,p2.1
- mov 23h,c
- mov c,p2.2
- mov 24h,c
- mov c,p2.3
- mov 25h,c
- mov c,p2.4
- mov 26h,c
- zhangai:
- jb 25h,stop
- jnb 22h,youzhuan
- jnb 23h,youzhuan
- jnb 24h,zuozhuan
- jnb 26h,zuozhuan
- ajmp jiance
- zuozhuan:
- clr p0.5
- clr p0.4
- mov sudu,#05h
- acall delaa
- setb p0.4
- setb p0.5
- mov sudu,#07h
- ajmp jiance
- youzhuan:
- clr p0.6
- clr p0.7
- mov sudu,#05h
- acall delaa
- setb p0.7
- setb p0.6
- mov sudu,#07h
- ajmp jiance
- stop:
- acall delay
- jnb 25h,zhangai
- clr tr0
- mov a,fenmi
- mov fenmc,a
- mov a,#02h
- add a,fenmc
- mov fenmc,a
- here: cjne a,fenmi,here
- clr tr1
- setb p2.6
- acall delaa
- setb p2.7
- ajmp $
- st0:
- push acc
- push psw
- mov th0,#3ch
- mov tl0,#0b0h
- inc zhond
- mov a,#0ah
- cjne a,zhond,out
- mov zhond,#00h
- inc zhodu
- mov a,#02h
- cjne a,zhodu,miepo
- mov point,#0bh
- mov zhodu,#00h
- inc miao
- mov a,#0ah
- cjne a,miao,out
- mov miao,#00h
- inc fmiao
- mov a,#06h
- cjne a,fmiao,out
- mov fmiao,#00h
- inc fenzh
- mov a,#0ah
- cjne a,fenzh,out
- mov fenzh,#00h
- inc shifn
- out:
- call xianshi
- outb:
- pop psw
- pop acc
- reti
- miepo:
- mov point,#0ah
- ajmp out
- st1:
- push acc
- push psw
- inc zhon
- mov a,sudu
- cjne a,zhon,hig
- setb p2.7
- ajmp outi
- hig:
- mov a,#0ah
- cjne a,zhon,outi
- mov zhon,#00h
- clr p2.7
- outi:
- mov a,#01h
- cjne a,jishk,outb
- jb p2.5,gao
- mov c,p2.5
- mov 21h,c
- orl c,20h
- clr 20h
- jc youbh
- ajmp outb
- gao:
- setb 20h
- ajmp outb
- youbh:
- inc maicho
- mov a,jinweb
- cjne a,maicho,outb
- mov maicho,#00h
- inc bhcs
- mov a,#02h
- cjne a,bhcs,jici
- mov jinweb,#03h
- goon:inc limiw
- mov a,#0ah
- cjne a,limiw,out
- mov limiw,#00h
- inc fenmi
- cjne a,fenmi,out
- mov fenmi,#00h
- inc meter
- cjne a,meter,out
- mov meter,#00h
- inc shimi
- ajmp out
- jici:
- mov jinweb,#02h
- ajmp goon
- xianshi:
- mov p1,#0aah
- mov p1,#0cch
- mov a,limiw
- swap a
- add a,miao
- mov p1,a
- nop
- nop
- mov p1,#0ddh
- mov a,fenmi
- swap a
- add a,fmiao
- mov p1,a
- nop
- nop
- mov p1,#0eeh
- mov a,#0b0h
- add a,point
- mov p1,a
- nop
- nop
- mov p1,#0eeh
- mov a,meter
- swap a
- add a,fenzh
- mov p1,a
- nop
- nop
- mov p1,#0ffh
- mov a,shimi
- swap a
- add a,shifn
- mov p1,a
- ret
- delay:
- mov 46h,#0ffh
- mov 47h,#0ffh
- i:djnz 47h,i1
- i1:djnz 46h,i
- ret
- delaa:
- mov 48h,#0ah
- ii:mov 49h,#0afh
- ii2:mov 50h,#0ffh
- ii3:djnz 50h,ii3
- djnz 49h,ii2
- djnz 48h,ii
- ret
復(fù)制代碼
五、軟件抗干擾技術(shù)
提高玩具車(chē)智能控制的可靠性,僅靠硬件抗干擾是不夠的,需要進(jìn)一步借助于軟件抗干擾技術(shù)來(lái)克服某些干擾。在單片機(jī)控制系統(tǒng)中,如能正確的采用軟件抗干擾技術(shù),與硬件干擾措施構(gòu)成雙道抗干擾防線(xiàn),無(wú)疑為了將大大提高控制系統(tǒng)的可靠性。經(jīng)常采用的軟件抗干擾技術(shù)是數(shù)字濾波技術(shù)、開(kāi)關(guān)量的軟件抗干擾技術(shù)、指令冗余技術(shù)、軟件陷阱技術(shù)等。
1、數(shù)字濾波技術(shù):
一般單片機(jī)應(yīng)用系統(tǒng)的模擬輸入信號(hào)中,均含有種種噪音和干擾,它們來(lái)自被測(cè)量本身、傳感器、外界干擾等。為了進(jìn)行準(zhǔn)確測(cè)量和控制,必須消除被測(cè)信號(hào)中的噪音和干擾。對(duì)于這類(lèi)信號(hào),采用積分時(shí)間等于20ms的整數(shù)倍的雙積分A/D轉(zhuǎn)換器,可有效的消除其影響。后者為隨機(jī)信號(hào),它不是周期信號(hào)。對(duì)于隨機(jī)干擾,我們可以用數(shù)字濾波方法予以削弱或?yàn)V除。所謂數(shù)字濾波,就是通過(guò)一定的計(jì)算或判斷程序減少干擾在有用信號(hào)中的比重。故實(shí)質(zhì)上它是一種程序?yàn)V波。數(shù)字濾波克服了模擬濾波器的不足,它與模擬濾波器相比 ,有以下幾個(gè)優(yōu)點(diǎn):
- 數(shù)字濾波是用程序?qū)崿F(xiàn)的,不需要增加硬設(shè)備,所以可靠性高,穩(wěn)定性好。
- 數(shù)字濾波可以根據(jù)信號(hào)的不同,采用不同的濾波方法或?yàn)V波參數(shù),具有靈活、方便,功能強(qiáng)的特點(diǎn)。
- 數(shù)字濾波可以對(duì)頻率很低的信號(hào)實(shí)現(xiàn)濾波,克服了模擬濾波器的缺陷。
- 數(shù)字濾波器具有以上優(yōu)點(diǎn),所以數(shù)字濾波在微機(jī)應(yīng)用系統(tǒng)中得到了廣泛應(yīng)用。
2、開(kāi)關(guān)量的軟件抗干擾技術(shù):
干擾信號(hào)多呈毛刺狀,作用時(shí)間短,利用這一點(diǎn),我們?cè)诓杉骋婚_(kāi)關(guān)量信號(hào)時(shí),可多次重復(fù)采集,直到連續(xù)兩次或兩次以上結(jié)果完全一致方為有效。若多次采樣后,信號(hào)總是變化不定,可停止采集,給出報(bào)警信號(hào),由于開(kāi)關(guān)量信號(hào)主要是來(lái)自各類(lèi)開(kāi)
關(guān)型狀態(tài)傳感器,如限位開(kāi)關(guān)、操作按鈕、電氣觸點(diǎn)等,對(duì)這些信號(hào)的采集不能用多次平均的方法,必須絕對(duì)一致才行。如果開(kāi)關(guān)量信號(hào)超過(guò)8個(gè),可按8個(gè)一組進(jìn)行分組處理,也可定義多字節(jié)信息暫存區(qū),按類(lèi)似方法處理。在滿(mǎn)足實(shí)時(shí)性要求的前提下,如果在各次采集數(shù)字信號(hào)之間接入一段延時(shí),效果會(huì)好一些,就能對(duì)抗較寬的干擾。
輸出設(shè)備是電位控制型還是同步鎖存型,對(duì)干擾的敏感性相對(duì)較大。前者有良好的抗‘毛刺’干擾能力,后者不耐干擾,當(dāng)鎖存線(xiàn)上出現(xiàn)干擾時(shí),它就會(huì)盲目鎖存當(dāng)前的數(shù)據(jù),也不管此時(shí)數(shù)據(jù)是否有效。輸出設(shè)備和慣性(響應(yīng)速度)與干擾的耐受能力也有很大關(guān)系。慣性大的輸出設(shè)備(如各類(lèi)電磁執(zhí)行機(jī)構(gòu))對(duì)‘毛刺’干擾有一定的耐受能力。慣性小的輸出設(shè)備(如通行口、顯示設(shè)備)耐受能力就小一些。在軟件上,最為有效的方法就是重復(fù)輸出同一個(gè)數(shù)據(jù)。只要有可能,其重復(fù)周期盡可能短些。外設(shè)設(shè)備接受到一個(gè)被干擾的錯(cuò)誤信息后,還來(lái)不及作出有效的反應(yīng),一個(gè)正確的信息又來(lái)了,就可及時(shí)防止錯(cuò)誤動(dòng)作的產(chǎn)生。另外,各類(lèi)數(shù)據(jù)鎖存器盡可能和CPU安裝在同一電路板上,使傳輸線(xiàn)上傳送的都是鎖存好的電位控制信號(hào),對(duì)于重要的輸出設(shè)備,最好建立檢測(cè)通道,CPU可以檢測(cè)通道來(lái)確定輸出結(jié)果的正確性。
3、指令冗余技術(shù):
當(dāng)CPU受到干擾后,往往將一些操作數(shù)當(dāng)作指令碼來(lái)執(zhí)行,引起程序混亂。當(dāng)程序彈飛到某一字節(jié)指令上時(shí),便自動(dòng)納入正軌。當(dāng)彈飛到某一雙字節(jié)指令上時(shí),有可能落到其操作數(shù)上,從而繼續(xù)出錯(cuò)。當(dāng)程序彈飛到三字節(jié)指令上時(shí),因它有兩個(gè)操作數(shù),繼續(xù)出錯(cuò)的機(jī)會(huì)就更大。因此,我們應(yīng)多采用單字節(jié)指令(NOP)或?qū)巫止?jié)指令重復(fù)書(shū)寫(xiě),這便是指令冗余。指令冗余無(wú)疑會(huì)降低系統(tǒng)的效率,但在絕大多數(shù)情況下,CPU還不至于忙到不能多執(zhí)行幾條指令的程度,故這種方法還是被廣泛采用。
在一些對(duì)程序流向起決定作用的指令之前插入兩條NOP指令,以保證彈飛的程序迅速納入正確軌道。在某些對(duì)系統(tǒng)工作狀態(tài)重要的指令前也可插入兩條NOP指令,以保證正確執(zhí)行。指令冗余技術(shù)可以減少程序彈飛的次數(shù),使其很快進(jìn)入程序軌道,但這并不能保證在失控期間不干壞事,更不能保證程序納入正常軌道后就太平無(wú)事了,解決這個(gè)問(wèn)題必須采用軟件容錯(cuò)技術(shù)。
4﹑軟件陷阱技術(shù):
指令冗余使彈飛的程序安定下來(lái)是有條件的。首先,彈飛的程序必須落到程序區(qū);其次,必須執(zhí)行到冗余指令。所謂軟件陷阱,就是一套引導(dǎo)指令,強(qiáng)行將捕獲的程序引向一個(gè)指定的地址,在那里有一段專(zhuān)門(mén)對(duì)程序出錯(cuò)進(jìn)行處理的程序。如果我們把這段程序的入口標(biāo)號(hào)記為 ERR 的話(huà),軟件陷阱即為一條無(wú)條件轉(zhuǎn)移指令,為了加強(qiáng)其捕捉效果,一般還在它前面加兩條 NOP 指令,因此真正的軟件陷阱由3條指令構(gòu)成:
軟件陷阱安排在以下四種地方:
(1)未使用的中斷向量區(qū)。
(2)未使用的大片ROM空間
(3)表格
5、程序區(qū)
由于軟件陷阱都安排在正常程序執(zhí)行不到的地方,故不影響程序執(zhí)行效率,在當(dāng)前EPROM容量不成問(wèn)題的條件下,還是多多益善。
六 、看門(mén)狗技術(shù)
PC受到干擾而失控,引起程序亂飛,也可能使程序陷入“死循環(huán)” [6]。指令技術(shù)、軟件陷阱技術(shù)不能使失控的程序擺脫“死循環(huán)”的困境,這時(shí)系統(tǒng)完全癱瘓。如果操作者在場(chǎng),就可以按下人工復(fù)位安鈕,強(qiáng)制系統(tǒng)復(fù)位。但操作者不能一直監(jiān)視著系統(tǒng),也往往是在引起不良后果之后才進(jìn)行人工復(fù)位。為使程序脫離“死循環(huán)”,通常采用“看門(mén)狗技術(shù)”!翱撮T(mén)狗”技術(shù)就是不斷監(jiān)視程序循環(huán)運(yùn)行時(shí)間,若發(fā)現(xiàn)時(shí)間超過(guò)已知的循環(huán)設(shè)定時(shí)間,則認(rèn)為系統(tǒng)陷入了“死循環(huán)”,然后強(qiáng)迫程序返回到0000H入口,在0000H處安排一段出錯(cuò)處理程序,使系統(tǒng)運(yùn)行納入正規(guī)。
“看門(mén)狗”技術(shù)可由硬件實(shí)現(xiàn),可由軟件實(shí)現(xiàn),也可由兩者結(jié)合實(shí)現(xiàn)。本系統(tǒng)采用硬件“看門(mén)狗”電路。
實(shí)現(xiàn)硬件“看門(mén)狗”電路方案較多,目前采用較多的方案有以下幾種:
- 采用微處理器監(jiān)控器;
- 采用單穩(wěn)態(tài)電路來(lái)實(shí)現(xiàn)“看門(mén)狗”,單穩(wěn)定電路可采用74LS123;
- 采用內(nèi)帶震蕩器的記數(shù)芯片。
本設(shè)計(jì)采用第三種方案實(shí)現(xiàn)“看門(mén)狗”電路,下面就對(duì)該方案作以介紹。
(1)基本原理
CD4060 是帶震蕩器的14位計(jì)數(shù)器,由該芯片構(gòu)成的看門(mén)狗電路4060記數(shù)頻率由RT和CT決定。設(shè)實(shí)際的程序所需工作周期為T(mén),分頻器記滿(mǎn)時(shí)間為T(mén)’,當(dāng)T’>T 且系統(tǒng)正常工作時(shí),程序每隔T對(duì)4060進(jìn)行掃描一次,分頻且永無(wú)記滿(mǎn)輸出信號(hào)。如系統(tǒng)工作不正常(如程序跑飛、死循環(huán)等),程序?qū)?060發(fā)不出掃描信號(hào),分頻器記滿(mǎn)輸出一脈沖號(hào)使CPU復(fù)位。
(2)參數(shù)選擇
4060的振蕩頻率f由 RT 、CT決定。Rs用于改善振蕩器的穩(wěn)定性,Rs 要大于RT。一般取Rs=10RT,且RT>1kΩ,CT≥100pF。如果Rs=450Ω,RT=45Ω,CT=1uF,則f=10HZ。4060的振蕩頻率和Qi(i=6,7,8,9,10,12,13,14)的選擇要根據(jù)情況確定。
(3)幾個(gè)原則
看門(mén)狗電路必須由硬件邏輯組成,不宜由可編程計(jì)數(shù)器充當(dāng),因?yàn)镃PU失控后,可能會(huì)修改可編程器件參數(shù),使看門(mén)狗失效。4060的RST線(xiàn)上阻容組成的微分電路很重要,因?yàn)閽呙栎斎胄盘?hào)是CPU產(chǎn)生的正脈沖,若此信號(hào)變“1”后,由于干擾,程序亂飛,微分電路只能讓上跳沿通過(guò),不會(huì)封死4060,看門(mén)狗仍能計(jì)數(shù)起作用。若沒(méi)有微分電路,掃描輸入信號(hào)上的“1”狀態(tài)封死4060,使之不能記數(shù),看門(mén)狗不起作用。CPU必須在正確完成所有工作后才能發(fā)掃描輸入信號(hào),且程序中發(fā)掃描信號(hào)的地方不能太多。否則,正好在哪里有死循環(huán),看門(mén)狗就不產(chǎn)生記滿(mǎn)輸出信號(hào),不能重新啟動(dòng)CPU。4060的記滿(mǎn)輸出信號(hào)不但要接到MCS-51的RST腳,而且還應(yīng)接到其它芯片的RST腳,因?yàn)槌绦騺y飛后,其它具有RST腳的芯片也混亂了,必須全部復(fù)位。
六、可編程邏輯器件
可編程邏輯器件GAL16V8是LATTICE公司研制的一種電可擦除的可重復(fù)編程的低密度PLD器件。它采用更為靈活的可編I/O結(jié)構(gòu),并采用了先進(jìn)的EECOMS工藝,數(shù)秒內(nèi)即可完成芯片的擦除和編程過(guò)程,并可反復(fù)改寫(xiě),是產(chǎn)品開(kāi)發(fā)研制的理想器件之一。
GAL16V8技術(shù)特性
(1)電可擦除工藝
可重編程單元
100%成品率
可重配置邏輯
(2)高性能E2CMOS工藝
低功耗:45mA最大運(yùn)行功耗,35mA最大維持功耗
高速度:15~25us最快存取速度
(3)8個(gè)輸出邏輯單元
對(duì)于復(fù)雜邏輯設(shè)計(jì)具有最大靈活性,GAL16V8可仿真20條引腳的PAL器件,具有功能 / 熔絲圖 /參數(shù)的完全兼容性
(4)預(yù)置、加電復(fù)位全部寄存器
(5)具有保密單元、電子標(biāo)簽
(6)數(shù)據(jù)保持超過(guò)20年。
80C51按鍵電路直接由80C51接口電路查詢(xún)。消抖(延時(shí)20ms)由軟件延時(shí)完成。

 實(shí)現(xiàn)電壓測(cè)量、頻率測(cè)量與實(shí)時(shí)時(shí)鐘功能的程序如下:(顯示和操作通過(guò)矩陣鍵盤(pán)實(shí)現(xiàn))
- #include "STC15.h"
- #include <intrins.h>
- sbit SCK=P1^7;
- sbit SDA=P2^3;
- sbit RST = P1^3; // DS1302復(fù)位
- void Write_Ds1302_Byte(unsigned char temp)
- {
- unsigned char i;
- for (i=0;i<8;i++)
- {
- SCK=0;
- SDA=temp&0x01;
- temp>>=1;
- SCK=1;
- }
- }
- void Write_Ds1302( unsigned char address,unsigned char dat )
- {
- RST=0;
- _nop_();
- SCK=0;
- _nop_();
- RST=1;
- _nop_();
- Write_Ds1302_Byte(address);
- Write_Ds1302_Byte(dat);
- RST=0;
- }
- unsigned char Read_Ds1302 ( unsigned char address )
- {
- unsigned char i,temp=0x00;
- RST=0;
- _nop_();
- SCK=0;
- _nop_();
- RST=1;
- _nop_();
- Write_Ds1302_Byte(address);
- for (i=0;i<8;i++)
- {
- SCK=0;
- temp>>=1;
- if(SDA)
- temp|=0x80;
- SCK=1;
- }
- RST=0;
- _nop_();
- RST=0;
- SCK=0;
- _nop_();
- SCK=1;
- _nop_();
- SDA=0;
- _nop_();
- SDA=1;
- _nop_();
- return (temp);
- }
復(fù)制代碼- #include "STC15.h"
- #include "ds1302.h"
- #include "iic.h"
- #include "intrins.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- u8 e_write_flag=0;
- u8 mode=0;
- u8 code t_display[]={ //標(biāo)準(zhǔn)字庫(kù)
- // 0 1 2 3 4 5 6 7 8 9 -
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
- void Delay1ms() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
- void delay_ms(u16 i)
- {
- while(i--)
- Delay1ms();
- }
- void dis_num(u8 x,u8 num) //數(shù)碼管顯示
- {
- P0=0X01<<x;
- P2=0XC0;
- P2=0X00;
- P0=~t_display[num];
- P2=0XE0;
- Delay1ms();
- P0=0XFF;
- P2=0X00;
- }
- u8 ad() //AD采集
- {
- u8 i;
- IIC_Start();
- IIC_SendByte(0x90);
- IIC_WaitAck();
- IIC_SendByte(0x03);
- IIC_WaitAck();
- IIC_Start();
- IIC_SendByte(0x91);
- IIC_WaitAck();
- i=IIC_RecByte();
- IIC_Stop();
- return i;
- }
- void DS1302_Init() //1302初始化
- {
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x80,0x55);
- Write_Ds1302(0x82,0x59);
- Write_Ds1302(0x84,0x23);
- Write_Ds1302(0x8e,0x80);
- }
- void show_time() //顯示時(shí)間
- {
- u8 i;
- i=Read_Ds1302(0x85);
- dis_num(0,(i&0xf0)>>4);
- dis_num(1,(i&0x0f));
- dis_num(2,10);
- i=Read_Ds1302(0x83);
- dis_num(3,(i&0xf0)>>4);
- dis_num(4,(i&0x0f));
- dis_num(5,10);
- i=Read_Ds1302(0x81);
- dis_num(6,(i&0xf0)>>4);
- dis_num(7,(i&0x0f));
- }
- void write_eeprom(u8 adr,u8 dat) //寫(xiě)入EEPROM
- {
- IIC_Start();
- IIC_SendByte(0xa0);
- IIC_WaitAck();
- IIC_SendByte(adr);
- IIC_WaitAck();
- IIC_SendByte(dat);
- IIC_WaitAck();
- IIC_Stop();
- }
- u8 read_eeprom(u8 adr) //讀取EEPROM
- {
- u8 i;
- IIC_Start();
- IIC_SendByte(0xa0);
- IIC_WaitAck();
- IIC_SendByte(adr);
- IIC_WaitAck();
- IIC_Start();
- IIC_SendByte(0xa1);
- IIC_WaitAck();
- i=IIC_RecByte();
- IIC_Stop();
- return i;
- }
- u8 scan_key() //按鍵掃描
- {
- u8 key,i;
- for(i=0;i<2;i++)
- {
- P3|=0X0F;
- switch(i)
- {
- case 0:{P44=0;P42=1;}break;
- case 1:{P44=1;P42=0;}break;
- }
- key=P3&0X0F;
- if(key!=0x0f)
- {
- delay_ms(30);
- key=P3&0X0F;
- if(key!=0x0f)
- {
- while((P3&0X0F)!=0X0F);
- switch(key)
- {
- case 0x0e:return i*4+7;break;
- case 0x0d:return i*4+6;break;
- case 0x0b:return i*4+5;break;
- case 0x07:return i*4+4;break;
- }
- }
- }
- }
- return 0;
- }
- void Time0_Init()
- {
- AUXR = 0x80; //定時(shí)器0為1T模式
- TMOD = 0x04; //設(shè)置定時(shí)器0為16位自動(dòng)重裝載外部記數(shù)模式
- TH0 = TL0 = 0xff; //設(shè)置定時(shí)器0初始值
- TR0 = 0; //定時(shí)器0開(kāi)始工作
- ET0 = 1; //開(kāi)定時(shí)器0中斷
- }
- void Timer1Init(void) //50毫秒@11.0592MHz
- {
- AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TL1 = 0x00; //設(shè)置定時(shí)初值
- TH1 = 0x4C; //設(shè)置定時(shí)初值
- TF1 = 0; //清除TF1標(biāo)志
- TR1 = 0; //定時(shí)器1開(kāi)始計(jì)時(shí)
- ET1 = 1;
- }
- void Timer2Init(void) //50毫秒@11.0592MHz
- {
- AUXR &= 0xFB; //定時(shí)器時(shí)鐘12T模式
- T2L = 0x00; //設(shè)置定時(shí)初值
- T2H = 0x4C; //設(shè)置定時(shí)初值
- IE2 |= (1<<2); //允許中斷
- AUXR |= 0x10; //定時(shí)器2開(kāi)始計(jì)時(shí)
- IE2 |= 0x04; //開(kāi)定時(shí)器2中斷
- }
- //調(diào)整時(shí)間
- bit change_time()
- {
- u8 x,k,temp_0,temp_1,show_flag;
- u8 time[3]={0};
- x=Read_Ds1302(0x85);
- time[0]=((x&0xf0)>>4)*10+(x&0x0f);
- x=Read_Ds1302(0x83);
- time[1]=((x&0xf0)>>4)*10+(x&0x0f);
- x=Read_Ds1302(0x81);
- temp_0=x;
- time[2]=((x&0xf0)>>4)*10+(x&0x0f);
- x=0;
- show_flag=1;
- while(1)
- {
- if(show_flag)
- {
- dis_num(x*3,time[x]/10);
- dis_num(x*3+1,time[x]%10);
- }
- switch(x)
- {
- case 0:{dis_num(2,10);dis_num(3,time[1]/10);dis_num(4,time[1]%10);dis_num(5,10);dis_num(6,time[2]/10);dis_num(7,time[2]%10);}break;
- case 1:{dis_num(0,time[0]/10);dis_num(1,time[0]%10);dis_num(2,10);dis_num(5,10);dis_num(6,time[2]/10);dis_num(7,time[2]%10);}break;
- case 2:{dis_num(0,time[0]/10);dis_num(1,time[0]%10);dis_num(2,10);dis_num(3,time[1]/10);dis_num(4,time[1]%10);dis_num(5,10);}break;
- }
- k=scan_key();
- if(k==7)
- {
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x80,(((time[2]/10)<<4)|(time[2]%10)));
- Write_Ds1302(0x82,(((time[1]/10)<<4)|(time[1]%10)));
- Write_Ds1302(0x84,(((time[0]/10)<<4)|(time[0]%10)));
- Write_Ds1302(0x8e,0x80);
- return 0;
- }
- if(k!=0)
- {
- switch(k)
- {
- case 4:{x++;if(x==3)x=0;}break;
- case 11:{time[x]++;if(time[x]>59)time[x]=0;}break;
- case 10:{if((x!=0)&(time[x]==0))time[x]=60;if((x==0)&(time[x]==0))time[x]=13;time[x]--;}break;
- }
- }
- temp_1=Read_Ds1302(0x81);
- if(temp_1!=temp_0)
- {
- temp_0=temp_1;
- show_flag=!show_flag;
- }
-
- }
- }
- bit menu_1()//顯示時(shí)間和設(shè)置時(shí)間
- {
- u8 k,x;
- x=0;
- while(1)
- {
- show_time();
- k=scan_key();
- if(k==4)
- {
- change_time();
- }
- switch(k)
- {
- case 6:{mode=1;return 1;}break;
- case 5:{mode=2;return 1;}break;
- case 9:{mode=3;return 1;}break;
- }
- }
- }
- u8 V[2]={0,0};
- bit change_V() //修改電壓上下限
- {
- u8 k,x,show_flag,temp_0,temp_1;
- x=0;
- show_flag=1;
- temp_0=Read_Ds1302(0x81);
- while(1)
- {
- if(show_flag)
- {
- if(x)
- {
- dis_num(4,V[1]/10);
- dis_num(5,V[1]%10);
- dis_num(6,0);
- dis_num(7,0);
- }
- else
- {
- dis_num(0,V[0]/10);
- dis_num(1,V[0]%10);
- dis_num(2,0);
- dis_num(3,0);
- }
- }
- if(x)
- {
- dis_num(0,V[0]/10);
- dis_num(1,V[0]%10);
- dis_num(2,0);
- dis_num(3,0);
- }
- else
- {
- dis_num(4,V[1]/10);
- dis_num(5,V[1]%10);
- dis_num(6,0);
- dis_num(7,0);
- }
- k=scan_key();
- temp_1=Read_Ds1302(0x81);
- if(temp_1!=temp_0)
- {
- temp_0=temp_1;
- show_flag=!show_flag;
- }
- if(k!=0)
- {
- switch(k)
- {
- case 4:{x++;if(x==2)x=0;}break;
- case 11:{
- if((x==1)&(V[0]>V[1])&(V[1]<95))
- V[x]+=5;
- if((x==0)&(V[0]<95))
- V[x]+=5;
- }break;
- case 10:{
- if((x==0)&(V[0]>V[1])&(V[0]>4))
- V[x]-=5;
- if((x==1)&(V[1]>4))
- V[x]-=5;
- }break;
- }
- }
- if(k==6)
- {
- write_eeprom(0,V[0]);
- delay_ms(50);
- write_eeprom(1,V[1]);
- return 1;
- }
- }
- }
- bit menu_2() //顯示電壓
- {
- u16 i;
- u8 k;
- while(1)
- {
- dis_num(0,10);
- dis_num(1,1);
- dis_num(2,10);
- i=ad();
- i=(u16)((float)i*19.6+0.5);
- dis_num(4,i/1000);
- dis_num(5,i%1000/100);
- dis_num(6,i%100/10);
- dis_num(7,i%10);
- k=scan_key();
- if(k==4)
- {
- change_V();
- }
- switch(k)
- {
- case 7:{mode=0;return 1;}break;
- case 5:{mode=2;return 1;}break;
- case 9:{mode=3;return 1;}break;
- }
- }
- }
- u16 timer=0;
- u16 zhouqi=0;
- u16 c_flag=0;
- u8 over_flag=0;
- bit menu_3() //頻率周期顯示
- {
- u8 k,ft=0;
- u16 f,t;
- EA=1;
- TR0=1;
- TR1=1;
- while(1)
- {
- dis_num(0,10);
- dis_num(1,2);
- dis_num(2,10);
-
- if(over_flag)
- {
- ET0=1;
- TR0=1;
- TR1=1;
- over_flag=0;
- f=c_flag*10;
- c_flag=0;
-
- }
- k= scan_key();
- if(k==4)
- ft=!ft;
- switch(k)
- {
- case 7:{mode=0;return 1;}break;
- case 6:{mode=1;return 1;}break;
- case 9:{mode=3;return 1;}break;
- }
- if(ft) //f
- {
- dis_num(3,f/10000);
- dis_num(4,f%10000/1000);
- dis_num(5,f%10000%1000/100);
- dis_num(6,f%100/10);
- dis_num(7,f%10);
- }
- else
- {
- t=1000000/f;
- dis_num(3,t/10000);
- dis_num(4,t%10000/1000);
- dis_num(5,t%10000%1000/100);
- dis_num(6,t%100/10);
- dis_num(7,t%10);
- }
- }
- }
- bit menu_4() //查詢(xún)
- {
- u8 k;
- while(1)
- {
- dis_num(6,0);
- dis_num(7,read_eeprom(2));
- k= scan_key();
- if(k==4)
- {
- k=0;
- while(1)
- {
- dis_num(0,read_eeprom(3)/10);
- dis_num(1,read_eeprom(3)%10);
- dis_num(2,10);
- dis_num(3,read_eeprom(4)/10);
- dis_num(4,read_eeprom(4)%10);
- dis_num(5,10);
- dis_num(6,read_eeprom(5)/10);
- dis_num(7,read_eeprom(5)%10);
- k=scan_key();
- if((k==7)|(k==6)|(k==5)|(k==4))
- break;
- }
- }
- switch(k)
- {
- case 7:{mode=0;return 1;}break;
- case 6:{mode=1;return 1;}break;
- case 5:{mode=2;return 1;}break;
- }
-
- }
- }
- void main()
- {
- u16 i,j;
- P0=0X00;
- P2=0XA0;
- P2=0X00;
- P0=0XFF;
- P2=0X80;
- P2=0X00;
- V[0]=read_eeprom(0);
- delay_ms(10);
- V[1]=read_eeprom(1);
- DS1302_Init();
- Time0_Init();
- Timer1Init();
- Timer2Init();
- EA=1;
- while(1)
- {
- switch(mode)
- {
- case 0:menu_1();break; //shijian
- case 1:menu_2();break; //dianya
- case 2:menu_3();break; //zhouqi
- case 3:menu_4();break; //chaxun
- }
- }
- }
- //中斷服務(wù)程序
- void t0int() interrupt 1 //中斷入口
- {
- c_flag++;
- }
- bit t1_c=0;
- void t1int() interrupt 3
- {
- if(t1_c==0)
- t1_c=1;
- else
- {
- t1_c=0;
- ET0=0;
- TR0=0;
- TR1=0;
- over_flag=1;
- }
- }
- u8 t2_flag=0;
- void timer2_int (void) interrupt 12 //50ms *100 5s
- {
- u16 i;
- t2_flag++;
- if(t2_flag>=100)
- {
- t2_flag=0;
-
- i=ad();
- i=(u16)((float)i*19.6+0.5);
- if(i>V[0]*100)
- {
- write_eeprom(2,1);
- delay_ms(8);
- i=Read_Ds1302(0x85);
- i=((i&0xf0)>>4)*10+i&0x0f;
- write_eeprom(3,i);
- delay_ms(8);
- i=Read_Ds1302(0x83);
- i=((i&0xf0)>>4)*10+i&0x0f;
- write_eeprom(4,i);
- delay_ms(8);
- i=Read_Ds1302(0x81);
- i=((i&0xf0)>>4)*10+i&0x0f;
- write_eeprom(5,i);
- }
- if(i<V[1]*100)
- {
- write_eeprom(2,0);
- delay_ms(8);
- i=Read_Ds1302(0x85);
- i=((i&0xf0)>>4)*10+(i&0x0f);
- write_eeprom(3,i);
- delay_ms(8);
- i=Read_Ds1302(0x83);
- i=((i&0xf0)>>4)*10+(i&0x0f);
- write_eeprom(4,i);
- delay_ms(8);
- i=Read_Ds1302(0x81);
- i=((i&0xf0)>>4)*10+(i&0x0f);
- write_eeprom(5,i);
- }
- }
- }
復(fù)制代碼
附:硬件整體設(shè)計(jì)如下所示:
給大家分享我收集的單片機(jī)經(jīng)典程序:
|
|