门禁锁加装指纹功能

2020年12月13日                                    13469次阅读 5人点赞

STC15W201S系列单片机文档下载

原理分析

本装置直接使用挂锁的指纹识别模块方案,该指纹识别模块添加和删除指纹都通过模块独立完成,不需要外接单片机,使得制作难度大幅降低。

该指纹模块识别到正确的指纹后,电机驱动引脚就会输出高电平,所以我通过在指纹模块上加装一个单片机,单片机通过检测指纹模块的电机驱动引脚的电平高低,若电平为高电平,则通过单片机的串口引脚发送一串特定的字符,而处于门内的单片机则接受字符,并判断字符是否符合特定的字符,若符合,则控制引脚输出电机驱动信号,如不符合,则清空已接收的所有字符,重新接收。也就是单片机之间的串口加密控制。(指纹模块和数据发送单片机可以一次性封装在一起,防止暴力拆解指纹模块通过拉高单片机引脚来破解开门)

警告

本装置安全性不高,仅用于技术学习,若您使用本装置造成了经济损失,后果自负。

第一步线路原理

5v供电一定要接到指纹模块的USB输入的正极引脚,不要接到锂电池的引脚,防止电压过高烧坏芯片。

VCC电压输入一定要高于5V,若电压等于5V,则可以去除1117-5.0v线性稳压芯片。为了保证单片机工作的稳定性,则可以在单片机的VCC引脚和GND引脚之间并联一个47uF的电解电容和一个0.1uF的瓷片电容。

电机驱动模块任意一种都可以。

发送数据单片机代码

#include<STC15.H>
sbit key = P3^3;
#define A 0x00	   //设置密码第一位	十六进制数,比如0x22,0x89,0xEF,0x3F
#define B 0x00	   //设置密码第二位
#define C 0x00	   //设置密码第三位
#define D 0x00	   //设置密码第四位
#define E 0x00	   //设置密码第五位
#define F 0x00	   //设置密码第六位
unsigned char code tab[]={A,B,C,D,E,F};           //密码
void send(unsigned char dat)            //数据发送程序	 一次发送8位,比如0x22,对应的8位二进制为00010110
{
   	SBUF=dat;                           //将要发送的数据存入发送缓冲器中
    while(TI==0);                       //若发送中断标志位没有置1(正在发送数据),就等待
    TI=0;                               //若发送完成,TI自动置1,这里把它清零
}
                       //延时函数
void delay(unsigned int ms)

{

unsigned int i,j;

    for(i=ms;i>0;i--)
    for(j=110;j>0;j--);

}       

void main(void)
{
    unsigned char i;
    TMOD=0x20;                         //定时器T工作于方式2(可自动重装的8位定时器)
    SCON=0x40;                         //串口工作方式1,不允许接收
    PCON=0x00;
    AUXR |=0X01;					     //启动定时器T2
    AUXR |=0X04;                         //波特率不倍增
    T2L =0xE0;                          //波特率为9600b/s
    T2H =0xFE;
    AUXR |= 0X10;
//	TH1=0xfd; 							//波特率为9600b/s
//	TL1=0xfd;
//	TR1=1; 							    //启动定时器T1(T1作波特率的发生器)
    key = 0;                            
    while(1)
    {
    if(key==1)
        {
        delay(10);
        if(key==1)
        {

            for(i=0;i<6;i++)               
            {
                send(tab[i]);              //发送数据
                delay(1);               
            }
        }
        }
    }
}

 

接收数据的单片机的代码

#include<STC15.h>
//#include<reg51.h>
//sbit key = P5^5;
#define A 0x00	   //设置密码第一位
#define B 0x00	   //设置密码第二位
#define C 0x00	   //设置密码第三位
#define D 0x00	   //设置密码第四位
#define E 0x00	   //设置密码第五位
#define F 0x00	   //设置密码第六位
sbit ML = P1^2;		//定义电机引脚
sbit MR = P1^3;
int i;
unsigned char pass[6];
unsigned char num[1];
void delay(unsigned int ms);
void delay(unsigned int ms)		 //延时函数

{

unsigned int i,j;

    for(i=ms;i>0;i--)
    for(j=892;j>0;j--);

}            
void passclean(void)	   //密码清除函数
{
          	i = 0;
            delay(45);   
   		  for (i = 0; i < 6; i++)  //for循环赋值  
   		 	{  	
        	pass[i] = 0;  
   			}
}
unsigned char receive(void)         //数据接收函数
{
    unsigned char dat;
    
    while(RI==0);                   //数据没有接收完毕时等待接收
    RI=0;                           //接收完毕时清零
    dat=SBUF;                       //将接收缓冲器中的数据存入dat
    return dat;                     //将接收到的数据返回
}
void main(void)
{

    TMOD=0x20;                     //设置定时器T1工作于方式2
    SCON=0x50;                     //串口工作方式1,允许接收数据
    PCON=0x00;                     //波特率不倍增
    AUXR |=0X01;
    AUXR |=0X04;                         //波特率不倍增
    T2L =0xE0;                          //波特率为9600b/s
    T2H =0xFE;
    AUXR |= 0X10;
//	TH1=0xfd;                      //波特率为9600b/s
//	TL1=0xfd;
//	TR1=1;                         //启动定时器T1
    REN=1; 						    //允许接收数据
//	key = 0; 
    ML = 0;						 //电机方向引脚初始化
    MR = 0;                      
    while(1)
    { 	
      
        while((pass[1] != A)||(pass[2]!=B)||(pass[3]!=C)||(pass[4]!=D)||(pass[5]!=E)||(pass[6]!=F))	//若密码都符合则退出数据接收循环
        { 	

        num[1] = receive();	   //将接受的的密码存到数组num[1]里
        if(num[1]==A){		   //判断接受到的数据是否符合密码A位,若符合,则将密码放入到pass数组第一位里。
        pass[1] = num[1];	   //以下同理
        }
        else if(num[1]==B){
        pass[2]= num[1];
        }			             
        else if(num[1]==C){
        pass[3]= num[1];
        }
        else if(num[1]==D){
        pass[4]= num[1];
        }
        else if(num[1]==E){
        pass[5]= num[1];
        }
        else if(num[1]==F){
        pass[6]= num[1];
        }
        else
        {
        passclean();	//清空已接收的密码。
        }

        //	key=0;

        }				  	
        if((pass[1] == A)&&(pass[2]==B)&&(pass[3]==C)&&(pass[4]==D)&&(pass[5]==E)&&(pass[6]==F))  //若密码符合则执行开锁
        {
        //	key = 1;
        //delay(100);
        ML = 1;			  //开锁
        MR = 0;
        delay(120);
        ML = 0;			 //电机停转
        MR = 0;
        delay(4500);	  //等待时间
        ML = 0;			  //关锁
        MR = 1;
        delay(120);
        ML = 0;			  //电机停转
        MR = 0;
        //delay(50);
    

        passclean();	//清空已接收的密码。
        //key = 0;
        //key = 1; 
        }
        

    }
}

 

 --------------------------------本教程由光阴似水1204原创,可自由转载,转载请附上本文网址,并标注来源。

GYSS1204

这个人很懒,什么都没留下

文章留言