欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21314|回復: 5
打印 上一主題 下一主題
收起左側

基于單片機的密碼鎖設計論文 附源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:321070 發表于 2018-5-3 11:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
論文題目  基于單片機的密碼鎖設計
姓    名    學    號 09531013
  院    系  經濟技術學院  專   業    電子信息工程
        指導教師       李*    職   稱     副教授     





安徽農業大學經濟技術學院學士學位論文(設計)開題報告
課題名稱
基于單片機的密碼鎖設計
課題來源
導師指定
學生姓名

專業
電子信息工程
學號
09531013
指導教師姓名

職稱
副教授
研究內容
本系統由STC89C52單片機系統(主要是STC89C52單片機最小系統)、4×4矩陣鍵盤、LCD1602顯示和報警系統等組成,具有設置、修改六位用戶密碼、超次報警、超次鎖定、密碼錯誤報警等功能(本設計由P0口控制LCD顯示,密碼正確顯示OPEN! 密碼錯誤顯示error!超過三次輸入錯誤自動鎖定。由P1口控制矩陣鍵盤含有0-9數字鍵和A-F功能鍵。)。除上述基本的密碼鎖功能外,依據實際的情況還可以添加遙控功能。
研究計劃
3月中3月底   調研、查資料。
4月初4月中   確定系統架構、分析并劃分各功能模塊的接口。
4月底5月中   各功能模塊軟、硬件的設計與開發。
5月下5月底   各功能模塊及整個系統的調試與運行。撰寫畢業設計論文。

特色與創新
   1.按鍵設置6位密碼,輸入密碼若密碼正確,則鎖打開。顯示open!
2.密碼可以自己修改(6位密碼),必須是鎖打開時才能改密。為防止誤操作,修改密碼得輸入兩次。
3.若密碼輸入錯誤次數超過3次,蜂鳴器報警并且鎖定鍵盤。
4.液晶屏亮度會隨光線自動調整。
計較方便,易懂


指導教師意見
同意開題。
教研室意見
  同意開題。
學院意見
同意開題。

目 錄
第一章 緒論1

11、課題背景和意義1

12、電子密碼鎖發展趨勢2
第二章 設計思想3
第三章 系統硬件設計              4
31硬件支持4
    311STC89C52RC 單片機介紹4
    312液晶顯示LCD1602的介紹5
    313自鎖開關說明5
    314上拉電阻介紹5
    315三極管介紹6
    316繼電器介紹8
    317供電方式9
   318輕觸按鍵9
32功能單元模塊設計10
    321 開鎖機構10
    322 矩陣鍵盤設計電路11
    323 聲音提示電路設計11
    324 AT24C02掉電存儲單元的設計12
第四章 程序設計與系統仿真13
41 模塊介紹 13
   411 主程序模塊 14
   412 密碼比較判斷模塊15
   413 鍵盤掃描模塊15
  414 修改密碼模塊16
42 電子密碼鎖原理圖18
   421總店路圖18
  422控制電路18
   423實物圖19
   424仿真圖19第五章 系統功能19
第六章 設計總結19
致謝20
參考文獻20
附錄 21
a 電子密碼鎖元件清單21
b 源程序22




摘 要本設計提出了一種電子密碼鎖的設計方法。本系統由STC89C52單片機系統、4×4矩陣鍵盤、LCD1602顯示和報警系統等組成,具有設置、修改六位用戶密碼、超次報警、超次鎖定、密碼錯誤報警等功能。本系統成本低廉,功能實用。


第一章 緒論
1.1 課題
背景和意義

隨著電子技術和計算機技術的飛速發展,單片機性能不斷完善,性能價格比顯著提高,技術日趨完善。由于單片機具有體積小、重量輕、價格便宜、功耗低、控制功能強及運算速度快等特點,因而在國民經濟建設、軍事及家用電器等各個領域均得到了廣泛的應用。本設計利用單片機及附加電子元器件實現數據采集和控制算法,來完成某一實際功能。

隨著人們生活水平的提高和安全意識的加強,對安全的要求也就越來越高。鎖自古以來就是把守護門的鐵將軍,人們對它要求甚高,既要安全可靠的防盜,又要使用方便,這也是制鎖者長期以來研制的主題。隨著電子技術的發展,各類電子產品應運而生,電子密碼鎖就是其中之一。電子鎖是通過鍵盤輸入一組密碼完成開鎖過程。研究這種鎖的初衷,就是為提高鎖的安全性。由于電子鎖的密鑰量(密碼量)極大,可以與機械鎖配合使用,并且可以避免因鑰匙被仿制而留下安全隱患。電子鎖只需記住一組密碼,無需攜帶金屬鑰匙,免除了人們攜帶金屬鑰匙的煩惱,而被越來越多的人所欣賞。電子鎖的種類繁多,例如數碼鎖,指紋鎖,磁卡鎖,IC卡鎖,生物鎖等。但較實用的還是按鍵式電子密碼鎖。

20世紀80年代后,隨著電子鎖專用集成電路的出現,電子鎖的體積縮小,可靠性提高,成本較高,是適合使用在安全性要求較高的場合,且需要有電源提供能量,使用還局限在一定范圍,難以普及,所以對它的研究一直沒有明顯進展。

目前,在西方發達國家,電子密碼鎖技術相對先進,種類齊全,電子密碼鎖已被廣泛應用于智能門禁系統中,通過多種更加安全,更加可靠的技術實現大門的管理。國內的不少企業也引進了世界上先進的技術,發展前景非常可觀。希望通過不斷的努力,使電子密碼鎖在我國也能得到廣泛應用。

1.2 電子密碼鎖發展趨勢

電子密碼鎖應用于金融業,其根本的作用是“授權”,即被“授權”的人才可以存取錢、物。廣義上講,金融業的“授權”主要包括以下三種層次的內容:1、授予保管權,如使用保管箱、保險箱和保險柜;2、授予出入權,如出入金庫、運鈔車和保管室;3、授予流通權,如自動存取款。目前,金融行業電子密碼鎖的應用主要集中在前兩個層面上。下面將介紹幾種在金融行業中使用較多的電子密碼鎖以及它們的技術發展方向。當然,以上所說的授權技術再高超,都必須由精良的“鎖具”擔當承載結構部件,實現開啟、閉鎖的功能,而且承擔實體防護作用,抵抗住或盡量延遲破壞行為,讓電子密碼鎖“軟、硬不吃”。一般情況下,鎖具防盜的關鍵是鎖身外殼、閉鎖的部件的強度、鎖止型式、配合間隙和布局。提高電子密碼鎖之防護能力的必然途徑是報警,在金融業的許多場所有人值守、有電視監控,具有報警功能,可以綜合物理防范和人力防范兩種作用。報警的前提是具備探測功能,根據電子密碼鎖的使用場所和防護要求,可選擇多種多樣的探測手段。在中國的城市金融業中,實現聯網報警已經成為對各金融網點的基本要求。根據國內外的實踐經驗,金融業實行安全防范風險等級很有必要,即依據使用的防盜報警器材的性能、安裝布局和人員值守狀況等,可以評估被防護物或區域的防護能力,得出風險等級,其中,電子密碼鎖的性能至關重要。

