找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 24804|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的電子密碼鎖綜合課程設(shè)計(jì)報(bào)告,含源碼和接線圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我的單片機(jī)結(jié)課項(xiàng)目
原理比較簡(jiǎn)單,主要使用80C51單片機(jī),加一個(gè)lcd屏
信息與機(jī)電工程學(xué)院
《單片機(jī)原理及應(yīng)用》課程設(shè)計(jì)報(bào)告

課題名稱       基于51單片機(jī)的電子密碼鎖設(shè)計(jì)  
專業(yè)班級(jí)         2016級(jí)電子信息工程國(guó)內(nèi)班      


基于51單片機(jī)的電子密碼鎖設(shè)計(jì)

在日常的生活和工作中,住宅安全,文件資料的保護(hù)都需要用鎖來(lái)保證。傳統(tǒng)往往使用機(jī)械式鑰匙開鎖,但鑰匙丟失會(huì)使鎖的安全性大打折扣。隨著科學(xué)技術(shù)的不斷發(fā)展,電子密碼鎖應(yīng)運(yùn)而生,而密碼鎖也具有安全性高、成本低、功耗低、易操作等優(yōu)點(diǎn)。

本設(shè)計(jì)是基于51單片機(jī),并結(jié)合液晶顯示LCD1602,以及矩陣鍵盤輸入、復(fù)位、電源等電路組合而成。系統(tǒng)能夠完成開鎖、修改密碼等基本功能。整個(gè)設(shè)計(jì)在Keil開發(fā)環(huán)境下,用C語(yǔ)言編寫主控芯片的控制程序來(lái)實(shí)現(xiàn)具有多功能的電子密碼鎖。


一、緒論

1.1電子密碼鎖的背景

  隨著社會(huì)不斷進(jìn)步,人民生活水平不斷提高,安全成為現(xiàn)代居民最關(guān)心的問(wèn)題之一。從古至今,鎖一直就是保護(hù)人們財(cái)產(chǎn)的必不可少的工具。目前,我們最常用的鎖就是圓柱形銷栓的彈子鎖,其機(jī)構(gòu)簡(jiǎn)單,使用方便,價(jià)格便宜,但在使用中暴露了很多缺點(diǎn):1、容易被開啟;2、內(nèi)部機(jī)械結(jié)構(gòu)復(fù)雜、故障率高;3、換鎖麻煩;4、互開率高;5、易被破壞;6、帶鑰匙的煩惱;7、鑰匙開門的煩惱。

電子密碼鎖是一種通過(guò)密碼輸入來(lái)控制電路或是芯片工作,從而控制機(jī)械開關(guān)的閉合,完成開鎖、閉鎖任務(wù)的電子產(chǎn)品。它的種類很多,有簡(jiǎn)易的電路產(chǎn)品,也有基于芯片的性價(jià)比較高的產(chǎn)品,F(xiàn)在應(yīng)用較廣的電子密碼鎖是以芯片為核心,通過(guò)編程來(lái)實(shí)現(xiàn)的。其性能和安全性已大大超過(guò)了機(jī)械鎖。所以,研究電子密碼鎖,符合現(xiàn)在主流發(fā)展趨勢(shì),具有極大的研究意義和現(xiàn)實(shí)意義,也具有經(jīng)濟(jì)可行性。

1.2電子密碼鎖的特點(diǎn)

1.保密性好,編碼量多,遠(yuǎn)遠(yuǎn)大于彈子鎖。隨機(jī)開鎖成功率幾乎為零。

2.密碼可變。 用戶可以經(jīng)常更改密碼,防止密碼被盜,同時(shí)也可以避免因人員的更替而使鎖的密級(jí)下降。

3.誤碼輸入保護(hù)。當(dāng)輸入密碼多次錯(cuò)誤時(shí),報(bào)警系統(tǒng)自動(dòng)啟動(dòng)。

4. 電子密碼鎖操作簡(jiǎn)單易行,一學(xué)即會(huì)。

5.干擾碼功能。在輸入正確密碼前可輸入任意碼。

6.安保功能。如果連續(xù)輸錯(cuò)4次密碼將會(huì)自動(dòng)斷電3分鐘。

7.緊急開啟功能(Panic Open)。出門時(shí)無(wú)需其他操作,只需一次的把手動(dòng)作,可機(jī)械的開啟門,所以遇到火災(zāi)等應(yīng)急狀況下也迅速,安全的開啟門。

8.入侵感應(yīng)功能。在門上鎖的狀態(tài)下,有人破鎖而入時(shí),會(huì)發(fā)出強(qiáng)力的報(bào)警音。

9.火災(zāi)報(bào)警功能。在室內(nèi)如果溫度達(dá)到75°左右,將會(huì)發(fā)出強(qiáng)力的報(bào)警音,同時(shí)鎖會(huì)自動(dòng)開啟。

10.雙重鎖定功能。外部強(qiáng)制鎖定:在內(nèi)部不能開啟,適用于外出時(shí),防止有人入侵。內(nèi)部強(qiáng)制鎖定:在外部不能開啟,讓您在家時(shí)更安心、安全。

11.弱電提醒功能。弱電提醒當(dāng)電量不足時(shí),在啟動(dòng)開門時(shí),會(huì)有美妙的音樂(lè)提示您及時(shí)更換電池。

12.自動(dòng)上鎖功能。采用全自動(dòng)鎖芯,門關(guān)后6秒內(nèi)自動(dòng)上鎖,外出更加安全。

13.外部顯示功能。當(dāng)密碼輸入錯(cuò)誤,鎖舌沒正常鎖到位,室內(nèi)反鎖,弱電等情況下,外部都有提示功能。

1.3電子密碼鎖的設(shè)計(jì)意義

單片機(jī)是典型的嵌入式微控制器(Microcontroller Unit),由運(yùn)算器,控制器,存儲(chǔ)器,輸入輸出設(shè)備等構(gòu)成,相當(dāng)于一個(gè)微型的計(jì)算機(jī)。與應(yīng)用在個(gè)人電腦中的通用型微處理器相比,它更強(qiáng)調(diào)自供應(yīng)(不用外接硬件)和節(jié)約成本。它的最大優(yōu)點(diǎn)是體積小,可放在儀表內(nèi)部,但存儲(chǔ)量小,輸入輸出接口簡(jiǎn)單,功能較低。由于其發(fā)展非常迅速,舊的單片機(jī)的定義已不能滿足,所以在很多應(yīng)用場(chǎng)合被稱為范圍更廣的微控制器;從上世紀(jì)80年代,由當(dāng)時(shí)的4位、8位單片機(jī),已經(jīng)發(fā)展到現(xiàn)在的32位300M的高速單片機(jī)。

