程序名:密碼鎖
編寫人:
編寫時間:
硬件支持:STC89C52RC 外部12MHZ晶振
說明備注:
1、輸入密碼時在LCD屏幕上顯示暗碼(*),設置管理員密碼時顯示明碼。
2、用戶密碼3組位5位密碼及管理員密碼1組。
3、斷電保護密碼不消失。
4、可手動復位管理員密碼及用戶密碼。
5、輸入管理員密碼才能修改用戶密碼,密碼不能為6個0,管理員密碼需要按復位鍵進行設置。
6、可指定秀給任意1組的密碼。
7、LCD操作步驟提示。
8、密碼輸入錯誤3次蜂鳴器報警,輸入錯誤5次鍵盤鎖定(需要復位解鎖)。
9、輸入管理員密碼才能修改用戶密碼,密碼不能為6個0,管理員密碼需要按復位鍵進行設置。
10、按鍵提示音,開鎖音,錯誤音,報警音。
11、第一次上電強制要求設置管理員密碼
1.jpg (176.44 KB, 下載次數: 113)
下載附件
2019-4-12 23:11 上傳
此圖片僅供參考
后來用STC12C5A60S2做的 用的是內部集成的eeprom 添加了刷卡開鎖+更換為12864屏
因為很多功能不能仿真 沒有發上來
2.png (74.25 KB, 下載次數: 105)
下載附件
2019-4-12 23:11 上傳
3.png (8.05 KB, 下載次數: 143)
下載附件
2019-4-12 23:11 上傳
單片機主程序:
- /********************************************************************************************/
- #include "config.h"
- #include "lcd1602.h"
- #include "eeprom.h"
- #include "LOCK.h"
- #include "delay.h"
- #include "KEY.h"
- void Timer0Init(void); //50毫秒@12.000MHz
- void Timer1Init(void); //1毫秒@12.000MHz
- /********************************************************************************************/
- // 主程序 //
- /********************************************************************************************/
- void main(void){
- LOCK=0; //初始化鎖關閉狀態
- ALAM=1;
- EA=1; //開啟總中斷
- Timer0Init(); //50毫秒@12.000MHz
- Timer1Init(); //1毫秒@12.000MHz
- Delay1ms(400); //啟動等待,等LCD講入工作狀態
- Init_LCD1602(); //LCD初始化
- InitLock(); //密碼鎖上電初始化
- while(1){ //進入主循環
- keyjiance(); //讀取按鍵狀態、確定要執行動作
- }
- }
- void Timer0Init(void){ //50毫秒@12.000MHz
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0xB0; //設置定時初值
- TH0 = 0x3C; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 0; //定時器1停止計時
- ET0 = 1; //使能T0中斷
- }
- void InterruptTimer0() interrupt 1{
- unsigned char countt0;
- TL0=0xB0;
- TH0=0x3C; //定時器重新賦初值
- countt0++; //計時變量加,加1次時50ms
- if(countt0==20){ //加到20次就是1s
- countt0=0; //變量清零
- second++; //秒加
- if(key_disable==1){ //鍵盤鎖狀態時
- if(second==3){ //秒加到1s時
- TR0=0; //關定時器
- TL0=0xB0; //再次賦初值
- TH0=0x3C; //再次賦初值
- Cancel0(); //返回--取消所有操作
- second=0; //秒清零
- }
- }
- else{ //不在鍵盤鎖狀態時
- if(second==6){ //秒加到5時
- TR0=0; //關閉定時器
- second=0; //秒清零
- Cancel0(); //返回--取消所有操作
- TL0=0xB0; //重新賦初值
- TH0=0x3C; //重新賦初值
- }
- else
- TR0=1; //打開定時器
- }
- }
- }
- void Timer1Init(void){ //1毫秒@12.000MHz
- TMOD &= 0x0F; //設置定時器模式
- TMOD |= 0x10; //設置定時器模式
- TL1 = 0x18; //設置定時初值
- TH1 = 0xFC; //設置定時初值
- TF1 = 0; //清除TF1標志
- TR1 = 1; //定時器1開始計時
- ET1 = 1; //使能T1中斷
- }
- //*********************************中斷服務函數**************************************
- void time1_int(void) interrupt 3{//定時器T1
- TL1 = 0x18; //重置定時初值
- TH1 = 0xFC; //重置定時初值
- KeyScan(); //矩陣鍵盤掃面
- }
復制代碼
鎖.c :
- #include "config.h"
- #include "LCD1602.h"
- #include "eeprom.h"
- #include "delay.h"
- #include "KEY.h"
- #include "LOCK.h"
- bit pass=0; //密碼正確標志
- bit ReInputIx=0; //重置密碼功能標志
- bit ReInputEn=0; //重置密碼輸入允許標志
- bit key_disable=0; //鎖定鍵盤標志
- unsigned char ReInputBit = 0; //修改密碼第幾組標記
- unsigned char InputData[6]; //輸入密碼暫存區
- unsigned char TempPassword[6]; //修改密碼第一遍暫存
- unsigned char N=0; //密碼輸入位數計數
- unsigned char ErrorCont = 0; //錯誤次數計數
- unsigned char ReInputCont; //密碼次數輸入計數
- unsigned char second; //t0中斷計數器,秒計數器
- unsigned char code initpassword[6]={0,0,0,0,0,0}; //初始化密碼
- unsigned char CurrentPassword[4][6]={ //讀取EEPROM密碼暫存數組
- {0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0}
- };
- unsigned char code start_line[] = {"password: "};//密碼
- unsigned char code name[] = {"===Coded Lock==="};//密碼鎖
- //=================將按鍵值編碼為數值============================
- unsigned char coding(unsigned char m){
- unsigned char k;
- switch(m){
- case (0x31): k=1;break;
- case (0x32): k=2;break;
- case (0x33): k=3;break;
- case (0x26): k='A';break;
- case (0x34): k=4;break;
- case (0x35): k=5;break;
- case (0x36): k=6;break;
- case (0x25): k='B';break;
- case (0x37): k=7;break;
- case (0x38): k=8;break;
- case (0x39): k=9;break;
- case (0x28): k='C';break;
- case (0x1B): k='*';break;
- case (0x30): k=0;break;
- case (0x0D): k='#';break;
- case (0x27): k='D';break;
- }
- return(k);
- }
- //====================一聲提示音,表示有效輸入===================
- void OneAlam(void){
- ALAM=0;
- Delay1ms(50);
- ALAM=1;
- }
- //====================二聲提示音,表示操作成功===================
- void TwoAlam(void){
- ALAM=0;
- Delay1ms(50);
- ALAM=1;
- Delay1ms(50);
- ALAM=0;
- Delay1ms(50);
- ALAM=1;
- }
- //====================三聲提示音,表示錯誤========================
- void ThreeAlam(void){
- ALAM=0;
- Delay1ms(50);
- ALAM=1;
- Delay1ms(50);
- ALAM=0;
- Delay1ms(50);
- ALAM=1;
- Delay1ms(50);
- ALAM=0;
- Delay1ms(50);
- ALAM=1;
- }
- //============輸入密碼錯誤超過三過,報警并鎖死鍵盤===============
- void Alam_KeyUnable(void){
- P1=0xFF;
- ALAM=~ALAM; //蜂鳴器一直閃爍鳴響
- Delay1ms(5);
- }
- //=====================上電初始化=============================
- // 1、判斷是否上電復位還是按鍵復位,如果是上電復位 標志位清0退出,
- // 2、如果是按鍵復位,管理員密碼及用戶密碼都清0,
- // 3、讀出管理員密碼 比較管理員密碼是否是6個0
- // 4、如果管理員密碼是6個0,一直等待用戶設置管理員密碼后再進入下一步
- void InitLock(void){
- unsigned char x;
- write_1602com(er+9); //設置光標位置
- write_1602com(0x0f); //設置光標為閃爍
- Write1602_ZiFuChuan(1,1,"===Coded Lock===");//向液晶屏寫開機畫面--英文“密碼鎖”
- if(0x10==(PCON&0x10)){ //如果上電復位標志為1
- PCON&=0xEF; //上電復位標志清零
- }
- else{ //否則判斷為外部按鍵復位,重設管理員密碼
- for(x=0;x<4;x++){
- E2Write(initpassword,x*8,6);//強制將初始管理員密碼及3組用戶密碼6個0寫入24C02存儲
- }
- }
- Write1602_ZiFuChuan(2,1,"Admin Password: ");//第2行第1位顯示“管理員密碼 ”
- E2Read(CurrentPassword[0],0,6); //讀出管理員密碼
- while(CurrentPassword[0][0]==0){//判斷24c02中的管理員密碼是否是0---密碼6個0無效 ---目的是停在這里讓用戶修改管理員密碼
- AdminPassword(); //設置管理員密碼
- E2Read(CurrentPassword[0],0,6);//讀出管理員密碼---以便比較設置好了嗎
- }
- Write1602_ZiFuChuan(2,1,"password: ");//第2行第1位顯示“密碼 ”
- N=0; //將輸入數據計數器清零,為輸入作準備
- }
- //====================設置管理員密碼=============================
- void AdminPassword(void){
- unsigned char j,y,z;
- y=KeyDriver(); //讀按鍵的位置碼
- if(y!=0){
- z=coding(y); //根據按鍵的位置將其編碼,編碼值賦值給NUM
- switch(z){
- case ('A'):;break;
- case ('B'):;break;
- case ('C'): //刪除最后一個字符
- if(N>=1) N--; //定位輸入的字 加上0的位數
- OneAlam(); //按鍵提示音
- for(j=N;j<16;j++){
- write_1602com(er+6+j); //第二行已輸入的最后一位
- write_1602dat(' '); //顯示換成空格
- }
- break;
- case ('D'):;break;
- case ('*'):;break; //取消當前輸入
- case ('#'): //確認鍵
- if(N==6){ //輸入滿6位
- E2Write(InputData,0,6); //管理員密碼EEPROM存儲
- TwoAlam(); //成功提示音
- break; //退出循環
- }
- else{ //小于6位報錯
- Write1602_ZiFuChuan(2,1," error ");//顯示錯誤
- ThreeAlam(); //錯誤提示音
- }
- default:{ //如果不是功能鍵按下時,就是數字鍵按下
- if(N<6){ //當輸入的密碼少于6位時,接受輸入并保存,大于6位時則無效。
- Write1602_ZiFuChuan(1,1,"====Set Lock====");//第2行第1位顯示“管理員密碼 ”
- Write1602_ZiFuChuan(2,1,"input: ");//顯示輸入畫面--“輸入 ”
- OneAlam(); //按鍵有效提示音
- InputData[N]=z; //將數字鍵的碼賦值給InputData[]數組暫存
- for(j=0;j<=N;j++){ //顯示位數隨輸入增加而增加
- Write1602(0xc0+6+j,InputData[j]+0x30);//第2行但顯示實際數字
- }
- N++; //密碼位數加
- }
- else{ //輸入數據位數大于6后,忽略輸入
- N=6; //密碼輸入大于6位時,不接受輸入
- break;
- }
- }
- }
- }
- }
- //========================設置密碼===============================
- void ResetPassword(void){
- unsigned char i;
-
- ReInputCont++; //密碼次數計數
- if(ReInputCont==2){ //輸入第二次密碼時
- for(i=0;i<6;){ //循環比較2次6位密碼是否一致
- if(TempPassword==InputData) //將兩次輸入的新密碼作對比
- i++;
- else { //如果兩次的密碼不同
- Write1602_ZiFuChuan(2,1," error ");//顯示錯誤
- ThreeAlam(); //錯誤提示音
- ReInputIx=0; //關閉密碼重置功能
- ReInputEn=0; //關閉重置輸入允許
- ReInputCont=0; //密碼次數計數清零
- break;
- }
- }
- if(i==6){ //2次6位密碼一致 -----等待存入位置選擇 并確認后存入EEPROM
- ReInputBit = 1; //"修改密碼第幾組標記"標記為第一組
- write_1602com(0x01); //清屏
- Write1602_ZiFuChuan(1,1,"Select location:");//第1行第1位顯示“設置位置”--設置儲存在第幾組位置(共3組)
- Write1602_ZiFuChuan(2,1," [1] [2] [3]");//第2行分別顯示 三組供選擇
- write_1602com(0xc2); //光標在第一組閃爍
- OneAlam(); //操作有效提示音
- }
- ReInputCont=0; //密碼次數計數清零
- }
- else{ //輸入一次密碼時
- OneAlam(); //操作有效提示音
- write_1602com(0x01); //清屏
- Write1602_ZiFuChuan(1,1,"====Set Lock====");//第1行第1位顯示“設置密碼”
- Write1602_ZiFuChuan(2,1,"input again: "); //第2行第1位顯示“再次輸入”
- for(i=0;i<6;i++){
- TempPassword=InputData; //將第一次輸入的數據暫存起來
- }
- }
- N=0; //輸入數據位數計數器清零
- }
- //============取消所有操作(定時器0專用)不然有警告================
- void Cancel0(void){
- unsigned char i,j;
-
- write_1602com(0x01); //清屏
- for(j=0;j<16;j++){
- Write1602(yi+j,name[j]);//第1行第1位顯示“密碼鎖”
- Write1602(er+j,start_line[j]);//第1行第1位顯示“密碼鎖”
- }
- TwoAlam(); //操作成功提示音
- for(i=0;i<6;i++){
- InputData=0; //將輸入密碼清零
- }
- LOCK=0; //關閉鎖
- ALAM=1; //報警關
- pass=0; //密碼正確標志清零
- ReInputEn=0; //重置輸入充許標志清零
- ReInputIx=0; //密碼重置功能標志清零
- ReInputBit=0; //"修改密碼第幾組標記"清零
- ErrorCont=0; //密碼錯誤輸入次數清零
- ReInputCont=0; //重置密碼輸入次數清零
- key_disable=0; //鎖定鍵盤標志清零
- N=0; //輸入位數計數器清零
- }
- //======================取消所有操作=============================
- void Cancel(void){
- unsigned char i;
-
- write_1602com(0x01); //清屏
- Write1602_ZiFuChuan(1,1,"===Coded Lock===");//第1行第1位顯示“密碼鎖”
- Write1602_ZiFuChuan(2,1,"password: ");//第2行第1位顯示“密碼 ”
- TwoAlam(); //操作成功提示音
- for(i=0;i<6;i++){
- InputData=0; //將輸入密碼清零
- }
復制代碼
全部資料51hei下載地址:
密碼鎖仿真.zip
(67.29 KB, 下載次數: 278)
2019-4-12 21:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
89C52密碼鎖程序9 24C02 EEPROM.zip
(98.06 KB, 下載次數: 279)
2019-4-12 21:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|