由于數字、字符、圖形圖像、人體生物特征和時間等要素均可成為鑰匙的電子信息,組合使用這些信息能夠使電子密碼鎖獲得高度的保密性,如防范森嚴的金庫,需要使用復合信息密碼的電子密碼鎖,這樣對盜賊而言是“道高一尺、魔高一丈”。組合使用信息也能夠使電子密碼鎖獲得無窮擴展的可能,使產品多樣化,對用戶而言是“千挑百選、自得其所”。



               圖1.1 總體框圖

工作過程

  • 按鍵設置6位密碼,輸入密碼,通過單片機判斷,若密碼正確,通過則鎖打開,顯示open!
  • 首次使用時輸入:131420,對密碼進行初始化,當顯示:initpassword,證明密碼初始化完成,此時的密碼為:000000。

第二章 設計思想

(1)本設計為了防止密碼被竊取要求在輸入密碼時在LCD屏幕上顯示*號。

(2)設計開鎖密碼位六位密碼的電子密碼鎖。

(3)能夠LCD顯示在密碼正確時顯示open!,密碼錯誤時顯示ERROR,輸入密碼時顯示initpassword。

(4)實現輸入密碼錯誤超過限定的三次電子密碼鎖定。

(5)4×4的矩陣鍵盤其中包括0-9的數字鍵和A-D的功能鍵

(6)本產品具備報警功能,當輸入密碼錯誤時蜂鳴器響并且LED燈亮。

  •    (7)密碼可以由用戶自己修改設定(只支持6位密碼),修改密碼之前必須再次輸入密碼,在輸入新密碼時候需要二次確認,以防止誤操作



第三章 系統的硬件設計

3.1硬件支持

3.1.1 STC89C52RC 單片機介紹

STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統可編程Flash 存儲器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C51為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。 具有以下標準功能: 8k字節Flash,512字節RAM, 32 位I/O 口線,看門狗定時器,內置8KB EEPROM,MAX810復位電路,三個16 位 定時器/計數器,一個6向量2級中斷結構,全雙工串行口。另外 STC89X51 可降至0Hz 靜態邏輯操作,支持2種軟件可選擇節電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。最高運作頻率35Mhz,6T/12T可選。

圖3-1 STC89C52單片機引腳圖

     主要特性如下:

(1) 增強型 8051 單片機,6 時鐘/機器周期和 12 時鐘/機器周期可以任 意選擇,指令代碼完全兼容傳統 8051.

(2)工作電壓:5.5V~3.3V(5V 單片機)/3.8V~2.0V(3V 單片機)

(3) 工作頻率范圍:0~40MHz,相當于普通 8051 的 0~80MHz,實際工 作頻率可達 48MHz

(4) 用戶應用程序空間為 8K 字節

(5) 片上集成 512 字節 RAM

(6) 通用 I/O 口 (32 個) 復位后為: , P1/P2/P3/P4 是準雙向口/弱上拉, P0 口是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為 I/O 口用時,需加上拉電阻。

(7)ISP(在系統可編程)/IAP(在應用可編程) ,無需專用編程器,無 需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程 序,數秒即可完成一片

(8)具有 EEPROM 功能

(9)具有看門狗功能

(10)共 3 個 16 位定時器/計數器。即定時器 T0、T1、T2

(11)外部中斷 4 路,下降沿中斷或低電平觸發電路,Power Down 模式可 由外部中斷低電平觸發中斷方式喚醒

(12)通用異步串行口(UART) ,還可用定時器軟件實現多個 UART

(13) 工作溫度范圍:-40~+85℃(工業級)/0~75℃(商業級)

(14) PDIP 封裝

3.1.2液晶顯示LCD1602的介紹(1)LM1602字符型模塊的性能
重量輕:<100g;

體積小:<11mm 厚;

功耗低:10—15mW;

顯示內容:192 種字符(5×7 點字型);

32 種字符(5×10 點字型);

可自編8(5×7)或許(5×10)種字符;

指令功能強:可組合成各種輸入、顯示、移位方式以滿足不同的要求;

接口簡單方便:可與8 位微處理器或微控制器相聯;

工作溫度寬:0—50oC

可靠性高:壽命為50,000 小時(25oC)

圖3-2 液晶原理圖

  3.1.3自鎖開關說明

自鎖開關電路中起到電源的開關作用,常開的其中一腳接DC電源插口電源腳,常開的另一腳接電路的VCC

                        

  3-3自鎖開關原理圖                   3-4自鎖開關硬件圖

3.1.4上拉電阻介紹

     其實排阻就是由8個電阻組成的,其中一端全部接在一起,103為8個10K電阻,

102為8個1K電阻,他們在電路中起到“上拉”的作用,又稱上拉電阻。

上拉就是將不確定的信號通過一個電阻嵌位在高電平,電阻同時起限流作用,下拉同理.

上拉是對器件注入電流,下拉是輸出電流,弱強只是上拉電阻的阻值不同,沒有什么嚴格區分,對于非集電極(或漏極)開路輸出型電路(如普通門電路)提升電流和電壓的能力是有限的,上拉電阻的功能主要是為集電極開路輸出型電路輸出電流通道。

上拉,就是把電位拉高,比如拉到VCC

下拉,就是把電壓拉低,拉到GND

一般就是剛上電的時候,端口電壓不穩定,為了讓他穩定為高或低,就會用到上拉或下拉電阻。

有些芯片內部集成了上拉電阻(如單片機的P1、2、3口),所以外部就不用上拉電阻了。但是有一些開漏的(如單片機的P0口),外部必須加上拉電阻。

圖3-5 排組上拉電阻原理圖

3.1.5三極管介紹

  常見的三極管為9012、s8550、9013、s8050.單片機應用電路中三極管主要的作用就是開關作用。

其中9012與8550為pnp型三極管,可以通用。

其中9013與8050為npn型三極管,可以通用。

