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