久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)電子密碼鎖Proteus仿真+代碼+文檔

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:429225 發(fā)表于 2018-12-12 18:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
電子密碼鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


1.設(shè)計(jì)任務(wù)與設(shè)計(jì)思路

1.1 設(shè)計(jì)任務(wù)

1.系統(tǒng)通過(guò)4×4的矩陣鍵盤(pán)輸入或設(shè)定開(kāi)鎖密碼,用24WC04保存密碼
2.可以通過(guò)LCD查看已輸入的字符個(gè)數(shù)[顯示為*****]   
3. 通過(guò)單片機(jī)控制繼電器通斷(可以指示燈亮滅替代)
4、當(dāng)密碼輸入正確時(shí),繼電器通,綠燈亮;當(dāng)密碼輸入錯(cuò)誤時(shí),繼電器斷,紅燈亮,控制蜂鳴器報(bào)警;


1.2 設(shè)計(jì)思路

本設(shè)計(jì)由主控芯片52單片機(jī),24C04斷電存儲(chǔ)電路、單片機(jī)時(shí)鐘電路,LCD1602顯示電路、矩陣按鍵和蜂鳴器電路組成。單片機(jī)負(fù)責(zé)控制整個(gè)系統(tǒng)的執(zhí)行過(guò)程。

2.硬件電路設(shè)計(jì)

為了達(dá)到系統(tǒng)要求,硬件應(yīng)該包括如下部分:

   單片機(jī)最小系統(tǒng),最小系統(tǒng)主要包括時(shí)鐘電路和復(fù)位電路;

   LCD電路,為了能直觀的看到生成的密碼,以及用戶(hù)輸入的密碼,就需要一個(gè)顯示設(shè)備,而在單片機(jī)系統(tǒng)中,比較常見(jiàn)的顯示設(shè)備就是LED和LCD,相比較于LED來(lái)說(shuō),LCD顯示效果更加美觀,更加真實(shí);

  按鍵電路,為了做到密碼的提取以及校驗(yàn),就需要有人機(jī)交互的操作,本設(shè)計(jì)采用了機(jī)械按鍵充當(dāng)此功能。

   LED電路,本設(shè)計(jì)有紅綠兩個(gè)LED,當(dāng)密碼校驗(yàn)正確時(shí),綠燈亮;相反當(dāng)密碼校驗(yàn)錯(cuò)誤時(shí),紅燈亮。

   繼電器電路,為了模擬鎖的開(kāi)和關(guān),用到了繼電器的開(kāi)關(guān)來(lái)模擬。


2.1 單片機(jī)最小系統(tǒng)

本次選用的主控芯片為單片機(jī)STC89C52。其引腳圖如圖2.1-1所示。



圖2.1-1 STC89C52引腳圖


目前,不管是在工業(yè),農(nóng)業(yè)還是消費(fèi)電子領(lǐng)域,51系列單片機(jī)的身影隨處可見(jiàn),例如,我們可以利用單片機(jī)來(lái)檢測(cè)溫濕度,來(lái)檢測(cè)空氣質(zhì)量,我們?nèi)粘J褂玫碾娮訒r(shí)鐘等等都能很方便的使用51單片機(jī)來(lái)實(shí)現(xiàn)。STC89C52單片機(jī)是深圳宏晶科技有限公司生產(chǎn)的一種單片機(jī),它是在一小塊很小的集成電路上集成了一個(gè)微型計(jì)算機(jī)。每一個(gè)單片機(jī)的組成都離不開(kāi)如下幾種組成成分:

CPU:51系列單片機(jī)內(nèi)部集成的CPU都是8位的;

IO口;數(shù)據(jù)輸入輸出的并行口,51單片機(jī)有32個(gè)IO口,分別是P0,P1,P2,P3,每種有8條數(shù)據(jù)線(xiàn);

ROM:片內(nèi)程序存儲(chǔ)器,它主要用來(lái)存儲(chǔ)程序的,一般大小為4K;

RAM:片內(nèi)數(shù)據(jù)存儲(chǔ)器,它主要用來(lái)存儲(chǔ)臨時(shí)數(shù)據(jù),一般大小為512K;

中斷源;它主要用來(lái)引發(fā)中斷的,有5個(gè)中斷源;

定時(shí)器:它主要用來(lái)計(jì)數(shù)定時(shí)用,51單片機(jī)有2個(gè),分別是定時(shí)器0和定時(shí)器1;

圖2.1-2 STC89C52最小系統(tǒng)


2.2 液晶顯示電路

隨著人機(jī)界面的越來(lái)越人性化,液晶屏應(yīng)運(yùn)而生,十九世紀(jì)八十年代,奧地利科學(xué)家賴(lài)倪次在一種植物身上提取出了看起來(lái)很奇怪的物質(zhì),它既不是液態(tài)的,也不是固態(tài)的,徘徊于兩者之間,但是他即具有固態(tài)的特征,也有液態(tài)的特征,所以,當(dāng)時(shí)的人們就把它叫做成液態(tài)的晶體,這就是當(dāng)今液晶的前身。

