|
简易的单片机密码锁用不了,使用的是静态数码管+矩阵按键+蜂鸣器+继电器
自己写的程序,下载到单片机后按键可以使用,按下一个按键,数码管会正常显示按键按下对应的字符,但按了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
}
}
|
|