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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機和C語言的電子密碼鎖課程設計論文下載

[復制鏈接]
跳轉到指定樓層
樓主
摘 要

電子密碼鎖是一種通過密碼輸入來控制電路或是芯片工作,從而控制機械開關的閉合,完成開鎖、閉鎖任務的電子產品。它的種類很多,有簡易的電路產品,也有基于芯片的性價比較高的產品。現在應用較廣的電子密碼鎖是以芯片為核心,通過編程來實現的。

本文以STC89C52單片機為核心器件,結合按鍵電路、LED數碼管顯示電路、報警指示電路和開鎖機構,利用單片機靈活的編程設計和豐富的I/O端口,及其控制的準確性通過軟件程序來控制整個系統實現電子密碼鎖的基本功能,其主要具有如下功能:

●密碼通過鍵盤輸入,若密碼正確,則將鎖打開

●密碼輸入錯誤,蜂鳴器將報警提示

●用戶可以自由設定密碼

本密碼鎖具有設計方法合理,簡單易行成本低,安全實用等特點,具有一定的推廣價值。


1 緒 論
隨著人們生活水平的提高, 日常生活和工作中的住宅與部門的安全防范、單位的文件檔案、財務報表以及一些個人資料的保存等一系列安全防盜問題變的尤其突出。傳統的機械鎖由于其構造的簡單,被撬的事件屢見不鮮,且人們常需攜帶多把鑰匙, 使用極不方便, 一旦鑰匙丟失安全性即大打折扣。隨著科學技術的不斷發展,人們對日常生活中的安全保險器件的要求越來越高。為滿足人們對鎖的使用要求,增加其安全性,用密碼代替鑰匙的密碼鎖應運而生。密碼鎖因具有安全性高、成本低、功耗低、易操作等優點,受到了廣大用戶的青睞。
現今常見的密碼鎖設計主要有兩種方案,一種是中規模集成電路控制的方案,另一種是單片機控制的方案。對于采用集成電路控制的方案,其中的編碼電子鎖電路分為編碼電路、控制電路、復位電路、解碼電路、防盜報警電路、門鈴電路,而電子鎖主要由輸入元件、電路(包括電源)以及鎖體三部分組成。顯然此種方案的物理實現結構較為復雜且重新設置密碼、輸入密碼的操作過程也會給用戶帶來一定的不方便;而利用單片機控制的方案,由于單片機靈活的編程設計和豐富的I/O端口,及其控制的準確性,不但能實現基本的密碼鎖功能,還能添加掉電存儲、聲光提示甚至添加遙控控制功能,但其也有一定的局限性,就在于其控制原理的復雜以及要求設計人員具有更加良好的程序設計能力,調試較為繁瑣,否則程序一旦跑飛將造成意想不到的損失。通過對這兩種方案的優缺點比較,再考慮到本人自己對單片機設計具有一定的基礎,所以此次選擇利用單片機來進行密碼鎖的設計。
本文以STC89C52單片機為核心器件,結合按鍵電路、LED數碼管顯示電路、報警指示電路和開鎖機構,利用單片機靈活的編程設計和豐富的I/O端口,及其控制的準確性通過軟件程序來控制整個系統實現電子密碼鎖的基本功能。系統能實現如下的功能:
(1)密碼通過鍵盤輸入,若密碼正確,則將鎖打開
(2)密碼輸入錯誤,蜂鳴器將報警提示
(3)用戶可以自由設定密碼
系統功能實用,成本低廉,具有一定的實用價值。

2 系統的總體設計和主要元器件介紹
2.1設計要求
  •        以STC89C52單片機為核心器件,結合按鍵電路、LED數碼管顯示電路、報警指示電路和開鎖機構,利用單片機靈活的編程設計和豐富的I/O端口,及其控制的準確性通過軟件程序來控制整個系統實現電子密碼鎖的以下基本功能:
  •        1)輸入密碼時不顯示所輸入的數字,有一定的防偷窺特點
  •        2)密碼通過鍵盤輸入,若密碼正確,則顯示燈發光,將鎖打開
  •        3)密碼輸入錯誤,蜂鳴器將報警提示
  •        4)用戶可以自由設定密碼
  •        本密碼鎖具有設計方法合理,簡單易行成本低,安全實用等特點,具有一定的推廣價值。