市面上的LCD顯示屏可謂是林林總總,大型的有拼接墻,數(shù)十寸的等等,從才子上來(lái)分,有TFT、LED等等,但對(duì)于單片機(jī)系統(tǒng)來(lái)說(shuō),常用的LCD有兩種:分別是1602和12864型號(hào)。

12864的意思就是該LCD的點(diǎn)陣是128行*64列,總共有8192個(gè)像素點(diǎn), 控制器AIP31020。可顯示漢字及圖形, 內(nèi)置8192 個(gè)中文漢字 (16X16 點(diǎn)陣)、 128 個(gè)字符 (8X16點(diǎn)陣)及64X256點(diǎn)陣顯示RAM(GDRAM)。可與CPU 直接接口,提供兩種界面來(lái)連接微處理機(jī):8-位并行及串行兩種連接方式。具有多種功能:光標(biāo)顯示、畫(huà)面移位、睡眠模式等。而1602的意思就是該LCD的點(diǎn)陣是16行*2列,總共有32個(gè)像素點(diǎn),1602LCD分為帶背光和不帶背光兩種,帶背光的用起來(lái)就比較方便,但缺點(diǎn)就是比較厚,而不帶背光的需要自己加一個(gè)背光片,不方便使用,但他比較輕薄。

本次設(shè)計(jì)采用了LCD1602液晶顯示器,本次設(shè)計(jì)采用了LCD1602液晶顯示器。


圖2.2-1 液晶顯示電路


1602型液晶接口信號(hào)說(shuō)明如表2.2-1所示。

2.3 矩陣按鍵模塊

本實(shí)驗(yàn)選用矩陣按鍵來(lái)輸入密碼值。矩陣按鍵電路如下圖2.3-1所示:


圖2.3-1 矩陣按鍵電路

為了滿(mǎn)足輸入功能的需要,本設(shè)計(jì)采用了14個(gè)按鍵,如果全部接成獨(dú)立式按鍵,那么就需要14個(gè)IO口,資源占用過(guò)多,所以這里采用了矩陣式4*4規(guī)格的鍵盤(pán),多余兩個(gè)按鍵做備用。它總共占用8個(gè)IO口,分別接到了P0口上,由于P0口的特殊結(jié)構(gòu),必須接一個(gè)上拉電阻,才能輸出高電平。

其按鍵功能如下所示:

0-9的數(shù)字按鍵用來(lái)輸入密碼;

“存包”按鍵  --    按下此鍵生成四位隨機(jī)數(shù)密碼

“取包”按鍵  --    按下此按鍵,提示輸入密碼

“清空”按鍵 --     在輸入密碼過(guò)程中,按下此鍵清掉剛才輸入的數(shù)字

“確認(rèn)”按鍵  --    密碼輸入完畢后,按下此鍵進(jìn)行密碼的校驗(yàn)。

2.4 i2C 24C02模塊

串行E2PROM是基于I2C-BUS 的存儲(chǔ)器件,遵循二線(xiàn)制協(xié)議,由于其具有接口方便,體積小,數(shù)據(jù)掉電不丟失等特點(diǎn),在儀器儀表及工業(yè)自動(dòng)化控制中得到大量的應(yīng)用。

24C02與單片機(jī)的接口非常簡(jiǎn)單,如下圖2.4-1所示

圖2.4-1 24C02電路



E0,E1,E2為器件地址線(xiàn),WP為寫(xiě)保護(hù)引腳,SCL,SDA為二線(xiàn)串行接口,符合I2C總線(xiàn)協(xié)議。在一般單片機(jī)系統(tǒng)中,24C02 數(shù)據(jù)受到干擾的情況是很少的。

本實(shí)驗(yàn)采用AT24C02。AT24WC02是一個(gè)2K位串行CMOS,EEPROM內(nèi)部含有256個(gè)8位字節(jié)CATALYST公司的先進(jìn)CMOS技術(shù)實(shí)質(zhì)上減少了器件的功耗。AT24WC02有一個(gè)16字節(jié)頁(yè)寫(xiě)緩沖器,該器件通過(guò)I2C總線(xiàn)接口進(jìn)行操作有一個(gè)專(zhuān)門(mén)的寫(xiě)保護(hù)功能。



其引腳說(shuō)明如表2.4-1:

表2.4-1 AT24C02引腳說(shuō)明

2.5.蜂鳴器電路

在單片機(jī)應(yīng)用的設(shè)計(jì)上,很多方案都會(huì)用到蜂鳴器,大部分都是使用蜂鳴器來(lái)做提示或報(bào)警,比如按鍵按下、開(kāi)始工作、工作結(jié)束或是故障等等。