區別引腳:三極管向著自己,引腳從左到右分別為ebc,原理圖中有箭頭的一端為e,與電阻相連的為b,另一個為c。箭頭向里指為PNP(9012或8550),箭頭向外指為NPN(9013或8050)。

三極管的工作原理

   三極管是電流放大器件,有三個極,分別叫做集電極C,基極B,發射極E。分成NPN和PNP兩種。我們僅以NPN三極管的共發射極放大電路為例來說明一下三極管放大電路的基本原理。

(1)電流放大

    下面的分析僅對于NPN型硅三極管。如上圖所示,我們把從基極B流至發射極E的電流叫做基極電流Ib;把從集電極C流至發射極E的電流叫做集電極電流 Ic。這兩個電流的方向都是流出發射極的,所以發射極E上就用了一個箭頭來表示電流的方向。三極管的放大作用就是:集電極電流受基極電流的控制(假設電源 能夠提供給集電極足夠大的電流的話),并且基極電流很小的變化,會引起集電極電流很大的變化,且變化滿足一定的比例關系:集電極電流的變化量是基極電流變 化量的β倍,即電流變化被放大了β倍,所以我們把β叫做三極管的放大倍數(β一般遠大于1,例如幾十,幾百)。如果我們將一個變化的小信號加到基極跟發射 極之間,這就會引起基極電流Ib的變化,Ib的變化被放大后,導致了Ic很大的變化。如果集電極電流Ic是流過一個電阻R的,那么根據電壓計算公式 U=R*I 可以算得,這電阻上電壓就會發生很大的變化。我們將這個電阻上的電壓取出來,就得到了放大后的電壓信號了。

(2)偏置電路

    三極管在實際的放大電路中使用時,還需要加合適的偏置電路。這有幾個原因。首先是由于三極管BE結的非線性(相當于一個二極管),基極電流必須在輸入電壓 大到一定程度后才能產生(對于硅管,常取0.7V)。當基極與發射極之間的電壓小于0.7V時,基極電流就可以認為是0。但實際中要放大的信號往往遠比 0.7V要小,如果不加偏置的話,這么小的信號就不足以引起基極電流的改變(因為小于0.7V時,基極電流都是0)。如果我們事先在三極管的基極上加上一 個合適的電流(叫做偏置電流,上圖中那個電阻Rb就是用來提供這個電流的,所以它被叫做基極偏置電阻),那么當一個小信號跟這個偏置電流疊加在一起時,小 信號就會導致基極電流的變化,而基極電流的變化,就會被放大并在集電極上輸出。另一個原因就是輸出信號范圍的要求,如果沒有加偏置,那么只有對那些增加的 信號放大,而對減小的信號無效(因為沒有偏置時集電極電流為0,不能再減小了)。而加上偏置,事先讓集電極有一定的電流,當輸入的基極電流變小時,集電極 電流就可以減小;當輸入的基極電流增大時,集電極電流就增大。這樣減小的信號和增大的信號都可以被放大了。

(3)開關作用

    下面說說三極管的飽和情況。像上面那樣的圖,因為受到電阻 Rc的限制(Rc是固定值,那么最大電流為U/Rc,其中U為電源電壓),集電極電流是不能無限增加下去的。當基極電流的增大,不能使集電極電流繼續增大 時,三極管就進入了飽和狀態。一般判斷三極管是否飽和的準則是:Ib*β〉Ic。進入飽和狀態之后,三極管的集電極跟發射極之間的電壓將很小,可以理解為 一個開關閉合了。這樣我們就可以拿三極管來當作開關使用:當基極電流為0時,三極管集電極電流為0(這叫做三極管截止),相當于開關斷開;當基極電流很 大,以至于三極管飽和時,相當于開關閉合。如果三極管主要工作在截止和飽和狀態,那么這樣的三極管我們一般把它叫做開關管。

(4)工作狀態

    如果我們在上面這個圖中,將電阻Rc換成一個燈泡,那么當基極電流為0時,集電極電流為0,燈泡滅。如果基極電流比較大時(大于流過燈泡的電流除以三極管 的放大倍數 β),三極管就飽和,相當于開關閉合,燈泡就亮了。由于控制電流只需要比燈泡電流的β分之一大一點就行了,所以就可以用一個小電流來控制一個大電流的通 斷。如果基極電流從0慢慢增加,那么燈泡的亮度也會隨著增加(在三極管未飽和之前)。

                                          

    3-6  三極管引腳介紹          圖3-7  PNP型原理圖         圖3-8  NPN型原理圖



3.1.6繼電器介紹

    電磁繼電器一般由鐵芯、線圈、銜鐵、觸點簧片等組成的。只要在線圈兩端加上一定的電壓,線圈中就會流過一定的電流,從而產生電磁效應,銜鐵就會在電磁力吸引的作用下克服返回彈簧的拉力吸向鐵芯,從而帶動銜鐵的動觸點與靜觸點(常開觸點)吸合。當線圈斷電后,電磁的吸力也隨之消失,銜鐵就會在彈簧的反作用力返回原來的位置,使動觸點與原來的靜觸點(常閉觸點)釋放。這樣吸合、釋放,從而達到了在電路中的導通、切斷的目的。對于繼電器的“常開、常閉”觸點,可以這樣來區分:繼電器線圈未通電時處于斷開狀態的靜觸點,稱為“常開觸點”;處于接通狀態的靜觸點稱為“常閉觸點”。繼電器一般有兩股電路,為低壓控制電路和高壓工作電路。

繼電器的線圈和接線端子是分立的,互補影響的~~~~繼電器的觸點只相當于開關


            

      3-9  繼電器硬件圖                  3-10 繼電器原理圖

3.1.7供電方式

                          

             圖3-11  DC插頭                         圖3-12  USB電源線


3.1.8輕觸按鍵

               

       圖3-13 實物圖                  圖3-14 按鍵原理圖

   

            圖3-15  按鍵解析圖相贈                       圖3-16  按鍵解析圖


3.2功能單元模塊設計

   3.2.1 開鎖機構

    通過單片機送給開鎖執行機構,電路驅動電磁鎖吸合,從而達到開鎖的目的。如下圖所示,為密碼鎖開鎖電路原理圖。

當用戶輸入的密碼正確時,單片機便輸出開門信號,送到開鎖驅動電路,然后驅動電磁鎖,達到開門的目的。本次設計中,基于節省成本考慮,用發光二極管代替電磁鎖,信息通過LCD顯示,并利用蜂鳴器和二極管聲光指示。其中,綠發光二極管亮,表示開鎖;否則,表示密碼輸入錯誤并開啟報警電路。


               圖3-17  密碼鎖開鎖電路原理圖