2.2系統的總體思路設計

以STC89C52單片機為主控制單元,鍵盤為主要輸入單元,結合開鎖裝置、報警器和顯示器完成整個系統設計。

系統的運行過程大致如下:
假設初始狀態為閉鎖,此時整個系統只等待按鍵輸入,數碼管也不顯示。每按下一個數據鍵(即每輸入一個密碼),數碼管相應的顯示一個“-”標志,當密碼全部輸入完成后,需按下確認鍵“#”,此時系統判斷密碼是否正確,正確則開鎖(仿真中以繼電器動作導致發光二級管點亮為標志),錯誤則報警,此后數碼管熄滅繼續等待按鍵;若按下密碼重置鍵“*”,則需先輸入原密碼,正確后請輸入新密碼,輸入密碼過程中,數碼管顯示如上“-”。

2.3主要元器件介紹
2.3.1 STC89C52介紹


           STC89C52引腳圖
本次畢業設計選用的是STC89C52,STC89C52是一種帶4K字節FLASH存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的STC89C52是一種高效微控制器。STC89C52單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。
AT89C51主要特性:
  • 與MCS-51 兼容
  • 4K字節可編程FLASH存儲器
  • 壽命:1000寫/擦循環
4. 數據保留時間:10年
5. 全靜態工作:0Hz-24MHz
6. 三級程序存儲器鎖定
7. 128×8位內部RAM
8.32可編程I/O線
9. 兩個16位定時器/計數器
10.5個中斷源
11.可編程串行通道
12. 低功耗的閑置和掉電模式
13. 片內振蕩器和時鐘電路

STC89C52單片機引腳:
VCC:供電電壓。
  GND:接地。
  P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P0口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的低八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須接上拉電阻。
  P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為低八位地址接收。
  P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。
  P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。
  P3口也可作為STC89C52的一些特殊功能口,如下表所示:
  口管腳 備選功能
  P3.0 RXD(串行輸入口)
  P3.1 TXD(串行輸出口)
  P3.2 /INT0(外部中斷0)
  P3.3 /INT1(外部中斷1)
  P3.4 T0(記時器0外部輸入)
  P3.5 T1(記時器1外部輸入)
  P3.6 /WR(外部數據存儲器寫選通)
  P3.7 /RD(外部數據存儲器讀選通)
  P3口同時為閃爍編程和編程校驗接收一些控制信號。
  RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。
  ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。
  /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。
  /EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。
  XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。
  XTAL2:來自反向振蕩器的輸出。

振蕩器特性:
XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅動器件,XTAL2應不接。有余輸入至內部時鐘信號要通過一個二分頻觸發器,因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。
2.3.2 繼電器介紹
繼電器是一種電控制器件。它具有控制系統(又稱輸入回路)和被控制系統(又稱輸出回路)之間的互動關系。通常應用于自動化的控制電路中,它實際上是用小電流去控制大電流運作的一種“自動開關”。故在電路中起著自動調節、安全保護、轉換電路等作用。
當輸入量(如電壓、電流、溫度等)達到規定值時,繼電器被所控制的輸出電路導通或斷開。輸入量可分為電氣量(如電流、電壓、頻率、功率等)及非電氣量(如溫度、壓力、速度等)兩大類。繼電器具有動作快、工作穩定、使用壽命長、體積小等優點。廣泛應用于電力保護、自動化、運動、遙控、測量和通信等裝置中。
電磁繼電器工作原理和特性:
圖2.5 繼電器原理圖
電磁繼電器一般由鐵芯、線圈、銜鐵、觸點簧片等組成的。只要在線圈兩端加上一定的電壓,線圈中就會流過一定的電流,從而產生電磁效應,銜鐵就會在電磁力吸引的作用下克服返回彈簧的拉力吸向鐵芯,從而帶動銜鐵的動觸點與靜觸點(常開觸點)吸合。當線圈斷電后,電磁的吸力也隨之消失,銜鐵就會在彈簧的反作用力返回原來的位置,使動觸點與原來的靜觸點(常閉觸點)釋放。這樣吸合、釋放,從而達到了在電路中的導通、切斷的目的。對于繼電器的“常開、常閉”觸點,可以這樣來區分:繼電器線圈未通電時處于斷開狀態的靜觸點,稱為“常開觸點”;處于接通狀態的靜觸點稱為“常閉觸點”。繼電器一般有兩股電路,為低壓控制電路和高壓工作電路。
2.3.3 LED數碼管介紹
圖2.6 數碼管
LED數碼管實際上是由七個發光管組成8字形構成的,加上小數點就是8個。這些段分別由字母a,b,c,d,e,f,g,dp來表示。當數碼管特定的段加上電壓后,這些特定段就會發亮,以形成我們眼睛看到的樣子。以“2”為例,應當是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。LED數碼管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。小尺寸數碼管的顯示筆畫常用一個發光二極管組成,而大尺寸的數碼管由二個或多個發光二極管組成,一般情況下,單個發光二極管的管壓降為1.8V左右,電流不超過30mA。發光二極管的陽極連接到一起連接到電源正極的稱為共陽數碼管,發光二極管的陰極連接到一起連接到電源負極的稱為共陰數碼管。常用LED數碼管顯示的數字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
在本次實驗中我們用的是四位一體的數碼管,圖如下:


