找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6743|回复: 8
收起左侧

基于AS608和51单片机的简易指纹锁源程序

  [复制链接]
ID:518902 发表于 2019-10-25 20:57 | 显示全部楼层 |阅读模式
舍友老忘带钥匙 我就做了个简易的指纹锁,宿舍六个人用第一次上传这个 比较简陋哈~ 注释我写的很详细(自以为)
要是能帮到大家,那就很好了
51hei图片20191025205014.jpg 51hei图片20191025205006.jpg 51hei图片20191025204953.jpg

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit zhen=P2^0;           //电动机正转,拉把手开门
  4. sbit fan=P2^1;           //电动机反转,复位门把手
  5. sbit led_work=P2^2;  //单片机已经初始化完成指示LED兼检测门把手位置指示灯
  6. sbit check=P2^3;        //干簧管位置检测,门开为1
  7. sbit pressed=P2^6;        //指纹模块触摸检测
  8. sbit wakeup=P2^7;  //指纹模块上电控制,1为模块上电,0为关闭
  9. sbit test=P3^3;           //测试开门


  10. //////////////////////////////////////////////////////////////////////////
  11. volatile unsigned char FPM10A_RECEICE_BUFFER[32];        //定义接收缓存区
  12. code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //协议包头
  13. code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05};    //获得指纹图像
  14. code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //将图像放入到BUFFER1
  15. code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x64,0x00,0x72}; //搜索指纹搜索范围0 - 999,使用BUFFER1中的特征码搜索

  16. //////////////////////////////////////////////////////////////////////////

  17. /////////////////////////////////////////////
  18. //                 定时                                           //
  19. /////////////////////////////////////////////
  20. void delay1s(void)   //定时1S,晶振11.0592MHZ
  21. {
  22.     unsigned char a,b,c;
  23.     for(c=13;c>0;c--)
  24.         for(b=247;b>0;b--)
  25.             for(a=142;a>0;a--);
  26.     _nop_();  //if Keil,require use intrins.h
  27. }

  28. void delay100ms(void)   //定时100MS,晶振11.0592MHZ
  29. {
  30.     unsigned char a,b;
  31.     for(b=221;b>0;b--)
  32.         for(a=207;a>0;a--);
  33. }


  34. void delay500ms(void)   //500ms
  35. {
  36.     unsigned char a,b,c;
  37.     for(c=98;c>0;c--)
  38.         for(b=127;b>0;b--)
  39.             for(a=17;a>0;a--);
  40.     _nop_();
  41. }

  42. void delay1_6_f(void)   //误差 0us
  43. {
  44.     unsigned char a,b,c;
  45.     for(c=218;c>0;c--)
  46.         for(b=131;b>0;b--)
  47.             for(a=23;a>0;a--);
  48.     _nop_();  //if Keil,require use intrins.h
  49. }

  50. void delay50ms(void)   //误差 0us
  51. {
  52.     unsigned char a,b;
  53.     for(b=173;b>0;b--)
  54.         for(a=143;a>0;a--);
  55. }

  56. void delay10ms(void)   //误差 0us
  57. {
  58.     unsigned char a,b,c;
  59.     for(c=1;c>0;c--)
  60.         for(b=38;b>0;b--)
  61.             for(a=130;a>0;a--);
  62. }

  63. /////////////////////////////////////////////


  64. void kaisuo(void)
  65. {
  66.         int t;
  67.         zhen=fan=0;
  68.         zhen=1;                   //电动机正转启动
  69.         for(t=0;t<45;t++)          //50ms为一个段,共2.25s,控制最大拉动时间,防止出现意外正转过久把手被拉坏
  70.         {
  71.         if(check==0)
  72.                 {
  73.                  delay10ms();         //等待10ms,干簧管消抖
  74.                  if(check==0)  //再次检测
  75.                  {
  76.                  led_work=0;//检测到把手就位,指示灯熄灭以指示
  77.                  zhen=0;  //电机停机
  78.                  delay100ms(); //等待100ms,准备反转
  79.                  //delay500ms();//等待500ms,准备反转
  80.                  fan=1;
  81.                  delay1_6_f();//反转1.6s
  82.                  fan=0;
  83.                  led_work=1;//状态指示灯复位
  84.                  check=1;
  85.                  return;//跳出循环
  86.                  }
  87.                  
  88.                 }
  89.                 else
  90.                 {
  91.                 delay50ms();//50ms每段
  92.                 continue;
  93.                 }
  94.                        
  95.         }
  96.         zhen=0;        //超出时间,停机
  97.         delay100ms();//等待100ms,准备反转
  98.         //delay500ms(); //等待500ms,准备反转
  99.         fan=1;
  100.         delay1_6_f();
  101.         fan=0;
  102. }


  103. void Uart_Init(void) //初始化
  104. {
  105.         //zhen=1;
  106.         //fan=1;
  107.     SCON=0x50;   //UART方式1:8位UART;   REN=1:允许接收
  108.     PCON=0x00;   //SMOD=0:波特率不加倍
  109.     TMOD=0x20;   //T1方式2,用于UART波特率
  110.     TH1=0xFD;          //UART波特率设置:FDFD(9600)
  111.     TL1=0xFD;   //UART波特率设置:FDFD(9600)
  112.     TR1=1;         //允许T1计数
  113.     EA=1;         //
  114. }
  115. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



  116. //UART发送和接收部分
  117. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  118. void Uart_Send_Byte(unsigned char c)//uart发送一个字节
  119. {
  120.         SBUF = c;
  121.         while(!TI);                //发送完为1
  122.         TI = 0;
  123. }

  124. unsigned char Uart_Receive_Byte()//UART接受一个字节
  125. {       
  126.         unsigned char dat;
  127.         while(!RI);         //接收完为1
  128.         RI = 0;
  129.         dat = SBUF;
  130.         return (dat);
  131. }
  132. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  133. ////////////////////////////////////////////
  134. //         AS608/FPM10A指纹模块命令                  //
  135. ////////////////////////////////////////////

  136. void FPM10A_Cmd_Send_Pack_Head(void)   //发送通讯协议包头
  137. {
  138.         int i;       
  139.         for(i=0;i<6;i++)
  140.    {
  141.                 Uart_Send_Byte(FPM10A_Pack_Head[i]);   
  142.    }               
  143. }

  144. void FPM10A_Receive_Data(unsigned char ucLength) //接收指纹模块反馈数据缓冲
  145. {
  146.   unsigned char i;

  147.   for (i=0;i<ucLength;i++)
  148.      FPM10A_RECEICE_BUFFER[i] = Uart_Receive_Byte();

  149. }

  150. void FPM10A_Cmd_Get_Img(void)                ////FINGERPRINT_获得指纹图像命令(检测是否有指纹)
  151. {
  152.     unsigned char i;
  153.     FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
  154.     for(i=0;i<6;i++)
  155.         {
  156.        Uart_Send_Byte(FPM10A_Get_Img[i]);
  157.         }
  158. }
  159. //讲图像转换成特征码存放在Buffer1中
  160. void FINGERPRINT_Cmd_Img_To_Buffer1(void)
  161. {
  162.         unsigned char i;
  163.         FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头      
  164.            for(i=0;i<7;i++)   //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
  165.      {
  166.              Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);                  
  167.             }
  168. }

  169. //搜索指纹库前100枚(可以自己改DATA区的数字 最高999个)
  170. void FPM10A_Cmd_Search_Finger(void)
  171. {
  172.        unsigned char i;                       
  173.                          FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
  174.        for(i=0;i<11;i++)
  175.            {
  176.                   Uart_Send_Byte(FPM10A_Search[i]);    //接收指纹模块发回的数据
  177.                       }
  178. }

  179. //搜索是否有指纹,若有则认证
  180. void FPM10A_Find_Fingerprint()
  181. {
  182.   FPM10A_Cmd_Get_Img();                                         //发送获得指纹图像命令
  183.   FPM10A_Receive_Data(12);                                  //接收反馈数据缓冲
  184.   if(FPM10A_RECEICE_BUFFER[9]==0&&pressed==1)                 //根据反馈回来的第9位数据来判断模块上有无指纹,有则继续执行无则退出
  185.   {
  186.     FINGERPRINT_Cmd_Img_To_Buffer1();          //讲图像转换成特征码存放在Buffer1中
  187.         FPM10A_Receive_Data(12);               
  188.         FPM10A_Cmd_Search_Finger();                                //搜索全部用户100枚
  189.         FPM10A_Receive_Data(16);
  190.         if(FPM10A_RECEICE_BUFFER[9] == 0) //如果搜索到有相应的指纹  
  191.         {
  192.           kaisuo();         //开锁
  193.           //delay500ms();//延迟0.5s
  194.           delay1s();
  195.       wakeup=0;//模块SOC断电
  196.         }
  197.         else
  198.         {
  199.          wakeup=0;//模块SOC断电
  200.          //delay100ms(); //延迟100ms,跳出
  201.         }
  202.   }
  203.           else
  204.         {
  205.         wakeup=0;//模块SOC断电
  206.         }
  207. }


  208. //////////////////////////////////////////////

  209. //               主程序                                             //

  210. //////////////////////////////////////////////
  211. void main()         
  212. {
  213. //delay1s();//单片机上电,等待1s稳定
  214. Uart_Init();   //初始化串口
  215. led_work=0;
  216. zhen=0;
  217. fan=0;
  218. wakeup=0;
  219. pressed=0;
  220. test=1;
  221. check=1;           //检测位置干簧管
  222. led_work=1;           //工作指示灯亮,提醒系统已经完成初始化  (测试为0)
  223.         while(1)
  224.         {
  225.                 if(pressed==1)         //指纹模块是被按下? 按下为1 否则为0
  226.                 {
  227.                 //Uart_Init();
  228.                 wakeup=1; //模块SOC上电
  229.                 delay500ms();//延迟0.5s//等待SOC初始化完成
  230.                 Uart_Init(); //重新初始化串口
  231.                 FPM10A_Find_Fingerprint(); //查找,对比指纹
  232.                 }
  233.                 else
  234.                 {
  235.                 if(test==0)                        //测试开锁
  236.                 {
  237.                 kaisuo();         //开锁
  238.             delay500ms();//延迟0.5s
  239.                 }
  240.                 else
  241.                 {
  242.                 delay100ms();         //指纹模块没被按下 延迟100ms
  243.                 }                 
  244.                 }       
  245.         }
  246. }
复制代码

以上程序51hei提供下载:
指纹锁.zip (2.62 KB, 下载次数: 149)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:425617 发表于 2019-11-11 09:03 | 显示全部楼层
这个程序可以成功执行吗?
回复

使用道具 举报

ID:647444 发表于 2019-11-22 19:28 | 显示全部楼层
这东西可以运行吗??还有你的电路图拿一些东西呢??不全面啊。
回复

使用道具 举报

ID:647375 发表于 2019-11-22 21:13 | 显示全部楼层
程序可以运行吗?
回复

使用道具 举报

ID:676417 发表于 2019-12-30 10:58 来自手机 | 显示全部楼层
最近也在研究这个,感谢分享,不知道附件资料是否齐全。
回复

使用道具 举报

ID:681382 发表于 2020-1-5 04:32 | 显示全部楼层
请问有原理图吗
回复

使用道具 举报

ID:782179 发表于 2020-6-17 16:28 | 显示全部楼层
这个程序的点击是继电器吗
回复

使用道具 举报

ID:882360 发表于 2021-2-2 17:38 | 显示全部楼层
请问有原理图吗
回复

使用道具 举报

ID:503677 发表于 2021-5-9 10:16 | 显示全部楼层
怎么修改串口通信的引脚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表