1、在鎖開的狀態下輸入密碼,設置的密碼共4位,矩陣鍵盤分別代表數字1、2、…、9、0,輸入的密碼用數碼管顯示,最后輸入的密碼顯示在最右邊的數碼管上,即每輸入一位數,密碼在數碼管上的顯示左移一位。可刪除輸入的數字,刪除的是最后輸入的數字,每刪除一位,密碼在數碼管的顯示右移一位,并在左邊空出的位上補充“0”。 2、用一位輸出電平的狀態代表鎖的開閉狀態,綠色發光管指示。 3、為保證密碼鎖主人能打開密碼鎖,設置一個萬能密碼(1111),在主人忘記密碼時使用。 初始密碼是1234;
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
電子密碼鎖.png (99.28 KB, 下載次數: 84)
下載附件
protues仿真圖
2021-7-9 17:42 上傳
51hei.gif (161.83 KB, 下載次數: 87)
下載附件
2021-7-9 18:07 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit we1 = P2^0 ;
- sbit we2 = P2^1 ;
- sbit we3 = P2^2 ;
- sbit we4 = P2^3 ;
- sbit kai_s = P2^6;
- sbit guan_s = P2^7;
- sbit beep = P2^5; //蜂鳴器
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- uchar anj=0,flag=0,mi=0;
- uchar temp,key;
- bit xiu=0;
- int anj1=0, mima = 1234,mima1=0;
- //延時子函數
- void delay1(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- void display1(int a) //顯示程序
- {
- P0 = 0xff;
- we1=1;
- P0=table[a/1000];
- delay1(5);
- we1=0;
- P0 = 0xff;
- we2=1;
- P0=table[a/100%10];
- delay1(5);
- we2=0 ;
- P0=0xff;
- we3=1;
- P0=table[a/10%10];
- delay1(5);
- we3=0 ;
- P0=0xff;
- we4=1;
- P0=table[a%10];
- delay1(5);
- we4=0 ;
- }
- void display2()
- {
- P0 = 0xbf;
- we1=1;
- we2=1;
- we3=1;
- we4=1;
- }
- void anjian()
- {
- if(key<10&&mi<4)
- {
- if(xiu==0)
- {
- anj1 = anj1 * 10 + key;
- mi++;
- }
- if(xiu==1)
- {
- mima1 = mima1 * 10 + key;
- mi++;
- }
- }
- else if( key==13 && mi>0) //退格
- {
- if(xiu==0)
- {
- anj1 = anj1/10;
- mi--;
- }
- else //修改密碼
- {
- mima1 = mima1/10;
- mi--;
- }
- }
- else if(key==12) //確認
- {
- if(anj1==1111 || anj1==mima)
- {
- kai_s=1;
- guan_s=0;
- mi=0;
- }
- else
- {
- beep=0;
- delay1(100);
- beep=1;
- delay1(100);
- beep=0;
- delay1(100);
- beep=1;
- delay1(100);
- }
- if(xiu==1)
- {
- mima=mima1;
- xiu=0;
- kai_s=0;
- guan_s=1;
- anj1=0;
- mi=0;
- }
- }
- else if( key==14) //關鎖
- {
- kai_s=0;
- guan_s=1;
- anj1=0;
- mi=0;
- }
- else if( kai_s==1&&key==16) //修改密碼
- {
- xiu = 1;
- }
- }
- /**************************矩陣鍵盤函數*********/
- //矩陣按鍵掃描子函數
- uchar keyscan()
- {
- key=0xff;
- P1=0xfe; //將第一行線置低電平
- temp=P1;//讀JPJK的當前狀態到 temp
- temp&=0xf0;// temp = temp & 0xf0 按位與
- if(temp!=0xf0)
- {
- delay1(10);//延時去抖
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)//第一行有鍵被按下
- {
- temp=P1;//讀被按下的鍵
- switch(temp)
- {
- case 0xee: key=1;
- break;
- case 0xde: key=2;
- break;
- case 0xbe: key=3;
- break;
- case 0x7e: key=100; //顯示密碼
- break;
- }
- while(temp!=0xf0)//等待按鍵釋放
- {
- temp=P1;
- temp&=0xf0;
-
- }
- if(key==100) //顯示密碼
- {
- flag++;
- if(flag==2)flag=0;
- }
- anjian();
- }
- }
- P1=0xfd; //將第二行線置低電平
- temp=P1;//讀JPJK的當前狀態到 temp
- temp&=0xf0;// temp = temp & 0xf0
- if(temp!=0xf0)
- {
- delay1(10);//延時去抖
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)//第二行有鍵被按下
- {
- temp=P1;//讀被按下的鍵
- switch(temp)
- {
- case 0xed: key=4;
- break;
- case 0xdd: key=5;
- break;
- case 0xbd: key=6;
- break;
- case 0x7d: key=16; //修改密碼
- break;
- }
- while(temp!=0xf0)//等待按鍵釋放
- {
- temp=P1;
- temp&=0xf0;
-
- }
- anjian();
- }
- }
- P1=0xfb; //將第 三行線置低電平
- temp=P1;//讀JPJK的當前狀態到 temp
- temp&=0xf0;// temp = temp & 0xf0
- if(temp!=0xf0)
- {
- delay1(10);//延時去抖
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)//第三行有鍵被按下
- {
- temp=P1;//讀被按下的鍵
- switch(temp)
- {
- case 0xeb: key=7;
- break;
- case 0xdb: key=8;
- break;
- case 0xbb: key=9;
- break;
- case 0x7b: key=12; //確認
- break;
- }
- while(temp!=0xf0)//等待按鍵釋放
- {
- temp=P1;
- temp&=0xf0;
-
- }
- anjian();
- }
- }
- P1=0xf7; //將第四行線置低電平
- temp=P1;//讀JPJK的當前狀態到 temp
- temp&=0xf0;// temp = temp & 0xf0
- if(temp!=0xf0)
- {
- delay1(10);//延時去抖
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)//第四行有鍵被按下
- {
- temp=P1;//讀被按下的鍵
- switch(temp)
- {
- case 0xe7: key=10; //空建
- break;
- case 0xd7: key=0;
- break;
- case 0xb7: key=13; //退格
- break;
- case 0x77: key=14; //關鎖
- break;
- }
- while(temp!=0xf0)//等待按鍵釋放
- {
- temp=P1;
- temp&=0xf0;
-
- }
- anjian();
- }
- }
- return key; //返回按下的鍵
- }
- /*********************************END OF LINE***************************/
- //主函數
- void main()
- {
- kai_s=0;
- guan_s=1;
- while(1)
- {
- keyscan(); //按鍵掃描
- if(flag&&xiu==0) display1(anj1);
- else if(flag&&xiu==1) display1(mima1);
- else display2();
- }
- }
復制代碼
仿真程序資料51hei提供下載:
電子密碼鎖.zip
(125.84 KB, 下載次數: 145)
2021-7-9 17:44 上傳
點擊文件名下載附件
電子密碼鎖仿真+程序 下載積分: 黑幣 -5
|