3、硬件設計
3.1 單片機主控制模塊(含晶振、復位基本工作電路)
圖3.1 主控制模塊







    • 鍵盤輸入模塊
圖2.7 矩陣鍵盤
在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成3*4=12個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。

按鍵功能介紹:
第一行自左至右依次是1,2,3鍵, 第二行自左至右依次是4,5,6鍵, 第三行自左至右依次是7,8,9鍵, 第四行自左至右依次是*,0,#鍵

表3.1 按鍵功能

按 鍵
鍵 名
功 能 說 明
0-9鍵
數 字 鍵
輸 入 密 碼
* 鍵
重 設 密 碼 鍵
設 定 新 密 碼
# 鍵
確認鍵
確認密碼輸入完畢



3.3 顯示模塊
                                 圖3.3 顯示模塊

此設計中,使用了四個共陰極數碼管,使用動態顯示技術控制數碼管。其4個位選信號與P2.0-P2.3相連,當其中某位為低電平時表示選中該位;8段段選信號與P0口相連,當其中某段為高電平時導通該段,特殊的,由于STC89C52的P0口的驅動能力較弱,不足以驅動數碼管點亮,故在此又引入上拉電阻以驅動數碼管。
關于上拉電阻有如下介紹:
  • 當TTL電路驅動CMOS電路時,如果電路輸出的高電平低于CMOS電路的最低高電平(一般為3.5V), 這時就需要在TTL的輸出端接上拉電阻,以提高輸出高電平的值。
    2、OC門電路必須加上拉電阻,以提高輸出的高電平值。  
3、為加大輸出引腳的驅動能力,有的單片機管腳上也常使用上拉電阻。  
4、在CMOS芯片上,為了防止靜電造成損壞,不用的管腳不能懸空,一般接上拉電阻產生降低輸入阻抗, 提供泄荷通路。  
5、芯片的管腳加上拉電阻來提高輸出電平,從而提高芯片輸入信號的噪聲容限增強抗干擾能力。
6、提高總線的抗電磁干擾能力。管腳懸空就比較容易接受外界的電磁干擾 。
7、長線傳輸中電阻不匹配容易引起反射波干擾,加上下拉電阻是電阻匹配,有效的抑制反射波干擾。  

3.4 報警和開鎖模塊

圖3.4 報警和開鎖模塊

報警模塊由蜂鳴器、PNP三極管和單片機組成。選擇一只壓電式蜂鳴器,壓電式蜂鳴器工作時約需要100mA驅動電流。特殊的,此處為加強驅動能力,選用三極管來放大電流驅動蜂鳴器。當STC89C52的P3.0口輸出為低電平時,三極管導通,蜂鳴器產生蜂鳴音,STC89C52輸出為高電平時,蜂鳴器不發聲。
此處以繼電器的動作來模擬鎖的開閉。同樣,為了增強驅動能力添加了PNP三極管以放大電流,當P3.1口為低電平時,三極管導通,此時繼電器動作(鎖開),燈亮;二極管具有續流作用以保護器件安全