蜂鳴器電路如圖2.5-1所示。

圖2.5-1 蜂鳴器電路


本次設(shè)計(jì)使用了ULN2003D來(lái)驅(qū)動(dòng)蜂鳴器。其電路如圖2.5-2所示

圖2.5-2 蜂鳴器驅(qū)動(dòng)電路


本設(shè)計(jì) 用到了一個(gè)紅色LED和一個(gè)綠色LED來(lái)指示輸入密碼的正確與否。每個(gè)LED的正極通過(guò)一個(gè)限流電阻接到電源正極,然后負(fù)極分別接到P33和P34,當(dāng)IO口為高電平時(shí),燈熄滅,當(dāng)LED為低電平時(shí),燈亮起來(lái)。圖2.5-3是其連線(xiàn)圖。

圖2.5-3 LED提示燈電路

2.6  繼電器電路

本設(shè)計(jì)用繼電器來(lái)模擬鎖的動(dòng)作,當(dāng)繼電器吸合表示開(kāi)始鎖關(guān)閉,當(dāng)繼電器斷開(kāi)表示斷開(kāi),繼電器的控制引腳接在單片機(jī)的P37口,高電平讓其吸合,低電平讓其斷開(kāi),圖2-6是其連接圖。


      


主程序里面首先對(duì)單片機(jī)的硬件資源進(jìn)行初始化,硬件資源的初始化包括:

  • IO口的初始化,本設(shè)計(jì)所采用的51單片機(jī)有32個(gè)IO口,并且單片機(jī)復(fù)位后,所有IO口被默認(rèn)賦值為高電平(1),這就給一些功能帶來(lái)了一些不必要的麻煩,所以就需要對(duì)某些上電需要置低電平的IO口置低電平(比如本設(shè)計(jì)中的LCD某些管腳);
  • 定時(shí)器的初始化,定時(shí)器是單片機(jī)中的一個(gè)非常重要的資源,有了它,單片機(jī)就能“并行”的處理多個(gè)事情了,不然為了做到定時(shí),只能用死等來(lái)實(shí)現(xiàn),那樣會(huì)造成單片機(jī)資源大量的浪費(fèi),更嚴(yán)重的是,單片機(jī)運(yùn)行會(huì)相當(dāng)不流暢;
  • 串口的初始化,串口的存在使得單片機(jī)跟外界的通訊帶來(lái)了很大的方便,因?yàn)樗裱瓨?biāo)準(zhǔn)的RS232協(xié)議,所以可以跟任何具有RS232接口的設(shè)備通信,

    基本的資源初始化完畢后,程序然后進(jìn)入了一個(gè)while(1)死循環(huán),這樣保證了程序不斷的運(yùn)行,在該循環(huán)中,多個(gè)任務(wù)逐一按順序的執(zhí)行。


3.2 LCD顯示子程序


LCD1602的讀時(shí)序如圖3-2-1所示。


圖3-2-1  LCD1602讀時(shí)序









LCD1602的寫(xiě)時(shí)序如圖3-2-2 所示。

圖3-2-3 LCD2602寫(xiě)時(shí)序


從時(shí)序圖可以看出,首先判斷RS和RW,從硬件那一章我們得知,RS代表了是指令的操作(高電平)還是數(shù)據(jù)的操作(低電平),而RW代表了是往LCD里面寫(xiě)數(shù)據(jù)(高電平)還是從LCD里面讀出數(shù)據(jù)(低電平)。

然后再通過(guò)控制器把使能端拉低(通過(guò)上面一章,我們知道此管腳為高表示禁用該芯片,此管腳為低表示使能該芯片),拉低后需要延時(shí)一段時(shí)間,至于要不要 延時(shí),延時(shí)的時(shí)間多長(zhǎng),對(duì)于51單片機(jī)來(lái)說(shuō),其實(shí)關(guān)系都不大,不影響其使用。

以上兩步準(zhǔn)備操作完成后,就可以開(kāi)始讀和寫(xiě)了,也就是從這時(shí)候開(kāi)始數(shù)據(jù)或地址信號(hào)就被送上了數(shù)據(jù)總線(xiàn),數(shù)據(jù)送完之后,然后又將使能端拉高(禁止芯片),當(dāng)然,這中間需要一個(gè)建立時(shí)間的延遲,改時(shí)間最短為40納秒。然后再將使能端拉低(啟用),就可以將剛才數(shù)據(jù)總線(xiàn)上的數(shù)據(jù)送入LCD了。

1602液晶顯示子程序主要是對(duì)內(nèi)部控制指令進(jìn)行指定如液晶初始化,顯示空白,讀,寫(xiě),判斷液晶是否忙及指定字符的位置等函數(shù)構(gòu)成。液晶顯示子程序流程圖如圖所示。首先進(jìn)行液晶初始化,再寫(xiě)地址命令到LCD,然后放發(fā)送字符串,最終液晶顯示。

  根據(jù)上面描述的時(shí)序,可以得出如圖3-2-4所示的流程圖