單片機(jī)相當(dāng)于一個(gè)微型的計(jì)算機(jī)(最小系統(tǒng)),和計(jì)算機(jī)相比,單片機(jī)缺少了外圍設(shè)備等。概括的講:一塊芯片就成了一臺(tái)計(jì)算機(jī)。它的體積小、質(zhì)量輕、價(jià)格便宜、為學(xué)習(xí)、應(yīng)用和開發(fā)提供了便利條件。同時(shí),學(xué)習(xí)使用單片機(jī)是了解計(jì)算機(jī)原理與結(jié)構(gòu)的最佳選擇。它最早是被用在工業(yè)控制領(lǐng)域。

在很多方面單片機(jī)比專用處理器更適合應(yīng)用于嵌入式系統(tǒng),因此它得到了廣泛的應(yīng)用。事實(shí)上單片機(jī)是世界上數(shù)量最多處理器,隨著單片機(jī)家族的發(fā)展壯大,單片機(jī)和專用處理器的發(fā)展便分道揚(yáng)鑣。
現(xiàn)代人類生活中所用的幾乎每件有電子器件的產(chǎn)品中都會(huì)集成有單片機(jī)。手機(jī)、電話、計(jì)算器、家用電器、電子玩具、掌上電腦以及鼠標(biāo)等電子產(chǎn)品中都含有單片機(jī)。

基于單片機(jī)的電子密碼鎖設(shè)計(jì),只需在單片機(jī)外圍接簡(jiǎn)單的接口電路,核心部分由人為寫入程序即可,這樣不僅易于操作,也可使產(chǎn)品成本大大降級(jí),且容易進(jìn)行升級(jí)改善。該種電子密碼鎖設(shè)計(jì)方法合理,簡(jiǎn)單易行,成本低,符合人們需求,具有一定的商業(yè)價(jià)值和市場(chǎng)推廣性。

二、實(shí)驗(yàn)原理

2.1單片機(jī)開發(fā)系統(tǒng)主要硬件簡(jiǎn)介

單片機(jī)開發(fā)系統(tǒng)的硬件采用的是普中科技的HC6800EM3單片機(jī)開發(fā)試驗(yàn)儀,它是具有“實(shí)驗(yàn)、編程、ISP下載線”多功能合一的新一代單片機(jī)開發(fā)系統(tǒng)。該51單片機(jī)學(xué)習(xí)實(shí)驗(yàn)板支持STC的增強(qiáng)型51單片機(jī)的實(shí)驗(yàn)、編程功能,同時(shí)也兼容AVR系列單片機(jī)的燒寫和實(shí)驗(yàn)。

  • 硬件布局

2、實(shí)驗(yàn)板端口資源

整個(gè)板子采取功能模塊化設(shè)計(jì),也就是說(shuō)每個(gè)功能模塊都是獨(dú)立,端口之間都未連接,因此做實(shí)驗(yàn)時(shí)候需要學(xué)習(xí)者自己先進(jìn)行硬件電路的設(shè)計(jì)與連接來(lái)搭建。詳細(xì)見實(shí)驗(yàn)板原理圖和每個(gè)實(shí)驗(yàn)的內(nèi)容。下表為部分引腳和外圍IC的接口對(duì)照表:

外圍IC與單片機(jī)接口對(duì)照表

74HC165

并入串出鎖存器

CLOCK

P3.6

74HC595

串入并出鎖存器

MISO

P3.4(有短路帽)

INDAT

P1.7(有短路帽)

SCK

P3.6

SH/LD

P1.6

RCK

P3.5

74HC138

138譯碼器

A

P2.2

DS1302

實(shí)時(shí)時(shí)鐘

SCK

P3.6

B

P2.3

I/O

P3.4(有短路帽)

C

P2.4

RST

P3.5

AT24C02

EEPROM

SCL

P2.1

PCF8591

數(shù)模/模數(shù)轉(zhuǎn)換

SCL

P2.1

SDA

P2.0

SDA

P2.0

繼電器


P1.4(有短路帽)

蜂鳴器


P1.5(有短路帽)

紅外接收頭


P3.2(有短路帽)

溫度檢測(cè)


P3.7

步進(jìn)馬達(dá)


P1.0-P1.3

串口通信


P3.0  P3.1

1602/12864/彩屏8位數(shù)據(jù)接口


P0.0-P0.7

NE555

555定時(shí)器


P3.5(有短路帽)

2.2單片機(jī)開發(fā)軟件簡(jiǎn)介

KeilC51軟件開發(fā)系統(tǒng)簡(jiǎn)介

單片機(jī)開發(fā)中除必要的硬件外,同樣離不開軟件,匯編語(yǔ)言源程序要變?yōu)镃PU可以執(zhí)行的機(jī)器碼有兩種方法,一種是手工匯編,另一種是機(jī)器匯編,目前已極少使用手工匯編的方法了。

單片機(jī)在發(fā)展了這么多年來(lái),出現(xiàn)了各種各樣的編譯軟件,Keil C51是美國(guó)Keil Software公司出品的51系列兼容單片機(jī)C語(yǔ)言軟件開發(fā)系統(tǒng),是目前開發(fā)51系列單片機(jī)的主流工具。與匯編相比,C語(yǔ)言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。用過(guò)匯編語(yǔ)言后再使用C來(lái)開發(fā),體會(huì)更加深刻。

C語(yǔ)言是一個(gè)通用的編程語(yǔ)言,它提供高效的代碼、結(jié)構(gòu)化的編程和豐富的操作符。C語(yǔ)言不是一種大語(yǔ)言,不是為任何特殊應(yīng)用領(lǐng)域而設(shè)計(jì),它一般來(lái)說(shuō)限制較少,可以為各種軟件任務(wù)提供方便和有效的編程。許多應(yīng)用用C比其他語(yǔ)言編程更方便和有效。

優(yōu)化的Cx51的C編譯器完整的實(shí)現(xiàn)了ANSI的C語(yǔ)言標(biāo)準(zhǔn),對(duì)8051來(lái)說(shuō),Cx51不是一個(gè)通用的C編譯器,它首先的目標(biāo)是生成針對(duì)8051的最快和最緊湊的代碼。Cx51具有C編程的彈性和高效的代碼和匯編語(yǔ)言的速度。