4、軟件設計

4.1系統框圖

4.2 系統程序設計流程圖

                                    圖3.6 總程序流程圖



4.2 系統程序設計
重要端口定義說明:
sbit buzzer=P3^0;
sbit relay=P3^1;
uchar code table[2]={0x40,0x00 }; //共陰極數碼管編碼 顯示‘-’和 熄滅
uchar keyword[4]={1,1,1,1};
uchar keycmp[4];
uchar key=0,num=0,flg=0;

報警子程序:(通過控制buzzer端口的高低電平來控制三極管的通斷,從而控制蜂鳴器)
void alarm()
     {              num=0;
                  buzzer=0;
                            delay(100);
                            buzzer=1;
              }


數碼管顯示子程序:
LED顯示器工作方式有兩種:靜態顯示方式和動態顯示方式。靜態顯示的特點是每個數碼管的段選必須接一個8位數據線來保持顯示的字形碼。當送入一次字形碼后,顯示字形可一直保持,直到送入新字形碼為止。這種方法的優點是占用CPU時間少,顯示便于監測和控制。缺點是硬件電路比較復雜,成本較高;動態顯示的特點是將所有位數碼管的段選線并聯在一起,由位選線控制是哪一位數碼管有效。選亮數碼管采用動態掃描顯示。所謂動態掃描顯示即輪流向各位數碼管送出字形碼和相應的位選,利用發光管的余輝和人眼視覺暫留作用,使人的感覺好像各位數碼管同時都在顯示。動態顯示的亮度比靜態顯示要差一些。
本設計使用動態顯示方法。
void display()
     { uchar i,j,cs=0x7f;

                 for(i=num;i>0;i--)            
                   {
                    P0=table[0];
                    cs=_crol_(cs,1);
                    P2=cs;
                    delay(10);
                              }
                            for(j=4-num;j>0;j--)
                              {
                               P0=table[1];
                     cs=_crol_(cs,1);
                     P2=cs;
                     delay(10);
                              }
              }

按下確認鍵后執行功能子程序:(使用標志變量flg,根據其值來選擇執行相應的功能)
  1. void ok()
  2.      {              uchar i=0;
  3.                  display(); // P0=(flg+1);delay(1000);
  4.                  if(flg==0)
  5.                     {
  6.                                              for(i=0;i<4;i++)
  7.                                               if(keyword[i]!=keycmp[i]) {alarm();break;}
  8.                                           if(num==4) {relay=0;num=0;}
  9.                               }
  10.                  if(flg==2)
  11.                     {
  12.                                num=0;
  13.                                for(i=0;i<4;i++) keyword[i]=keycmp[i];
  14.                                flg=0;
  15.                               }
  16.                  if(flg==1)
  17.                     {
  18.                               
  19.                                 for(i=0;i<4;i++)
  20.                                               if(keyword[i]!=keycmp[i]) {alarm();break;}
  21.                                           if(num==4)
  22.                                               {
  23.                                                           num=0;
  24.                                                           display(); // P0=0x07;delay(1000);
  25.                                                           flg=2;
  26.                                                         }
  27.                                             
  28.                               }
  29.                
  30.               }
復制代碼