3.3 矩陣按鍵子程序


16個(gè)按鍵接在了P0的8個(gè)口,其中P00-P03為四行,P04-P07為四列,本設(shè)計(jì)采用的是行掃描法,也就是說(shuō)每次給四行當(dāng)中的一行輸出低電平(其他三行為高電平),然后再讀取四列的值,如果發(fā)現(xiàn)四列全部為高電平,那么就表示沒(méi)有按鍵按下,如果有某一列為低電平,就表示有按鍵按下了。


3.4 密碼比對(duì)子程序

  密碼比對(duì)過(guò)程主要是將按鍵輸入的密碼與正確密碼進(jìn)行比較的過(guò)程。該過(guò)程要求把密碼放入24C02芯片中存儲(chǔ),每按下一個(gè)按鍵則與芯片中相應(yīng)位進(jìn)行比較。流程如圖3.4-1所示   



4.系統(tǒng)調(diào)試

整個(gè)系統(tǒng)設(shè)計(jì)完成后,要進(jìn)行運(yùn)行調(diào)試,排除軟件和硬件的故障,同時(shí)驗(yàn)證系統(tǒng)的可靠性及穩(wěn)定性,使系統(tǒng)符合設(shè)計(jì)要求。本系統(tǒng)的調(diào)試主要分兩個(gè)步驟:單片機(jī)系統(tǒng)調(diào)試(硬件調(diào)試和軟件調(diào)試)及整個(gè)控制系統(tǒng)試運(yùn)行調(diào)試。

單片機(jī)系統(tǒng)的調(diào)試應(yīng)包括硬件及軟件兩部分,主要是通過(guò)調(diào)試發(fā)現(xiàn)硬件及軟件中存在的問(wèn)題,查看其運(yùn)行結(jié)果是否符合設(shè)計(jì)要求。

    系統(tǒng)硬件和軟件的研制可以相互獨(dú)立的平行進(jìn)行,軟件調(diào)試可以在硬件完成之前,硬件也可以在無(wú)完整應(yīng)用軟件的情況下進(jìn)行調(diào)試,但它們需要借助另外的工具提供調(diào)試環(huán)境。硬件和軟件分調(diào)完成之后,還要再進(jìn)行軟件和硬件的聯(lián)調(diào),在調(diào)試中找出問(wèn)題,判斷故障源,修改軟硬件。


4.1 硬件調(diào)試

靜態(tài)調(diào)試主要是排除明顯的硬件故障。在電路搭建好后,對(duì)其進(jìn)行仔細(xì)檢查,查看端口是否正確連接,連接是否可靠。同時(shí)還應(yīng)當(dāng)用萬(wàn)用表檢查電路,看應(yīng)當(dāng)開(kāi)路的地方是否開(kāi)路,應(yīng)當(dāng)短路的地方是否短路,電源地線(xiàn)連接是否可靠。在焊接后,查看焊接是否牢固,有無(wú)虛焊或短路等。在將芯片、傳感器等元件插到電路板上時(shí),要保證各處電源極性、電壓正確,以防止因電源極性接反或電壓過(guò)高損壞芯片或傳感器。此外,插入芯片必須在斷電的情況下進(jìn)行,特別注意芯片的方向不要插反。


4.2 軟件調(diào)試

    系統(tǒng)軟件程序在編制好以后,可通過(guò)匯編軟件對(duì)源程序進(jìn)行匯編,變?yōu)榭蓤?zhí)行的目標(biāo)代碼,在匯編過(guò)程中出現(xiàn)的錯(cuò)誤,要及時(shí)糾正。在軟件調(diào)試時(shí)采用軟件模擬開(kāi)發(fā)系統(tǒng)對(duì)程序進(jìn)行調(diào)試,這種模擬開(kāi)發(fā)系統(tǒng)是在計(jì)算機(jī)上利用模擬軟件實(shí)現(xiàn)對(duì)單片機(jī)的硬件模擬、指令模擬及運(yùn)行狀態(tài)模擬,從而完成應(yīng)用軟件開(kāi)發(fā)的全過(guò)程。調(diào)試過(guò)程中的運(yùn)行狀態(tài)、各寄存器狀態(tài)、端口狀態(tài)等都可以在指定的窗口區(qū)域顯示出來(lái),通過(guò)這些顯示結(jié)果隨時(shí)跟蹤程序運(yùn)行狀態(tài),以確定程序運(yùn)行無(wú)誤。

