單片機密碼鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (15.59 KB, 下載次數: 65)
下載附件
2018-11-4 15:56 上傳
簡單密碼鎖源程序:
- /*******************************************
- 密碼鎖:基本功能
- 1 開機顯示“-”,無密碼輸入時也顯示“-”,表示鎖定;
- 2 密碼為1位密碼;
- 3 輸入密碼正確,顯示“P”,開鎖;
- 4 輸入密碼錯誤,顯示“E”,繼續鎖定;
- *******************************************/
- #include <REGX51.H>
- #define LED P0 //一位數碼管顯示端口
- #define KEY P2 //鍵盤端口
- //共陽極數碼管字形碼
- unsigned char code ledSeg[]={
- //0 1 2 3 4 5 6 7 8 9
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
- //A B C D E F
- 0x88,0x83,0xc6,0xa1,0x86,0x8e,
- //P16 -17
- 0x8c,0xbf
- };
- void delay(unsigned int i)
- {
- unsigned char j;
- while(i--)
- for(j=0;j<123;j++);
- }
- /*矩陣4x4鍵盤函數
- 行列反轉法,行在低四位,
- 返回值:按鍵ascii碼,無按鍵返回0*/
- char rdmkey(void)
- {
- char cin,rin; //列,行輸入值
- char keyv=0; //鍵號
- static char preCin=0; //上次輸入
-
- KEY = 0x0f; //列輸出0,行輸出1
- delay(1);
- rin = KEY; //讀入行,只關心低四位
- rin &= 0x0f;
- if(rin==0x0f) return 0; //讀入行全為1,無按下,返回0
-
- //有鍵按下,行列反轉,繼續判斷在哪一列
- KEY = 0xf0; //行輸出0,列輸出1
- delay(1);
- cin = KEY; //讀入列輸入值cin只關心高四位
- cin &= 0xf0;
- if(cin==0x0f) return 0; //讀入行全為1,無按下,返回0
- cin = cin+rin; //鍵碼=cin+rin,保存在cin中,查表得到鍵碼
- if(cin == preCin)
- return 0;//和上次相同,返回0
- else
- preCin=cin;
- switch(cin) //查表得到鍵碼
- {
- case 0xee: keyv='1'; break; //0行0列 (列行1110 1110)
- case 0xde: keyv='2'; break; //0行1列 (列行1101 1110)
- case 0xbe: keyv='3'; break; //0行2列 (列行1011 1110)
- case 0x7e: keyv=0; break; //0行3列 (列行0111 1110)
- case 0xed: keyv='4'; break; //1行0列 (列行1110 1101)
- case 0xdd: keyv='5'; break; //1行1列 (列行1101 1101)
- case 0xbd: keyv='6'; break; //1行2列 (列行1011 1101)
- case 0x7d: keyv=0; break; //1行3列 (列行0111 1101)
- case 0xeb: keyv='7'; break; //2行0列 (列行1110 1011)
- case 0xdb: keyv='8'; break; //2行1列 (列行1101 1011)
- case 0xbb: keyv='9'; break; //2行2列 (列行1011 1011)
- case 0x7b: keyv=0; break; //2行3列 (列行0111 1011)
- case 0xe7: keyv='*'; break; //3行0列 (列行1110 0111)
- case 0xd7: keyv='0'; break; //3行1列 (列行1101 0111)
- case 0xb7: keyv='#'; break; //3行2列 (列行1011 0111)
- case 0x77: keyv=0; break; //3行3列 (列行0111 0111)
- default: ;
- }
- return keyv; //返回鍵碼
- }
- void main()
- {
- char keyv;
-
- LED=ledSeg[17]; //顯示-,鎖定
-
- while(1)
- {
- keyv=rdmkey();
-
- if (keyv!=0)
- {
- if(keyv=='6')LED=ledSeg[16]; //顯示 P
- else LED=ledSeg[14]; //顯示 E
- }
- }
- }
復制代碼
0.png (38.19 KB, 下載次數: 76)
下載附件
2018-11-4 15:57 上傳
全部資料51hei下載地址:
51單片機實現密碼鎖.rar
(9.2 KB, 下載次數: 35)
2018-11-4 15:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|