門禁鎖加裝指紋功能

光陰似水1204發表於2020-12-13

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; 
		}
		

	}
}

個人網站文章

相關文章