3.2.2 矩陣鍵盤設計電路

     每一條水平(行線)與垂直線(列線)的交叉處不相通,而是通過一個按鍵來連通,利用這種行列式矩陣結構只需要M條行線和N條列線,即可組成具有M×N個按鍵的鍵盤。由于本設計中要求使用16個按鍵輸入,為減少鍵盤與單片機接口時所占用的I/O線的數目,故使用矩陣鍵盤。本設計中,矩陣鍵盤行線和單片機P1.0-P1.3相連,列線與單片機P1.4-P1.7相連。矩陣鍵盤設計電路圖,如圖4所示。

鍵盤掃描采用行掃描法,即依次置行線中的每一行為低電平,其余均為高電平,掃描列線電平狀態,為低電平即表示該鍵按下。



                           圖3-18   矩陣鍵盤設計電路


3.2.3 聲音提示電路設計

聲音提示電路采用小蜂鳴器提示。蜂鳴器能夠根據脈沖信號,以及信號的頻率發出各種不同的聲音,這樣可以根據系統要求在密碼出入正確和密碼輸入錯誤時發出不同的聲音提示,已達到報警的要求。蜂鳴器電路,如下圖所示。

圖3-19  蜂鳴器電路


3.2.4 AT24C02掉電存儲單元的設計

本設計中掉電存儲單元采用AT24C02外部存儲器[8-9],其作用是在系統電源斷開的時候,存儲當前設定的密碼數據。

AT24C02是一個2K位串行CMOS E2PROM,內部含有256個8位字節, 含一個16字節頁寫緩沖器,具有寫保護功能。其采用兩線串行的總線和單片機通訊,電壓最低可以到2.5V,額定電流為1mA,靜態電流10Ua(5.5V),芯片內的資料可以在斷電的情況下保存40年以上,而且采用8腳的DIP封裝,使用方便。如下所示,下圖為AT24C02管腳示意圖,下表為AT24C02管腳說明。

                      圖3-20  AT24C02管腳示意圖

管腳名稱
功能
管腳名稱
功能
A0 A1 A2
器件地址選擇
SDA
串行數據/地址
SCL
串行時鐘信號
WP
寫保護
VCC
1.8V-6.0V工作電壓
VSS
接地


            

                                     表1  AT24C02管腳說明

本設計中,AT24C02的SCL和SDA引腳接上拉電阻后與單片機的P3.4(T0)和P3.5(T1)腳相連,其電路下圖所示。

                 



                                圖3-22  AT24C02掉電存儲單元設計圖


第四章 系統模塊與程序設計
4.1 模塊介紹

     與硬件電路相關聯,本系統軟件包括主程序模塊、密碼比較判斷模塊、鍵盤掃描模塊、修改密碼模塊、1602A液晶顯示模塊等[10]。系統程序流程下圖所示。

                             圖4-1  系統程序流程圖


4.1.1 主程序模塊

主程序主要用于定義全局變量,給全局變量賦初值,初始化E2PROM,啟動定時器以及   從AT24C02中讀取密碼,為整個程序提供數據;檢測按鍵;調用顯示等功能。


4.1.2 密碼比較判斷模塊

該模塊的功能是將鍵盤輸入的密碼利用if語句與設定的密碼進行逐個比較,若密碼完全正確則開鎖;若不正確,則開啟報警電路,復位后重新輸入密碼。其密碼輸入和比較判決流程圖下圖所示。

                        圖4-2  密碼輸入和比較判決流程圖

4.1.3 鍵盤掃描模塊

     鍵盤使用矩陣式鍵盤,由行和列組成,CPU對所有鍵盤進行監視,從而實現逐列掃描鍵盤確定被按鍵的具體位置、判斷鍵盤上有無鍵按下、消除去抖動、判斷閉合的鍵是否釋放等功能。如下圖所示,為鍵盤掃描流程圖                        

     

                       圖4-3  鍵盤掃描流程圖

4.1.4 修改密碼模塊

在密碼輸入正確情況下,可以按下“重置密碼”對密碼進行重新設置,每設定一位就將密碼送給AT24C02存儲起來,當設置6位密碼完畢后,系統將自動跳到程序開始,調用新設置的密碼。下圖為修改密碼流程圖。

                         圖4-4  修改密碼流程圖



4.2電子密碼鎖原理圖
  4.2.1 總電路圖
                  
                            圖4-5   總電路圖


4.2.2控制電路

                                    圖4-6  控制電路圖




4.2.3實物圖
   
                                      圖4-7實物圖
4.2.4仿真圖
五 系統功能

本設計中系統可實現功能如下:

(1)對輸入的6位密碼進行隱藏;

(2)通過發光二極管和蜂鳴器,對解密正確或者錯誤進行聲光報警;

(3)6位密碼修改;

(4)在密碼遺失情況下,通過初始密碼進行密碼再設置;

(5)采用AT24C02外部存儲器,完成斷電密碼保護功能;

六 設計總結

從基本方案的制定,到硬件電路的選擇,再到電路的焊接,最后進行程序調試——在此期間我們遇到很多困難,但經過不懈努力,終于擊破了各個難點,達到的所需要的效果。在這次設計中,我深刻認識到自身的不足——缺少實戰經驗。與此同時,也因為這次設計,我得到一定的鍛煉,體會到理論與實踐相結合的重要意義。

由于本次設計時間有限,一些設想沒有完全實現,比如說:電子密碼鎖的網絡通信擴展,人機界面智能化等。期待以后有機會對以上設想進行進一步研究實踐。







致謝

非常感謝**老師,老師在我大學的最后學習階段——畢業設計階段給自己的指導,從最初的定題,到資料收集,到寫作、修改,到論文定稿,她們給了我耐心的指導和無私的幫助。為了指導我們的畢業論文,他甚至放棄了自己的休息時間,他的這種無私奉獻的敬業精神令人欽佩,在此我向他表示我誠摯的謝意。同時,感謝所有任課老師和所有同學在這四年來給自己的指導和幫助,是他們教會了我專業知識,教會了我如何學習,教會了我如何做人。正是由于他們,我才能在各方面取得顯著的進步,在此向他們表示我由衷的謝意,并祝所有的老師培養出越來越多的優秀人才,桃李滿天下


