久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
stm32智能鎖AS608指紋識別程序 按鍵 APP開鎖
[打印本頁]
作者:
tyftyh
時間:
2019-5-30 23:16
標題:
stm32智能鎖AS608指紋識別程序 按鍵 APP開鎖
stm32智能鎖AS608指紋識別 按鍵 APP開鎖
單片機源程序如下:
#include "sys.h"
#include "delay.h"
#include "beep.h"
#include "usart2.h"
#include "key.h"
#include "led.h"
#include "stmflash.h"
#include "string.h"
#include "oled.h"
#include "as608.h"
#include "timer2.h"
#include "usart.h"
#include "bmp.h"
#include "adc.h"
#include "usart3.h"
#include "timer3.h"
#include "gizwits_product.h"
u8 *in_pwd1=0;
u8 *in_pwd2=0;
u8 *in_pwd3=0;
u8 *in_pwd4=0;
u8 *in_pwd5=0;
u8 *in_pwd6=0;
u8 *in_pwd7=0;
u8 *in_pwd8=0;
u8 *str=0;
int fall_time=0;
int in_time=0;
int mykey=0;//控制in_time每按一個按鍵只加一次的坎兒
u8 root_pwd[8]="66666666";//管理員密碼
u8 open_pwd[8]="";//開鎖密碼
#define SIZE_PWD sizeof(open_pwd)
#define FLASH_SAVE_ADDR 0X08070000
#define usart2_baund 57600//串口2波特率,根據指紋模塊波特率更改
SysPara AS608Para;//指紋模塊AS608參數
u16 ValidN;//模塊內有效指紋個數
void root_h(void);//管理員函數
void Add_FR(void); //錄指紋
void Del_FR(void); //刪除指紋
void press_FR(void);//刷指紋
u16 GET_NUM(void);//獲取數值
void AS608_Details(void);//獲取模塊詳情
extern u8 find_string_flag;
extern u8 receive_mode;
//協議初始化
void Gizwits_Init(void)
{
TIM3_Int_Init(9,7199);//1MS系統定時
usart3_init(9600);//WIFI初始化
userInit();//設備狀態結構體初始化
gizwitsInit();//緩沖區初始化
}
int main(void)
{
u8 key_num=0;
u8 *str=0;
int ret;
u16 adcx;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
delay_init(); //初始化延時函數
usart2_init(usart2_baund);//初始化串口2,用于與指紋模塊通訊
USART1_Init_Config(115200); //串口1,用于與A6模塊通信
Timer2_Init_Config(); //定時器2初始化,用于A6模塊
PS_StaGPIO_Init(); //初始化FR讀狀態引腳
BEEP_Init(); //初始化蜂鳴器
KEY_Init();
OLED_Init();
LED_Init();
Adc_Init();
Gizwits_Init(); //協議初始化
receive_mode = 1;
OLED_Clear();
//與AS608模塊握手
do
{
Moto=1;
OLED_ShowString(0,0,"AS608 Ready",8);
delay_ms(400);
OLED_Clear();
OLED_ShowString(0,2,"try connection",8);
OLED_ShowString(0,5,"wait...",8);
delay_ms(800);
OLED_Clear();
}
while(PS_HandShake(&AS608Addr));
while(1)
{
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)open_pwd,SIZE_PWD);
OLED_ShowString(0,0,"Enter 8 password",16);
OLED_ShowString(0,2,"Fingerprint",16);
OLED_ShowNum(0,5,adcx,4,12);//顯示ADC的值
OLED_DrawBMP(88,3,128,8,BMP2);
/***************************指紋解鎖*************************************/
if(PS_Sta) //檢測PS_Sta狀態,如果有手指按下
{
press_FR();//刷指紋
}
/***************************短信解鎖*************************************/
/* set_text_mode();//設置短信
CLR_Buf();
if(find_string_flag == 1)
{
delay_ms(200);//延時一點,讓串口把數據接收完成
if(Find("+CMTI"))//說明接收到了短信
{
ret = read_message();
if(ret == 1)
{
if(Find("ledon"))
{
CLR_Buf();
find_string_flag = 0;
delay_ms(200);
OLED_Clear();//清除之前輸入的密碼
OLED_ShowString(30,0,"Welcome",8);
OLED_ShowString(0,2,"open the door!",8);
delay_ms(1000);
OLED_Clear();
}
if(Find("ledoff"))
{
CLR_Buf();
find_string_flag = 0;
delay_ms(200);
OLED_Clear();//清除之前輸入的密碼
OLED_ShowString(0,2,"close the door!",8);
delay_ms(1000);
OLED_Clear();
}
}
}
} */
/***************************密碼解鎖**********************************/
key_num=keyscan();
if(key_num)
{
switch(key_num)
{
case 1:Del_FR(); key_num=0;break; //刪指紋
case 2:AS608_Details(); key_num=0;break; //詳情
case 3:Add_FR(); key_num=0;break; //錄指紋
case 13:gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入
LED0 = 0;
delay_ms(1000);
LED0 = 1;
key_num=0;
break;
case 16: ret = check_status();
if(ret == 1)
{
ret = send_text_message("SOS!This is a message for help");
delay_ms(1000);
delay_ms(1000);
};
key_num=0;
break;
default: break;
}
}
if(key_num>0)
{
switch(key_num)
{
case 14:str="0";break;
case 4:str="1";break;
case 5:str="2";break;
case 6:str="3";break;
case 7:str="4";break;
case 8:str="5";break;
case 9:str="6";break;
case 10:str="7";break;
case 11:str="8";break;
case 12:str="9";break;
default: break;
}
if(mykey==0)
{
in_time++;
switch(in_time)
{
case 1:in_pwd1=str;OLED_ShowString(0,8,str,8);delay_ms(200);OLED_ShowString(0,8,"*",8);break;
case 2:in_pwd2=str;OLED_ShowString(11,8,str,8);delay_ms(200);OLED_ShowString(11,8,"*",8);break;
case 3:in_pwd3=str;OLED_ShowString(23,8,str,8);delay_ms(200);OLED_ShowString(23,8,"*",8);break;
case 4:in_pwd4=str;OLED_ShowString(35,8,str,8);delay_ms(200);OLED_ShowString(35,8,"*",8);break;
case 5:in_pwd5=str;OLED_ShowString(47,8,str,8);delay_ms(200);OLED_ShowString(47,8,"*",8);break;
case 6:in_pwd6=str;OLED_ShowString(59,8,str,8);delay_ms(200);OLED_ShowString(59,8,"*",8);break;
case 7:in_pwd7=str;OLED_ShowString(71,8,str,8);delay_ms(200);OLED_ShowString(71,8,"*",8);break;
case 8:in_pwd8=str;OLED_ShowString(83,8,str,8);delay_ms(200);OLED_ShowString(83,8,"*",8);break;
}
mykey=1;//設置為1防止再次進入
}
if(in_time==8)
{
if( //普通用戶配對成功
*in_pwd3==open_pwd[2]&&
*in_pwd4==open_pwd[3]&&
*in_pwd5==open_pwd[4]&&
*in_pwd6==open_pwd[5])
{
fall_time=0;
OLED_Clear();//清除之前輸入的密碼
delay_ms(200);
OLED_ShowString(30,0,"Welcome",8);
OLED_ShowString(0,2,"open the door!",8);
Moto=0;
delay_ms(1000);
Moto=1;
delay_ms(1000);
OLED_Clear();
}
else if( *in_pwd1==root_pwd[0]&&//管理員用戶配對成功
*in_pwd2==root_pwd[1]&&
*in_pwd3==root_pwd[2]&&
*in_pwd4==root_pwd[3]&&
*in_pwd5==root_pwd[4]&&
*in_pwd6==root_pwd[5]&&
*in_pwd7==root_pwd[6]&&
*in_pwd8==root_pwd[7])
{
root_h();
}
else//配對失敗
{
OLED_Clear();//清除之前輸入的密碼
delay_ms(200);
OLED_ShowString(0,0,"*Wrong Password*",8);
OLED_ShowString(0,3,"please try again",8);
fall_time++;
LED0=!LED0;//紅燈閃爍提示
delay_ms(300);
LED0=!LED0;
delay_ms(300);
LED0=!LED0;
delay_ms(300);
LED0=!LED0;
LED0=1;
OLED_Clear();
}
in_time=0;
}
if(fall_time==5)
{
ret = check_status();
if(ret == 1)
{
ret = send_text_message("You have entered 5 error passwords");
delay_ms(1000);
delay_ms(1000);
}
fall_time=0;
OLED_Clear();//清除準備顯示鎖定
fall_for_10s();
LED0=1;
OLED_Clear();//清除Has been locked please wait
}
}else{ delay_ms(10); mykey=0;}
/***************************緊急情況**********************************/
adcx=Get_Adc_Average(ADC_Channel_9,10);
if(adcx>1500)
{
OLED_Clear();
delay_ms(200);
OLED_ShowString(0,0,"Warning",8);
ret = check_status();
if(ret == 1)
{
ret = send_text_message("Harmful gas is high, please pay attention to ventilation");
delay_ms(1000);
delay_ms(1000);
};
OLED_Clear();
}
userHandle();//用戶采集
gizwitsHandle((dataPoint_t *)¤tDataPoint);//協議處理
}
}
/***************************** 主函數結束 ***********************************************/
/******************************獲取數值*************************************/
u16 GET_NUM(void)
{
u8 key_num=0;
u16 num=0;
while(1)
{
key_num=keyscan();
if(key_num)
{
if(key_num==1)return 0xFFFF;//‘返回’鍵
if(key_num==3)return 0xFF00;//
if(key_num>3&&key_num<13&&num<99)//‘1-9’鍵(限制輸入3位數)
num =num*10+key_num-3;
if(key_num==13)num =num/10;//‘Del’鍵
if(key_num==14&&num<99)num =num*10;//‘0’鍵
if(key_num==15)return num; //‘Enter’鍵
}
}
}
/****************************************************************************/
/******************************管理員**************************************/
void root_h(void)//管理員用戶函數
{
u8 key_num;
in_time=0;
mykey=0;
in_pwd1="0";
in_pwd2="0";
in_pwd3="0";
in_pwd4="0";
in_pwd5="0";
in_pwd6="0";
in_pwd7="0";
in_pwd8="0";
Moto=0;
delay_ms(1000);
Moto=1;
OLED_Clear();// 清除普通用戶界面提示
OLED_ShowString(30,0,"ROOT MODE",8);
OLED_ShowString(0,2,"* you can change",8);
OLED_ShowString(0,4,"* password here",8);
while(key_num!=82)
{
key_num=keyscan();
if(key_num)
{
switch(key_num)
{
case 14:str="0";break;
case 4:str="1";break;
case 5:str="2";break;
case 6:str="3";break;
case 7:str="4";break;
case 8:str="5";break;
case 9:str="6";break;
case 10:str="7";break;
case 11:str="8";break;
case 12:str="9";break;
default: break;
}
if(mykey==0)
{
in_time++;
switch(in_time)
{
case 1:in_pwd1=str;OLED_ShowString(0,6,str,8);delay_ms(200);OLED_ShowString(0,6,"*",8);break;
case 2:in_pwd2=str;OLED_ShowString(11,6,str,8);delay_ms(200);OLED_ShowString(11,6,"*",8);break;
case 3:in_pwd3=str;OLED_ShowString(23,6,str,8);delay_ms(200);OLED_ShowString(23,6,"*",8);break;
case 4:in_pwd4=str;OLED_ShowString(35,6,str,8);delay_ms(200);OLED_ShowString(35,6,"*",8);break;
case 5:in_pwd5=str;OLED_ShowString(47,6,str,8);delay_ms(200);OLED_ShowString(47,6,"*",8);break;
case 6:in_pwd6=str;OLED_ShowString(59,6,str,8);delay_ms(200);OLED_ShowString(59,6,"*",8);break;
case 7:in_pwd7=str;OLED_ShowString(71,8,str,8);delay_ms(200);OLED_ShowString(71,8,"*",8);break;
case 8:in_pwd8=str;OLED_ShowString(83,8,str,8);delay_ms(200);OLED_ShowString(83,8,"*",8);break;
}
if(in_pwd1=="6"&&in_pwd2=="6"&&in_pwd3=="6"&&in_pwd4=="6"&&in_pwd5=="6"&&in_pwd6=="6"&&in_pwd7=="6"&&in_pwd8=="6")
{
OLED_Clear();//清除輸入新密碼提示以及新密碼
OLED_ShowString(0,0,"Coudle not set",8);
OLED_ShowString(0,4,"REC:12345678",8);
open_pwd[0]=*"1";
open_pwd[1]=*"2";
open_pwd[2]=*"3";
open_pwd[3]=*"4";
open_pwd[4]=*"5";
open_pwd[5]=*"6";
open_pwd[6]=*"7";
open_pwd[7]=*"8";
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)open_pwd,SIZE_PWD);
delay_ms(500);
delay_ms(1000);
}
else
{
open_pwd[0]=*in_pwd1;
open_pwd[1]=*in_pwd2;
open_pwd[2]=*in_pwd3;
open_pwd[3]=*in_pwd4;
open_pwd[4]=*in_pwd5;
open_pwd[5]=*in_pwd6;
open_pwd[6]=*in_pwd7;
open_pwd[7]=*in_pwd8;
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)open_pwd,SIZE_PWD);
delay_ms(500);
delay_ms(1000);
}
mykey=1;//設置為1防止再次進入
}
if(in_time==8)
{
in_time=0;
OLED_Clear();//清除輸入新密碼提示以及新密碼
OLED_ShowString(10,3,"RESET COMPLETE",8);
delay_ms(700);
OLED_Clear();
key_num=82;
}
}
else
{
delay_ms(10);
mykey=0;//放手時,歸零以便下次重新計數
}
}
}
/****************************************************************************/
/***************************AS608詳情************************************/
void AS608_Details(void)
{
u8 ensure;
ensure=PS_ReadSysPara(&AS608Para); //讀參數
if(ensure==0x00)
{
ensure=PS_ValidTempleteNum(&ValidN);//讀庫指紋個數
if(ensure==0x00)
{
OLED_Clear();//清除輸入新密碼提示以及新密碼
OLED_ShowString(25,0,"AS608_Details",8);
OLED_ShowString(0,2,"*Remainder:",8);
OLED_ShowString(0,4,"*Level:",8);
OLED_ShowNum(90,2,AS608Para.PS_max-ValidN,3,12);
OLED_ShowNum(90,4,AS608Para.PS_level,3,12);
delay_ms(1000);
delay_ms(1000);
OLED_Clear();
}
}
}
/****************************************************************************/
/*******************************錄指紋*************************************/
void Add_FR(void)
{
u8 i,ensure ,processnum=0;
u16 ID;
PS_ReadSysPara(&AS608Para); //讀參數
while(1)
{
switch (processnum)
{
case 0:
i++;
OLED_Clear();
OLED_ShowString(0,2,"Press the finger",8);
ensure=PS_GetImage();
if(ensure==0x00)
{
BEEP=1;
ensure=PS_GenChar(CharBuffer1);//生成特征
BEEP=0;
if(ensure==0x00)
{
OLED_Clear();
OLED_ShowString(0,2,"Normal",8);
i=0;
processnum=1;//跳到第二步
}
}
break;
case 1:
i++;
OLED_Clear();
OLED_ShowString(0,2,"Confirm again",8);
ensure=PS_GetImage();
if(ensure==0x00)
{
BEEP=1;
ensure=PS_GenChar(CharBuffer2);//生成特征
BEEP=0;
if(ensure==0x00)
{
OLED_Clear();
OLED_ShowString(0,2,"Normal",8);
i=0;
processnum=2;//跳到第三步
}
}
break;
case 2:
OLED_Clear();
OLED_ShowString(0,2,"Compare...",8);
ensure=PS_Match();
if(ensure==0x00)
{
OLED_Clear();
OLED_ShowString(0,2,"OK",8);
processnum=3;//跳到第四步
}
else
{
OLED_Clear();
OLED_ShowString(0,2,"Fail",8);
OLED_ShowString(0,4,"try again",8);
i=0;
processnum=0;//跳回第一步
}
delay_ms(1200);
break;
case 3:
OLED_Clear();
OLED_ShowString(0,2,"Saving...",8);
ensure=PS_RegModel();
if(ensure==0x00)
{
OLED_Clear();
OLED_ShowString(0,2,"Save success",8);
processnum=4;//跳到第五步
}else {processnum=0;}
delay_ms(1200);
break;
case 4:
OLED_Clear();
OLED_ShowString(0,2,"Input ID",8);
OLED_ShowString(0,4,"0=< ID <=299",8);
OLED_ShowString(0,6,"Your ID:",8);
do
{
ID=GET_NUM();
OLED_ShowNum(70,6,ID,3,12);
delay_ms(1000);
}
while(!(ID<AS608Para.PS_max));//輸入ID必須小于指紋容量的最大值
ensure=PS_StoreChar(CharBuffer2,ID);//儲存模板
if(ensure==0x00)
{
OLED_Clear();
OLED_ShowString(0,2,"Saved to flash",8);
delay_ms(500);
delay_ms(1000);
OLED_Clear();
return ;
}else {processnum=0;}
break;
}
delay_ms(400);
if(i==5)//超過5次沒有按手指則退出
{
OLED_Clear();
OLED_ShowString(0,2,"Out",8);
delay_ms(300);
OLED_Clear();
break;
}
}
}
/****************************************************************************/
/*******************************刷指紋*************************************/
void press_FR(void)
{
SearchResult seach;
u8 ensure;
PS_ReadSysPara(&AS608Para); //讀參數
ensure=PS_GetImage();
if(ensure==0x00)//獲取圖像成功
{
BEEP=1;//打開蜂鳴器
ensure=PS_GenChar(CharBuffer1);
if(ensure==0x00) //生成特征成功
{
BEEP=0;//關閉蜂鳴器
ensure=PS_HighSpeedSearch(CharBuffer1,0,AS608Para.PS_max,&seach);
if(ensure==0x00)//搜索成功
{
OLED_Clear();
OLED_ShowString(30,0,"Welcome",8);
OLED_ShowString(0,2,"open the door!",8);
OLED_ShowString(0,4,"ID:",8);
OLED_ShowNum(20,4,seach.pageID,3,12);
Moto=0;
delay_ms(1000);
Moto=1;
delay_ms(1000);
OLED_Clear();
if(seach.pageID==99)
{
send_text_message("Open the door under special circumstances");
delay_ms(1000);
delay_ms(1000);
}
}
}
BEEP=0;//關閉蜂鳴器
delay_ms(600);
}
}
/****************************************************************************/
/*******************************刪除指紋*************************************/
void Del_FR(void)
{
u8 ensure;
u16 num;
OLED_Clear();
OLED_ShowString(30,0,"Delete FR",8);
OLED_ShowString(0,2,"Input ID",8);
OLED_ShowString(0,4,"0=< ID <=299",8);
OLED_ShowString(0,6,"Your ID:",8);
delay_ms(50);
num=GET_NUM();//獲取返回的數值
if(num==0xFFFF)
goto MENU ; //返回主頁面
else if(num==0xFF00)
ensure=PS_Empty();//清空指紋庫
else
{
OLED_ShowNum(70,6,num,3,12);
delay_ms(1000);
ensure=PS_DeletChar(num,1);//刪除單個指紋
}
if(ensure==0)
{
OLED_Clear();
OLED_ShowString(0,2,"Delete success",8);
}
delay_ms(1000);
OLED_Clear();
MENU:
OLED_Clear();
OLED_ShowString(0,0,"Enter 6 password",16);
OLED_ShowString(0,2,"Fingerprint",16);
OLED_DrawBMP(88,3,128,8,BMP2);
}
復制代碼
所有資料51hei提供下載:
AS608指紋識別修改.7z
(260.72 KB, 下載次數: 242)
2019-5-31 18:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
lxc630
時間:
2019-6-2 09:21
學習了。。。
作者:
yishio
時間:
2019-6-9 16:23
好好學習一下
作者:
yishio
時間:
2019-6-9 16:24
好好學習一下 正好用到
作者:
18668033313
時間:
2019-9-5 18:14
受教了
作者:
aaaaaa。
時間:
2019-10-12 19:18
樓主,太厲害了
作者:
aaaaaa。
時間:
2019-10-12 19:19
能不能分享一下原理圖
作者:
ben0148
時間:
2020-1-8 10:22
辛苦樓主了,學習下!
作者:
王蘇凱ly
時間:
2021-2-19 20:09
AS608與MCU怎么連線啊
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
狠狠躁18三区二区一区
|
日韩在线免费视频
|
亚洲欧美日韩网站
|
69堂永久69tangcom
|
国产精品美女久久久久久久久久久
|
国产精品1区2区3区 国产在线观看一区
|
麻豆久久久久久久
|
亚洲精品第一国产综合野
|
亚洲一区二区免费
|
av免费网站在线观看
|
久久久久久久久99精品
|
国产专区在线
|
国产精品夜夜夜一区二区三区尤
|
国产一级一级国产
|
在线播放91
|
日韩精品视频中文字幕
|
国产视频福利
|
国产我和子的乱视频网站
|
黄片毛片
|
人成久久
|
少妇诱惑av
|
久久亚洲国产精品日日av夜夜
|
亚洲激情在线观看
|
日本免费黄色
|
欧美成年黄网站色视频
|
羞羞视频在线观免费观看
|
亚洲最大看片网站
|
91免费版在线观看
|
欧美黄色性生活视频
|
成人免费福利
|
www精品美女久久久tv
|
91精品国产91久久久久久最新
|
国产欧美一区二区在线观看
|
天天躁日日躁aaaa视频
|
亚洲女人天堂成人av在线
|
日本三级播放
|
欧美v日韩v
|
亚洲视频 欧美视频
|
色接久久
|
欧美精品一区二区免费
|
免费一区二区
|