|
0.png (39.3 KB, 下載次數(shù): 54)
下載附件
2016-9-25 15:12 上傳
簡(jiǎn)單的51單片機(jī)做的密碼鎖,帶矩陣鍵盤(pán),用數(shù)碼管來(lái)顯示,初始密碼111111,
0.png (51.13 KB, 下載次數(shù): 67)
下載附件
2016-9-25 15:15 上傳
所有資料下載:
51密碼鎖改.zip
(147.63 KB, 下載次數(shù): 58)
2016-9-25 15:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
下面是源程序:
- #include <reg51.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- //鍵盤(pán)子程序相關(guān)說(shuō)明
- #define BLANKCHAR 10 //定義空白常量
- #define PCHAR 11 //定義字符 P 常量(等待用戶輸入密碼)
- #define OPENCHAR 12 //定義開(kāi)鎖字符 |— 常量
- #define ALARMCHAR 13 //定義字符 A 常量(密碼多次錯(cuò)誤警告)
- #define LINECHAR 14 //定義字符 - 常量
- #define BACKKEY 0X0D //定義退格按鍵常量
- #define ENTERKEY 0X0F //定義確認(rèn)鍵常量
- #define LOCKKEY 0X0E //定義閉鎖鍵常量
- #define NO_KEY 20 //定義無(wú)按鍵返回值
- //定義按鍵掃描碼表,按鍵掃描時(shí),4位列線和4位行線組成字節(jié)數(shù)據(jù)表
- uchar code KEYCODE[] = {0XEE,0XDE,0XBE,0X7E, // 0 1 2 3
- 0XED,0XDD,0XBD,0X7D, // 4 5 6 7
- 0XEB,0XDB,0XBB,0X7B, // 8 9
- 0XE7,0XD7,0XB7,0X77};// back lockkey enter
- uchar KeyPre; //保存上次掃描按鍵的鍵值
- uchar KeyUp;//用于控制按鍵去抖動(dòng)操作。1:掃描時(shí)消抖 2:等待釋放 3:釋放時(shí)消抖
- #define LEDPORT P0 //定義顯示器段碼輸出端口
- #define LEDCON P1 //定義顯示器位控制端口
- #define KEYPORT P2 //定義鍵盤(pán)端口
- sbit ALARMCON = P3^3; //定義報(bào)警控制引腳
- sbit LOCKCON = P3^5; //定義電子鎖控制引腳
- uchar code SEGCODE[] =
- {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,//0...9的共陽(yáng)極段碼
- 0XFF,//不顯示
- 0X8C,//顯示字符P(等待用戶輸入密碼)
- 0X8F,//|-的共陽(yáng)極段碼(開(kāi)鎖)
- 0X88,//字符A
- 0XBF,//字符-
- 0X9f,//返回字符
- };
- //定義LED位碼控制碼
- uchar code BITCODE[6] = {0XC1,0XC2,0XC4,0XC8,0XD0,0XE0};
- uchar DispBuf[6]; //保存顯示的字符
- bit DispNormal; //控制顯示時(shí),是正常顯示還是閃爍顯示
- uchar DispCnt; //控制閃爍顯示時(shí)的頻率
- #define SHORT_TIME 10 //蜂鳴器響200ms
- #define LONG_TIME 100 //蜂鳴器響2s
- #define LONGER_TIME 9000 //蜂鳴器響3min
- bit AlarmEnable; //是否報(bào)警或聲音提示
- uint AlarmTime; //控制報(bào)警時(shí)間長(zhǎng)度
- uchar code PassWord[] = {1,1,1,1,1,1};//定義初始密碼表
- uchar PassInBuf[5]; //保存輸入的密碼字符
- uchar PassPosi; //用戶輸入密碼字符存放在PassInBuf[]的位置
- bit TimerBit; //20ms定時(shí)時(shí)間到
- uchar SysMode; //系統(tǒng)所處模式 0:輸入密碼模式 1:報(bào)警模式 2:開(kāi)鎖模式
- uchar ErrorCnt; //用戶連續(xù)輸入密碼出錯(cuò)次數(shù)
- void Delay(int z)
- {
- uchar y;
- int x;
- for(x=z; x>0; x--)
- for(y=255; y>0; y--);
- }
- /*********************************************************
- *1、填充子程序負(fù)責(zé)將顯示內(nèi)容寫(xiě)入DisBuf和PassInBuf緩沖區(qū),*
- * 分為以下幾個(gè)子程序。 *
- * 函數(shù)Fill_Buf;使用特定字符填充DisBuf和PassInBuf。 *
- * 函數(shù)Fill_Buf_P;將系統(tǒng)閉鎖時(shí)的顯示信息寫(xiě)入緩沖區(qū)。 *
- * 函數(shù)Fill_Buf_O;將系統(tǒng)開(kāi)鎖時(shí)的顯示信息寫(xiě)入緩沖區(qū)。 *
- * 函數(shù)Fill_Buf_A;將系統(tǒng)報(bào)警時(shí)的顯示信息寫(xiě)入緩沖區(qū)。 *
- *********************************************************/
- /**********函數(shù)Fill_Buf**************/
- void Fill_Buf(uchar FillChar)
- {
- uchar i;
- for (i=0; i<6; i++)
- {
- DispBuf[i] = FillChar;//用字符FillChar填充DispBuf[i]
- PassInBuf[i] = FillChar;//用字符FillChar填充PassInBuf[i]
- }
- }
- void Fill_Buf_P()
- {
- Fill_Buf(BLANKCHAR);//DispBuf[1..5] = ' '
- DispBuf[0] = PCHAR;//DispBuf[0] = 'p'
- LEDPORT = SEGCODE[PCHAR]; //顯示P
- LEDCON = BITCODE[5];//在最后一個(gè)數(shù)碼管顯示
- }
- void Fill_Buf_O()
- {
- Fill_Buf(BLANKCHAR);
- DispBuf[0] = OPENCHAR;// DispBuf[0] = '|-'
- LEDPORT = SEGCODE[OPENCHAR]; //顯示'|-'
- LEDCON = BITCODE[5];//在最后一個(gè)數(shù)碼管顯示
- }
- void Fill_Buf_A()
- {
- Fill_Buf(BLANKCHAR);
- DispBuf[0] = ALARMCHAR;// DispBuf[0] = 'A'
- LEDPORT = SEGCODE[ALARMCHAR]; //顯示'A'
- LEDCON = BITCODE[5];//在最后一個(gè)數(shù)碼管顯示
- }
- /*********************************************************
- *2、緩沖區(qū)顯示子程序負(fù)責(zé)將顯示內(nèi)容寫(xiě)入DisBuf和PassInBuf *
- * 緩沖區(qū),分為以下幾個(gè)子程序。 *
- * 函數(shù)Disp_Led_Sin;在某個(gè)LED數(shù)碼管上顯示一個(gè)字符。 *
- * 函數(shù)Disp_Led_OFF;關(guān)閉數(shù)碼管顯示。 *
- * 函數(shù)Disp_Led_All;將DispBuf緩沖區(qū)的內(nèi)容顯示。 *
- * 函數(shù)Disp_Led;當(dāng)系統(tǒng)處于不同模式時(shí),刷新顯示器。 *
- *********************************************************/
- void Disp_Led_Sin(uchar DispChar, uchar DispPosi)
- {
- LEDPORT = SEGCODE[DispChar];//輸出顯示段碼
- LEDCON = BITCODE[DispPosi];//輸出顯示位碼
- Delay(500);
- LEDCON = 0X00;//關(guān)閉顯示器
- }
- /*********啟動(dòng)報(bào)警函數(shù)***********/
- void Sys_Speaker(uint stime)
- {
- AlarmEnable = 1;//允許報(bào)警
- AlarmTime = stime;//報(bào)警時(shí)間長(zhǎng)短
- }
- /*********系統(tǒng)報(bào)警函數(shù)**********/
- void Sys_Alarm()
- {
- if (AlarmEnable == 1) //允許報(bào)警
- {
- ALARMCON = 0;//報(bào)警
- AlarmTime--;
- if (AlarmTime == 0) //停止報(bào)警時(shí)間到
- {
- AlarmEnable = 0;
- ALARMCON = 1;
- if (SysMode == 1) //報(bào)警發(fā)生在模式1.要返回模式0
- {
- SysMode = 0;
- Fill_Buf_P();//顯示P
- }
- }
-
- }
- }
- /*********按鍵檢測(cè)子程序**************/
- uchar Find_Key()
- {
- uchar KeyTOP, i;
- KEYPORT = 0XF0;//行線輸出全0,列線輸出全1
- KeyTOP = KEYPORT;//讀按鍵端口值
- if(KeyTOP == 0XF0)
- return NO_KEY;
- KEYPORT = KeyTOP | 0X0F;//列線輸出,行線輸入
- KeyTOP = KEYPORT;
- for (i=0; i<16; i++)
- {
- if(KeyTOP == KEYCODE[i])//根據(jù)按鍵端口掃描值,查找按鍵值
- return i;//返回按鍵值
- else if(i >= 15)
- {
- i = NO_KEY;
- return i;
- }
- }
- }
- /****************按鍵掃描函數(shù)**************/
- uchar Scan_Key()
- {
- uchar KeyTOP;
- KeyTOP = Find_Key();//接收按鍵檢測(cè)的返回值
- if (KeyTOP != NO_KEY)
- {
- Delay(100);
- if (KeyTOP != NO_KEY)
- KeyPre = KeyTOP;
- while(KeyTOP == Find_Key());
- return KeyPre;
- }
- else
- return NO_KEY;
- }
- /***************按鍵處理子程序**************/
- void Key_Process(uchar Key)
- {
- uchar i;
- if (Key == NO_KEY)
- return;//無(wú)按鍵,不處理
- switch(SysMode)
- {
- case 0://輸入密碼
- switch(Key)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- Disp_Led_Sin(Key,PassPosi);
- PassInBuf[PassPosi] = Key;//保存用戶輸入的密碼
- if (PassPosi<5)
- PassPosi++;//調(diào)整密碼輸入位置
- Sys_Speaker(SHORT_TIME);//發(fā)按鍵提示音
- break;
- case 20:break;
- case BACKKEY:
- DispBuf[PassPosi] = BLANKCHAR;//顯示空鍵
- PassInBuf[PassPosi] = BLANKCHAR;//清除當(dāng)前位置的密碼
- if (PassPosi>0)
- {
- PassPosi--;//調(diào)整顯示位置
- Disp_Led_Sin(15,5);
- }
- Sys_Speaker(SHORT_TIME);//發(fā)按鍵提示音
- break;
- case ENTERKEY:
- for (i=0; i<5; i++)//比較用戶密碼是否與預(yù)設(shè)密碼一致
- {
- if (PassInBuf[i] != PassWord[i])
- break;
- }
- if (i>=5)//輸入密碼正確
- {
- Fill_Buf_O();//顯示開(kāi)鎖狀態(tài)
- PassPosi = 0;
- LOCKCON = 1;//開(kāi)鎖
- ErrorCnt = 0;
- Sys_Speaker(LONG_TIME);//發(fā)長(zhǎng)提示音
- SysMode = 2;//轉(zhuǎn)模式2
- }
- else
- {
- ErrorCnt++;
- if(ErrorCnt>2)//超過(guò)3次
- {
- ErrorCnt = 0;
- Fill_Buf_A();//顯示報(bào)警狀態(tài)
- PassPosi = 0;
- Sys_Speaker(LONGER_TIME);//發(fā)報(bào)警音
- SysMode = 1;
- }
- else //少于3次,重新輸入
- {
- Fill_Buf_P();
- PassPosi = 0;
- Sys_Speaker(LONG_TIME);//發(fā)長(zhǎng)提示音
- }
- }
- break;
- case LOCKKEY://閉鎖鍵
- Fill_Buf_P();
- PassPosi = 0;
- Sys_Speaker(SHORT_TIME);//發(fā)短提示音
- break;
- }
- break;
- case 2://開(kāi)鎖狀態(tài)
- if (Key == LOCKKEY)//用戶按動(dòng)閉鎖按鍵
- {
- Fill_Buf_P();
- SysMode = 0;
- LOCKCON = 0;//閉鎖
- Sys_Speaker(SHORT_TIME);
- }
- break;
- }
- }
- void Init_Timer()
- {
- TMOD &= 0XF0;
- TMOD |= 0X01;
- TR0 = 0;
- TH0 = (65536-20000) / 256;
- TL0 = (65536-20000) % 256;
- TR0 = 1;
- ET0 = 1;
- }
- void Timer0() interrupt 1
- {
- TR0 = 0;
- TH0 = (65536-20000) / 256;
- TL0 = (65536-20000) % 256;
- TR0 = 1;
- TimerBit = 1;//20ms定時(shí)時(shí)間到
- }
- void Init_System()
- {
- PassPosi = 1;
- LOCKCON = 0; //閉鎖
- Init_Timer();
- Fill_Buf_P();
- EA = 1;
- }
- void main()
- {
- uchar KeyTemp;
- Init_System();
- PassPosi = 0;
- while(1)
- {
- if(TimerBit == 1)
- {
- Sys_Alarm();//報(bào)警函數(shù)
- KeyTemp = Scan_Key();//按鍵掃描
- Key_Process(KeyTemp);//按鍵處理
- TimerBit = 0;
- }
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|