單片機密碼鎖帶參考課程設(shè)計論文 單片機程序+proteus仿真圖+原理圖+PCB
本次設(shè)計使用AT89S52實現(xiàn)一基于單片機的電子密碼鎖。本系統(tǒng)由單片機系統(tǒng)、矩陣鍵盤、LCD顯示和報警系統(tǒng)組成。系統(tǒng)能完成開鎖、超次鎖定、修改用戶密碼基本的密碼鎖的功能。本系統(tǒng)成本低廉,功能實用。
1、密碼顯示 為了幫助用戶確認(rèn)是否有鍵按下,特在電路中設(shè)置了模擬顯示電路;而為了防止密碼外泄;顯示時,并不是顯示用戶按下的數(shù)字符號,而是以一個特定的字母符號提醒用戶是否有鍵按下。有鍵按下,就會顯示出字符“*”,沒鍵按下,則不會顯示字符。 2、密碼更改 設(shè)置6位密碼,密碼通過鍵盤輸入,當(dāng)按下更改密碼的功能鍵時,要先輸入原來的密碼,正確無誤后,再輸入新的密碼,最后按下確認(rèn)鍵即可。 3、本機鍵開鎖 當(dāng)用戶鍵入正確密碼后,在按確認(rèn)鍵,便會自動開鎖。但用戶鍵入密碼時應(yīng)注意:數(shù)字與數(shù)字之間的間隔時間為30秒,例如密碼為086541,當(dāng)鍵入第一個數(shù)字0后應(yīng)在30秒內(nèi)鍵入第二個數(shù)字8,否則就會視為無效。如果鍵入完密碼后不按確認(rèn)鍵系統(tǒng)會當(dāng)做放棄開鎖處理。
單片機密碼鎖proteus仿真圖文件:
課程設(shè)計論文里面的電路圖:
單片機密碼鎖ppt文件:
課程設(shè)計論文目錄:
目 錄
1 前言 4
1.1 數(shù)字隨機鍵盤的來源和意義 4
1.2單片機概述 4
2 數(shù)字密碼鎖總體設(shè)計說明 5
2.1 總體開發(fā)計劃 5
2.1.1 基本功能 5
2.1.2 擴展功能 5
2.2 總體設(shè)計方案 5
2.2.1 單片機的選擇 5
2.2.2 鍵盤的選擇 6
2.2.3 顯示模塊的選擇 6
2.2.4 報警模塊的選擇 6
3 硬件設(shè)計說明 7
3.1 硬件總體設(shè)計方案 7
3.1.1 硬件功能模塊的劃分 7
3.1.2 硬件設(shè)計目標(biāo) 7
3.2 硬件單元設(shè)計 7
3.2.1 主控電路 7
3.2.2 顯示電路 8
3.2.4 鍵盤電路 10
3.2.5 報警電路 10
4 軟件設(shè)計說明 11
4.1 軟件設(shè)計總體方案 12
4.1.1 軟件設(shè)計目標(biāo) 12
4.1.2 軟件功能模塊劃分 12
4.2 軟件設(shè)計 13
4.2.1 主函數(shù)的程序設(shè)計 13
4.2.2 系統(tǒng)初始化的程序設(shè)計 14
5 系統(tǒng)調(diào)試 16
6 總結(jié) 19
參考文獻(xiàn) 20
附件 21
主程序(完整代碼請下載附件):
- /***********天馬電子設(shè)計*******************/
- #include<AT89X52.h>
- #include "液晶.h"
- #include "stdlib.h"
- #include<Function.h>
- #include "fun_char.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit beep=P2^4; //警鈴
- uint TIM=0;
- uchar mydata[6]; //輸入密碼
- uchar testdata[6];//存儲器保存的密碼
- uchar ok_stop=0;
- struct key
- {
- uchar time; //按鍵時間控制
- uchar down; //輸入次數(shù)
- uchar open; //鍵盤打開
- uchar close;//鍵盤關(guān)閉
- uchar setnew;//設(shè)置新的密碼
- uchar error; //輸入密碼錯誤次數(shù)
- uchar reset_num; //設(shè)置密碼次數(shù)記錄(輸入新的密碼,需要輸入兩次,在第二次輸入后開始比較)
- uchar reset; //設(shè)置新的密碼標(biāo)志位
- uchar disclose; //關(guān)閉顯示
- uint time_n; //定時器中斷次數(shù)
- }key={0,0,0,0,0,0,0,0,0,0};
- unsigned char code KEYTAB[16] ={0x7e,0xBE,0XBD,0xBB,0xDE,0xDD,0xDB,0xEE,0xED,0xEB,0x7D,0x7B,0x77,0xb7,0xd7,0xe7};
- void clear_all();//
- /*******************************************
- *函數(shù)名稱:delay(uint t)延時函數(shù)
- *函數(shù)作用:延時1ms左右
- *
- *********************************************/
- void delay(uint t)
- {
- uint i,j;
- for(i=0;i<t;i++)
- for(j=0;j<110;j++);
- }
- /*******************************************
- *函數(shù)名稱:check_code( )
- *函數(shù)作用:1、對比輸入的密碼和存儲器中的密碼是否一致,一致
- 則開鎖。不一致,則記錄錯誤次數(shù),如果次數(shù)大于3次,
- 則鎖鍵盤,并報警
- 2、當(dāng)設(shè)置新的密碼時,檢測兩次輸入的密碼是否一致
- 一致則保存,
- *********************************************/
- void check_code(void)
- {
- unsigned char i=0;
- unsigned char dif_label=0;
- if(key.setnew==0||key.reset_num==1) //正處于開鎖狀態(tài)時輸入6位完成或者是設(shè)置新的密碼時第二次輸入完成
- {
- for(i=0;i<6;i++) //對這六位和實際的密碼進(jìn)行比較
- {
- if((mydata[i]!=testdata[i]))//如果有一位不同
- {
- if(key.setnew==0) //如果現(xiàn)在正處于開鎖狀態(tài)
- {
- key.error++;//輸入密碼錯誤次數(shù)記錄
- if(key.error>2)//如果大于2次
- {
- if(key.open==0)//如果現(xiàn)在沒有鎖鍵盤
- {
- lock_char(); //顯示KEY IS LOCK
- key.open=1; //鎖鍵盤
- TR1=1; //定時器啟動
- key.disclose=1; //關(guān)閉顯示
- key.error=0; //錯誤清楚
- key.time=0; //按鍵時間清零
- }
- }
- else //如果沒有超過2次
- {
- error_char(); //顯示輸入密碼錯誤
- beep=0;
- delay(1500);//延時3s左右
- beep=1;
- clear();// 變量清零
- }
- }
- else //如果處于設(shè)置密碼狀態(tài),但是設(shè)置的密碼兩次輸入不一樣
- {
-
- different_char(); //輸出it's different
- delay(1000); //延時2s
- key.down=0; //變量清除
- reset_char();//重新輸入新的密碼,這個地方最好有個時間記錄
- dif_label=1; //
- key.reset_num=0;// 提示重新輸入密碼
- }
- break;//退出循環(huán)
- }
- }
- }
-
- if(key.setnew==1)//如果正輸入新的密碼
- {
- if(key.reset_num==0) //如果是第一次輸入新的密碼,則i=6,主要是為了下面好判斷
- {
- i=6;//自動保存了
- }
-
- }
- if(i==6&&dif_label==0) //如果輸入密碼正確,
- {
-
- if(key.setnew==0)//輸入密碼正確
- {
- key.error=0; //清零
- key.down=0;//復(fù)位
- ok_char(); //顯示PASSWORD OK
- key.disclose=1;// 停止顯示光標(biāo)閃爍
- key.reset=1;// 允許設(shè)置新的密碼
- ok_stop=1;//
-
- }
- else//如果現(xiàn)在正處于輸入新的密碼狀態(tài)
- {
-
- if(key.reset_num==0) //如果是第一次輸入
- {
-
- for(i=0;i<6;i++) //保存密碼到testdata中
- {
- testdata[i]=mydata[i];//保存數(shù)據(jù)
- }
- key.reset_num=1;//進(jìn)入第二次數(shù)據(jù)輸入
- key.down=0;//清零等待第二次數(shù)據(jù)輸入
- again_char();//現(xiàn)在INPUT AGAIN
- }
- else
- {
- //設(shè)置密碼成功
- ISendStr(AT24C02, 0 , &mydata[0],6); //保存密碼
- delay(20);//
- ok_char(); //顯示PASSWORD OK
- delay(1000);//不知道什么時候復(fù)位啊
- key.reset_num=0;//這里要重新復(fù)位了
- key.down=0;
- ok_stop=1;
- key.disclose=1;//這個地方不再顯示了
-
- }
- }
- }
- }
- /*******************************************
- *函數(shù)名稱:keyscan( ) 鍵盤掃描函數(shù)
- *函數(shù)作用: 1、掃描鍵盤,獲得鍵值
- 2、顯示輸入鍵值(*號),并保存
- 3、讀取功能按鍵,并執(zhí)行相應(yīng)的功能
- 按鍵的功能劃分如下:
- | 7 | 8 | 9 | 修改密碼鍵 |
- ---------------------------------------
- | 4 | 5 | 6 | 重新輸入密碼鍵 |
- ---------------------------------------
- | 1 | 2 | 3 | 沒有使用 |
- ---------------------------------------
- | |確 | 清 |
- | 0 |認(rèn) | 除 | 沒有使用 |
- ---------------------------------------
- *********************************************/
- unsigned char keyscan(void)
- {
- unsigned char i=0;
- unsigned char redat;
- unsigned char keynum=0;
- P3=0XFF;
- P1=0XF0;
- redat=P3&0XF0;
- if(redat!=0xF0)
- {
- delay(12);
- redat=P3&0XF0;//再次延時檢測
- if(redat!=0xF0)
- {
- keynum=redat;//獲得第四位
- P1=0XFF;//看來這個地方是必須的
- P3=0X0F;//開始讀取高四位
- delay(1);
- redat=P1&0X0F;
- keynum|=redat;
- for(i=0;i<16;i++)
- {
- if(keynum==KEYTAB[i])
- {
-
- if(key.down<6)//如果輸入次數(shù)小于6
- {
- if(i<10&&ok_stop==0) //如果輸入鍵值小于10即0-9
- {
- key.time_n=0;//鍵盤時間計數(shù)清零
- mydata[key.down]=i; // 保存按鍵
- lcd_pos(key.down+68); //
- lcd_wdat(0x2a);//顯示星號
- key.down++; //按鍵次數(shù)加1
- key.time=1;//按鍵計時開始,如果長時間沒有按鍵按下,認(rèn)為輸入無效
- TR1=1;//啟動定時器
- }
- }
- /*****如果按下清除鍵******/
- if(i==11)//等待按下確認(rèn)鍵
- {
- if(key.down>0) //如果當(dāng)前還有輸入的數(shù)據(jù)
- {
- key.down=key.down-1;//
- mydata[key.down]=0;//還要再弄一些標(biāo)志變量
- lcd_pos(key.down+68);
- lcd_wdat(0x20);//將星號顯示關(guān)閉
- key.time_n=0;
- }
- }
- /**************等待按下確認(rèn)鍵************/
- if(key.down==6)//如果已經(jīng)輸入了6個數(shù)據(jù)
- {
- if(i==10) //確認(rèn)鍵的鍵值是10
- {
- TR1=0;//關(guān)閉定時器
- key.time_n=0;//重新準(zhǔn)備開始
- key.time=0;
- check_code();//開始對比輸入的密碼值和存儲器中保存的密碼
-
- }
- }
- if(key.reset==1) //只有當(dāng)鎖打開的時候,才允許設(shè)置新的密碼
- {
- if(i==15)//沒有鎖鍵盤
- {
- key.setnew=1;//允許輸入新的密碼
- key.disclose=0;//重新打開
- reset_char();
- ok_stop=0;
- }
- }
- if(i==14) //這個按鍵相當(dāng)于復(fù)位了
- {
- clear_all();//重新復(fù)位重新開始
-
- }
- delay(400);//鍵盤延時
- }
- }
- }
- }
- return 0;
- }
- /*******************************************
- *函數(shù)名稱:display( ) 顯示函數(shù)
- *函數(shù)作用:
- 1、當(dāng)輸入數(shù)字鍵值小于6時,光標(biāo)閃爍
- *********************************************/
- void display()
- {
- if(key.down<6)
- {
- delay(120); //這個地方顯示光標(biāo)閃爍
- lcd_pos(68+key.down);//
- lcd_wcmd(0x0f);
- delay(140);
- lcd_pos(68+key.down);//光標(biāo)閃爍
- lcd_wcmd(0x0c); //
- }
-
- }
- /*******************************************
- *函數(shù)名稱:init_timer( ) 定時器初始化函數(shù)
- *函數(shù)作用:
- 定時器定時時間1ms
- *********************************************/
- void init_timer() //
- {
- TMOD|= 0x10;//
- TH1 = 0xEC;
- TL1 = 0x78;
- ET1=1;
- EA=1;
- TR1 = 0; //關(guān)閉
- }
- /*******************************************
- *函數(shù)名稱:clear( ) 清除函數(shù)
- *函數(shù)作用:
- 只清除按下的次數(shù),以及初始化字符顯示
- *********************************************/
- void clear() reentrant
- {
- key.down=0;
- ok_stop=0;
- init_char();
- }
- /*******************************************
- *函數(shù)名稱:clear_all( ) 清除所有的標(biāo)志變量
- *函數(shù)作用:
-
- *********************************************/
- void clear_all() //所有的變量清零
- {
- clear();
- TR1=0;//關(guān)閉定時器
- key.close=0;
- beep=1;
- key.reset=0;
- key.setnew=0;
- key.error=0;
- key.reset_num=0;//全部清零
- key.disclose=0;
- key.open=0;
- }
- /*******************************************
- *函數(shù)名稱:main( ) 主函數(shù)
- *函數(shù)作用:
- 這個函數(shù)必須有的
- *********************************************/
- void main()//
- {
- uchar i=0;
- beep=1;//初始化蜂鳴器
- lcd_init();
- init_char();
- init_timer();
- while(1)
- {
-
- if(key.open==0)//如果鍵盤沒有鎖,調(diào)用鍵盤掃描
- {
- keyscan();
- }
- if(key.disclose==0) //如果顯示沒有關(guān)閉,調(diào)用display
- {
- display(); //顯示字符應(yīng)該控制住的
- }
- if(key.close==1) //如果三次密碼輸入錯誤,報警完成后開始清除所有變量
- {
-
- clear_all();
- }
-
- }
- }
- /*******************************************
- *函數(shù)名稱:TI_int1( ) 定時器1中斷處理函數(shù)
- *函數(shù)作用:
-
- *********************************************/
- void T1_int1(void) interrupt 3//定時器中斷
- {
- TH1 = 0xEC;
- TL1 = 0x78;
- //beep=~beep;
- if(key.time==1)
- {
- key.time_n++;
- if(key.time_n>1099)
- {
- //清零
- key.close=1;
- key.time_n=0;
- TR1=0;//關(guān)閉定時器
- key.time=0;
- }
- }
- else
- { TIM++;
- beep=0;
- if(TIM>1300)
- {
- TIM=0;
- key.open=0;
- key.close=1;
- key.time=0;
- beep=1;
- }
-
- }
-
- }
復(fù)制代碼
基于單片機電子密碼鎖設(shè)計.rar
(4.66 MB, 下載次數(shù): 330)
2016-4-16 22:17 上傳
點擊文件名下載附件
|