C語(yǔ)言不能執(zhí)行的操作如輸入和輸出,需要操作系統(tǒng)的支持的一部分提供,因?yàn)檫@些函數(shù)和語(yǔ)言本身無(wú)關(guān),所以C特別適合對(duì)多平臺(tái)提供代碼。

8051系列是增長(zhǎng)最快的微處理器構(gòu)架之一,從不同的芯片廠家提供了400多種新擴(kuò)展的8051芯片,如PHILIPS的8051MX有幾M字節(jié)的代碼和數(shù)據(jù)空間大的應(yīng)用中。為了支持這些不同的8051芯片,Keil提供了幾種開發(fā)工具輸出文件格式,OMF2允許支持最多16MB代碼和數(shù)據(jù)空間的PHILIPS 8051MX結(jié)構(gòu)。

Keil C51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語(yǔ)言的優(yōu)勢(shì)。

2.3程序燒錄

程序燒錄有兩種方法:

  • 使用普中科技的程序下載軟件。
  • 使用STC官方軟件下載

三、系統(tǒng)總體方案設(shè)計(jì)

3.1電子密碼鎖功能簡(jiǎn)介

電子密碼鎖由機(jī)械模塊、集成線路、電子元件、運(yùn)行算法等多部分組成,其核心為芯片,通過(guò)程序算法下達(dá)各種指令,由其他部分配合完成密碼的設(shè)置、存貯、識(shí)別和顯示、驅(qū)動(dòng)電磁執(zhí)行器并檢測(cè)其驅(qū)動(dòng)電流值、接收傳感器送來(lái)的報(bào)警信號(hào)、發(fā)送數(shù)據(jù)等工作。

密碼鎖的核心原理也很容易讓人理解,單片機(jī)接收用戶輸入的指令(密碼),與存貯在EEPROM中的密碼進(jìn)行對(duì)比。若指令相同,則驅(qū)動(dòng)電機(jī)開鎖;若指令不同,則提示錯(cuò)誤和重新輸入密碼。同時(shí)芯片會(huì)記錄用戶操作的指令以及芯片做出的反應(yīng)狀態(tài),作為后續(xù)智能化分析單依據(jù)。

3.2 STC15W4K32S4系列單片機(jī)簡(jiǎn)介

STC15W4K32S4系列單片機(jī)是 單片機(jī)是STC生產(chǎn)的單時(shí)鐘/機(jī)器周期(1T)的單片機(jī),是寬電壓/高速/高可靠/低功耗/超強(qiáng)抗干擾的新一代8051單片機(jī),采用STC第九代加密技術(shù),無(wú)法解密,指令代碼完全兼容傳統(tǒng)8051,但速度快8-12倍。內(nèi)部集成高精度R/C時(shí)鐘(±0.3%),±1%溫飄(-40℃~+85℃),常溫下溫飄±0.6%(-20℃~+65℃),ISP編程時(shí)5MHz~30MHz寬范圍可設(shè)置,可徹底省掉外部昂貴的晶振和外部復(fù)位電路(內(nèi)部已集成高可靠復(fù)位電路,ISP編程時(shí)16級(jí)復(fù)位門檻電壓 可選)。8路10位PWM,8路高速10位A/D轉(zhuǎn)換(30萬(wàn)次/秒),內(nèi)置4K字節(jié)大容量SRAM,4組獨(dú)立 的高速異步串行通信端口(UART1/UART2/UART3/UART4),1組高速同步串行通信端口SPI, 針對(duì)多串行口通信/電機(jī)控制/強(qiáng)干擾場(chǎng)合。內(nèi)置比較器,功能更強(qiáng)大。

現(xiàn)STC15系列單片機(jī)采用STC-Y5超高速CPU內(nèi)核,在相同的時(shí)鐘頻率下,速度又比STC早期的1T系列單片機(jī)(如STC12系列/STC11系列/STC10系列)的速度快20%。

1.增強(qiáng)型 8051 CPU,1T,單時(shí)鐘/機(jī)器周期,速度比普通8051快8-12倍

2.工作電壓:2.5V - 5.5V

3.16K/32K/40K/48K/56K/58K/61K/63.5K字節(jié)片內(nèi)Flash程序存儲(chǔ)器,擦寫次數(shù)10萬(wàn)次以上

4.片內(nèi)大容量4096字節(jié)的SRAM,包括常規(guī)的256字節(jié)RAM <idata> 和內(nèi)部擴(kuò)展的3840字節(jié) XRAM <xdata>

5.大容量片內(nèi)EEPROM,擦寫次數(shù)10萬(wàn)次以上 EEPROM,擦寫次數(shù)10萬(wàn)次以上,擦寫次數(shù)10萬(wàn)次以上

6.ISP/IAP,在系統(tǒng)可編程/在應(yīng)用可編程,無(wú)需編程器/仿真器

7.共8通道10位高速ADC,速度可達(dá)30萬(wàn)次/秒,8路PWM還可當(dāng)8路D/A使用

8.6通道15位專門的高精度PWM(帶死區(qū)控制)+2通道CCP(利用它的高速脈沖輸出功能可實(shí)現(xiàn)11~16位PWM)----可用來(lái)再實(shí)現(xiàn)8路D/A或2個(gè)16位定時(shí)器,或2個(gè)外部中斷(支持上升沿/下降沿中斷)與STC15W4K32S4系列單片機(jī)的6路增強(qiáng)型PWM相關(guān)的端口.上電后默認(rèn)為高阻輸入,上電前用戶須在程序中將該些端口設(shè)置為其他模式(如準(zhǔn)雙向口或強(qiáng)推挽模式);注意該些端口進(jìn)入掉電模式時(shí)不能為高阻輸入,否則需外部加上拉電阻。
9.內(nèi)部高可靠復(fù)位,ISP編程時(shí)16級(jí)復(fù)位門檻電壓可選,可徹底省掉外部復(fù)位電路

10.工作頻率范圍: 5MHz~28MHz, 相當(dāng)于普通8051的60MHz~336MHz

11.內(nèi)部高精度R/C時(shí)鐘(+0.3%),+1%溫飄( 40°C~+85*C),常溫下溫飄+0.6%(-20*C~+65*C)

12.不需外部晶振和外部復(fù)位,還可對(duì)外輸出時(shí)鐘和低電平復(fù)位信號(hào)