單片機源程序如下:



  1. <font style="background-color:rgb(255, 255, 255)">#include <REG51.h>
  2. #include<intrins.h>
  3. #define LCM_Data  P0
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define w 6                                                        //定義密碼位數
  7. sbit lcd1602_rs=P2^7;
  8. sbit lcd1602_rw=P2^6;
  9. sbit lcd1602_en=P2^5;

  10. sbit Scl=P3^4;                                          //24C02串行時鐘
  11. sbit Sda=P3^5;                                          //24C02串行數據

  12. sbit ALAM = P2^1;                            //報警            
  13. sbit KEY = P3^6;                            //開鎖

  14. sbit open_led=P2^2;                            //開鎖指示燈

  15. bit  operation=0;                            //操作標志位
  16. bit  pass=0;                                          //密碼正確標志
  17. bit  ReInputEn=0;                            //重置輸入充許標志            
  18. bit  s3_keydown=0;                            //3秒按鍵標志位
  19. bit  key_disable=0;                            //鎖定鍵盤標志

  20. unsigned char countt0,second;              //t0中斷計數器,秒計數器

  21. void Delay5Ms(void);

  22. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};                                                                                                                                                           //控盤掃描控制表

  23. unsigned char code start_line[]              = {"password:       "};
  24. unsigned char code name[]                             = {"===Coded Lock==="};                                                                                                                                                                        //顯示名稱
  25. unsigned char code Correct[]               = {"     correct    "};                                                                                                                                                          //輸入正確
  26. unsigned char code Error[]                 = {"      error     "};                                                                                                                                                            //輸入錯誤
  27. unsigned char code codepass[]              = {"      pass      "};
  28. unsigned char code LockOpen[]              = {"      open      "};                                                                                                                                                                        //OPEN
  29. unsigned char code SetNew[]               = {"SetNewWordEnable"};
  30. unsigned char code Input[]                 = {"input:          "};                                                                                                                                                                        //INPUT
  31. unsigned char code ResetOK[]               = {"ResetPasswordOK "};
  32. unsigned char code initword[]              = {"Init password..."};
  33. unsigned char code Er_try[]                            = {"error,try again!"};
  34. unsigned char code again[]                            = {"input again     "};

  35. unsigned char InputData[6];                                                                                                                                                                                                                                //輸入密碼暫存區
  36. unsigned char CurrentPassword[6]={1,3,1,4,2,0};                                                                                                                                                                                                     //當前密碼值
  37. unsigned char TempPassword[6];
  38. unsigned char N=0;                                                        //密碼輸入位數記數
  39. unsigned char ErrorCont;                                          //錯誤次數計數
  40. unsigned char CorrectCont;                                          //正確輸入計數
  41. unsigned char ReInputCont;                                           //重新輸入計數
  42. unsigned char code initpassword[6]={0,0,0,0,0,0};

  43. //=====================5ms延時==============================
  44. void Delay5Ms(void)
  45. {
  46.               unsigned int TempCyc = 5552;
  47.               while(TempCyc--);
  48. }

  49. //===================400ms延時==============================
  50. void Delay400Ms(void)
  51. {
  52. unsigned char TempCycA = 5;
  53. unsigned int TempCycB;
  54. while(TempCycA--)
  55. {
  56.   TempCycB=7269;
  57.   while(TempCycB--);
  58. }
  59. }

  60. //=============================================================================================
  61. //================================24C02========================================================
  62. //=============================================================================================

  63. void mDelay(uint t) //延時
  64. {
  65.               uchar i;
  66.                  while(t--)
  67.                  {
  68.                                for(i=0;i<125;i++)
  69.                                {;}
  70.                  }
  71. }
  72.    void Nop(void)                              //空操作
  73. {
  74.               _nop_();
  75.               _nop_();
  76.               _nop_();
  77.               _nop_();
  78. }


  79. /*起始條件*/

  80. void Start(void)
  81. {
  82.               Sda=1;
  83.               Scl=1;
  84.               Nop();
  85.               Sda=0;
  86.               Nop();
  87. }


  88. /*停止條件*/
  89. void Stop(void)
  90. {
  91.               Sda=0;
  92.               Scl=1;
  93.               Nop();
  94.               Sda=1;
  95.               Nop();
  96. }

  97. /*應答位*/
  98. void Ack(void)
  99. {
  100.               Sda=0;
  101.               Nop();
  102.               Scl=1;
  103.               Nop();
  104.               Scl=0;
  105. }

  106. /*反向應答位*/
  107. void NoAck(void)
  108. {
  109.               Sda=1;
  110.               Nop();
  111.               Scl=1;
  112.               Nop();
  113.               Scl=0;
  114. }

  115. /*發送數據子程序,Data為要求發送的數據*/
  116. void Send(uchar Data)
  117. {
  118.                  uchar BitCounter=8;
  119.                  uchar temp;
  120.                  do
  121.                  {
  122.                                temp=Data;
  123.                                Scl=0;
  124.                                Nop();
  125.                                if((temp&0x80)==0x80)
  126.                                Sda=1;
  127.                                else
  128.                                Sda=0;
  129.                                Scl=1;
  130.                                temp=Data<<1;
  131.                                Data=temp;
  132.                                BitCounter--;
  133.                  }
  134.                  while(BitCounter);
  135.                  Scl=0;
  136. }

  137. /*讀一字節的數據,并返回該字節值*/
  138. uchar Read(void)
  139. {
  140.     uchar temp=0;
  141.               uchar temp1=0;
  142.               uchar BitCounter=8;
  143.               Sda=1;
  144.               do{
  145.               Scl=0;
  146.               Nop();
  147.               Scl=1;
  148.               Nop();
  149.               if(Sda)
  150.               temp=temp|0x01;
  151.               else
  152.               temp=temp&0xfe;
  153.               if(BitCounter-1)
  154.               {
  155.               temp1=temp<<1;
  156.               temp=temp1;
  157.               }
  158.               BitCounter--;
  159.               }
  160.               while(BitCounter);
  161.               return(temp);
  162.               }

  163. void WrToROM(uchar Data[],uchar Address,uchar Num)
  164. {
  165.   uchar i;
  166.   uchar *PData;
  167.   PData=Data;
  168.   for(i=0;i<Num;i++)
  169.   {
  170.   Start();
  171.   Send(0xa0);
  172.   Ack();
  173.   Send(Address+i);
  174.   Ack();
  175.   Send(*(PData+i));
  176.   Ack();
  177.   Stop();
  178.   mDelay(20);
  179.   }
  180. }

  181. void RdFromROM(uchar Data[],uchar Address,uchar Num)
  182. {
  183.   uchar i;
  184.   uchar *PData;
  185.   PData=Data;
  186.   for(i=0;i<Num;i++)
  187.   {
  188.   Start();
  189.   Send(0xa0);
  190.   Ack();
  191.   Send(Address+i);
  192.   Ack();
  193.   Start();
  194.   Send(0xa1);
  195.   Ack();
  196.   *(PData+i)=Read();
  197.   Scl=0;
  198.   NoAck();
  199.   Stop();
  200.   }
  201. }
  202. //==================================================================================================
  203. //=======================================LCD1602====================================================
  204. //==================================================================================================

  205. #define yi 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)
  206. #define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)


  207. //----------------延時函數,后面經常調用----------------------
  208. void delay(uint xms)//延時函數,有參函數
  209. {
  210.               uint x,y;
  211.               for(x=xms;x>0;x--)
  212.               for(y=110;y>0;y--);
  213. }

  214. //--------------------------寫指令---------------------------
  215. write_1602com(uchar com)//****液晶寫入指令函數****
  216. {
  217.               lcd1602_rs=0;//數據/指令選擇置為指令
  218.               lcd1602_rw=0; //讀寫選擇置為寫
  219.               P0=com;//送入數據
  220.               delay(1);
  221.               lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準備
  222.               delay(1);
  223.               lcd1602_en=0;//en由高變低,產生下降沿,液晶執行命令
  224. }

  225. //-------------------------寫數據-----------------------------
  226. write_1602dat(uchar dat)//***液晶寫入數據函數****
  227. {
  228.               lcd1602_rs=1;//數據/指令選擇置為數據
  229.               lcd1602_rw=0; //讀寫選擇置為寫
  230.               P0=dat;//送入數據
  231.               delay(1);
  232.               lcd1602_en=1; //en置高電平,為制造下降沿做準備
  233.               delay(1);
  234.               lcd1602_en=0; //en由高變低,產生下降沿,液晶執行命令
  235. }

  236. //-------------------------初始化-------------------------
  237. void lcd_init(void)
  238. {
  239.               write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
  240.               write_1602com(0x0c);//開顯示不顯示光標
  241.               write_1602com(0x06);//整屏不移動,光標自動右移
  242.               write_1602com(0x01);//清顯示
  243. }
  244. //========================================================================================
  245. //=========================================================================================

  246. //==============將按鍵值編碼為數值=========================
  247. unsigned char coding(unsigned char m)            
  248. {
  249.               unsigned char k;
  250.             
  251.               switch(m)
  252.               {
  253.                             case (0x11): k=1;break;
  254.                             case (0x21): k=2;break;
  255.                             case (0x41): k=3;break;
  256.                             case (0x81): k='A';break;
  257.                             case (0x12): k=4;break;
  258.                             case (0x22): k=5;break;
  259.                             case (0x42): k=6;break;
  260.                             case (0x82): k='B';break;
  261.                             case (0x14): k=7;break;
  262.                             case (0x24): k=8;break;
  263.                             case (0x44): k=9;break;
  264.                             case (0x84): k='C';break;
  265.                             case (0x18): k='*';break;
  266.                             case (0x28): k=0;break;
  267.                             case (0x48): k='#';break;
  268.                             case (0x88): k='D';break;
  269.               }
  270.               return(k);
  271. }


  272. //=====================按鍵檢測并返回按鍵值===============================
  273. unsigned char keynum(void)
  274. {
  275.               unsigned char row,col,i;
  276.               P1=0xf0;
  277.               if((P1&0xf0)!=0xf0)
  278.               {
  279.                                Delay5Ms();
  280.         Delay5Ms();
  281.                                if((P1&0xf0)!=0xf0)
  282.                             {
  283.                                 row=P1^0xf0;          //確定行線
  284.                                           i=0;
  285.                                           P1=a[i];                        //精確定位
  286.                                           while(i<4)
  287.                                           {
  288.                                                         if((P1&0xf0)!=0xf0)
  289.                                                           {
  290.                                                                          col=~(P1&0xff);                //確定列線
  291.                                                                          break;            //已定位后提前退出  
  292.                                                           }
  293.                                                         else
  294.                                                           {
  295.                                                                          i++;
  296.                                                                          P1=a[i];
  297.                                                           }
  298.                                           }
  299.                             }
  300.                             else
  301.                             {
  302.                                           return 0;
  303.                             }
  304.             
  305.                             while((P1&0xf0)!=0xf0);
  306.        return (row|col);                                          //行線與列線組合后返回
  307.               }
  308.               else return 0;                                                   //無鍵按下時返回0
  309. }
  310. //=======================一聲提示音,表示有效輸入========================
  311. void OneAlam(void)
  312. {
  313.               ALAM=0;
  314.               Delay5Ms();
  315.     ALAM=1;
  316. }
  317. //========================二聲提示音,表示操作成功========================
  318. void TwoAlam(void)
  319. {
  320.               ALAM=0;
  321.               Delay5Ms();
  322.     ALAM=1;
  323.     Delay5Ms();
  324.               ALAM=0;
  325.               Delay5Ms();
  326.     ALAM=1;
  327. }
  328. //========================三聲提示音,表示錯誤========================
  329. void ThreeAlam(void)
  330. {
  331.               ALAM=0;
  332.               Delay5Ms();
  333.     ALAM=1;
  334.     Delay5Ms();
  335.               ALAM=0;
  336.               Delay5Ms();
  337.     ALAM=1;
  338.     Delay5Ms();
  339.               ALAM=0;
  340.               Delay5Ms();
  341.     ALAM=1;

  342. }
  343. //=====================顯示輸入的N個數字,用H代替以便隱藏============================
  344. void DisplayOne(void)
  345. {
  346. //              DisplayOneChar(9+N,1,'*');
  347.               write_1602com(yi+5+N);
  348.               write_1602dat('*');
  349. }
  350. //=======================顯示提示輸入=========================
  351. void DisplayChar(void)
  352. {
  353.               unsigned char i;
  354.               if(pass==1)
  355.               {
  356.                             //DisplayListChar(0,1,LockOpen);
  357.                             write_1602com(er);
  358.                             for(i=0;i<16;i++)
  359.                             {
  360.                                           write_1602dat(LockOpen[i]);            
  361.                             }
  362.               }
  363.               else
  364.               {
  365.                             if(N==0)
  366.                             {
  367.                                           //DisplayListChar(0,1,Error);
  368.                                           write_1602com(er);
  369.                                           for(i=0;i<16;i++)
  370.                                           {
  371.                                                         write_1602dat(Error[i]);            
  372.                                           }
  373.                             }
  374.                             else
  375.                             {
  376.                                           //DisplayListChar(0,1,start_line);            
  377.                                           write_1602com(er);
  378.                                           for(i=0;i<16;i++)
  379.                                           {
  380.                                                         write_1602dat(start_line[i]);            
  381.                                           }
  382.                             }
  383.               }
  384. }

  385. void DisplayInput(void)
  386. {
  387.               unsigned char i;
  388.               if(CorrectCont==1)
  389.               {
  390.                             //DisplayListChar(0,0,Input);
  391.                             write_1602com(er);
  392.                             for(i=0;i<16;i++)
  393.                             {
  394.                                           write_1602dat(Input[i]);            
  395.                             }
  396.               }
  397. }


  398. //========================重置密碼==================================================
  399. //==================================================================================
  400. void ResetPassword(void)
  401. {
  402.               unsigned char i;            
  403.               unsigned char j;
  404.               if(pass==0)
  405.               {
  406.                             pass=0;
  407.                             DisplayChar();
  408.                             ThreeAlam();
  409.               }
  410.               else
  411.               {
  412.                   if(ReInputEn==1)
  413.                             {
  414.                                           if(N==6)
  415.                                           {
  416.                                                         ReInputCont++;                                                      
  417.                                                         if(ReInputCont==2)
  418.                                                         {
  419.                                                                       for(i=0;i<6;)
  420.                                                                       {
  421.                                                                                     if(TempPassword[i]==InputData[i])              //將兩次輸入的新密碼作對比
  422.                                                                                                   i++;
  423.                                                                                     else
  424.                                                                                     {
  425.                                                                                                   //DisplayListChar(0,1,Error);
  426.                                                                                                   write_1602com(er);
  427.                                                                                                   for(j=0;j<16;j++)
  428.                                                                                                   {
  429.                                                                                                                 write_1602dat(Error[j]);            
  430.                                                                                                   }
  431.                                                                                                   ThreeAlam();                                          //錯誤提示            
  432.                                                                                                   pass=0;
  433.                                                                                                   ReInputEn=0;                                          //關閉重置功能,
  434.                                                                                                   ReInputCont=0;
  435.                                                                                                   DisplayChar();
  436.                                                                                                   break;
  437.                                                                                     }
  438.                                                                       }
  439.                                                                       if(i==6)
  440.                                                                       {
  441.                                                                                     //DisplayListChar(0,1,ResetOK);
  442.                                                                                     write_1602com(er);
  443.                                                                                     for(j=0;j<16;j++)
  444.                                                                                     {
  445.                                                                                                   write_1602dat(ResetOK[j]);            
  446.                                                                                     }

  447.                                                                                     TwoAlam();                                                        //操作成功提示
  448.                                                                                     WrToROM(TempPassword,0,6);                            //將新密碼寫入24C02存儲
  449.                                                                                     ReInputEn=0;
  450.                                                                       }
  451.                                                                       ReInputCont=0;
  452.                                                                       CorrectCont=0;
  453.                                                         }
  454.                                                         else
  455.                                                         {
  456.                                                                       OneAlam();
  457.                                                                       //DisplayListChar(0, 1, again);                             //顯示再次輸入一次
  458.                                                                       write_1602com(er);
  459.                                                                       for(j=0;j<16;j++)
  460.                                                                       {
  461.                                                                                     write_1602dat(again[j]);            
  462.                                                                       }                                                                     
  463.                                                                       for(i=0;i<6;i++)
  464.                                                                       {
  465.                                                                                     TempPassword[i]=InputData[i];                            //將第一次輸入的數據暫存起來                                                                                   
  466.                                                                       }
  467.                                                         }

  468.                                           N=0;                                                                                    //輸入數據位數計數器清零
  469.                                }
  470.                   }
  471.               }

  472. }



  473. //=======================輸入密碼錯誤超過三過,報警并鎖死鍵盤======================
  474. void Alam_KeyUnable(void)
  475. {
  476.               P1=0x00;
  477.               {
  478.                             ALAM=~ALAM;
  479.                             Delay5Ms();
  480.               }
  481. }


  482. //=======================取消所有操作============================================
  483. void Cancel(void)
  484. {            
  485.               unsigned char i;
  486.               unsigned char j;
  487.               //DisplayListChar(0, 1, start_line);
  488.               write_1602com(er);
  489.               for(j=0;j<16;j++)
  490.               {
  491.                             write_1602dat(start_line[j]);            
  492.               }
  493.               TwoAlam();                                                        //提示音
  494.               for(i=0;i<6;i++)
  495.               {
  496.                             InputData[i]=0;
  497.               }
  498.               KEY=1;                                                                      //關閉鎖
  499.               ALAM=1;                                                                      //報警關
  500.               operation=0;                                          //操作標志位清零
  501.               pass=0;                                                                      //密碼正確標志清零
  502.               ReInputEn=0;                                          //重置輸入充許標志清零
  503.               ErrorCont=0;                                          //密碼錯誤輸入次數清零
  504.               CorrectCont=0;                                          //密碼正確輸入次數清零
  505.               ReInputCont=0;                                          //重置密碼輸入次數清零
  506.               open_led=1;
  507.               s3_keydown=0;
  508.               key_disable=0;
  509.               N=0;                                                                      //輸入位數計數器清零
  510. }


  511. //==========================確認鍵,并通過相應標志位執行相應功能===============================
  512. void Ensure(void)
  513. {            
  514.               unsigned char i,j;
  515.               RdFromROM(CurrentPassword,0,6);                                                                       //從24C02里讀出存儲密碼
  516.     if(N==6)
  517.               {
  518.                   if(ReInputEn==0)                                                                                                  //重置密碼功能未開啟
  519.                             {
  520.                                           for(i=0;i<6;)
  521.                                              {                                                                     
  522.                                                         if(CurrentPassword[i]==InputData[i])
  523.                                                         {
  524.                                                                       i++;
  525.                                                         }
  526.                                                         else
  527.                                                         {                                         
  528.                                                                       ErrorCont++;
  529.                                                                       if(ErrorCont==3)                                          //錯誤輸入計數達三次時,報警并鎖定鍵盤
  530.                                                                       {
  531.                                                                                     write_1602com(er);
  532.                                                                                     for(i=0;i<16;i++)
  533.                                                                                     {
  534.                                                                                                   write_1602dat(Error[i]);            
  535.                                                                                     }
  536.                                                                                     do
  537.                                                                                     Alam_KeyUnable();
  538.                                                                                     while(1);
  539.                                                                       }
  540.                                                                       else
  541.                                                                       {
  542.                                                                                     TR0=1;                                                        //開啟定時
  543.                                                                                     key_disable=1;                                          //鎖定鍵盤
  544.                                                                                     pass=0;
  545.                                                                                     break;
  546.                                                                       }
  547.                                                         }
  548.                                           }

  549.                                           if(i==6)
  550.                                           {
  551.                                                         CorrectCont++;
  552.                                                         if(CorrectCont==1)                                                        //正確輸入計數,當只有一次正確輸入時,開鎖,
  553.                                                         {
  554.                                                                       //DisplayListChar(0,1,LockOpen);
  555.                                                                       write_1602com(er);
  556.                                                                       for(j=0;j<16;j++)
  557.                                                                       {
  558.                                                                                     write_1602dat(LockOpen[j]);            
  559.                                                                       }
  560.                                                                       TwoAlam();                                          //操作成功提示音
  561.                                                                       KEY=0;                                                                                                                                                          //開鎖
  562.                                                                       pass=1;                                                                                                                                                          //置正確標志位
  563.                                                                       TR0=1;                                                                                                                                                          //開啟定時
  564.                                                                       open_led=0;                                                                                                                                            //開鎖指示燈亮
  565.                                                                       for(j=0;j<6;j++)                                                                                                                //將輸入清除
  566.                                                                       {
  567.                                                                                     InputData[i]=0;
  568.                                                                       }
  569.                                                         }            
  570.                                                         else                                                                                                                                                                        //當兩次正確輸入時,開啟重置密碼功能
  571.                                                         {
  572.                                                                       //DisplayListChar(0,1,SetNew);
  573.                                                                       write_1602com(er);
  574.                                                                       for(j=0;j<16;j++)
  575.                                                                       {
  576.                                                                                     write_1602dat(SetNew[j]);            
  577.                                                                       }
  578.                                                                       TwoAlam();                                                                                                                                  //操作成功提示
  579.                                                                       ReInputEn=1;                                                                                                                              //允許重置密碼輸入
  580.                                                                       CorrectCont=0;                                                                                                                              //正確計數器清零
  581.                                                         }
  582.                                             }
  583.             
  584.                                           else                                          //=========================當第一次使用或忘記密碼時可以用131420對其密碼初始化============
  585.                                           {
  586.                                                         if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0))
  587.                                                           {
  588.                                                                       WrToROM(initpassword,0,6);                                                         //強制將初始密碼寫入24C02存儲
  589.                                                                       //DisplayListChar(0,1,initword);                                          //顯示初始化密碼
  590.                                                                       write_1602com(er);
  591.                                                                       for(j=0;j<16;j++)
  592.                                                                       {
  593.                                                                                     write_1602dat(initword[j]);            
  594.                                                                       }
  595.                                                                       TwoAlam();
  596.                                                                       Delay400Ms();
  597.                                                                       TwoAlam();
  598.                                                                       N=0;
  599.                                                         }
  600.                                                         else
  601.                                                         {
  602.                                                                       //DisplayListChar(0,1,Error);
  603.                                                                       write_1602com(er);
  604.                                                                       for(j=0;j<16;j++)
  605.                                                                       {
  606.                                                                                     write_1602dat(Error[j]);            
  607.                                                                       }
  608.                                                                       ThreeAlam();                                                                                                                                            //錯誤提示音
  609.                                                                       pass=0;            
  610.                                                         }
  611.                                           }
  612.                             }

  613.                             else                                                                                                                                                          //當已經開啟重置密碼功能時,而按下開鎖鍵,
  614.                             {
  615.                                           //DisplayListChar(0,1,Er_try);
  616.                                           write_1602com(er);
  617.                                           for(j=0;j<16;j++)
  618.                                           {
  619.                                                         write_1602dat(Er_try[j]);            
  620.                                           }
  621.                                           ThreeAlam();
  622.                             }
  623.               }

  624.               else
  625.               {
  626.                             //DisplayListChar(0,1,Error);
  627.                             write_1602com(er);
  628.                             for(j=0;j<16;j++)
  629.                             {
  630.                                           write_1602dat(Error[j]);            
  631.                             }

  632.                             ThreeAlam();                                                                                                                                            //錯誤提示音
  633.                             pass=0;            
  634.               }
  635.               N=0;                                                                                                                                                                                      //將輸入數據計數器清零,為下一次輸入作準備
  636.   operation=1;
  637. }
  638. //==============================主函數===============================
  639. void main(void)
  640. {
  641.               unsigned char KEY,NUM;
  642.               unsigned char i,j;
  643.               P1=0xFF;
  644.               TMOD=0x11;
  645.               TL0=0xB0;
  646.               TH0=0x3C;
  647.               EA=1;
  648.               ET0=1;            
  649.               TR0=0;
  650.               Delay400Ms();               //啟動等待,等LCM講入工作狀態
  651.               lcd_init();               //LCD初始化
  652.               write_1602com(yi);//日歷顯示固定符號從第一行第0個位置之后開始顯示
  653.               for(i=0;i<16;i++)
  654.               {
  655.                             write_1602dat(name[i]);//向液晶屏寫日歷顯示的固定符號部分
  656.               }
  657.               write_1602com(er);//時間顯示固定符號寫入位置,從第2個位置后開始顯示
  658.               for(i=0;i<16;i++)
  659.               {
  660.                             write_1602dat(start_line[i]);//寫顯示時間固定符號,兩個冒號
  661.               }
  662.               write_1602com(er+9);              //設置光標位置
  663.               write_1602com(0x0f);              //設置光標為閃爍
  664.               Delay5Ms(); //延時片刻(可不要)
  665. ……………………

  666. …………限于本文篇幅 余下代碼請從51黑下載附件…………
  667. </font>
復制代碼

所有資料51hei提供下載:

4-密碼鎖畢業論文.doc (5.75 MB, 下載次數: 122)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:448207 發表于 2018-12-17 17:45 | 只看該作者
強烈支持
回復

使用道具 舉報

板凳
ID:495312 發表于 2019-3-25 13:19 | 只看該作者
仿真出來按鍵兩邊都是高電平,用不了
回復

使用道具 舉報

地板
ID:692293 發表于 2020-2-12 13:58 | 只看該作者
怎么改密碼呢
回復

使用道具 舉報

5#
ID:686142 發表于 2020-3-11 17:00 | 只看該作者
本密碼鎖的設計論文思路比較清晰,且值得借鑒,望能發我借鑒  ljl943253633@gmail.com
回復

使用道具 舉報

6#
ID:702057 發表于 2020-3-13 16:48 | 只看該作者
很喜歡,有空一定要做一個玩玩!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表