找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3060|回复: 2
收起左侧

单片机fm70指纹门禁源程序PCB工程 蓝牙通信输出pwm控制舵机动作

[复制链接]
ID:410995 发表于 2020-11-20 17:46 | 显示全部楼层 |阅读模式
stc11f02e 单片机
fm70指纹模块 jdy-31蓝牙模块

蓝牙发送命令 增加 删除 查询
没有加入密码 连接蓝牙后可以直接发送命令

输出pwm控制舵机动作
由于ad不太会用 画了一个比较low的板子
买的贴片 又转成DIP的

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
123.jpg

大佬勿喷  新手入门

部分单片机代码如下:

  1. #include<fm70.h>
  2. u8 AutoLogin[11]={0x01,0x00,0x08,0x54,0x55,0x02,0x00,0x00,0x01,0x00,0x00}; //5.5s  2次 序号*2 可重复 校验和
  3. u8 DeleteChar[10]={0x01,0x00,0x07,0x0c,0x00,0x00,0x00,0x01,0x00,0x00};//删除
  4. u8 ValidN;//模板个数
  5. u16 MathScore;//得分
  6. u16 IDs_temp;
  7. u8 recive_num;//确认码
  8. bit Recive_Error;//校验和错误
  9. bit Open_Flag;//开门标志
  10. void Delay500us()                //@11.0592MHz
  11. {
  12.         unsigned char i, j;

  13.         i = 6;
  14.         j = 93;
  15.         do
  16.         {
  17.                 while (--j);
  18.         } while (--i);
  19. }
  20. void Uart_Send(u8 sta) //发送
  21. {
  22.         SBUF=sta;
  23.         while(!TI);
  24.         TI=0;        
  25. }
  26. u8 Uart_Recevie()//接收
  27. {
  28.         u8 sta;
  29.         while(!RI);
  30.         RI=0;
  31.         sta=SBUF;
  32.         return (sta);
  33. }
  34. void SendCmd(u8 *cmd,u8 len)//发送命令
  35. {
  36.         u8 i;
  37.         for(i=0;i<6;i++)
  38.                 Uart_Send(PackHead[i]);//发送包头
  39.         for(i=0;i<len;i++)
  40.                 Uart_Send(cmd[i]);
  41. }
  42. void Send_Char(u8 *str)//发送信息
  43. {
  44.         u8 *s;
  45.         s=str;
  46.         AUXR1=0x80;//=1 ->P1    =0 ->P3
  47.         Delay500us();
  48.         while(*s!='\0')
  49.         {
  50.                 Uart_Send(*s);
  51.                 s++;        
  52.         }
  53.         AUXR1=0x00;//=1 ->P1    =0 ->P3
  54. }
  55. void StoreChar_SetNum()//设置指纹存储数组
  56. {
  57.         u8 i;
  58.         u16 sum_temp=0x00; //校验和临时变量
  59.         AutoLogin[7]=ValidN; //低位
  60.         for(i=0;i<9;i++)   //校验和计数
  61.                 sum_temp+=AutoLogin[i];
  62.         AutoLogin[9]=(u8)(sum_temp>>8);
  63.         AutoLogin[10]=(u8)sum_temp;        
  64. }
  65. void Delete_Finger(u8 delete_id)//删除指纹数据
  66. {
  67.         u8 i;
  68.         u16 sum_temp=0x00;               
  69.         //DeleteChar[4]=(u8)(delete_id>>8);//PageID 高位
  70.         DeleteChar[5]=delete_id;//低位
  71.         for(i=0;i<8;i++)          //校验和计算
  72.                 sum_temp+=DeleteChar[i];
  73.         DeleteChar[8]=(u8)(sum_temp>>8);
  74.         DeleteChar[9]=(u8)sum_temp;
  75.         SendCmd(DeleteChar,10);
  76.         ReviceCmd(6);
  77.         if(Recive_Error)//校验和错误
  78.                 return;        
  79.         if(recive_num==0x10)
  80.                 Send_Char("删除成功!!!\r\n");        
  81.         else if(recive_num==0x00)
  82.                 Send_Char("删除失败!!!\r\n");        
  83. }               
  84. void ReviceCmd(u8 len)//接收包处理
  85. {
  86.         u8 i;
  87.         u16 check_num=0x00;//校验和
  88.         u16 sum_temp=0x00;//数据和
  89.         u8 recive_temp[10];//接收数据缓存
  90.         Recive_Error=0;//校验和标志清零
  91.         for(i=0;i<6;i++)
  92.                 Uart_Recevie();//丢弃前6个数据
  93.         for(i=0;i<len;i++)
  94.                 recive_temp[i]=Uart_Recevie();
  95.         check_num=recive_temp[len-2];
  96.         check_num=(check_num<<8)|recive_temp[len-1];//校验和合并
  97.         for(i=0;i<len-2;i++)
  98.                 sum_temp+=recive_temp[i]; //数据和计算
  99.         if(sum_temp==check_num)
  100.         {
  101.                 if(len==10)//接收的是搜索指纹返回包
  102.                 {        
  103.                         IDs_temp=(recive_temp[4]<<8)|recive_temp[5];//搜索到的指纹号
  104.                         MathScore=(recive_temp[6]<<8)|recive_temp[7];//得分                        
  105.                 }
  106.                 if(len==8)//读取模板个数返回包
  107.                 {
  108.                         //ValidN=recive_temp[4];
  109.                         //ValidN=(ValidN<<8)|recive_temp[5];//模板个数合并
  110.                         ValidN=recive_temp[5];//0xff 直接省略高位数据
  111.                 }                                 
  112.                 recive_num=recive_temp[3];//确认码        
  113.         }
  114.         else
  115.         {
  116.                 Recive_Error=1;
  117.                 Send_Char("校验和错误\r\n");//发送信息
  118.         }
  119. }
  120. void Add_finger()//添加指纹
  121. {
  122.         u8 str[5];
  123.         if(ValidN>=100)
  124.         {
  125.                 Send_Char("指纹库满!!!\r\n");
  126.                 while(wake);
  127.                 return;
  128.         }
  129.         StoreChar_SetNum();//设置指纹存储数组
  130.         ValidN=ValidN+1;//指纹加一
  131.         SendCmd(AutoLogin,11);
  132.         ReviceCmd(6);
  133.         if(Recive_Error)//校验和错误
  134.                 return;        
  135.         if(recive_num!=0x56)
  136.         {
  137.                 Send_Char("第一次采集失败!!!\r\n");
  138.                 while(wake);
  139.                 return;               
  140.         }
  141.         ReviceCmd(6);        
  142.         if(recive_num!=0x00)
  143.         {
  144.                 Send_Char("添加失败!!!\r\n");
  145.                 while(wake);
  146.                 return;               
  147.         }
  148.         Send_Char("添加成功\r\n");
  149.         Send_Char("当前编号:");
  150.         str[0]=AutoLogin[7]/10+0x30;        
  151.         str[1]=AutoLogin[7]%10+0x30;
  152.         str[2]='\0';
  153.         Send_Char(str);
  154.         Send_Char("\r\n");
  155. }
  156. void Search_Finger()//搜索指纹
  157. {
  158.         SendCmd(AutoSearch,11);
  159.         ReviceCmd(10);           //OK_Char
  160.         if(Recive_Error)//校验和错误
  161.                 return;
  162.         if(recive_num==0x09)
  163.         {
  164.                 Send_Char("你是黑户!!!!!!!!\r\n");
  165.                 return;               
  166.         }        
  167.         else if(recive_num==0x00)
  168.         {
  169.                 Send_Char("欢迎回家!\r\n");
  170.                 Open_Door();//开门
  171.         }        
  172. }
  173. void Init_FM70()//初始化模块
  174. {
  175.         SendCmd(GetEcho,6);        
  176.         ReviceCmd(6);//接受包处理
  177.         if(Recive_Error)//校验和错误
  178.                 return;
  179.         if(recive_num!=0x55)
  180.         {
  181.                 Send_Char("设备异常!!!\r\n");
  182.                 Send_Char("即将重启!!!\r\n");
  183.                 Delay400ms();Delay400ms();Delay400ms();        
  184.                 IAP_CONTR=0x40;//重启        
  185.         }
  186.         Send_Char("\r\n系统加载成功!\r\n");        
  187. }
复制代码
51hei.png 51hei.png

全部资料51hei下载地址:
fm70.rar (18 MB, 下载次数: 31)

评分

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

查看全部评分

回复

使用道具 举报

ID:308785 发表于 2021-5-9 08:12 | 显示全部楼层
借阅一下
回复

使用道具 举报

ID:871775 发表于 2021-5-10 21:13 | 显示全部楼层
您好,我想问一下FM70和FM40这两种指纹模块的区别是什么?我打算用51来做,选用FM40是否可行呢?还是用AS608?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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