13.四組完全獨(dú)立的高速異步串行通信端口,分時(shí)切換可當(dāng)9組串口使用:串口1(RxD/P3.0,TxD/P3.1)可以切換到(RxD_2/P3.6,TxD_2/P3.7),還可以切換到(RxD_3/P1.6,TxD_3/P1.7);串口2(RxD2/P1.0,TxD2/P1.1)可以切換到(RxD2_ 2/P4.6,TxD2_2/P4.7);串口3(RxD3/P0.0,TxD3/P0.1)可以切換到(RxD3_ 2/P5.0,TxD3_ 2/P5.1);串口4(RxD4/P0.2, TxD4/P0.3)可以切換到(RxD4_ 2/P5.2, TxD4_ _2/P5.3)

注意:建議用戶將串口1放在P3.6/P3.7或P1.6/ P1.7 (P3.0/P3.1作下載/仿真用);若用戶不想切換,堅(jiān)持使用P3.0/P3.1或作為串口1進(jìn)行通信,則務(wù)必在下載程序時(shí),在軟件上勾選“下次冷啟動(dòng)時(shí),P3.2/P3.3為0/0時(shí)才可以下載程序”。

14.一組高速同步串行通信端口SPI.

15.支持程序加密后傳輸,防攔截

16.支持RS485下載
17.低功耗設(shè)計(jì):低速模式,空閑模式,掉電模式/停機(jī)模式.
18.可將掉電模式/停機(jī)模式喚醒的定時(shí)器:有內(nèi)部低功耗掉電喚醒專用定時(shí)器。
19.共7個(gè)定時(shí)器,5個(gè)16位可重裝載定時(shí)器/計(jì)數(shù)器(TO/T1/T2/T3/T4,其中T0/T1兼容普通8051的定時(shí)器/計(jì)數(shù)器),并均可獨(dú)立實(shí)現(xiàn)對(duì)外可編程時(shí)鐘輸出(5通道),另外管腳SysClkO可將系統(tǒng)時(shí)鐘對(duì)外分頻輸出(+1或+2或+4或+16),2路CCP還可再實(shí)現(xiàn)2個(gè)定時(shí)器

20.定時(shí)器/計(jì)數(shù)器2,也可實(shí)現(xiàn)1個(gè)16位重裝載定時(shí)器/計(jì)數(shù)器,定時(shí)器/計(jì)數(shù)器2也可產(chǎn)生時(shí)鐘輸出T2CLKO

單片機(jī)引腳說(shuō)明

單片機(jī)的40個(gè)引腳大致可分為4類:電源、時(shí)鐘、控制和I/O引腳。
⒈ 電源:
⑴ VCC - 芯片電源,接+5V;
⑵ VSS - 接地端;

⒉ 時(shí)鐘:XTAL1、XTAL2 - 晶體振蕩電路反相輸入端和輸出端。

⒊ 控制線:控制線共有4根,
⑴ ALE/PROG:地址鎖存允許/片內(nèi)EPROM編程脈沖
① ALE功能:用來(lái)鎖存P0口送出的低8位地址
② PROG功能:片內(nèi)有EPROM的芯片,在EPROM編程期間,此引腳輸入編程脈沖。
⑵ PSEN:外ROM讀選通信號(hào)。
⑶ RST/VPD:復(fù)位/備用電源。
① RST(Reset)功能:復(fù)位信號(hào)輸入端。
② VPD功能:在Vcc掉電情況下,接備用電源。
⑷ EA/Vpp:內(nèi)外ROM選擇/片內(nèi)EPROM編程電源。
① EA功能:內(nèi)外ROM選擇端。
② Vpp功能:片內(nèi)有EPROM的芯片,在EPROM編程期間,施加編程電源Vpp。

⒋ I/O線
  80C51共有4個(gè)8位并行I/O端口:P0、P1、P2、P3口,共32個(gè)引腳。P3口還具有第二功能,用于特殊信號(hào)輸入輸出和控制信號(hào)(屬控制總線)。  

3.3LCD1602簡(jiǎn)介

工業(yè)字符型液晶,能夠同時(shí)顯示16x02即32個(gè)字符。(16列2行)
1602液晶也叫1602字符型液晶,它是一種專門用來(lái)顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形(用自定義CGRAM,顯示效果也不好)。
1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。
市面上字符液晶大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。

1602LCD 主要技術(shù)參數(shù):

顯示容量:16×2 個(gè)字符

芯片工作電壓:4.5—5.5V

工作電流:2.0mA(5.0V)

模塊最佳工作電壓:5.0V

字符尺寸:2.95×4.35(W×H)mm

管腳功能

1602采用標(biāo)準(zhǔn)的16腳接口,其中:
第1腳:VSS為電源地
第2腳:VCC接5V電源正極
第3腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高(對(duì)比度過(guò)高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè)10K的電位器調(diào)整對(duì)比度)。
第4腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。
第5腳:RW為讀寫信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作。
第6腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。
第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極。

特性

3.3V或5V工作電壓,對(duì)比度可調(diào)
內(nèi)含復(fù)位電路
提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能
有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM
內(nèi)建有192個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM
8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM

特征應(yīng)用

微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧,常用在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中。

操作控制

注:關(guān)于E=H脈沖——開始時(shí)初始化E為0,然后置E為1。
字符集
1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字母“A”。
在單片機(jī)編程中還可以用字符型常量或變量賦值,如'A’。因?yàn)镃GROM儲(chǔ)存的字符代碼與我們PC中的字符代碼是基本一致的,因此我們?cè)谙駾DRAM寫C51字符代碼程序時(shí)甚至可以直接用P1=‘A’這樣的方法。PC在編譯時(shí)就把'A'先轉(zhuǎn)換為41H代碼了。
字符代碼0x00~0x0F為用戶自定義的字符圖形RAM(對(duì)于5X8點(diǎn)陣的字符,可以存放8組,5X10點(diǎn)陣的字符,存放4組),就是CGRAM了。
0x20~0x7F為標(biāo)準(zhǔn)的ASCII碼,0xA0~0xFF為日文字符和希臘文字符,其余字符碼(0x10~0x1F及0x80~0x9F)沒有定義。
以下是1602的16進(jìn)制ASCII碼表地址:讀的時(shí)候,先讀左邊那列,再讀上面那行,如:感嘆號(hào)!的ASCII為0x21,字母B的ASCII為0x42(前面加0x表示十六進(jìn)制)。

