仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (17.65 KB, 下載次數: 50)
下載附件
2020-9-24 17:11 上傳
單片機源程序如下:
- /*
- 上電顯示8個*
- 輸入8個按鍵
- 按*開鎖
- 錯誤報警
- 再次按*修改密碼
- 輸入8個按鍵
- 按#保存密碼
- 按*返回主菜單
- */
- #include<AT89x51.h>
- #include"intrins.h"
- #include"key.h"
- #include"xsh.h"
- #include"24c02.h"
- #include"1602.h"
- #define ulong unsigned long
- bit BJCB=0;//報警標志
- XG=0,//修改密碼標志位
- BJ=0,//報警標志位
- SJ=0;//鎖鍵盤標志位
- // xg=0;//修改密碼標志位
- uchar PSWD0_0[16]={0};//密碼輸入緩存存儲單元
- //uchar code PSWD0_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//用戶初始密碼存儲單元
- //uchar PSWD1_0[16]={0};//讀出密碼緩存存儲單元
- uchar PSWD1_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};////管理員初始密碼存儲單元
- sbit OUT=P2^7;//輸出端口
- sbit L1=P3^2;//上電指示
- sbit L2=P3^1;//開鎖指示
- sbit L3=P3^0;//報警指示
- uint mg=0,//密碼個數
- KSC=0,//開鎖次數
- BJC=0,//報警次數
- TCNTY=0,//用戶按鍵定時次數累加
- TCNTG=0,//管理員輸入密碼定時次數
- yhsh,//用戶輸入標志位
- glsh,//管理員輸標志位
- shw;//密碼輸完標志位
- void yhmimaxig();//密碼修改程序
- void glmimaxig();//管理員修改程序
- void bjyin(ulong t)
- {
- ulong c;
- uint n;
- for(c=0;c<t;c++)
- {
- for(n=0;n<50;n++); //延時
- BEEP=~BEEP; //取反輸出到喇叭的信號
- }
- }
- void delay_10ms(void)
- {
- uint i = 1000;
- while(i--);
- }
- //////////////定時中斷服務函數//////////////////////////////////////
- void timer0() interrupt 1
- {
- uint i;
- TH0=(65536-50000)/256; //對TH0 TL0賦值50MS定時
- TL0=(65536-50000)%256; //重裝計數初值
- if(yhsh==1)
- {
- TCNTY++;//用戶定時計數
- if(shw==1)
- {
- TR0=0;
- TCNTY=0;
- }
- if(TCNTY==400)
- {
- TR0=0;//關閉T0定時器
- TCNTY=0;
- mg=0;//密碼個數清零
- L1=1;
- for(i=0;i<2;i++)//聲光報警電路
- {
- L3=0;
- bjyin(1000);
- L3=1;
- delay(1000);
- }
- L1=0;
- }
- }
- else if(glsh==1)
- {
- TCNTG++;//管理員定時計數
- if(shw==1)
- {
- TR0=0;
- TCNTG=0;
- }
- if(TCNTG==400)
- {
- TR0=0;//關閉T0定時器
- TCNTG=0;
- mg=0;//密碼個數清零
- L1=1;
- for(i=0;i<2;i++)//聲光報警電路
- {
- L3=0;
- bjyin(1000);
- L3=1;
- delay(1000);
- }
- L1=0;
- }
- }
- }
-
- void main()
- { uint i;///////////密碼輸入/////////////////
- init_1602();
- /////////////////////////////開鎖前顯示///////////////////////////
- loop: L1=0;//上電紅燈亮
- L2=1;//開鎖成功后綠燈亮
- L3=1;//輸錯時黃燈亮報警
- OUT=0;//開信號關閉
- write_string(0,0,"qsrmm");
- write_com(0xc0);
- for(i=0;i<8;i++)
- {
- write_data(0x2a);
- }//開鎖前顯示
-
- ////////////////////密碼輸入///////////////////////////////////
- if(SJ==0)//鎖鍵盤標志位為0
- {
- do
- {
- flag=0;//鍵盤標志位
- key();
- if(flag==1&&num<=9)
- {
- PSWD0_0[mg]=num;
- write_com(0xc0+mg);
- write_data(0x30+num);
- mg++;//密碼個數
- }
- //刪除未使用//
- if(flag==1&&num==14&&mg>=1)//輸入錯誤刪除
- {
- mg=mg-1;
- }
- if(mg==1) //有密碼鍵按下開定時器限時
- {
- TR0=1;
- yhsh=1;
- }
- }
- while(num!=11);
- //////////////////密碼比較////////////////////////
- if(flag==1&&num==11)
- { flag=0;
- yhsh=0;
- shw=1;
- num=0;
- for(i=0;i<8;i++) //從24c02里讀出16個密碼
- {
- PSWD1_1[i]=i2cRead24LC16B(i);
- delay_10ms;
- }
- for(i=0;i<8;i++)
- {
- if(PSWD1_1[i]!=PSWD0_0[i])
- {
- BJCB=1;
- break;
- }
- else
- BJCB=0;
-
- }
- /////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////
- //////////////////////報警/////////////////////////////////
- if(BJCB!=0)
- {
- BJC++;
- if(BJC!=3) //輸錯3次密碼
- {
- BJCB=0; //第一次和第二次報警
- delay(500);
- mg=0;//密碼個數清零
- L1=1;//上電指示
- for(i=0;i<3;i++)//聲光報警電路
- {
- L3=0;//報警指示
- write_string(0,0,"mimacuowu BJ"); //顯示報警
- bjyin(1000);
- L3=1;//報警指示
- delay(1000);
- }
- goto loop; //開鎖前顯示
- }
- //第三次輸錯密碼//
- else if(BJC==3)
- {
- BJC=0;
- BJCB=0;
- write_string(0,0,"mima3cuowu BJ");//顯示三次輸入密碼失敗,自鎖
- SJ=1;//鎖鍵盤標志位
- mg=0;//密碼個數清零
- L1=1;//上電
- for(i=0;i<2;i++)//聲光報警電路
- {
- L3=0;//報警
- bjyin(1000);
- L3=1;
- delay(1000);
- }
- goto loop;
- }
- /////沒有報警//
- }
- else
- if(BJCB==0)
- {
- KSC++;
- write_string(0,0,"ok-KS"); //顯示開鎖ok
- i2cWrite24LC16B(KSC,0X20);//寫入開鎖次數到24c01 0x20
- if(KSC==100)
- {
- SJ=1;
- }
- L2=0;//開鎖成功后綠燈亮
- L1=1;
- OUT=1;//開信號打開
- mg=0;//密碼個數清零
- loop1:do //鍵盤掃描等待功能鍵按下
- {
- flag=0;
- key();
- if(flag)
- {
- flag=0;
- switch(num)
- {
- case 11: //按#開始修改密碼
- {
- write_string(0,0,"xg_mm");
- write_com(0xc0);
- for(i=0;i<8;i++)
- {
- write_data(0x2a);
- }//開鎖前顯示
- do
- {
- flag=0;//鍵盤標志位
- key();
- //修改密碼
- if(flag==1&&num<=9)
- {
- PSWD0_0[mg]=num;
- write_com(0xc0+mg);
- write_data(0x30+num);
- mg++;//密碼個數
- }
- if(mg==8)
- {
- do //鍵盤掃描等待功能鍵按下
- {
- flag=0;
- key();
- }
- while(num!=12);
- }
- }
- while(num!=12);
- if(mg!=8&&num==12)
- {
- for(i=mg;i<8;i++)
- {
- PSWD0_0[i]=0;
- }
- }
- if(flag==1&&num==12)
- {
- flag=0;
- mg=0;
- for(i=0;i<8;i++) //用一次寫一個向24c02里寫
- {
- i2cWrite24LC16B(PSWD0_0[i],i);
- delay_10ms;
- }
- write_string(0,1,"XG_OK "); //顯示開鎖ok
- delay(1000);
- goto loop;
-
- do //鍵盤掃描等待功能鍵按下
- {
- flag=0;
- key();
- }
- while(num!=11); //按下返回鍵,鎖鎖返回
- {
- goto loop;
- }
- }
- };break;
-
- }
- }
- }
- while(flag!=0);//如果設置密碼鍵按下
- goto loop1;
- // i2cWrite24c02_page(0x00,PSWD1_1,mg);
- }
- }
- }
- }
復制代碼
51hei.png (11.6 KB, 下載次數: 39)
下載附件
2020-9-24 17:12 上傳
所有資料51hei提供下載:
8位密碼鎖ok.rar
(128.59 KB, 下載次數: 37)
2020-9-24 09:11 上傳
點擊文件名下載附件
密碼鎖 下載積分: 黑幣 -5
|