4.3動(dòng)態(tài)調(diào)試

    控制系統(tǒng)的軟件和硬件是密切相關(guān)的,軟件模擬開(kāi)發(fā)系統(tǒng)不能對(duì)硬件部分進(jìn)行診斷,同時(shí)也不能實(shí)時(shí)在線(xiàn)仿真,所以用戶(hù)程序還需跟硬件連接起來(lái)進(jìn)行聯(lián)調(diào),同時(shí)對(duì)軟件和硬件進(jìn)行檢查和診斷。整個(gè)單片機(jī)系統(tǒng)進(jìn)行在線(xiàn)調(diào)試時(shí),需借助仿真開(kāi)發(fā)工具來(lái)對(duì)用戶(hù)軟件及硬件電路進(jìn)行診斷、調(diào)試。在應(yīng)用系統(tǒng)各電路板調(diào)試成功后,將用戶(hù)程序加載到在線(xiàn)仿真器上,這時(shí)就能單步、多步或連續(xù)地執(zhí)行目標(biāo)程序,同時(shí)也可以根據(jù)需要分段設(shè)置斷點(diǎn)執(zhí)行用戶(hù)程序。系統(tǒng)中的硬件故障(如各個(gè)部件內(nèi)部存在的故障和部件之間連接的邏輯錯(cuò)誤)主要是靠聯(lián)機(jī)仿真來(lái)排除的。對(duì)于與硬件無(wú)聯(lián)系的用戶(hù)程序,例如定時(shí)標(biāo)志等,雖然已經(jīng)沒(méi)有語(yǔ)法錯(cuò)誤,但可能存在邏輯錯(cuò)誤,這時(shí),就借助于動(dòng)態(tài)在線(xiàn)調(diào)試手段發(fā)現(xiàn)邏輯錯(cuò)誤,直至邏輯錯(cuò)誤糾正為止。而對(duì)于一些與硬件相關(guān)的用戶(hù)程序,如接口驅(qū)動(dòng)程序等,則需要配合硬件,進(jìn)行在線(xiàn)調(diào)試,如果有邏輯錯(cuò)誤,也要及時(shí)糾正修改。程序調(diào)試完畢后,利用在線(xiàn)編程器將程序固化到單片機(jī)中,使整個(gè)系統(tǒng)運(yùn)行起來(lái)。








4.4 實(shí)驗(yàn)圖


按下取包鍵,獲取密碼,得到密碼為2392,此時(shí)繼電器為關(guān)閉狀態(tài):


調(diào)試圖a:


調(diào)試圖a



              當(dāng)輸入密碼錯(cuò)誤時(shí)紅燈亮,即D1燈亮,此時(shí)繼電器為關(guān)閉狀態(tài):


調(diào)試圖b:



調(diào)試圖b






當(dāng)輸入密碼正確是綠燈亮,即D2燈亮,此時(shí)繼電器為打開(kāi)狀態(tài):


結(jié)果圖:



結(jié)果圖



附錄

附錄1:電路原理圖







