舍友老忘带钥匙 我就做了个简易的指纹锁,宿舍六个人用第一次上传这个 比较简陋哈~ 注释我写的很详细(自以为)
要是能帮到大家,那就很好了
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- sbit zhen=P2^0; //电动机正转,拉把手开门
- sbit fan=P2^1; //电动机反转,复位门把手
- sbit led_work=P2^2; //单片机已经初始化完成指示LED兼检测门把手位置指示灯
- sbit check=P2^3; //干簧管位置检测,门开为1
- sbit pressed=P2^6; //指纹模块触摸检测
- sbit wakeup=P2^7; //指纹模块上电控制,1为模块上电,0为关闭
- sbit test=P3^3; //测试开门
- //////////////////////////////////////////////////////////////////////////
- volatile unsigned char FPM10A_RECEICE_BUFFER[32]; //定义接收缓存区
- code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //协议包头
- code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05}; //获得指纹图像
- code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //将图像放入到BUFFER1
- code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x64,0x00,0x72}; //搜索指纹搜索范围0 - 999,使用BUFFER1中的特征码搜索
- //////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////
- // 定时 //
- /////////////////////////////////////////////
- void delay1s(void) //定时1S,晶振11.0592MHZ
- {
- unsigned char a,b,c;
- for(c=13;c>0;c--)
- for(b=247;b>0;b--)
- for(a=142;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- void delay100ms(void) //定时100MS,晶振11.0592MHZ
- {
- unsigned char a,b;
- for(b=221;b>0;b--)
- for(a=207;a>0;a--);
- }
- void delay500ms(void) //500ms
- {
- unsigned char a,b,c;
- for(c=98;c>0;c--)
- for(b=127;b>0;b--)
- for(a=17;a>0;a--);
- _nop_();
- }
- void delay1_6_f(void) //误差 0us
- {
- unsigned char a,b,c;
- for(c=218;c>0;c--)
- for(b=131;b>0;b--)
- for(a=23;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- void delay50ms(void) //误差 0us
- {
- unsigned char a,b;
- for(b=173;b>0;b--)
- for(a=143;a>0;a--);
- }
- void delay10ms(void) //误差 0us
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- /////////////////////////////////////////////
- void kaisuo(void)
- {
- int t;
- zhen=fan=0;
- zhen=1; //电动机正转启动
- for(t=0;t<45;t++) //50ms为一个段,共2.25s,控制最大拉动时间,防止出现意外正转过久把手被拉坏
- {
- if(check==0)
- {
- delay10ms(); //等待10ms,干簧管消抖
- if(check==0) //再次检测
- {
- led_work=0;//检测到把手就位,指示灯熄灭以指示
- zhen=0; //电机停机
- delay100ms(); //等待100ms,准备反转
- //delay500ms();//等待500ms,准备反转
- fan=1;
- delay1_6_f();//反转1.6s
- fan=0;
- led_work=1;//状态指示灯复位
- check=1;
- return;//跳出循环
- }
-
- }
- else
- {
- delay50ms();//50ms每段
- continue;
- }
-
- }
- zhen=0; //超出时间,停机
- delay100ms();//等待100ms,准备反转
- //delay500ms(); //等待500ms,准备反转
- fan=1;
- delay1_6_f();
- fan=0;
- }
- void Uart_Init(void) //初始化
- {
- //zhen=1;
- //fan=1;
- SCON=0x50; //UART方式1:8位UART; REN=1:允许接收
- PCON=0x00; //SMOD=0:波特率不加倍
- TMOD=0x20; //T1方式2,用于UART波特率
- TH1=0xFD; //UART波特率设置:FDFD(9600)
- TL1=0xFD; //UART波特率设置:FDFD(9600)
- TR1=1; //允许T1计数
- EA=1; //
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //UART发送和接收部分
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Uart_Send_Byte(unsigned char c)//uart发送一个字节
- {
- SBUF = c;
- while(!TI); //发送完为1
- TI = 0;
- }
- unsigned char Uart_Receive_Byte()//UART接受一个字节
- {
- unsigned char dat;
- while(!RI); //接收完为1
- RI = 0;
- dat = SBUF;
- return (dat);
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////
- // AS608/FPM10A指纹模块命令 //
- ////////////////////////////////////////////
- void FPM10A_Cmd_Send_Pack_Head(void) //发送通讯协议包头
- {
- int i;
- for(i=0;i<6;i++)
- {
- Uart_Send_Byte(FPM10A_Pack_Head[i]);
- }
- }
- void FPM10A_Receive_Data(unsigned char ucLength) //接收指纹模块反馈数据缓冲
- {
- unsigned char i;
- for (i=0;i<ucLength;i++)
- FPM10A_RECEICE_BUFFER[i] = Uart_Receive_Byte();
- }
- void FPM10A_Cmd_Get_Img(void) ////FINGERPRINT_获得指纹图像命令(检测是否有指纹)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<6;i++)
- {
- Uart_Send_Byte(FPM10A_Get_Img[i]);
- }
- }
- //讲图像转换成特征码存放在Buffer1中
- void FINGERPRINT_Cmd_Img_To_Buffer1(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<7;i++) //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
- {
- Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
- }
- }
- //搜索指纹库前100枚(可以自己改DATA区的数字 最高999个)
- void FPM10A_Cmd_Search_Finger(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
- for(i=0;i<11;i++)
- {
- Uart_Send_Byte(FPM10A_Search[i]); //接收指纹模块发回的数据
- }
- }
- //搜索是否有指纹,若有则认证
- void FPM10A_Find_Fingerprint()
- {
- FPM10A_Cmd_Get_Img(); //发送获得指纹图像命令
- FPM10A_Receive_Data(12); //接收反馈数据缓冲
- if(FPM10A_RECEICE_BUFFER[9]==0&&pressed==1) //根据反馈回来的第9位数据来判断模块上有无指纹,有则继续执行无则退出
- {
- FINGERPRINT_Cmd_Img_To_Buffer1(); //讲图像转换成特征码存放在Buffer1中
- FPM10A_Receive_Data(12);
- FPM10A_Cmd_Search_Finger(); //搜索全部用户100枚
- FPM10A_Receive_Data(16);
- if(FPM10A_RECEICE_BUFFER[9] == 0) //如果搜索到有相应的指纹
- {
- kaisuo(); //开锁
- //delay500ms();//延迟0.5s
- delay1s();
- wakeup=0;//模块SOC断电
- }
- else
- {
- wakeup=0;//模块SOC断电
- //delay100ms(); //延迟100ms,跳出
- }
- }
- else
- {
- wakeup=0;//模块SOC断电
- }
- }
- //////////////////////////////////////////////
- // 主程序 //
- //////////////////////////////////////////////
- void main()
- {
- //delay1s();//单片机上电,等待1s稳定
- Uart_Init(); //初始化串口
- led_work=0;
- zhen=0;
- fan=0;
- wakeup=0;
- pressed=0;
- test=1;
- check=1; //检测位置干簧管
- led_work=1; //工作指示灯亮,提醒系统已经完成初始化 (测试为0)
- while(1)
- {
- if(pressed==1) //指纹模块是被按下? 按下为1 否则为0
- {
- //Uart_Init();
- wakeup=1; //模块SOC上电
- delay500ms();//延迟0.5s//等待SOC初始化完成
- Uart_Init(); //重新初始化串口
- FPM10A_Find_Fingerprint(); //查找,对比指纹
- }
- else
- {
- if(test==0) //测试开锁
- {
- kaisuo(); //开锁
- delay500ms();//延迟0.5s
- }
- else
- {
- delay100ms(); //指纹模块没被按下 延迟100ms
- }
- }
- }
- }
复制代码
以上程序51hei提供下载:
指纹锁.zip
(2.62 KB, 下载次数: 149)
|