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