原理分析
本装置直接使用挂锁的指纹识别模块方案,该指纹识别模块添加和删除指纹都通过模块独立完成,不需要外接单片机,使得制作难度大幅降低。
该指纹模块识别到正确的指纹后,电机驱动引脚就会输出高电平,所以我通过在指纹模块上加装一个单片机,单片机通过检测指纹模块的电机驱动引脚的电平高低,若电平为高电平,则通过单片机的串口引脚发送一串特定的字符,而处于门内的单片机则接受字符,并判断字符是否符合特定的字符,若符合,则控制引脚输出电机驱动信号,如不符合,则清空已接收的所有字符,重新接收。也就是单片机之间的串口加密控制。(指纹模块和数据发送单片机可以一次性封装在一起,防止暴力拆解指纹模块通过拉高单片机引脚来破解开门)
本装置安全性不高,仅用于技术学习,若您使用本装置造成了经济损失,后果自负。警告
第一步线路原理
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原创,可自由转载,转载请附上本文网址,并标注来源。
文章留言