|
簡易的單片機密碼鎖用不了,使用的是靜態數碼管+矩陣按鍵+蜂鳴器+繼電器
自己寫的程序,下載到單片機后按鍵可以使用,按下一個按鍵,數碼管會正常顯示按鍵按下對應的字符,但按了123后蜂鳴器和繼電器沒有反應,下面是我寫的單片機程序(附件有單片機原理圖和實物圖)
#include "reg52.h"
#define jian_pan P1
#define shumaguan P0
sbit buzzer=P2^3; //蜂鳴器
sbit relay=P2^2; //繼電器
int data password[4];
unsigned char cunfang; //存放矩陣鍵盤按下的位置對應的0~f字符
unsigned char code number[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值 共陰
void delay(unsigned long int i) //延時函數
{
while(i--);
}
void keydown() //檢測哪個按鍵按下
{
int a=0;
jian_pan=0x0f;
if(jian_pan!=0x0f)
{
delay(100);//延時10ms
if(jian_pan!=0x0f)
{
//測試列
jian_pan=0x0f;
switch(jian_pan)
{
case(0x07) : cunfang=0;break;
case(0x0b) : cunfang=4;break;
case(0x0d) : cunfang=8;break;
case(0x0e) : cunfang=12;break;
}
//測試行
jian_pan=0xf0;
switch(jian_pan)
{
case(0x70) : cunfang=cunfang;break;
case(0xb0) : cunfang=cunfang+1;break;
case(0xd0) : cunfang=cunfang+2;break;
case(0xe0) : cunfang=cunfang+3;break;
}
while((a<50)&&(jian_pan!=0xf0))
{
delay(1000); //延時100ms
a++;
}
}
}
}
void judge_number() //檢測按下的三次是否依次為123
{
int mi_ma=0,n;
if(cunfang!=0) //判斷存放按鍵的數值是否為零,當不為零的話相當于輸入了一位密碼
{
mi_ma=mi_ma+1; //記錄按下的次數
password[mi_ma]=cunfang; //把按下的密碼存放到數組中
if(mi_ma==3) //判斷是否按下了三次
{
password[0]=password[1]*100+password[2]*10+password[3]; 把前三次輸入的數字合并
if(password[0]==123) //設置正確密碼是123 并判斷用戶輸入的密碼是否為123 】
{ |
buzzer=0; |
for(n=0;n<1000;n++) | 當密碼輸入正確繼電器打開,蜂鳴器響
{ |
relay=~relay; |
delay(10); |
} 】
delay(6553400); //延時約1分鐘相當于開鎖一分鐘
}
}
}
}
void main()
{
while(1)
{
keydown(); //判斷鍵入的字符
shumaguan=~number[cunfang];//數碼管顯示按下的字符
judge_number(); //檢測按下的三次是否依次為123
}
}
|
|