鍵盤掃描子程序:(運用矩陣鍵盤逐行逐列掃描法,一次檢測各個按鍵)
鍵盤是單片機常用輸入設備,在按鍵數量較多時,為了節省I/O口等單片機資源,一般采取掃描的方式來識別到底是哪一個鍵被按下。即通過確定被按下的鍵處在哪一行哪一列來確定該鍵的位置,獲取鍵值以啟動相應的功能程序。
查找哪個按鍵被按下的方法為:一個一個地查找。 先第一行輸出0,檢查列線是否非全高;否則第二行輸出0,檢查列線是否非全高;否則第三行輸出0,檢查列線是否非全高;如果某行輸出0時,查到列線非全高,則該行有按鍵按下;根據第幾行線輸出0與第幾列線讀入為0,即可判斷在具體什么位置的按鍵按下。
  1. void keyscan()
  2.      {
  3.                  uchar temp1,temp2;
  4.                  P1=0xfe;//令第一列為低電平,檢測第1列
  5.                  temp1=P1;
  6.                  if(temp1!=0xfe)
  7.                     {
  8.                                 delay(5);              //去抖
  9.                                              temp2=P1;
  10.                                           if(temp1==temp2)
  11.                                              {
  12.                                               switch(temp2)
  13.                                                               {
  14.                                                                       case 0xf6: if(num<4){key=1;keycmp[num]=key;num++;display();}
  15.                                                                                                                    else alarm();
  16.                                                                                                break;
  17.                                                                       case 0xee: if(num<4){key=4;keycmp[num]=key;num++;display();}
  18.                                                                                                                    else alarm();
  19.                                                                                                break;
  20.                                                                       case 0xde: if(num<4){key=7;keycmp[num]=key;num++;display();}
  21.                                                                                                                    else alarm();
  22.                                                                                                break;
  23.                                                                       case 0xbe: set();break;
  24.                                                                         }
  25.                                              }
  26.                               }
  27.                             while(temp1!=0xfe)              temp1=P1;//等待按鍵釋放

  28.                  P1=0xfd;//檢測第2列
  29.                  temp1=P1;
  30.                  if(temp1!=0xfd)
  31.                     {
  32.                                 delay(5);              //去抖
  33.                                              temp2=P1;
  34.                                           if(temp1==temp2)
  35.                                              {
  36.                                               switch(temp2)
  37.                                                               {
  38.                                                                       case 0xf5: if(num<4){key=2;keycmp[num]=key;num++;display();}
  39.                                                                                                else alarm();
  40.                                                                                                                    break;
  41.                                                                       case 0xed: if(num<4){key=5;keycmp[num]=key;num++;display();}
  42.                                                                                                else alarm();
  43.                                                                                                                    break;
  44.                                                                       case 0xdd: if(num<4){key=8;keycmp[num]=key;num++;display();}
  45.                                                                                                                    else alarm();
  46.                                                                                                break;
  47.                                                                       case 0xbd: if(num<4){key=0;keycmp[num]=key;num++;display();}
  48.                                                                                                                    else alarm();
  49.                                                                                                break;
  50.                                                                         }
  51.                                              }
  52.                               }
  53.                             while(temp1!=0xfd)              temp1=P1;//等待按鍵釋放

  54.                             P1=0xfb;//檢測第3列
  55.                  temp1=P1;
  56.                  if(temp1!=0xfb)
  57.                     {
  58.                                 delay(5);              //去抖
  59.                                              temp2=P1;
  60.                                           if(temp1==temp2)
  61.                                              {
  62.                                               switch(temp2)
  63.                                                               {
  64.                                                                       case 0xf3: if(num<4){key=3;keycmp[num]=key;num++;display();}
  65.                                                                                                                    else alarm();
  66.                                                                                                break;
  67.                                                                       case 0xeb: if(num<4){key=6;keycmp[num]=key;num++;display();}
  68.                                                                                                                    else alarm();
  69.                                                                                                break;
  70.                                                                       case 0xdb: if(num<4){key=9;keycmp[num]=key;num++;display();}
  71.                                                                                                                    else alarm();
  72.                                                                                                break;
  73.                                                                       case 0xbb: if(num==4) ok();
  74.                                                                                                else alarm();
  75.                                                                                                                    break;
  76.                                                                         }
  77.                                              }
  78.                               }
  79.                             while(temp1!=0xfb)              temp1=P1;//等待按鍵釋放

  80.                  display();
  81.               }
復制代碼


中斷服務函數:(當通過機械手段關鎖時,將通過外部中斷的形式使程序初始化恢復原狀態)
void Int0() interrupt 0
    {
                relay=1;
              }
整個系統的完整程序設計詳見附錄。




5、系統仿真設計