1602LCD 的指令說(shuō)明及時(shí)序

1602 液晶模塊內(nèi)部的控制器共有11條控制指令。

控制命令表

序號(hào)

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清顯示

0

0

0

0

0

0

0

0

0

1

2

光標(biāo)返回

0

0

0

0

0

0

0

0

1

*

3

置輸入模式

0

0

0

0

0

0

0

1

I/D

S

4

顯示開/關(guān)控制

0

0

0

0

0

0

1

D

C

B

5

光標(biāo)或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符發(fā)生存貯器地址

0

0

0

1

字符發(fā)生存貯器地址

8

置數(shù)據(jù)存貯器地址

0

0

1

顯示數(shù)據(jù)存貯器地址

9

讀忙標(biāo)志或地址

0

1

BF

計(jì)數(shù)器地址

10

寫數(shù)到CGRAM或DDRAM)

1

0

要寫的數(shù)據(jù)內(nèi)容

11

從CGRAM或DDRAM讀數(shù)

1

1

讀出的數(shù)據(jù)內(nèi)容

1602 液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過(guò)指令編程來(lái)實(shí)現(xiàn)的。(說(shuō)明:1 為高電平、0 為低電平)

指令 1:清顯示,指令碼 01H,光標(biāo)復(fù)位到地址 00H 位置。

指令 2:光標(biāo)復(fù)位,光標(biāo)返回到地址 00H。

指令 3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移 S:屏幕上所有文字是否 左移或者右移。高電平表示有效,低電平則無(wú)效。

指令 4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控 制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無(wú)光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電

平不閃爍。

指令 5:光標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。

指令 6:功能設(shè)置命令 DL:高電平時(shí)為 4 位總線,低電平時(shí)為 8 位總線 N:低電平時(shí)為單行顯示,高 電平時(shí)雙行顯示 F: 低電平時(shí)顯示 5x7 的點(diǎn)陣字符,高電平時(shí)顯示 5x10 的點(diǎn)陣字符。

指令 7:字符發(fā)生器 RAM 地址設(shè)置。

指令 8:DDRAM 地址設(shè)置。

指令 9:讀忙信號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如 果為低電平表示不忙。

指令 10:寫數(shù)據(jù)。

指令 11:讀數(shù)據(jù)。

基本操作時(shí)序表

讀操作時(shí)序:

寫操作時(shí)序:

LCD1602的RAM地址映射

液晶顯示模塊是一個(gè)慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示 不忙,否則此指令失效。要顯示字符時(shí)要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖 10-57 是 1602 的內(nèi)部顯示地址。

1602 的內(nèi)部顯示地址:

例如第二行第一個(gè)字符的地址是 40H,那么是否直接寫入 40H 就可以將光標(biāo)定位在第二行第一個(gè)字符 的位置呢?這樣不行,因?yàn)閷懭腼@示地址時(shí)要求最高位 D7 恒定為高電平 1 所以實(shí)際寫入的數(shù)據(jù)應(yīng)該是 01000000B(40H)+10000000B(80H)=11000000B(C0H)。

在對(duì)液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時(shí)光標(biāo)是自動(dòng)右移的,無(wú)需人工 干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。

1602 液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了 160 個(gè)不同的點(diǎn)陣字符圖形,如圖 10-58 所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有 一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是 01000001B(41H),顯示時(shí)模塊把地址 41H 中 的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字母“A”。

1602LCD 的一般初始化(復(fù)位)過(guò)程

延時(shí) 15mS

寫指令 38H(不檢測(cè)忙信號(hào))

延時(shí) 5mS

寫指令 38H(不檢測(cè)忙信號(hào))

延時(shí) 5mS

寫指令 38H(不檢測(cè)忙信號(hào))

以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢測(cè)忙信號(hào)

寫指令 38H:顯示模式設(shè)置

寫指令 08H:顯示關(guān)閉

寫指令 01H:顯示清屏

寫指令 06H:顯示光標(biāo)移動(dòng)設(shè)置

寫指令 0CH:顯示開及光標(biāo)設(shè)置

3.4矩陣鍵盤簡(jiǎn)介

矩陣鍵盤是單片機(jī)外部設(shè)備中所使用的排布類似于矩陣的鍵盤組。矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識(shí)別也要復(fù)雜一些,列線通過(guò)電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。矩陣鍵盤的優(yōu)點(diǎn)是節(jié)約單片機(jī)IO口,例如普通鍵盤8個(gè)IO口只能用作8個(gè)按鍵,而矩陣鍵盤能作16個(gè)按鍵。

組成結(jié)構(gòu)

在鍵盤中按鍵數(shù)量較多時(shí),為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過(guò)一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P1口)就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時(shí),采用矩陣法來(lái)做鍵盤是合理的。

矩陣鍵盤不僅在連接上比單獨(dú)式按鍵復(fù)雜,它的按鍵識(shí)別方法也比單獨(dú)式按鍵復(fù)雜。在矩陣鍵盤的軟件接口程序中,常使用的按鍵識(shí)別方法有行掃描法和線反轉(zhuǎn)法。這兩種方法的基本思路是采用循環(huán)查循的方法,反復(fù)查詢按鍵的狀態(tài),因此會(huì)大量占用MCU的時(shí)間,所以較好的方式也是采用狀態(tài)機(jī)的方法來(lái)設(shè)計(jì),盡量減少鍵盤查詢過(guò)程對(duì)MCU的占用時(shí)間。

單片機(jī)系統(tǒng)中,若使用按鍵較多時(shí)如電子密碼鎖、電話機(jī)鍵盤等一般都至少有12到16個(gè)按鍵,通常采用矩陣鍵盤。

矩陣鍵盤又稱行列鍵盤,它是用四條I/O線作為行線,四條I/O線作為列線組成的鍵盤。在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤上按鍵的個(gè)數(shù)就為4*4個(gè)。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O口的利用率。

矩陣鍵盤的工作原理

   最常見的鍵盤布局如圖3所示。一般由16個(gè)按鍵組成,在單片機(jī)中正好可以用一個(gè)P口實(shí)現(xiàn)16個(gè)按鍵功能,這也是在單片機(jī)系統(tǒng)中最常用的形式,4*4矩陣鍵盤的內(nèi)部電路如圖。

矩陣鍵盤布局圖:

矩陣鍵盤內(nèi)部布局圖:

