戴文駿
(江蘇聯(lián)合職業(yè)技術(shù)學(xué)院 南京分院,江蘇南京,210019)
隨著電子技術(shù)的飛速發(fā)展以及人們對(duì)美好生活的不斷追求,電子密碼鎖漸漸走進(jìn)了千家萬(wàn)戶。相比于傳統(tǒng)機(jī)械鎖存在的機(jī)械結(jié)構(gòu)簡(jiǎn)單,容易被撬鎖,需要隨身攜帶鑰匙并且鑰匙容易被復(fù)制的缺點(diǎn),電子密碼鎖因其安全性能可靠、開(kāi)鎖密碼變更便捷、密碼不易被陌生人破解的優(yōu)點(diǎn),逐漸取代了傳統(tǒng)的機(jī)械鎖[1~4]。電子密碼鎖擺脫了隨身攜帶鑰匙的煩惱,由于數(shù)字密碼的組合結(jié)果多種多樣,保密性較強(qiáng),一旦發(fā)現(xiàn)密碼泄露,隨時(shí)都可以更改密碼,確保了解鎖的安全可靠[5]。電子密碼鎖適用于家庭、學(xué)生宿舍、辦公室及賓館等場(chǎng)所,受到越來(lái)越多的年輕用戶群體的青睞和選擇,也改變了他們的生活方式。
本設(shè)計(jì)將STC89C52 單片機(jī)作為主控制芯片,外加4×4 的矩陣鍵盤(pán)作為密碼輸入按鍵以及LCD1602 液晶顯示屏作為按鍵鍵值的顯示,并且可以自動(dòng)判別按鍵鍵值與設(shè)定的四位數(shù)密碼是否相同,兩者相同解鎖成功,兩者不同解鎖失敗,并重新輸入4 個(gè)按鍵鍵值重復(fù)上面的判斷,直到密碼輸入正確,解鎖成功。本設(shè)計(jì)方案中,需求效果易于實(shí)現(xiàn)且硬件成本價(jià)格低廉,可以在實(shí)現(xiàn)基本解鎖功能的基礎(chǔ)上,對(duì)硬件進(jìn)行擴(kuò)展,軟件進(jìn)行升級(jí),以實(shí)現(xiàn)更加豐富多樣的用戶需求。該項(xiàng)目的總體設(shè)計(jì)結(jié)構(gòu)框圖,如圖1 所示。
圖1 總體設(shè)計(jì)結(jié)構(gòu)框圖
本設(shè)計(jì)充分利用已有的單片機(jī)開(kāi)發(fā)試驗(yàn)儀進(jìn)行開(kāi)發(fā)設(shè)計(jì)。硬件上采用STC89C52 型單片機(jī)作為主控芯片,它具有操作簡(jiǎn)單、性能穩(wěn)定的優(yōu)點(diǎn)[6]。外設(shè)采用了4×4 的矩陣鍵盤(pán)作為輸入方式,一共16 個(gè)按鍵,實(shí)際只使用了12 個(gè)按鍵。其中按鍵S1~S9 代表數(shù)字1~9 輸入鍵,按鍵S10 代表數(shù)字0 輸入鍵,按鍵S11代表“確認(rèn)”鍵,按鍵S12代表“取消”鍵。LCD1602 液晶顯示屏顯示用戶按下的四位數(shù)密碼。如果密碼輸入正確,則在已有的“Password:”的右端顯示“OK”;如果密碼輸入錯(cuò)誤,則在已有的“Password:”的右端顯示“ERR”。在輸入密碼的過(guò)程中,如果發(fā)現(xiàn)輸入有誤,按下S12“取消”鍵,則輸入地顯示界面恢復(fù)到初始界面“0000”狀態(tài),重新開(kāi)始輸入四位數(shù)密碼。輸入完成后,按下S11“確認(rèn)”鍵,系統(tǒng)自動(dòng)對(duì)比預(yù)設(shè)的正確密碼與輸入的密碼是否一致,兩者一致顯示“OK”,否則顯示“ERR”。與此同時(shí)密碼輸入界面又一次恢復(fù)到初始的“0000”狀態(tài)。預(yù)設(shè)的正確密碼通過(guò)軟件程序編寫(xiě)的方式進(jìn)行修改變更,可以預(yù)設(shè)0000-9999 中的任意一個(gè)四位數(shù)作為正確密碼。
如圖2 所示,STC89C52 是由COΜS 工藝技術(shù)制成的入門(mén)級(jí)的8 位微控制器,它基于8051 的內(nèi)核,指令代碼完全兼容傳統(tǒng)的8051,運(yùn)行速度較傳統(tǒng)的51 單片機(jī)提高了8~12 倍,自帶ADC,具有4 路PWΜ,雙串口,有全球唯一的ID 號(hào),加密性更好,抗干擾能力更強(qiáng),是一款增強(qiáng)型51 單片機(jī)[7]。具有價(jià)格低廉、可靠性好、功耗低、電壓低等優(yōu)點(diǎn),因此得到了快速發(fā)展和廣泛應(yīng)用[8~9]。STC89C52具有8K 字節(jié)程序存儲(chǔ)空間,512 字節(jié)數(shù)據(jù)存儲(chǔ)空間,內(nèi)帶8K 字節(jié)EEPROΜ 存儲(chǔ)空間,可直接使用串口下載用戶程序。內(nèi)部集成專用的復(fù)位電路。本設(shè)計(jì)以STC89C52 單片機(jī)為主控系統(tǒng),包括晶振電路、復(fù)位電路等構(gòu)成了單片機(jī)最小系統(tǒng)[10~11]。單片機(jī)最小系統(tǒng)的主要功能是系統(tǒng)資源完全開(kāi)放,電路板簡(jiǎn)單實(shí)用,結(jié)合用戶動(dòng)手搭建的硬件電路或者模塊化的集成電路可以實(shí)現(xiàn)多種實(shí)驗(yàn)功能。此外,它的接口設(shè)計(jì)靈活,使用方便,適用于創(chuàng)新實(shí)踐活動(dòng)中設(shè)計(jì)使用。
圖2 STC89C52 主控芯片引腳排列
本設(shè)計(jì)使用LCD1602 液晶屏作為密碼的顯示界面,可以顯示2 行16 列的字符,顯示的內(nèi)容與LED 數(shù)碼管相比,更加多樣[12]。而且還避免了數(shù)碼管需要不斷掃描更新,一旦掃描不及時(shí)就會(huì)出現(xiàn)數(shù)碼管顯示閃爍的缺點(diǎn)。液晶屏插接到開(kāi)發(fā)板的排針上,操作簡(jiǎn)單,利用螺絲刀調(diào)節(jié)電位器可以改變屏幕顯示的對(duì)比度。LCD 液晶屏作為調(diào)試的窗口,提供了類似于printf 函數(shù)的功能,可以實(shí)時(shí)地觀察單片機(jī)內(nèi)部數(shù)據(jù)的變化情況。單片機(jī)STC89C52 與LCD1602的接線如圖3 所示,單片機(jī)P0.0~P0.7 共8 個(gè)引腳分別接顯示屏的DB0~DB7 的8 個(gè)接口。單片機(jī)的RD 管腳(P2.6 引腳)、WR 管腳(P2.5 引腳)、LCDE 管腳(P2.7 引腳)分別接顯示屏的RS 接口、RW 接口、E 接口。此外,還需要給顯示屏及其背景燈提供電源。
圖3 LCD1602 接線圖
為了減少I(mǎi)/O 口的占用,本項(xiàng)目采用如圖4 所示的4 行4 列的矩陣鍵盤(pán)形式作為輸入按鍵,16 個(gè)按鍵僅占用了8 個(gè)接口。其中最后一行的按鍵沒(méi)有設(shè)置功能,前三行,即S1~S12 共12 個(gè)按鍵,依次對(duì)應(yīng)數(shù)字1~9 鍵,數(shù)字0 鍵,“確認(rèn)”鍵和“取消”鍵的輸入功能。本項(xiàng)目采用逐列掃描的方式,然后快速循環(huán)這個(gè)過(guò)程,從而讀取出12 個(gè)按鍵中任意位置按鍵的狀態(tài),實(shí)現(xiàn)所有按鍵同時(shí)檢測(cè)的效果。硬件接線將16 個(gè)按鍵的引腳通過(guò)排針JP4 的1~8 口依次連接到單片機(jī)的P2.0~P2.7 的引腳上。
圖4 4×4 矩陣鍵盤(pán)輸入電路
矩陣鍵盤(pán)的按鍵實(shí)質(zhì)上是機(jī)械開(kāi)關(guān),受到彈性的作用,機(jī)械觸點(diǎn)在閉合時(shí)不會(huì)立馬就穩(wěn)定地接通,同樣在斷開(kāi)時(shí)也不會(huì)一下子就斷開(kāi)。按鍵地按下和抬起的瞬間,都伴隨有一連串的極短時(shí)間的抖動(dòng)。為了消除抖動(dòng),可以采用搭建硬件電路,過(guò)濾掉抖動(dòng)的瞬間后,再進(jìn)行按鍵狀態(tài)的檢測(cè),但這種方法需要消耗硬件資源,而且操作起來(lái)難度較大,所以本項(xiàng)目采用軟件編寫(xiě)的方式消除抖動(dòng)。因?yàn)楫a(chǎn)生抖動(dòng)的時(shí)間段一般為5~10ms,所以當(dāng)檢測(cè)到按鍵按下或者抬起時(shí),通過(guò)軟件延時(shí)20ms,就可以規(guī)避掉抖動(dòng)的時(shí)間段。
本項(xiàng)目針對(duì)一個(gè)相對(duì)復(fù)雜的任務(wù),將其拆分成若干個(gè)小任務(wù)來(lái)解決,這種方法叫做分層。分層后形成的若干個(gè)較小的局部任務(wù),相較于整個(gè)任務(wù)來(lái)說(shuō),往往易于研究,容易找到突破口,處理起來(lái)難度也較小。這也就是軟件編程設(shè)計(jì)中,模塊化的編程思路。模塊化編程的好處有以下四個(gè)方面:
(1)各模塊之前相互獨(dú)立。當(dāng)一個(gè)模塊需要使用其他模塊的功能時(shí),不需要知道它的底層邏輯是如何實(shí)現(xiàn)的,只需要調(diào)用該模塊的接口,就可以接受到它所提供的服務(wù)。
(2)靈活性好。當(dāng)某一模塊的任務(wù)需求發(fā)生改變后,只需要對(duì)該模塊的程序進(jìn)行修改,實(shí)現(xiàn)對(duì)應(yīng)的功能函數(shù)的編寫(xiě),則不影響其他模塊功能的實(shí)現(xiàn)。
(3)結(jié)構(gòu)上可分割。每個(gè)模塊都可以采用最合適的算法技術(shù)來(lái)實(shí)現(xiàn)。
(4)復(fù)雜性低,易于排錯(cuò)。每個(gè)模塊的功能性比較明確,在整個(gè)程序的調(diào)試過(guò)程中便于定位到存在問(wèn)題的具體位置,只要針對(duì)該位置進(jìn)行程序的修改調(diào)試即可。
本項(xiàng)目包含3 個(gè)相互獨(dú)立的子程序,分別為Delay 延時(shí)子程序、LCD1602 液晶屏調(diào)試子程序、ΜatrixKey 矩陣按鍵子程序。在使用延時(shí)子程序的延時(shí)功能時(shí),只需要調(diào)用它的函數(shù)聲明,并給它的形式參數(shù)在合理取值范圍內(nèi)賦值,可以實(shí)現(xiàn)預(yù)定時(shí)間的延時(shí)。在本項(xiàng)目中延時(shí)功能主要用于軟件消抖,檢測(cè)到按鍵按下或抬起時(shí),延時(shí)20ms。本項(xiàng)目提供的LCD1602 代碼屬于模塊化的代碼,在使用過(guò)程中只要知道所提供函數(shù)的作用和使用方法就可以很容易地使用LCD1602。比如初始化LCD 液晶屏、顯示字符串“Password:”、顯示十進(jìn)制的數(shù)字“0000”等,按照對(duì)應(yīng)功能函數(shù)的參數(shù)說(shuō)明,添加合適的參數(shù)值即可完成相應(yīng)功能。矩陣按鍵子程序,主要實(shí)現(xiàn)功能是通過(guò)單片機(jī)P2 端口的不斷循環(huán)掃描讀取,檢測(cè)定位到矩陣按鍵的具體位置,并給該按鍵附上鍵值。矩陣按鍵的部分程序如下:
主函數(shù)調(diào)用LCD1602 子函數(shù)實(shí)現(xiàn)LCD 初始化,在LCD 顯示屏的第一行顯示字符串“Password:”。調(diào)用矩陣按鍵子程序,對(duì)按下的鍵值進(jìn)行判斷。如果鍵值KeyNum<=10,即S1~S10(數(shù)字鍵0~9)按鍵按下,變量Count 計(jì)數(shù)1 次,累計(jì)計(jì)數(shù)達(dá)到4 次,實(shí)現(xiàn)輸入四位數(shù)密碼的功能,并且四次的鍵值依次從高位到低位顯示在LCD1602 顯示屏上;如果鍵值KeyNum==11,即S11(“確認(rèn)”鍵)按下,實(shí)現(xiàn)軟件設(shè)置的四位數(shù)預(yù)設(shè)密碼和輸入的四位數(shù)密碼的比對(duì),兩者相同顯示屏顯示“OK”,兩者不同顯示“ERR”;如果鍵值KeyNum==12,即S12(“取消”鍵)按下,實(shí)現(xiàn)四位數(shù)密碼清零,恢復(fù)到“0000”的顯示。程序設(shè)計(jì)流程圖,如圖5 所示。
圖5 程序設(shè)計(jì)流程圖
本設(shè)計(jì)以STC89C52 單片機(jī)為核心,結(jié)合LCD1602 液晶顯示屏和4×4 矩陣鍵盤(pán)的外設(shè)組合,構(gòu)成了簡(jiǎn)單的電子密碼鎖設(shè)計(jì)。該設(shè)計(jì)易于實(shí)現(xiàn),設(shè)計(jì)實(shí)物圖,如圖6 所示。在此基礎(chǔ)上可以增加外設(shè)模塊,拓展出其他功能,滿足更加多元化的用戶需求。如實(shí)現(xiàn)連續(xù)三次輸入密碼錯(cuò)誤觸發(fā)聲光報(bào)警、增加遠(yuǎn)程遙控器輸入密碼完成遠(yuǎn)程解鎖功能、預(yù)先存儲(chǔ)用戶的指紋和實(shí)時(shí)檢測(cè)到的指紋相比對(duì),從而實(shí)現(xiàn)若指紋匹配則智能化打開(kāi)電子鎖的功能等[13]。
圖6 設(shè)計(jì)實(shí)物圖