`自己利用空闲时间制作的电子密码锁,有PCB、原理图,PCB印制电路板。此设计用外部存储器,支持修改密码,本来想添加指纹识别模块,但是12864的数据口被使用了,gpio口不够用。在实际中我发现12864还是用串口比较好,因为用并口的话使用会影响同GPIO口的其他位口。毕竟是业余时间做的,可能在有些方面不是很完善。 一、功能介绍: 1、输入6位密码,即可开锁。 2、输入7次纯数字,系统会自动恢复初始状态。 3、没有输入完6位密码,按下确认键,系统不会应答。 4、密码输入错误三次,锁定键盘并且蜂鸣器提醒10秒。 5、输入错误可以退格、清零。 6、开机后12864模块会有60秒定时显示,没操作键盘60秒后,清除数据并且恢复初始状态。如果在记时期间有按键按下,这停止倒计时,并且在没有操作键盘8秒左右,重新开启倒计时12864休眠功能。 7、在功能模式下可以修改密码,也可以做其他功能选择(其他功能你们根据自身能力添加)。 8、程序有密码数值存储在数组,可用于显示等操作。(修改密码时可以显示) 9、有人体感应模块,感应到有人吗,并且12864处于关屏休眠模式下,即可打开12864屏幕。 10、有外部存储器24C02,支持修改密码,密码断电不丢失。 11、步进电机模块。 12、继电器模块。 13、温度模块,倒计时期间可以测量7805和1117芯片温度或者外部温度,并实时显示。 二、资料展示 1.原理图 2.PCB印制电路板 因为自己做的板,所以在布线的时候那那么专业,能用就好。
3.实物图 外观大概就这样,工作状态 4、说明 我是用的KT板面上贴了一层贴纸,把这些弄到了一起,自己准备在包装一下,做一个密码箱完全没有问题。可以用来放放自己的小秘密,哈哈哈 。
5、部分代码 按键模块的键值内容判断
#include "key_control.h"
#include "delay.h"
#include "key.h"
#include "12864.h"
#include "Relay.h"
#include "buzzer.h"
#include "time.h"
#include "24c02.h"
#include "uln2003.h"
u8 password[]={0x30,0x30,0x30,0x30,0x30,0x30};
u8 new_password[]={0x30,0x30,0x30,0x30,0x30,0x30};
uchar display[]={0x2A,0x2A,0x2A,0x2A,0x2A,0x2A};
u8 nkv=0,sign=0,fkv,noe=0,Function_menu_flag=0,Move_down_flag=0,
Move_up_flag=1,Revise_the_password_flag=0,New_password_flag=0,
Number_of_new_passwords=0;
u16 mc=1;
extern uchar mima[];
extern u8 Countdown;
void Key_Number(void)
{
u8 num=0,i;
num=Key_Scan();
if(num==16&&Countdown==0&&GPIO_ReadOutputDataBit (GPIOB,GPIO_Pin_9)==1)
{
mc++;
delay_ms(10);
if(mc==1001)
{
mc=1;
TIM3_Int_Init(9999,7199);
}
if(mc==50001)
mc=1;
}
if(num!=16&&num<=9)
{
LCD_Display_Specify_Words(0,0,"00");
TIM3_STOP();
Countdown=0;
Key_Init();
mc=1;
sign=0;
if(Function_menu_flag==0)
{
nkv++;
if(nkv==7)
LCD_Display_Specify_Words(2,5," ");
else
{
LCD_Display_Words(2,5,display,nkv);
for(i=nkv-1;i<nkv;i++)
password[i]=num+0x30;
}
Key_Init();
}
else if(Function_menu_flag==1&&(Revise_the_password_flag==1||New_password_flag==1))
{
nkv++;
LCD_Display_Words(3,5,display,nkv);
for(i=nkv-1;i<nkv;i++)
password[i]=num+0x30;
Key_Init();
}
}
else if(num!=16&&num>9)
{
Countdown=0;
LCD_Display_Specify_Words(0,0,"00");
Key_Init();
TIM3_STOP();
mc=1;
sign=1;
fkv=num;
}
}
按键内容判断处理函数
void Key_Function(void)
{
u8 h=0;
uint i;
if(sign==1)
{
switch(fkv)
{
case 15:
{
switch(New_password_flag)
{
case 0:
{
if(nkv==6)
{
nkv=0;
for(i=0;i<6;i++)
{
if(mima[i]==password[i])
{
h++;
if(h==6)
{
switch (Revise_the_password_flag)
{
case 0:
{
LCD_Display_Specify_Words(2,5," ");
LCD_Display_Specify_Words(2,5,"Open!");
LCD_Display_Specify_Words(2,5," ");
Relay_on();
delay_ms(2000);
Relay_off();
noe=0;
ULN2003_init();
Unlocking();
}break;
case 1:
{
LCD_Display_Specify_Words(3,5," ");
LCD_Display_Specify_Words(3,5,"yes ok");
LCD_Display_Specify_Words(3,0,"D??ü??: ");
New_password_flag=1;
}break;
}
}
}
else
{
switch (Revise_the_password_flag)
{
case 0:
{
h=1;
LCD_Display_Specify_Words(2,5," ");
LCD_Display_Specify_Words(2,5,"Error!");
LCD_Display_Specify_Words(2,5," ");
buzzer_On_off();
noe++;
if(noe==3)
{
noe=0;
TIM2_Int_Init(9999,7199);
Time2_10_seconds_countdown();
}break;
case 1:
{
h=1;
LCD_Display_Specify_Words(3,5," ");
LCD_Display_Specify_Words(3,5,"Error!");
LCD_Display_Specify_Words(3,5," ");
buzzer_On_off();
}break;
}break;
}
}
}
}break;
case 1:
{
if(nkv==6)
{
nkv=0;
Number_of_new_passwords++;
switch(Number_of_new_passwords)
{
case 1:
{
LCD_Display_Specify_Words(3,5," ");
for(i=0;i<6;i++)
new_password[i]=password[i];
}break;
case 2:
{
for(i=0;i<6;i++)
{
if(password[i]==new_password[i])
{
h++;
if(h==6)
{
AT24CXX_Write(0,(u8*)new_password,6);
delay_ms(20);
AT24CXX_Read(0,mima,6);
LCD_Display_Words(3,5,new_password,6);
LCD_Display_Specify_Words(3,0,"DT???ü??3é1|£?");
LCD_Display_Specify_Words(2,0," ");
LCD_Display_Specify_Words(3,0," ");
LCD_Display_Specify_Words(2,0,"password: ");
Function_menu_flag=0;
Move_down_flag=0;
Revise_the_password_flag=0;
New_password_flag=0;
Number_of_new_passwords=0;
}
}
else
{
LCD_Display_Specify_Words(3,5," ");
LCD_Display_Specify_Words(3,5,"Error!");
LCD_Display_Specify_Words(3,5," ");
Number_of_new_passwords=0;
break;
}
}
}break;
}
}
}break;
}
switch(Move_down_flag)
{
case 1:
{
LCD_Display_Specify_Words(2,0," ");
LCD_Display_Specify_Words(3,0," ");
LCD_Display_Specify_Words(2,0,"1|?ü: DT???ü??");
LCD_Display_Specify_Words(3,0,"?-?ü??£o");
Move_down_flag=2;
Revise_the_password_flag=1;
}break;
}
}break;
case 14:
{
switch(Revise_the_password_flag)
{
case 0:
{
LCD_Display_Specify_Words(2,5," ");
nkv=0;
}break;
case 1:
{
LCD_Display_Specify_Words(3,5," ");
nkv=0;
}break;
}
}break;
case 11:
{
switch(Revise_the_password_flag)
{
case 0:
{
if(nkv==1)
LCD_Display_Specify_Words(2,5," ");
else if(nkv==2||nkv==4||nkv==6)
{
i=nkv/2-1;
LCD_Display_Specify_Words(2,5+i,"* ");
}
else if(nkv==3||nkv==5)
{
i=nkv/2;
LCD_Display_Specify_Words(2,5+i," ");
}
nkv--;
}break;
case 1:
{
if(nkv==1)
LCD_Display_Specify_Words(3,5," ");
else if(nkv==2||nkv==4||nkv==6)
{
i=nkv/2-1;
LCD_Display_Specify_Words(3,5+i,"* ");
}
else if(nkv==3||nkv==5)
{
i=nkv/2;
LCD_Display_Specify_Words(3,5+i," ");
}
nkv--;
}break;
}
}break;
case 13:
{
if(nkv==0)
{
Move_down_flag=0;
Function_menu_flag++;
switch(Function_menu_flag)
{
case 1:
{
LCD_Display_Specify_Words(2,0," ");
LCD_Display_Specify_Words(2,0,"2?μ¥: ");
LCD_Display_Specify_Words(2,3,">>");
LCD_Display_Specify_Words(2,4,"?????÷");
LCD_Display_Specify_Words(3,4,"?ü????");
}break;
case 2:
{
LCD_Display_Specify_Words(2,0," ");
LCD_Display_Specify_Words(3,0," ");
LCD_Display_Specify_Words(2,0,"password:");
Function_menu_flag=0;
Move_down_flag=0;
Revise_the_password_flag=0;
New_password_flag=0;
Number_of_new_passwords=0;
}break;
}
}
}break;
case 10:
{
if(Function_menu_flag==1)
{
switch(Move_down_flag)
{
case 0:
{
Move_down_flag=1;
LCD_Display_Specify_Words(2,3," ");
LCD_Display_Specify_Words(3,3,">>");
}break;
}
}
}break;
case 12:
{
if(Function_menu_flag==1)
{
switch(Move_down_flag)
{
case 1:
{
Move_down_flag=0;
LCD_Display_Specify_Words(2,3,">>");
LCD_Display_Specify_Words(3,3," ");
}break;
}
}
}break;
}
fkv=0;
Key_Init();
}
}
void open_close(void)
{
Function_menu_flag=0;
Move_down_flag=0;
Revise_the_password_flag=0;
New_password_flag=0;
Number_of_new_passwords=0;
nkv=0;
fkv=0;
}
代码太多了,我把主要的按键综合代码写出来了,上面的注释看不到,可以程序里面看。在资料里有单独的DS18B20、24c02、定时器的一些单一代码,直接修改一下就能移植。
三、最后说几句 1、有电子相关专业(专科)的同学们,可以用这个作为毕业设计,可以去掉步进电机,再添加一个指纹模块后,应该能够通过。 2、我原本想用指纹模块来控制步进电机来打开老式的拉锁,现在我还没有试,不知道能不能成功。 3、因为我的按键模块、12864模块、DS18B20之间的gpio口有点干扰,因为矩阵键盘的列需要输入探测是用了一整个GPIO的操作函数,所以用了它后,另外两个它也会受到影响。 4、资料里包含了四个文件夹,PCB设计、程序、串口调试工具、资料(相关芯片,外设的资料)
完整资料下载:https://download.csdn.net/download/qq_31309951/39573366
|