當(dāng)無(wú)按鍵閉合時(shí),P3.0~P3.3與P3.4~P3.7之間開路。當(dāng)有鍵閉合時(shí),與閉合鍵相連的兩條I/O口線之間短路。判斷有無(wú)按鍵按下的方法是:第一步,置列線P3.4~P3.7為輸入狀態(tài),從行線P3.0~P3.3輸出低電平,讀入列線數(shù)據(jù),若某一列線為低電平,則該列線上有鍵閉合。第二步,行線輪流輸出低電平,從列線P3.4~P3.7讀入數(shù)據(jù),若有某一列為低電平,則對(duì)應(yīng)行線上有鍵按下。綜合一二兩步的結(jié)果,可確定按鍵編號(hào)。但是鍵閉合一次只能進(jìn)行一次鍵功能操作,因此須等到按鍵釋放后,再進(jìn)行鍵功能操作,否則按一次鍵,有可能會(huì)連續(xù)多次進(jìn)行同樣的鍵操作。  

掃描法:
以4*4矩陣按鍵為例,將全部行線置低電平,然后檢測(cè)列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤中無(wú)鍵按下。
判斷閉合鍵所在的位置: 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過(guò)程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
線反轉(zhuǎn)法:

Step 1:將列線作為輸出線,行線作為輸入線。置輸出線全部為0,此時(shí)行線中呈低電平0的為按鍵所在行,如果全部都不是0,則沒有按鍵按下。
Step 2:將第一步反過(guò)來(lái),即將行線作為輸出線,列線作為輸入線。置輸出線全部為0,此時(shí)列線呈低電平的為按鍵所在的列。這樣,就可以確定了按鍵的位置(X,Y)。

鍵盤掃描方法:

鍵盤掃描方法是:行線P10~P13為輸出線,列線P14~P17為輸入線。一開始單片機(jī)將行線(P10~P13)全部輸出低電平,此時(shí)讀入列線數(shù)據(jù),若列線全為高電平則沒有鍵按下,當(dāng)列線有出現(xiàn)低電平時(shí)調(diào)用延時(shí)程序以此來(lái)去除按鍵抖動(dòng)。延時(shí)完成后再判斷是否有低電平,如果此時(shí)讀入列線數(shù)據(jù)還是有低電平,則說(shuō)明確實(shí)有鍵按下。最后一步確定鍵值。以第二行的S5鍵為例,若按下S5后該怎么得到這個(gè)鍵值呢?當(dāng)判斷確實(shí)有鍵按下之后,行線輪流輸出低電平,根據(jù)讀入列線的數(shù)據(jù)可以確定鍵值。首先,單片機(jī)將P10輸出為低電平,其它P11~P13輸出高電平,此時(shí)讀取列線的數(shù)據(jù)全為高電平,說(shuō)明沒有在第一行有鍵按下;其次,單片機(jī)將P11輸出低電平,其它P10、P12、P13仍為高電平,此時(shí)再來(lái)讀取列線數(shù)據(jù),發(fā)現(xiàn)列線讀到的數(shù)據(jù)有低電平,數(shù)值為1011(0x0B),如果鍵盤布局已經(jīng)確定,那么0x0B就代表S5的值了。轉(zhuǎn)到S5鍵功能處理子程序就可以達(dá)到目的。

四、系統(tǒng)軟件設(shè)計(jì)方案

4.1軟件設(shè)計(jì)思路

將整個(gè)程序分為三個(gè)部分,一個(gè)是輸入部分,一個(gè)是顯示部分,最后是密碼驗(yàn)證和重置。

輸入部分由矩陣鍵盤完成,將矩陣鍵盤上的每一個(gè)鍵賦值,主要有數(shù)字鍵0-9,確認(rèn)鍵,更正鍵(重新輸入密碼),以及重置鍵(設(shè)置新的密碼)。

顯示部分:在矩陣鍵盤上輸入數(shù)字時(shí),將輸入的數(shù)字顯示在LCD液晶屏上,并且在輸入密碼、驗(yàn)證密碼后顯示密碼是否正確。

密碼驗(yàn)證和重置:在輸入密碼完成后,將輸入密碼和實(shí)際密碼比較。而在重置密碼時(shí),要先確認(rèn)輸入密碼是否正確。


五、系統(tǒng)調(diào)試

編程運(yùn)行顯示無(wú)錯(cuò)誤,經(jīng)過(guò)在老師面前進(jìn)行實(shí)物操作,顯示該電子密碼鎖確實(shí)具有輸入,顯示,驗(yàn)證,修改密碼,重置密碼等功能。



