一、序言
话不多说,先上图
在写自己的整个心路历程之前,想先说明几点,以防大家喷:
1.我只是做着玩,怎么方便怎么来,电路乱但我看着爽,懒得整理。
2.我一点也不懂电路,用的都是某宝买的模块,真的不会什么放大电路,电源也不会做,求说我浪费的大大绕个路,模块都是我用奖学金买的,我自己觉得开心就好。
3.做这个的目的是,舍友一直忘记带钥匙,可以增加一种开门的选择,纯属好玩。我们寝室平时都不断电,只有在半夜11点才断电。假如有哪一天,四个人都忘了带钥匙,并且寝室碰巧断电,那我也认了,只能硬着头皮去找宿管大爷了QAQ
4.说我乱拉电线、损坏公物什么什么的,我们寝室已经很破了,如果学校真让我们赔钱换个新门,我一点也不介意,就当是造福下一代了。什么通告批评、处分之类的我不怕的。。。
二、我用了一些什么东西
以前用旧的单片机开发板、指纹模块、电磁铁、继电器、声音录放模块、开关电源、排插、螺丝、螺丝刀、电线、电钻(只能钻门了=。=)。
三、模块分析
想了想,我这个东西可以大概分为三个模块: 声音模块、指纹模块、开锁模块,中控用的是51单片机开发板,我知道用一整个板子很浪费,用一个最小系统就好了,但是我平常几乎不用单片机,所以放那里也是浪费,这点大家就不用喷我啦。
A.声音模块
这个模块使用起来很简单,在自己调试的时候不用接单片机,电源VCC端接在单片机开发板的5V,GND接单片机开发板的GND,然后按住REC说话,可以将自己的声音录进去,播放用其他两个键就可以啦。我用这个模块的目的是进门的时候,如果有软萌软萌的声音跟你说“欢迎光临”的话。。咳咳,想想就很心动。
如果调试成功的话,将左边的P-L端,接在单片机的IO口,输出高电平就可以播放欢迎语啦。
B.指纹模块
先看一下实物图
我买的这个指纹模块有6个接口,从左到右分别是:
探测手指电路电源、模块电源正输入端、TXD、RXD、GND、手指探测信号输出
解释一下:手指探测电路,也就是接口1和接口6是为了减小指纹模块的损耗,在实际使用中不用也行,编程时候只要循环获取手指图像就好了,但这么好的功能怎么能不用呢!有一点需要注意一下,接口6在探测到手指时,会开漏输出低,需要接上拉电阻,然后接到单片机的外部中断0处就好了。
C.开锁模块
这个是我当时有做指纹开门想法的时候,最纠结的一块了。声音和指纹都很好想,但是开门要怎么开?要用什么开?于是我就百度,看到了一张图给了我灵感,那就是用电磁铁,可以利用电磁铁通电瞬间的吸力,将门锁拉开。那如何控制电磁铁呢?大概的想法就是利用继电器控制电磁铁的电源,如果指纹比对通过的话,单片机输出信号给继电器,然后继电器的常断端闭合,电磁铁把锁拉开。
三、So Easy的编程
单片机的编程很简单,会编写串口通信那部分就好了,指纹模块购买之后,卖家会给你它的使用文档,里面有通信协议。什么是通信协议呢,就是你的指纹模块收到什么指令会进行采集图像,收到什么指令会进行指纹比对等等。那指令只能靠单片的TXD发啦。我们来整理一下编程思路:
四、下面贴出主要源码
- fingerPrint.c
#include <reg52.h>
#include "qxmcs51_config.h"
#include "delay.h"
#include "uart.h"
#include <stdio.h>
#include <intrins.h>
unsigned char FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};
//协议包头
unsigned char FP_Get_Img[6] = {0x01,0x00,0x03,0x01,0x0,0x05};
//获得指纹图像
unsigned char FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08};
//将图像放入到BUFFER1
unsigned char FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09};
//将图像放入到BUFFER2
unsigned char FP_Search[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x03,0xA1,0x0,0xB2};
//搜索指纹搜索范围0 - 929
//以上可以根据通信协议写出
extern unsigned char RECEVICE_BUFFER[24];
sbit beep = P2^3;
sbit door = P1^2;
sbit voice = P1^3;
void GetImage() //获取指纹图像
{
unsigned char i;
for(i=0;i<6;i++) //发送包头
Send_uart(FP_Pack_Head[i]);
for(i=0;i<6;i++) //发送命令
Send_uart(FP_Get_Img[i]);
Recevice_Data(0x0C);
}
void GenChar() //提取指纹特征
{
unsigned char i;
for(i=0;i<6;i++) //发送包头
Send_uart(FP_Pack_Head[i]);
for(i=0;i<7;i++) //发送命令
Send_uart(FP_Img_To_Buffer1[i]);
Recevice_Data(0x0C);
}
void Search() //在指纹库中进行比对
{
unsigned char i;
for(i=0;i<6;i++) //发送包头
Send_uart(FP_Pack_Head[i]);
for(i=0;i<11;i++) //发送命令
Send_uart(FP_Search[i]);
Recevice_Data(0x10);
if(RECEVICE_BUFFER[9]==0x00)
{
door = 0;
voice = 1;
Delay_Ms(2000);
door = 1;
}
else
{
door = 1;
voice =0;
}
}
- uart.c
#include <reg52.h>
#include <stdio.h>
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
volatile unsigned char RECEVICE_BUFFER[24];
void UART_init()
{
SCON = 0x50;
TMOD = 0x21;
TCON = 0x40;
TH1 = 0xFF;
TL1 = 0xFF;
PCON = 0x80;
RI = 0;
TI = 0;
TR1 = 1;
EA = 1; //开总中断
ES = 1; //串口中断打开
EX0 = 1;
IT0 = 0;
}
void Send_uart(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
unsigned char Receive_uart()
{
unsigned char dat;
while(!RI);
RI = 0;
dat = SBUF;
return (dat);
}
void Recevice_Data(unsigned char length)
{
unsigned char i;
for (i=0;i<length;i++)
RECEVICE_BUFFER[i] = Receive_uart();
}
- main.c
#include "qxmcs51_config.h"
#include "delay.h"
#include "uart.h"
#include "GetImage.h"
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
extern voice;
void main()
{
Delay_Ms(100);
UART_init();
voice = 0;
while(1);
}
void int0() interrupt 0
{
GetImage();
GenChar();
Search();
}
五、总结一下下
学校附近很坑,各种材料都没有地方能买,只能从某宝买,我觉得我等快递的时间比我真正做东西的时间还长QAQ。其实还有很多小细节没有写,比如电磁铁的要求电压是24V,电流6A,那我怎么得到这样的电压电流呢。。因为我真的不懂电路,所以只能买了一个24V,10A的开关电源。还有电磁铁的拉力至关重要,第一次买的电磁铁拉力太小拉不开,只好又买了一个拉力大的。甚至螺丝的大小都要量一下,不然东西固定不到门上。然后还有单片机怎么供电?开关电源怎么供电等等,这些都是需要考虑的问题啦。
所以做完这个东西虽然花了不少钱,但还是蛮开心的,学到的东西还算是有点用?
大家有什么问题可以评论里问啦。
再加一句,大神不要来嘲笑我!!!我只是一个渣渣。。。。
over。。。