门禁锁加装指纹功能

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;                     //设置定时器T工作于方式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; 
		}
		

	}
}

个人网站文章

上一篇:树莓派3B+连接DLPDLCR2000EVM


下一篇:codeforces水题100道 第十九题 Codeforces Round #109 (Div. 2) A. I_love_%username% (brute force)