5.1 Proteus 軟件介紹

Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件(該軟件中國總代理為廣州風標電子技術有限公司)。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。雖然目前國內推廣剛起步,但已受到單片機愛好者、從事單片機教學的教師、致力于單片機開發應用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調試到單片機與外圍電路協同仿真,一鍵切換到PCB設計,真正實現了從概念到產品的完整設計。是目前世界上唯一將電路仿真軟件、PCB設計軟件和虛擬模型仿真軟件三合一的設計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列處理器,并持續增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。
在PROTEUS繪制好原理圖后,調入已編譯好的目標代碼文件:*.HEX,可以在PROTEUS的原理圖中看到模擬的實物運行狀態和過程。
  PROTEUS 是單片機課堂教學的先進助手。
  PROTEUS不僅可將許多單片機實例功能形象化,也可將許多單片機實例運行過程形象化。前者可在相當程度上得到實物演示實驗的效果,后者則是實物演示實驗難以達到的效果。
  它的元器件、連接線路等卻和傳統的單片機實驗硬件高度對應。這在相當程度上替代了傳統的單片機實驗教學的功能,例:元器件選擇、電路連接、電路檢測、電路修改、軟件調試、運行結果等。
  課程設計、畢業設計是學生走向就業的重要實踐環節。由于PROTEUS提供了實驗室無法相比的大量的元器件庫,提供了修改電路設計的靈活性、提供了實驗室在數量、質量上難以相比的虛擬儀器、儀表,因而也提供了培養學生實踐精神、創造精神的平臺
  隨著科技的發展,“計算機仿真技術”已成為許多設計部門重要的前期設計手段。它具有設計靈活,結果、過程的統一的特點。可使設計時間大為縮短、耗資大為減少,也可降低工程制造的風險。相信在單片機開發應用中PROTEUS也能茯得愈來愈廣泛的應用。
使用Proteus 軟件進行單片機系統仿真設計,是虛擬仿真技術和計算機多媒體技術相結合的綜合運用,有利于培養學生的電路設計能力及仿真軟件的操作能力;在單片機課程設計和全國大學生電子設計競賽中,我們使用 Proteus 開發環境對學生進行培訓,在不需要硬件投入的條件下,學生普遍反映,對單片機的學習比單純學習書本知識更容易接受,更容易提高。實踐證明,在使用 Proteus 進行系統仿真開發成功之后再進行實際制作,能極大提高單片機系統設計效率。因此,Proteus 有較高的推廣利用價值。

5.2 Proteus 仿真圖

圖5.1系統仿真圖

實物照

布線圖





總結

使用單片機制作的電子密碼鎖具有軟硬件設計簡單,易于開發,成本較低,安全可靠,操作方便等特點。本實訓在設計之初認真分析了幾種方案的優缺點,正是由于單片機的眾多優良特性的吸引,最終從經濟實用的角度出發,采用單片機STC89C52作為主控芯片,結合外圍的鍵盤輸入、顯示、報警、開鎖等電路,用C語言編寫主控芯片的控制程序,設計了一款可以多次更改密碼具有報警功能的電子密碼鎖。


參考文獻:
[1]  于殿泓,王新年.單片機原理與程序設計實驗教程[M].西安:西安電子科技大學出版社,2007,8.
[2]  趙文博,劉文濤.單片機語言C51程序設計[M].北京:人民郵電出版社,2005,10.
[3]  李愛秋.紅外線遙控12位電子密碼鎖的設計[J]. 溫州職業技術學院學報第8卷第一期,2008.
[4]  陳杰,黃鴻.傳感器與檢測技術[M].北京:高等教育出版社,2010,8.
[5]  周航慈. 單片機應用程序設計技術[M]. 北京:北京航空航天大學出版社,2011,2.
[6]  李朝青. 單片機原理及接口技術[M]. 北京:北京航空航天大學出版社, 2005,10.
[7]  孫育才. MCS-51系列單片微型計算機及其應用[M]. 東南大學出版社, 2004,6.
[8]  沈紅衛. 單片機應用系統設計實力與分析[M]. 北京:北京航空航天大學出版社,2003.
[9]  徐愛鈞, 彭秀華. 單片機高級語言C51應用程序設計[M].北京航空航天大學出版社,2006.
[10]  曾一江. 單片微機原理與接口技術[M]. 北京:科技出版社,2009,12.
[11]  康華光. 電子技術基礎(模擬部分)[M]. 北京:高等教育出版社, 2004,4.



實訓感想

緊張又繁忙的兩周實訓終于即將要結束了。在這兩周的學習中,讓我收獲很多,也讓我知道自己所學的專業必須要求自己一絲不茍,特別認真耐心完成每一條線路的連接,如果稍有大意就會使做出來的成品無法正常顯示,導致功虧一簣。

