金士豪
(湖南科技學(xué)院 智能制造學(xué)院,湖南 永州 425199)
單片機(jī)又稱單片微控制器,它不是完成某一個(gè)邏輯功能的芯片,而是把一個(gè)計(jì)算機(jī)系統(tǒng)集成到一個(gè)芯片上[1]。單片機(jī)相當(dāng)于一個(gè)微型計(jì)算機(jī),與計(jì)算機(jī)相比,它只缺少了I/O設(shè)備。一塊芯片就構(gòu)成了一臺計(jì)算機(jī)。單片機(jī)的體積小、質(zhì)量輕、價(jià)格便宜,為學(xué)習(xí)、應(yīng)用和開發(fā)提供了便利條件[2]。單片機(jī)的使用領(lǐng)域十分廣泛,如智能儀表、實(shí)時(shí)工控、通信設(shè)備、導(dǎo)航系統(tǒng)、家用電器等。在各種產(chǎn)品中集成單片機(jī),能夠起到使產(chǎn)品升級換代的作用。人們常在這些產(chǎn)品名稱前冠以形容詞——“智能型”,如智能型洗衣機(jī)等[3]。
電子鐘是一種利用數(shù)字電路顯示時(shí)間的計(jì)時(shí)裝置。石英鐘是一種利用石英振蕩器所產(chǎn)生的振蕩頻率驅(qū)動時(shí)鐘的3針顯示秒、分、時(shí)的計(jì)時(shí)裝置。電子鐘與機(jī)械時(shí)鐘相比,直觀性為其主要特點(diǎn),因非機(jī)械驅(qū)動具有更長的使用壽命,相較石英鐘的石英機(jī)芯驅(qū)動,其更具準(zhǔn)確性。它的特點(diǎn)可歸結(jié)為“兩強(qiáng)一弱”:電子鐘比機(jī)械鐘強(qiáng)在觀看時(shí)顯著,比石英鐘強(qiáng)在走時(shí)準(zhǔn)確,它的弱點(diǎn)是顯時(shí)較為單調(diào)。電子鐘更為方便、快捷和實(shí)用。由于電子鐘的數(shù)字集成電路構(gòu)成方式,使電子鐘具有走時(shí)準(zhǔn)確、性能穩(wěn)定、攜帶方便等優(yōu)點(diǎn)。電子鐘也可用于定時(shí)自動報(bào)警、按時(shí)自動打鈴、時(shí)間程序自動控制等[4]。
本文設(shè)計(jì)的數(shù)字電子時(shí)鐘系統(tǒng)需要考慮數(shù)碼管的掃描復(fù)用方式。采用函數(shù)進(jìn)行調(diào)用時(shí),注意函數(shù)的參數(shù)應(yīng)直接設(shè)置為小時(shí)、分鐘和秒,此過程還需要設(shè)置一個(gè)參數(shù)進(jìn)行鬧鐘模式的切換。自動顯示功能需要考慮設(shè)置若干個(gè)全局變量,使其在定時(shí)中斷時(shí)不斷被調(diào)用,實(shí)現(xiàn)數(shù)據(jù)自增。另外,在LCD部分,一定要加上LCD驅(qū)動。系統(tǒng)的具體組成如圖1所示。該數(shù)字電子鐘系統(tǒng)可以分為主控制單元、復(fù)位電路、晶振電路、鍵盤電路和顯示電路等。
圖1 系統(tǒng)組成
本設(shè)計(jì)利用KEIL5軟件實(shí)現(xiàn)程序設(shè)計(jì)。C語言是硬件設(shè)計(jì)時(shí)常用的編程語言之一。除匯編語言外,最接近硬件的編程語言是C語言。很多操作系統(tǒng)軟件的底層部分和驅(qū)動代碼都是用C語言編寫,由C語言負(fù)責(zé)將應(yīng)用層用戶的指令轉(zhuǎn)化為具體的硬件驅(qū)動指令進(jìn)行驅(qū)動。現(xiàn)在常見的Unix,Linux和Windows操作系統(tǒng),工業(yè)控制和嵌入式領(lǐng)域常見的RTOS系統(tǒng)都是由標(biāo)準(zhǔn)的C語言開發(fā)而來。現(xiàn)在手機(jī)端火熱的安卓系統(tǒng)也是在封裝Linux內(nèi)核的基礎(chǔ)上,實(shí)現(xiàn)對底層硬件的驅(qū)動和控制。
3.1.1 晶振電路
數(shù)字電路需要各種高頻率開關(guān)信號使計(jì)數(shù)器正常計(jì)數(shù),使各種數(shù)字模塊能夠同步,因此,需要一個(gè)高頻率電子振蕩電路產(chǎn)生振蕩信號。這個(gè)振蕩電路最重要的一個(gè)元件就是晶振,它生成的振蕩信號頻率可以達(dá)到幾兆甚至十幾兆,再經(jīng)過分頻器或倍頻器,得到各種不同的頻率信號。在某些通信系統(tǒng)中,由于系統(tǒng)的基頻和射頻使用不同的晶振,通常通過電子調(diào)頻的方式保持同步。在本文設(shè)計(jì)的電子時(shí)鐘中,為了讓各個(gè)部分保持同步,該電子時(shí)鐘共用一個(gè)晶振,利用該晶振提供基本的時(shí)鐘信號。
3.1.2 復(fù)位電路
復(fù)位電路等同于電腦的重啟部分。電腦在使用中出現(xiàn)死機(jī),按下重啟按鈕后,電腦內(nèi)的程序從頭開始執(zhí)行。單片機(jī)也一樣,單片機(jī)系統(tǒng)在運(yùn)行中受到環(huán)境干擾程序時(shí),按下復(fù)位按鈕,內(nèi)部的程序可自動從頭開始執(zhí)行,即把一些寄存器及存儲設(shè)備恢復(fù)到出廠時(shí)的狀態(tài)。
3.1.3 鍵盤電路
根據(jù)4×4矩陣鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。因此,鍵盤上按鍵的個(gè)數(shù)為4×4個(gè)。采用此方法設(shè)計(jì)的鍵盤電路結(jié)構(gòu)可以大大提高電子時(shí)鐘中I/O口的利用率。本文設(shè)計(jì)實(shí)現(xiàn)了按鍵控制鬧鐘和按鍵設(shè)置時(shí)間的功能。
在按鍵內(nèi)部設(shè)置兩個(gè)觸點(diǎn),首先將電路中的一條線路截?cái)?,然后將兩個(gè)斷線分別連接到按鍵的兩個(gè)觸點(diǎn)上。當(dāng)按下按鍵或按下按鍵不放,按鍵內(nèi)部的觸點(diǎn)結(jié)合在一起,該條線路導(dǎo)通;再按下按鍵或者松開按鍵,觸點(diǎn)釋放,線路斷開。
3.1.4 顯示電路
采用4位共陰極數(shù)碼管驅(qū)動方式,P2口連接相應(yīng)的位置,即選擇要顯示的數(shù)碼管位,P0口連接相應(yīng)的位置,即顯示相應(yīng)的數(shù)碼管段,從而負(fù)責(zé)顯示時(shí)鐘的時(shí)和分。
電子時(shí)鐘的硬件部分主要包括控制芯片、時(shí)鐘芯片、按鍵、顯示屏等幾個(gè)部分??刂菩酒?,也就是單片機(jī),可以采用ST/STC/ALTER等8位單片機(jī)或者根據(jù)需求采用PCI或更高級的ARM等進(jìn)行控制以及對時(shí)鐘芯片的操作等。時(shí)鐘芯片,采用DS12C887,DS1302等時(shí)鐘芯片,通過單片機(jī)對時(shí)鐘芯片進(jìn)行配置、操作、讀取、設(shè)置等。按鍵,外部按鍵可以對時(shí)鐘芯片進(jìn)行外部設(shè)置,比如設(shè)置初始時(shí)間等,按鍵的采集可以用并行、串行、模擬AD采集等方式。如果單片機(jī)的I/O口足夠,可采用并行采集;如果I/O口有限,則可采用為不同按鍵分配不同阻值的電阻,掛在同一數(shù)據(jù)線上通過串行AD進(jìn)行采集,再通過單片機(jī)分析采集到的電壓值判斷按鍵。顯示屏可以采用點(diǎn)陣顯示屏或者彩色TFT(8Bit/16Bit/24Bit)模擬/數(shù)字屏,如果只是一般的應(yīng)用,采用一般的單行或多行點(diǎn)陣顯示屏即可。
本文使用了Produce軟件進(jìn)行硬件原理圖的仿真設(shè)計(jì)。主控電路采用80C51單片機(jī)。80C51單片機(jī)的內(nèi)振蕩電路是一種高增益逆變放大器。導(dǎo)線xtal1和xtal2分別是逆變器振蕩放大器的輸入、內(nèi)部時(shí)鐘工作電路的輸入和逆變器振蕩器的輸出。本文將逆變器放大器配置為片上振蕩器。由電容器進(jìn)行充電,RST可以在通電后的一段時(shí)間內(nèi)保持在高水平,以實(shí)現(xiàn)通電復(fù)位操作。通電復(fù)位是復(fù)位電路使用的主要方法。此方法不僅能使單片機(jī)復(fù)位,還能使單片機(jī)的外圍設(shè)備同時(shí)復(fù)位。程序出現(xiàn)錯誤時(shí),可以隨時(shí)使電路復(fù)位。鍵盤電路的設(shè)計(jì)主要考慮如何實(shí)現(xiàn)按下同一個(gè)鍵時(shí),可以執(zhí)行不同的功能程序。每個(gè)鍵以一對多的方式對應(yīng)多個(gè)功能程序。在按下某個(gè)鍵時(shí),該鍵對應(yīng)的引腳被拉低,系統(tǒng)進(jìn)行一次掃描,返回鍵值,執(zhí)行當(dāng)下鍵值對應(yīng)的功能程序。顯示電路主要是由數(shù)碼管顯示數(shù)字電子鐘的時(shí)和分。
主函數(shù)的流程設(shè)計(jì)過程首先進(jìn)行初始化設(shè)定初值,然后執(zhí)行相關(guān)子程序的調(diào)用。具體流程如圖2所示。
調(diào)用中斷服務(wù)子程序,循環(huán)次數(shù)自增,因?yàn)槎〞r(shí)時(shí)長為50 ms,所以循環(huán)次數(shù)為20時(shí),循環(huán)次數(shù)清0,秒自增;秒為60時(shí),分自增,秒清0;分為60時(shí),時(shí)自增,分清0;時(shí)為24時(shí),時(shí)清0,中斷返回。
先確認(rèn)彈簧消抖是否有鍵按下,接著判斷掃描按鍵,不同的按鍵觸發(fā)不同功能。
其中,控制鬧鐘的核心代碼如下。
void almkozi(){
if((hour1==hour)&&(minit1==minit)&&(second<4)){
speaker=0; //鬧鐘時(shí)間到,蜂鳴器響
}
if(minit==0&&second<4){
//整點(diǎn)報(bào)時(shí),蜂鳴器響
speaker=0;
}
if(second>4) {//控制蜂鳴器響的時(shí)長
speaker=1; //關(guān)閉蜂鳴器
}
}
數(shù)碼管的核心代碼如下。
void show(int){
P0=tc[h/10];
P2=0xCD;
retardation();P2=0xCE; //片選關(guān)
P0=tc[h%10]; //p0口送數(shù)據(jù),拆數(shù)顯示,時(shí)的個(gè)位
P2=0xCF; //P2.1
retardation(); P2=0xDC;
P0=tc[m/10]; //p0口送數(shù)據(jù),拆數(shù)顯示,分的十位
P2=0xDE; //P2.2
retardation();
P2=0xEF;
P0=tc[m%10]; //p0口送數(shù)據(jù),拆數(shù)顯示,分的個(gè)位
P2=0XD9; //P2.3
retardation();
P2=0xEE;
}
本文設(shè)計(jì)的電子時(shí)鐘,顯示屏清晰,可顯示基本的時(shí)、分和秒,還可通過按鍵調(diào)整時(shí)間、設(shè)置鬧鐘和提醒。其鬧鐘一天內(nèi)可設(shè)置3次且音量可調(diào)節(jié)。該電子時(shí)鐘功能基本齊全,能夠滿足人們生活的基本需求。但因?yàn)楸敬卧O(shè)計(jì)還有部分智能功能未實(shí)現(xiàn),有待在后期設(shè)計(jì)和實(shí)現(xiàn)中進(jìn)行擴(kuò)展。
圖2 程序總體流程