單片機(jī)源程序如下:

  1. <font color="rgb(0, 0, 0)">#include <STC15.h>

  2. #include "intrins.h"
  3. typedef unsigned char u8;
  4. typedef unsigned int u16;
  5. u8 code KeyCodeTable[]=
  6. {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
  7. 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};

  8. sbit FMQ=P4^2;
  9. sbit RS = P2^6;          //數(shù)據(jù)/命令選擇控制位
  10. sbit RW = P2^5;                //讀/寫控制位
  11. sbit EN = P2^7;                //使能控制位
  12. #define DataPort P0

  13. u8 Keys_Scan(void);
  14. void Delay_500us(void);
  15. void Delay_nms(u16 nms);
  16. void Beep(void);
  17. void Pin_Mode(void);

  18. void LCD_Initial(void);
  19. bit LCD_Check_Busy(void);
  20. void LCD_Write_Command(u8 command);
  21. void LCD_Write_Data(u8 Data);
  22. void LCD_Clear(void);
  23. void xianshi(void); //LCD顯示函數(shù)
  24. void xianshiyes(void);  //輸入密碼正確的顯示函數(shù)
  25. void xianshiwrong(void);  //輸入密碼錯(cuò)誤后的顯示函數(shù)
  26. void input(void);  //輸入函數(shù)
  27. void CZMA(void);   //重置密碼函數(shù)
  28. void yanzhen(void);  //將輸入的密碼與正確密碼對(duì)比的驗(yàn)證函數(shù)
  29. void fuzhi1(void);  //對(duì)LCD顯示函數(shù)中的數(shù)組賦值函數(shù)

  30. u8 RIGHT[]="pass";
  31. u8 WRONG[]="Password Error";
  32. u8 SHURU[]="aaaaaaaaaa";
  33. u8 SHUZU[]="aaaaaaaaaa";
  34. u8 MIMA[]="000aaaaaaa";
  35. u16 Yanzhenshu=0;
  36. void main(void)
  37. {
  38.         Pin_Mode();
  39.         LCD_Initial();
  40.         LCD_Clear();
  41.         while(1)
  42.         { P1=0x0f;
  43.                
  44.                 if((P1&0x0f)!=0x0f)
  45.                 { Delay_nms(15);
  46.                         if((P1&0x0f)!=0x0f)
  47.                         { LCD_Clear();
  48.                                 fuzhi1(); //先對(duì)顯示的數(shù)組進(jìn)行賦值,以免出現(xiàn)顯示錯(cuò)誤
  49.                                 
  50.                                 input(); //輸入密碼
  51.                                 if(Keys_Scan()==12)
  52.                                 LCD_Clear();
  53.                                 fuzhi1();
  54.                                 
  55.                                 input(); //若按下重置鍵,則重新輸入
  56.                                 if(Keys_Scan()==13)
  57.                                 { yanzhen(); //按下確認(rèn)鍵,對(duì)密碼進(jìn)行驗(yàn)證
  58.                                         if(Yanzhenshu==0)
  59.                                         {LCD_Clear();
  60.                                         xianshiyes(); //密碼正確
  61.                                         }
  62.           else
  63.           { LCD_Clear();
  64.                                                 fuzhi1();
  65.                                                 xianshiwrong();        //密碼錯(cuò)誤
  66.                                         }                                                
  67.                                 }
  68.                                 if(Keys_Scan()==15)
  69.                                 {
  70.                                         LCD_Clear();
  71.                                         fuzhi1();
  72.                                         yanzhen(); //按下重置密碼鍵之后,先確認(rèn)之前輸入的密碼是否正確
  73.                                         if(Yanzhenshu==0)
  74.                                         CZMA(); //正確則重置密碼
  75.                                   else
  76.                                         {LCD_Clear();
  77.                                         xianshiwrong();        
  78.                                         }
  79.                                 }
  80.                                 P1=0xf0;
  81.                                 while((P1&0xf0)!=0xf0)
  82.                                 { P1=0xf0;
  83.                                         Beep();
  84.                                 }
  85.                         }
  86.                 }

  87.         }
  88. }
  89. void fuzhi1(void)
  90. { u8 i=0;
  91.         for(;i<10;i++)
  92.         { SHUZU[i]='a';
  93.         }
  94. }

  95. void yanzhen(void)
  96. { u8 i;
  97.         Yanzhenshu=0;
  98.         for(i=0;MIMA[i]!='a' && MIMA[i]!='\0';i++)
  99.         { if(SHURU[i]!=MIMA[i] || SHURU[i+1]!=MIMA[i+1])  //驗(yàn)證密碼是否正確
  100.           {Yanzhenshu=1;
  101.                         break;
  102.                 }
  103.         }
  104. }
  105. void xianshiyes(void)
  106. { u8 m;
  107.          u8 n=0;
  108.         for (m=0x80;m<0x90;m++)
  109.         {
  110.         LCD_Write_Command(m);
  111.                 if(RIGHT[n]=='\0') break;
  112.                 LCD_Write_Data(RIGHT[n]);
  113.                 n++;
  114.         }
  115. }
  116. void xianshiwrong(void)
  117. { u8 m;
  118.          u8 n=0;
  119.         for (m=0x80;m<0x90;m++)
  120.         {
  121.         LCD_Write_Command(m);
  122.                 if(WRONG[n]=='\0') break;
  123.                 LCD_Write_Data(WRONG[n]);
  124.                 n++;
  125.         }
  126. }
  127. void xianshi(void)
  128. { u8 m;
  129.          u8 n=0;
  130.         for (m=0x80;m<0x90;m++)
  131.         {
  132.           LCD_Write_Command(m);
  133.                 if(SHUZU[n]=='a'|| SHUZU[n]=='\0') break;
  134.                 LCD_Write_Data(SHUZU[n]);
  135.                 n++;
  136.         }
  137. }
  138. void CZMA(void)
  139. { u8 i,key;
  140.         for(i=0;i<10;)
  141.         { P1=0xf0;
  142.                 if((P1&0xf0)!=0xf0)
  143.                 { Delay_nms(15);
  144.                         if((P1&0xf0)!=0xf0 )
  145.                         { if(Keys_Scan()!=15)
  146.                                 {
  147.                                 if (Keys_Scan()==13) break; //再確認(rèn)要重置密碼后,把輸入的新密碼存入'SHUZU'數(shù)組中,若按下確認(rèn)鍵則跳出
  148.                           key=Keys_Scan();
  149.                                 SHUZU[i]=key+'0';
  150.                                 xianshi();
  151.                                 i++;
  152.                                 }
  153.                                 P1=0xf0;
  154.                                 while((P1&0xf0)!=0xf0)
  155.                                 { P1=0xf0;
  156.                                         Beep();
  157.                                 }
  158.                         }
  159.                 }
  160.                
  161.         }
  162.         for(i=0;i<9;i++)
  163.         {MIMA[i]=SHUZU[i];//將密碼存入“MIMA”數(shù)組中
  164.         }
  165.         LCD_Clear();
  166.         fuzhi1();
  167. }
  168. void input(void)
  169. {
  170.         u8 i=0,key;
  171.         for(;i<10;)
  172.         { P1=0xf0;
  173.                 if((P1&0xf0)!=0xf0)
  174.                 { Delay_nms(15);
  175.                         if((P1&0xf0)!=0xf0)
  176.                         { if (Keys_Scan()>=10) break; //確認(rèn)有鍵按下后,如果按下的不是數(shù)字鍵0-9,則跳出循環(huán)
  177.                                 key=Keys_Scan();
  178.                                 SHURU[i]=key+'0'; //將輸入的數(shù)字轉(zhuǎn)化為字符變量存入‘SHURU’和‘SHUZU'兩個(gè)數(shù)組中
  179.                                 SHUZU[i]=SHURU[i];
  180.                                 SHURU[i+1]='a';  //對(duì)"SHURU"數(shù)組的下一位賦值為a,避免在驗(yàn)證密碼時(shí)出錯(cuò)
  181.                                 xianshi(); //顯示函數(shù)
  182.                                 i++;
  183.                                 
  184.                                 P1=0xf0;
  185.                                 while((P1&0xf0)!=0xf0)
  186.                                 { P1=0xf0;
  187.                                         Beep();
  188.                                 }
  189.                         }
  190.                 }
  191.                
  192.         }
  193.         
  194. }
  195. void Delay_500us(void)
  196. {
  197.         u16 t;
  198.         for(t=0;t<540;t++);
  199. }

  200. void Delay_nms(u16 nms)
  201. {
  202.         u16 i,t;
  203.         for(i=0;i<nms;i++)        
  204.         {
  205.                 for(t=0;t<1080;t++);
  206.         }
  207. }

  208. void Beep(void)
  209. {
  210.         u8 i;
  211.         for(i=0;i<10;i++)
  212.         {
  213.                 Delay_500us();
  214.                 FMQ=~FMQ;
  215.         }
  216.         FMQ=1;
  217. }

  218. void Pin_Mode(void)
  219. {
  220.         P0M1 = 0x00;        P0M0 = 0x00;
  221.         P2M1 = 0x00;        P2M0 = 0x00;
  222.         P1M1 = 0x00;  P1M0 = 0x00;
  223.         P4M1 = 0x00;  P4M0 = 0x00;
  224. }
  225. u8 Keys_Scan(void)
  226. {
  227.         u8 j,temp,i;
  228.         u8 t=0xfe;
  229.         P1=0xf0;
  230.                 if((P1&0xf0)!=0xf0)
  231.                 { Beep();
  232.                         for(i=0;i<4;i++)
  233.                         { P1=t;
  234.                                 temp=P1;
  235.                    for(j=0;j<16;j++)
  236.                         { if(temp==KeyCodeTable[j]) return(j);
  237.                         }
  238.        t=_crol_(t,1);
  239.                 }
  240.                
  241.         }
  242.         return(16);
  243. }
  244. //當(dāng)有鍵按下時(shí),確認(rèn)所按下的鍵并賦值
  245. void LCD_Initial(void)
  246. {
  247.         LCD_Write_Command(0x38);         //顯示模式設(shè)置
  248.         Delay_nms(5);                                 //16*2,5*7點(diǎn)陣
  249.         LCD_Write_Command(0x38);         //8位數(shù)據(jù)接口
  250.         Delay_nms(5);
  251.         LCD_Write_Command(0x38);
  252.         Delay_nms(5);
  253.         LCD_Write_Command(0x38);  
  254.         LCD_Write_Command(0x08); //顯示關(guān)閉,見手冊(cè)4.1.2
  255.         LCD_Write_Command(0x01); //顯示清屏
  256.         LCD_Write_Command(0x06); //顯示光標(biāo)移動(dòng)設(shè)置
  257.         Delay_nms(5);
  258.         LCD_Write_Command(0x0C); //顯示開及光標(biāo)設(shè)置
  259. }
  260. bit LCD_Check_Busy(void)
  261. {
  262.         DataPort = 0xFF;         //將端口置為全高(輸入)
  263.         RS = 0;                 //指令(狀態(tài))
  264. ……………………

  265. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
  266. </font>
復(fù)制代碼


所有資料51hei提供下載:

電子密碼鎖.rar (1.58 MB, 下載次數(shù): 364)




評(píng)分

參與人數(shù) 2黑幣 +17 收起 理由
NPC-1024 + 5 贊一個(gè)!
凌凈清河 + 12 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏21 分享淘帖 頂9 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:448890 發(fā)表于 2018-12-20 00:33 來(lái)自手機(jī) | 只看該作者
樓主,能分享我一份嗎!940121069@qq.com
回復(fù)

使用道具 舉報(bào)

板凳
ID:509769 發(fā)表于 2019-4-11 16:44 | 只看該作者
myqq 發(fā)表于 2018-12-20 00:33
樓主,能分享我一份嗎!940121069@qq.com

樓主給分享一份好嗎?89160985@qq.com
回復(fù)

使用道具 舉報(bào)

地板
ID:502407 發(fā)表于 2019-4-17 10:02 | 只看該作者
樓主能分享一份嗎,黑幣不夠。614837496@qq.com
回復(fù)

使用道具 舉報(bào)

5#
ID:4303 發(fā)表于 2019-11-19 15:40 | 只看該作者
有點(diǎn)問(wèn)題吧,按鍵最后一列不好用啊
回復(fù)

使用道具 舉報(bào)

6#
ID:671283 發(fā)表于 2019-12-28 17:33 來(lái)自手機(jī) | 只看該作者
文章不錯(cuò),樓主棒棒的
回復(fù)

使用道具 舉報(bào)

7#
ID:511038 發(fā)表于 2020-1-6 10:45 | 只看該作者
感謝樓主分享!
回復(fù)

使用道具 舉報(bào)

8#
ID:110278 發(fā)表于 2020-1-6 20:56 | 只看該作者
很完整。
回復(fù)

使用道具 舉報(bào)

9#
ID:685980 發(fā)表于 2020-1-14 11:18 來(lái)自手機(jī) | 只看該作者
樓主可以分享一份嘛?。。。。
回復(fù)

使用道具 舉報(bào)

10#
ID:773648 發(fā)表于 2020-6-9 10:49 | 只看該作者
點(diǎn)贊,做得挺詳細(xì)的
回復(fù)

使用道具 舉報(bào)

11#
ID:847720 發(fā)表于 2020-12-8 10:38 | 只看該作者
void Pin_Mode(void)
{
        P0M1 = 0x00;        P0M0 = 0x00;
        P2M1 = 0x00;        P2M0 = 0x00;
        P1M1 = 0x00;  P1M0 = 0x00;
        P4M1 = 0x00;  P4M0 = 0x00;
}
這一段是什么意思?
回復(fù)

使用道具 舉報(bào)

12#
ID:842146 發(fā)表于 2020-12-10 15:49 | 只看該作者
素箋 發(fā)表于 2020-12-8 10:38
void Pin_Mode(void)
{
        P0M1 = 0x00;        P0M0 = 0x00;

對(duì)I/O口輸出模式的設(shè)置
回復(fù)

使用道具 舉報(bào)

13#
ID:865623 發(fā)表于 2020-12-22 17:08 | 只看該作者
樓主有設(shè)計(jì)總圖或者接線圖能發(fā)一下嗎
回復(fù)

使用道具 舉報(bào)

14#
ID:865623 發(fā)表于 2020-12-22 17:15 | 只看該作者
樓主能發(fā)一下電路圖嗎
回復(fù)

使用道具 舉報(bào)

15#
ID:1103636 發(fā)表于 2023-12-12 09:15 | 只看該作者
太強(qiáng)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表