單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include<absacc.h>
  6. #include "lcd1602.h"
  7. #include "main.h"
  8. #include "key.h"

  9. sbit Lock = P3^7;  //代表鎖控的繼電器IO   高電平關(guān)鎖,低電平開(kāi)鎖
  10. sbit LEDRED = P2^0;  //代表密碼輸入錯(cuò)誤的紅燈IO  高電平熄滅,低電平點(diǎn)亮
  11. sbit LEDGREEN = P2^1;  //代表密碼輸入正確的綠燈IO  高電平熄滅,低電平點(diǎn)亮
  12. sbit beep=P1^5;         
  13. uchar genPasswd[4];           //存儲(chǔ)生成的四位隨機(jī)數(shù)密碼
  14. uchar inpPasswd[4];           //存儲(chǔ)取包時(shí)輸入的四位密碼
  15. uchar code welcome[8]="welcome";  //開(kāi)機(jī)顯示的歡迎標(biāo)語(yǔ)
  16. uchar code set[7]="Passwd";    //顯示生成的密碼標(biāo)題
  17. uchar code  close[12]="close door!";   //提示關(guān)門(mén)
  18. uchar code         input[13] = "input passwd";   //提示請(qǐng)輸入密碼

  19. /****************定時(shí)器設(shè)置相關(guān)的變量***********************/
  20. unsigned char TL0_temp;         /*暫存TL0的初值*/
  21. unsigned char TH0_temp;         /*暫存TH0的初值*/
  22. #define INT_CLOCK 10    /*INT_CLOCK為定時(shí)值,單位為ms ,此處定義為10ms*/
  23. #define CRY_FREQUENCY 11059200 /*CRY_FREQUENCY為晶振頻率,單位為Hz*/





  24. /*延時(shí)程序*/
  25. void delay(uint z)               
  26. {
  27.         unsigned int i,j;
  28.    for(i=0;i<z;i++)
  29.     for(j=0;j<100;j++);
  30. }
  31. /******************************
  32. 顯示首頁(yè) welcome
  33. ******************************/
  34. void display1()
  35. {
  36.    unsigned char i;
  37.    for(i = 0;i < 7;i++)
  38.    {
  39.                    wr_com(0x85+i);
  40.                 wr_dat(welcome[i]);
  41.    }
  42. }


  43. /************************************
  44. 顯示密碼生成界面
  45. ************************************/
  46. void display2()
  47. {
  48.    unsigned char i;
  49.    
  50.    for(i = 0;i < 6;i++)
  51.    {
  52.                    wr_com(0x85+i);
  53.                 wr_dat(set[i]);
  54.    }
  55.    for(i = 0;i < 4;i++)
  56.    {
  57.                    wr_com(0xc6+i);
  58.                 wr_dat(genPasswd[i]+0x30);
  59.                
  60.    }
  61. }

  62. /************************************
  63. 顯示請(qǐng)關(guān)門(mén)界面
  64. ************************************/

  65. void display3()
  66. {
  67.      unsigned char i;
  68.    for(i = 0;i < 11;i++)
  69.    {
  70.                    wr_com(0x83+i);
  71.                 wr_dat(close[i]);
  72.    }

  73. }


  74. /************************************
  75. 顯示密碼輸入界面
  76. ************************************/
  77. void display4()
  78. {
  79.    unsigned char i;
  80.    for(i = 0;i < 12;i++)
  81.    {
  82.                    wr_com(0x82+i);
  83.                 wr_dat(input[i]);
  84.    }
  85.    for(i = 0;i < 4;i++)
  86.    {
  87.                    wr_com(0xc6+i);
  88.                 wr_dat(inpPasswd[i]+0x30);
  89.                
  90.    }

  91. }
  92.         




  93. /***********************************
  94. 定時(shí)器0初始化
  95. ***********************************/
  96. void Timer0_init()
  97. {
  98.         unsigned long T0_temp;                                     /*暫存T0的初始值        */
  99.         T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    /*T0初始值計(jì)算公式,參考教科書(shū)*/
  100.         TL0_temp = T0_temp & 0xff;
  101.         TH0_temp = T0_temp >> 8;
  102.         TL0 = TL0_temp;
  103.         TH0 = TH0_temp;
  104.         TMOD |= 0x01;
  105.         TR0 = 1;                        /*開(kāi)定時(shí)器0中斷*/
  106.         ET0 = 1;  
  107.         EA = 1;                    /*開(kāi)總中斷*/                                       

  108. }






  109. /*主函數(shù)*/
  110. uchar global_state = 0;
  111. uchar count_num = 0;  //輸入的數(shù)字個(gè)數(shù)
  112. void main()
  113. {  
  114.    uchar i,j;
  115.    uchar passwd;
  116.    
  117.            uchar key_value = 0;
  118.         uchar temp_key_value = 0xff;
  119.         Lock = 1;  //剛上電 鎖是需要保持閉合
  120.         Timer0_init();        //定時(shí)器初始化
  121.          lcd_init();        //LCD1602初始化
  122.    
  123.         while(1)        //進(jìn)入不斷循環(huán)
  124.         {
  125.                    temp_key_value = Calkey_scan();          //讀取矩陣按鍵的鍵值
  126.                 if(temp_key_value != 0xff)
  127.                 {
  128.                         key_value = temp_key_value;
  129.                 }
  130.                 switch(global_state)
  131.                 {
  132.                         case 0:         //初始化狀態(tài)
  133.                                 display1();         //顯示歡迎語(yǔ)句        -- "welcome"
  134.                         

  135.                                 if(key_value == 13)  //存包按鍵被按下
  136.                                 {
  137.                                     key_value = 0xff;  //將按鍵值清除
  138.                                         Lock = 0;    //開(kāi)鎖
  139.                                        
  140.                                         display3();    //顯示關(guān)門(mén)提示語(yǔ)        -- "close door!"
  141.                                     delay(1900);    //等待關(guān)門(mén) 大約3秒
  142.                                         Lock = 1;   //關(guān)門(mén)
  143.                                         clear();                 //清屏,準(zhǔn)備下一屏的顯示
  144.                                         global_state = 1;   //切換運(yùn)行狀態(tài)
  145.                                         passwd = TL0;  //采用定時(shí)器寄存器的值作為密碼
  146.                                         genPasswd[0] = passwd/100;                  //存儲(chǔ)密碼
  147.                                         genPasswd[1] = passwd%100/10;
  148.                                         genPasswd[2] = passwd%10;
  149.                                         genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
  150.                                 }
  151.                                 if(key_value == 14)  //取包按鍵被按下
  152.                                 {
  153.                                     key_value = 0xff;  //將按鍵值清除
  154.                                         clear();    //清屏,準(zhǔn)備下一屏的顯示
  155.                                         global_state = 2;  //切換運(yùn)行狀態(tài)
  156.                                         count_num = 0;   //清除數(shù)字按鍵變量
  157.                                         for(i = 0;i < 4;i++)  //清空輸入的密碼數(shù)組
  158.                                             inpPasswd[i] = ' '-0x30;
  159.                                 }
  160.                         break;
  161.                         case 1:                //密碼生成狀態(tài)
  162.                                    display2();         //顯示密碼生成界面
  163.                                 delay(1900);    //等待大約3秒
  164.                                 global_state = 0;  //返回到初始界面
  165.                                 clear();        //清屏,準(zhǔn)備下一屏的顯示
  166.                                 
  167.                         break;
  168.                         case 2:          //輸入密碼狀態(tài)
  169.                            display4();           //顯示輸入密碼界面
  170.                            if((key_value >= 0) && (key_value <= 9))          //如果按下的為0-9的數(shù)字按鍵
  171.                            {
  172.                               
  173.                                 if(count_num <= 3)         //如果按鍵次數(shù)小于4次
  174.                                         {
  175.                                         inpPasswd[count_num] = key_value; //將按鍵值存入數(shù)組,并顯示
  176.                                                    count_num++;
  177.                                     }
  178.                                          key_value = 0xff;  //將按鍵值清除
  179.                            }
  180.                            if(key_value == 15) //清除按鍵被按下
  181.                            {
  182.                                 key_value = 0xff;  //將按鍵值清除
  183.                                            for(i = 0;i < 4;i++)
  184.                                           inpPasswd[i] = ' '-0x30;  //清除剛剛輸入的密碼
  185.                            }
  186.                            if(key_value == 16) //確認(rèn)按鍵被按下
  187.                            {
  188.                                 key_value = 0xff;  //將按鍵值清除
  189.                                            for(i = 0;i < 4;i++)
  190.                                         {
  191.                                                 if(inpPasswd[i] != genPasswd[i])
  192.                                                    break;
  193.                                         }
  194.                                         if(i == 4)          //密碼輸入正確
  195.                                         {
  196.                                                 LEDRED = 1;         //紅燈熄滅
  197.                                                 LEDGREEN = 0;  //綠燈亮
  198.                                                 Lock = 1;  //開(kāi)鎖
  199.                                                 delay(1900);    //等待大約3秒
  200.                                                 Lock = 0;  //關(guān)鎖
  201.                                                 LEDGREEN = 1;  //綠燈熄滅
  202.                                         }
  203.                                         else   //密碼輸入錯(cuò)誤
  204.                                         {        

  205.                                                 for(j = 0;j <19009 ;j++)
  206.                                                 {
  207.                                                         beep=~beep;
  208. ……………………

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

所有資料51hei提供下載:
電子密碼鎖(自改).rar (141.51 KB, 下載次數(shù): 758)
電子密碼鎖.docx (3.07 MB, 下載次數(shù): 392)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:357894 發(fā)表于 2019-1-9 19:14 | 只看該作者
可惜仿真沒(méi)有Proteus7.5版本的,附件里面仿真是8.8高版本的,我沒(méi)安裝啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:229401 發(fā)表于 2019-3-15 20:55 | 只看該作者
好東西
回復(fù)

使用道具 舉報(bào)

地板
ID:307982 發(fā)表于 2019-4-29 07:51 | 只看該作者
好資料,51黑有你更精彩!!!Proteus8.8可以正常打開(kāi)
回復(fù)

使用道具 舉報(bào)

5#
ID:526497 發(fā)表于 2019-5-3 17:02 來(lái)自手機(jī) | 只看該作者
請(qǐng)教一下如果是STC15F2K60S2呢,要改很多嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:549713 發(fā)表于 2019-5-30 22:58 | 只看該作者
樓主我找到你的仿真圖了 但是運(yùn)行不出來(lái)呀 按鍵沒(méi)反應(yīng)
回復(fù)

使用道具 舉報(bào)

7#
ID:445120 發(fā)表于 2019-11-25 16:56 | 只看該作者
有DNS文件嗎?
回復(fù)

使用道具 舉報(bào)

8#
ID:628872 發(fā)表于 2020-3-18 15:03 | 只看該作者
結(jié)果圖那個(gè)板子,叫什么啊 想買(mǎi)一個(gè)
回復(fù)

使用道具 舉報(bào)

9#
ID:628872 發(fā)表于 2020-3-18 15:09 | 只看該作者
SterneC 發(fā)表于 2019-5-30 22:58
樓主我找到你的仿真圖了 但是運(yùn)行不出來(lái)呀 按鍵沒(méi)反應(yīng)

先按存包會(huì)顯示密碼,然后點(diǎn)取包輸入顯示的密碼,然后點(diǎn)確定
回復(fù)

使用道具 舉報(bào)

10#
ID:163292 發(fā)表于 2021-1-4 16:37 | 只看該作者
正好我的朋友 有這個(gè)需要
回復(fù)

使用道具 舉報(bào)

11#
ID:805058 發(fā)表于 2021-1-7 17:54 | 只看該作者
你好呀,請(qǐng)問(wèn)有板子的連接圖嗎
回復(fù)

使用道具 舉報(bào)

12#
ID:914086 發(fā)表于 2021-4-29 15:41 | 只看該作者
請(qǐng)問(wèn),仿真的連線(xiàn)圖有沒(méi)有高清版本的
回復(fù)

使用道具 舉報(bào)

13#
ID:914086 發(fā)表于 2021-4-29 20:35 | 只看該作者
能不能加一下功能呀
回復(fù)

使用道具 舉報(bào)

14#
ID:914086 發(fā)表于 2021-4-29 20:38 | 只看該作者
想問(wèn)一下,如果加一個(gè)“第一個(gè)按鈕觸動(dòng)侯5秒內(nèi)沒(méi)有解鎖,電路自動(dòng)復(fù)位并且蜂鳴器報(bào)警,綠燈滅紅燈亮”的功能要怎么樣才能實(shí)現(xiàn)
回復(fù)

使用道具 舉報(bào)

15#
ID:328014 發(fā)表于 2021-4-29 22:11 | 只看該作者
哆啦B夢(mèng) 發(fā)表于 2021-4-29 15:41
請(qǐng)問(wèn),仿真的連線(xiàn)圖有沒(méi)有高清版本的

用Proteus8.8打開(kāi)后,可以放大縮小,再截圖就是高清了
回復(fù)

使用道具 舉報(bào)

16#
ID:914420 發(fā)表于 2021-4-30 13:11 | 只看該作者
你好,你這個(gè)用Proteus仿真出現(xiàn)編譯錯(cuò)誤是怎么回事啊
回復(fù)

使用道具 舉報(bào)

17#
ID:936399 發(fā)表于 2021-6-15 15:29 | 只看該作者
姬火火 發(fā)表于 2019-1-9 19:14
可惜仿真沒(méi)有Proteus7.5版本的,附件里面仿真是8.8高版本的,我沒(méi)安裝啊

。。。。。。
回復(fù)

使用道具 舉報(bào)

18#
ID:991042 發(fā)表于 2021-12-11 21:07 | 只看該作者
哆啦B夢(mèng) 發(fā)表于 2021-4-29 15:41
請(qǐng)問(wèn),仿真的連線(xiàn)圖有沒(méi)有高清版本的

同問(wèn),我也需要。
回復(fù)

使用道具 舉報(bào)

19#
ID:781892 發(fā)表于 2022-3-22 05:10 來(lái)自手機(jī) | 只看該作者
正在做自己的設(shè)計(jì),是很好的資料哦
回復(fù)

使用道具 舉報(bào)

20#
ID:825397 發(fā)表于 2022-5-27 09:52 | 只看該作者
不錯(cuò),能用,謝謝分享。找了其他好幾個(gè)基本都不完整或不能用。點(diǎn)贊!
回復(fù)

使用道具 舉報(bào)

21#
ID:1031013 發(fā)表于 2022-5-30 22:34 | 只看該作者
老哥,這用32實(shí)現(xiàn)的話(huà)難度大嗎
回復(fù)

使用道具 舉報(bào)

22#
ID:1029915 發(fā)表于 2024-12-23 18:24 | 只看該作者
好資料,51黑有你更精彩!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: h片在线观看免费 | 久久精彩视频 | 午夜免费电影 | 这里有精品 | 国产一区二区av | 成人免费视频网 | 免费一级网站 | 久草精品视频 | 337p日本欧洲亚洲大胆鲁鲁 | h视频免费观看 | 国产精品免费观看 | 亚洲午夜电影 | 香蕉视频一区二区 | 国产精品视频一二三区 | 成人99 | 久久大| 一区二区三区四区在线视频 | 欧美三级在线 | 日本人爽p大片免费看 | 粉嫩一区二区三区性色av | 日本人爽p大片免费看 | 亚洲欧美网 | 日本精品裸体写真集在线观看 | 日韩久久久久久 | 精品入口麻豆88视频 | 欧美日韩在线综合 | 在线观看视频中文字幕 | 成人精品鲁一区一区二区 | 精品国产青草久久久久福利 | 日韩中文字幕在线观看视频 | 欧美日韩亚洲国产 | 国产一级视频在线播放 | 欧美成人精品一区二区男人看 | 亚洲国产精品99久久久久久久久 | 国产午夜精品久久久 | 国产午夜精品一区二区三区嫩草 | 国产97人人超碰caoprom | 欧美日韩黄 | 午夜精品久久久久久久星辰影院 | 国产精品一区三区 | 欧美激情亚洲激情 |