在這兩周期間,我們這組做的是電子密碼鎖。兩周,需要學的東西很多,而且有些東西,比如我們新學的三項軟件,并不是在短時間就能掌握的,必需靠長時間的練習去把握,理解。所以任務對我們來說顯得很重。但不知道為什么,學校只給我們排了兩周的電工實習,而且還是這學期最后兩周,實訓結束馬上就要考試,所以我們不得不一邊做實訓項目電子密碼鎖,一邊為這學期的考試做準備。對于這樣的安排我們全校的學生應該都只有兩個字來形容我們此刻的心情——無語!希望學校能夠盡快重視起實訓時間的安排。所以兩周下來,基本上就沒有休息時間,只有一個 感覺,時間緊,任務重。

要完成這項工藝品,前面已經提過要用到我們新學的三項軟件,我們需要先設計出電路圖,用Proteus把電路圖畫出來,仿真電路,看電路是否能正常運行,如果不能正常運行就必須修改到正常運行為止,然后就要用到第二個軟件——Keil,我們要在上面編寫出我們所用的單片機C程序,之后生成HEX文件,最后就是要用到的最后一個軟件,Altium Designer ,我們要用它制作PCB,這個PCB真的好難,不僅需要對這個軟件足夠了解,還要知道電路元器件的實際尺寸,因為我們需要對元器件做封裝,為了保證元器件能插到電路板上,必須對元器件的實際尺寸有清楚的了解,這樣封裝才能做到位,才能保證實驗的成功。然而,讓我們更心酸的是在我們終于完成電路的pcb之后,自我感覺還是不錯的時候,老師給我們狠狠潑了一盆涼水,接著就是我們三個埋頭修改的身影,不幸的是接著我們又被吵了好多次,在此期間,我感觸頗多,同時也讓我學會了很多知識,盡管被老師吵了好多次,但是正是老師的批評指責,才讓我們的pcb更加完美,在此,我要對每一位為我們是實訓付出辛苦的老師說一聲“謝謝您”。你們的無私奉獻真的讓我們很感動,真不愧是知識的傳播者。

另外,在實訓中我深切的體會到了團隊的力量和與人溝通的重要性。從這次的實訓中,我懂得了一個組要想成為一個優秀的組,最重要的是要團結,還有就是組員之間的信任以及溝通都是很必要的;這個組中的成員還要有一個共同的目標,有了共同的目標我們才能有目的的去完成作品。這次實訓我體會最深的還有一個“累”字,它不僅僅是身體的疲憊,勞動的汗水;更多的是一種“苦盡甘來”的滋味,我會為我曾經“累”過而感到驕傲和滿足。正是這種“累”讓我發現了自身的不足,讓我學會了更多的專業技能;也正是這種“累”讓我懂得了責任和團隊的意義。實訓雖然結束了,但我們現在的學習并未結束,我們應該珍惜在學校的每一天,多學習,把自身的弱勢和不足變成優勢與特長,掃清我們就業道路上的絆腳石,為自己擁有一個美好的未來而加倍努力!

總而言之,這兩周的實訓讓我整個人都變得很充實,讓我增長了很多知識。更讓堅定了我對本專業的信心,我相信自己會走好人生路上的每一步,跟希望像這樣實訓的活動能更多一些。

最后,再次希望學校能合理安排實訓時間,畢竟實訓是一次很重要的機會,對我們動手以及其它方面能力的提高都有極大的好處,誰都不想匆匆而過,誰都愿意認真對待。     

****

                                                 **************




附錄2:   元器件清單
電子密碼鎖器件清單
單片機AT89C51             1片
30pf電容                   2個
10uf電解電容               1個
12MHZ晶振                                       1個
1k電阻                     5個
10k電阻                    1個
PNP三極管                  2個
按鍵                       12個
5v的5管腳繼電器           1個
發光二極管                  1個
普通二極管                  1個
10k的8管腳排阻             1個
微型喇叭                    1個
4位一體共陽數碼管           1個
管座(4位一體數碼管用)     1個
管座(51單片機用)          1個


