stc11f02e 单片机
fm70指纹模块 jdy-31蓝牙模块
蓝牙发送命令 增加 删除 查询
没有加入密码 连接蓝牙后可以直接发送命令
输出pwm控制舵机动作
由于ad不太会用 画了一个比较low的板子
买的贴片 又转成DIP的
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
大佬勿喷 新手入门
部分单片机代码如下:
- #include<fm70.h>
- u8 AutoLogin[11]={0x01,0x00,0x08,0x54,0x55,0x02,0x00,0x00,0x01,0x00,0x00}; //5.5s 2次 序号*2 可重复 校验和
- u8 DeleteChar[10]={0x01,0x00,0x07,0x0c,0x00,0x00,0x00,0x01,0x00,0x00};//删除
- u8 ValidN;//模板个数
- u16 MathScore;//得分
- u16 IDs_temp;
- u8 recive_num;//确认码
- bit Recive_Error;//校验和错误
- bit Open_Flag;//开门标志
- void Delay500us() //@11.0592MHz
- {
- unsigned char i, j;
- i = 6;
- j = 93;
- do
- {
- while (--j);
- } while (--i);
- }
- void Uart_Send(u8 sta) //发送
- {
- SBUF=sta;
- while(!TI);
- TI=0;
- }
- u8 Uart_Recevie()//接收
- {
- u8 sta;
- while(!RI);
- RI=0;
- sta=SBUF;
- return (sta);
- }
- void SendCmd(u8 *cmd,u8 len)//发送命令
- {
- u8 i;
- for(i=0;i<6;i++)
- Uart_Send(PackHead[i]);//发送包头
- for(i=0;i<len;i++)
- Uart_Send(cmd[i]);
- }
- void Send_Char(u8 *str)//发送信息
- {
- u8 *s;
- s=str;
- AUXR1=0x80;//=1 ->P1 =0 ->P3
- Delay500us();
- while(*s!='\0')
- {
- Uart_Send(*s);
- s++;
- }
- AUXR1=0x00;//=1 ->P1 =0 ->P3
- }
- void StoreChar_SetNum()//设置指纹存储数组
- {
- u8 i;
- u16 sum_temp=0x00; //校验和临时变量
- AutoLogin[7]=ValidN; //低位
- for(i=0;i<9;i++) //校验和计数
- sum_temp+=AutoLogin[i];
- AutoLogin[9]=(u8)(sum_temp>>8);
- AutoLogin[10]=(u8)sum_temp;
- }
- void Delete_Finger(u8 delete_id)//删除指纹数据
- {
- u8 i;
- u16 sum_temp=0x00;
- //DeleteChar[4]=(u8)(delete_id>>8);//PageID 高位
- DeleteChar[5]=delete_id;//低位
- for(i=0;i<8;i++) //校验和计算
- sum_temp+=DeleteChar[i];
- DeleteChar[8]=(u8)(sum_temp>>8);
- DeleteChar[9]=(u8)sum_temp;
- SendCmd(DeleteChar,10);
- ReviceCmd(6);
- if(Recive_Error)//校验和错误
- return;
- if(recive_num==0x10)
- Send_Char("删除成功!!!\r\n");
- else if(recive_num==0x00)
- Send_Char("删除失败!!!\r\n");
- }
- void ReviceCmd(u8 len)//接收包处理
- {
- u8 i;
- u16 check_num=0x00;//校验和
- u16 sum_temp=0x00;//数据和
- u8 recive_temp[10];//接收数据缓存
- Recive_Error=0;//校验和标志清零
- for(i=0;i<6;i++)
- Uart_Recevie();//丢弃前6个数据
- for(i=0;i<len;i++)
- recive_temp[i]=Uart_Recevie();
- check_num=recive_temp[len-2];
- check_num=(check_num<<8)|recive_temp[len-1];//校验和合并
- for(i=0;i<len-2;i++)
- sum_temp+=recive_temp[i]; //数据和计算
- if(sum_temp==check_num)
- {
- if(len==10)//接收的是搜索指纹返回包
- {
- IDs_temp=(recive_temp[4]<<8)|recive_temp[5];//搜索到的指纹号
- MathScore=(recive_temp[6]<<8)|recive_temp[7];//得分
- }
- if(len==8)//读取模板个数返回包
- {
- //ValidN=recive_temp[4];
- //ValidN=(ValidN<<8)|recive_temp[5];//模板个数合并
- ValidN=recive_temp[5];//0xff 直接省略高位数据
- }
- recive_num=recive_temp[3];//确认码
- }
- else
- {
- Recive_Error=1;
- Send_Char("校验和错误\r\n");//发送信息
- }
- }
- void Add_finger()//添加指纹
- {
- u8 str[5];
- if(ValidN>=100)
- {
- Send_Char("指纹库满!!!\r\n");
- while(wake);
- return;
- }
- StoreChar_SetNum();//设置指纹存储数组
- ValidN=ValidN+1;//指纹加一
- SendCmd(AutoLogin,11);
- ReviceCmd(6);
- if(Recive_Error)//校验和错误
- return;
- if(recive_num!=0x56)
- {
- Send_Char("第一次采集失败!!!\r\n");
- while(wake);
- return;
- }
- ReviceCmd(6);
- if(recive_num!=0x00)
- {
- Send_Char("添加失败!!!\r\n");
- while(wake);
- return;
- }
- Send_Char("添加成功\r\n");
- Send_Char("当前编号:");
- str[0]=AutoLogin[7]/10+0x30;
- str[1]=AutoLogin[7]%10+0x30;
- str[2]='\0';
- Send_Char(str);
- Send_Char("\r\n");
- }
- void Search_Finger()//搜索指纹
- {
- SendCmd(AutoSearch,11);
- ReviceCmd(10); //OK_Char
- if(Recive_Error)//校验和错误
- return;
- if(recive_num==0x09)
- {
- Send_Char("你是黑户!!!!!!!!\r\n");
- return;
- }
- else if(recive_num==0x00)
- {
- Send_Char("欢迎回家!\r\n");
- Open_Door();//开门
- }
- }
- void Init_FM70()//初始化模块
- {
- SendCmd(GetEcho,6);
- ReviceCmd(6);//接受包处理
- if(Recive_Error)//校验和错误
- return;
- if(recive_num!=0x55)
- {
- Send_Char("设备异常!!!\r\n");
- Send_Char("即将重启!!!\r\n");
- Delay400ms();Delay400ms();Delay400ms();
- IAP_CONTR=0x40;//重启
- }
- Send_Char("\r\n系统加载成功!\r\n");
- }
复制代码
全部资料51hei下载地址:
fm70.rar
(18 MB, 下载次数: 31)
|