附錄1:      
總程序:
  1. #include

  2. #include

  3. #define uint unsigned int

  4. #define uchar unsigned char

  5. sbit buzzer=P3^0;

  6. sbit relay=P3^1;

  7. uchar code table[2]={0x40,0x00 }; //共陰極數碼管編碼 顯示'-'和 熄滅

  8. uchar keyword[4]={1,1,1,1};

  9. uchar keycmp[4];

  10. uchar key=0,num=0,flg=0;

  11. //==============================延遲程序 延時x毫秒

  12. void delay(uint x)

  13.      {

  14.                  uint i,j;

  15.                  for(i=x;i>0;i--)

  16.                      for(j=110;j>0;j--);

  17.                 }

  18. //==============================報警程序

  19. void alarm()

  20.      {              int i;            

  21.                             num=0;

  22.                             for(i=0;i<3;i++)

  23.                                           {            

  24.                                 buzzer=0;

  25.                                           delay(120);

  26.                                           buzzer=1;

  27.                                           delay(120);

  28.                                           }

  29.               }

  30. //==============================數碼管顯示程序

  31. void display()

  32.      { uchar i,j,cs=0x7f;

  33.                  for(i=num;i>0;i--)            

  34.                    {

  35.                     P0=table[0];

  36.                     cs=_crol_(cs,1);

  37.                     P2=cs;

  38.                     delay(10);

  39.                               }

  40.                             for(j=4-num;j>0;j--)

  41.                               {

  42.                                P0=table[1];

  43.                      cs=_crol_(cs,1);

  44.                      P2=cs;

  45.                      delay(10);

  46.                               }

  47.               }

  48. //==============================密碼重置程序

  49. void set()

  50.       {

  51.                   num=0;

  52.                             display();

  53.                             flg=1;

  54.                 }

  55. //==============================確認鍵程序

  56. void ok()

  57.      {              uchar i=0;

  58.                  display(); // P0=(flg+1);delay(1000);

  59.                  if(flg==0)

  60.                     {

  61.                                              for(i=0;i<4;i++)

  62.                                               if(keyword[i]!=keycmp[i]) {alarm();}

  63.                                           if(num==4) {relay=0;num=0;}

  64.                               }

  65.                  if(flg==2)

  66.                     {

  67.                                num=0;

  68.                                for(i=0;i<4;i++) keyword[i]=keycmp[i];

  69.                                flg=0;

  70.                               }

  71.                  if(flg==1)

  72.                     {

  73.                               

  74.                                 for(i=0;i<4;i++)

  75.                                               if(keyword[i]!=keycmp[i]) {alarm();break;}

  76.                                           if(num==4)

  77.                                               {

  78.                                                           num=0;

  79.                                                           display(); // P0=0x07;delay(1000);

  80.                                                           flg=2;

  81.                                                         }

  82.                                             

  83.                               }

  84.                

  85.               }

  86. //==============================鍵盤掃描程序

  87. void keyscan()

  88.      {

  89.                  uchar temp1,temp2;

  90.                  P1=0xfe;//令第一列為低電平,檢測第1列



  91. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整論文下載(word格式 可編輯):
基于單片機和C語言的電子密碼鎖.doc (3.84 MB, 下載次數: 83)



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

使用道具 舉報

沙發
ID:211258 發表于 2017-6-14 22:26 | 只看該作者
非常好
回復

使用道具 舉報

板凳
ID:211258 發表于 2017-6-15 17:12 | 只看該作者
謝謝分享!收藏了!
回復

使用道具 舉報

地板
ID:212728 發表于 2017-12-17 16:00 | 只看該作者
下載查看了,程序沒問題,問就是初始密碼還要自己設定嗎?
回復

使用道具 舉報

5#
ID:212728 發表于 2017-12-17 16:04 | 只看該作者
論文里有很多錯的,比如共陽數碼管,應該是共陰
回復

使用道具 舉報

6#
ID:212728 發表于 2017-12-17 17:28 | 只看該作者
無法使用,程序有編寫錯誤,謹慎下載
回復

使用道具 舉報

7#
ID:634141 發表于 2019-11-24 20:33 | 只看該作者
不錯,謝謝分享
回復

使用道具 舉報

8#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

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