這是一個基于AS608+STC89C52單片機的指紋識別和鍵盤密碼鎖。本文尾部有完成c語言程序,原理圖,pcb文件附件。
3.png (234.4 KB)
下載附件
2021-6-13 02:39 上傳
原理圖截圖:
2.png (81.47 KB)
下載附件
2021-6-13 02:40 上傳
pcb文件截圖:
1.png (123.99 KB)
下載附件
2021-6-13 02:40 上傳
部分源碼:
- /*********************************************************
- 函數名稱:bit Command(uchar *p,uchar MaxTime)
- 函數作用:命令解析,給模塊發送一個命令
- 參數說明:*p指令,MaxTime延時時長
- *********************************************************/
- bit Command(u8 *p,u8 MaxTime)
- {
- u8 count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;
-
- bit result=0, start=0,stop=0;
- UART_send_char(0xef);//數據包包頭識別碼
- UART_send_char(0x01);//數據包包頭識別碼
- i=p[0];//數組的第“0”個元素、里面存放了本數組的長度,把這個長度給變量i,方便進行操作
- for(count=2; count<i;count++)//發送數據包
- UART_send_char(p[count]); //將數據發送出去
-
- result=TURE; //發送完成,結果為真 (真為1)
- FifoNumber=0;//清除接收的數據個數
- for(count=0;count<=MAX_NUMBER;count++)//清空所有FIFO[]數組里面的內容,寫入0X00
- FIFO[count]=0x00;
- if(result)
- {
- result=FALSE;
- start =FALSE;
- stop =FALSE;
- count=0;
- clk0=0; //清零CL0計數
-
- do /////////////////////////////do的內容////////////////////////////////
- {
- restart0:
- if (RI==1)//如果接收到數據
- {
- tmpdat=SBUF;//先把接收到的數據放到tmpdat中
- RI=0; //軟件清除接收標志
- if((tmpdat==0xef)&&(start==FALSE))//這個數據為第一個傳回來的數據,也就是“指令應答”的第一個字節
- {
- count=0;
- FIFO[0]=tmpdat;//讀入第一個應答字節(0XEF),存在第“0”個元素中
- flag=1;
- goto
- restart0;//可以用中斷方式進行
-
- }
- if(flag==1)//第一個字節已經回來,所以flag==1成立
- {
- if(tmpdat!=0x01)//接收數據錯誤,將重新從緩沖區接收數據
- {
- flag=0;//接收應答失敗
- result=FALSE;
- start =FALSE;
- stop=FALSE;
- count=0;
- goto
- restart0;
- }
- //如果成功接收到0xef01,可以開始接收數據
- flag=2;//flag=2;表示應答成功,可以開始接收數據了
- count++;//現在count=1;
- FIFO[count]=tmpdat;//讀入第二個應答字節(0X01),存在第“1”個元素中
- start=TURE; //應答成功可以開始接收數據
- goto
- restart0;
- }
- if((flag==2)&&(start==TURE))//flag=2;表示應答成功,可以開始接收數據了
- {
- count++;//數據元素下標++
- FIFO[count]=tmpdat;//存入數據
- if(count>=6)
- {
- checksum=FIFO[count]+checksum;//計算校驗和
- }
- if(count==8)
- {
- package=FIFO[7]*0X100+FIFO[8];//計算包長度
- stop= TURE;
- }
- if(stop)
- {
- if(count==package+8)
- {
- checksum=checksum-FIFO[count-1] - FIFO[count];
- if(checksum != (FIFO[count]&0xff))
- result=FALSE; //校驗失敗,置結果標志為0
- else
- result=TURE;
- flag=0;
- break;
- }
- }
- }
- }
- }
- while((clk0<=MaxTime)&&(count<=MAX_NUMBER));//由定時器以及最大接收數據來控制,保證不會在此一直循環
-
- FifoNumber=count;//保存接收到的數據個數
- }
- return (result);//返回操作是否成功
- }
- /*********************************************************
- 函數名稱:uchar ImgProcess(uchar BUFID)
- 函數作用:發獲取圖像并生成特征文件,存入BUFID中
- 參數說明:BUFID為緩沖區號
- *********************************************************/
- u8 ImgProcess(u8 BUFID)
- {
- if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功
- {
- if(BUFID==1) //生成指紋特征1
- {
- if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功
- return 1;
- else
- return 0;
- }
- else if(BUFID==2)//生成指紋特征2
- {
- if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00))//操作成功
- return 1;
- else
- return 0;
- }
- }
- else
- return 0;
- return 0;
- }
- /*********************************************************
- 函數名稱:uchar search()
- 函數作用:搜索指紋
- 參數說明:返回指紋序號
- *********************************************************/
- u8 search()
- {
- u8 SearchBuf=0;
- if (ImgProcess(1)==1)//首先讀入一次指紋
- {
- if(Command(SEAT,60) && (FifoNumber==15) && (FIFO[9]==0x00))//進行指紋比對,如果搜索到,返回搜索到的指紋序號
- return FIFO[10]*0x100+FIFO[11];
- else
- return 255;
- }
- return 0;
- }
- /*********************************************************
- 函數名稱:bit savefingure(uchar ID)
- 函數作用:保存指紋
- 參數說明:指定保存的序號
- *********************************************************/
- bit savefingure(u8 ID)
- {
- u8 i;
- //現在開始進行存儲指紋模板的操作
- for (i=0;i<16;i++) //獲取保存指紋信息指令
- {
- FIFO[i]=STOR[i];
- }
- FIFO[12]=ID; //把指紋模板存放的PAGE_ID也就是FLASH的位置
- FIFO[14]=FIFO[14]+ID; //重新計算校驗和
-
- if (Command(FIFO,70)==1)//成功返回1 //此處進行存放指紋模板的命令
- {return(1);}
- else
- {return(0);} //不成功返回0
- }
- /*********************************************************
- 函數名稱:bit dellfingure(uchar ID)
- 函數作用:刪除指紋
- 參數說明:指定序號刪除
- *********************************************************/
- bit dellfingure(u8 ID)
- {
- u8 i;
- //現在開始進行存儲指紋模板的操作
- for (i=0;i<16;i++) //獲取刪除指紋信息指令
- {
- FIFO[i]=DELE_one[i];
- }
- FIFO[11]=ID; //把指紋模板存放的PAGE_ID也就是FLASH的位置
- FIFO[15]=FIFO[15]+ID; //重新計算校驗和
-
- if (Command(FIFO,70)==1)//成功返回1//此處進行存放指紋模板的命
- {return(1);}
- else
- {return(0);} //不成功返回0
- }
- /*********************************************************
- 函數名稱:bit Clear_All()
- 函數作用:清空指紋庫
- 參數說明:返回1成功,返回0失敗
- *********************************************************/
- bit Clear_All()
- {
- if(Command(DELE_all,50)==1)
- return(1);
- else
- return(0);
- }
- /*********************************************************
- 函數名稱:uchar enroll()
- 函數作用:采集兩次指紋,生成1個指紋模板
- 參數說明:
- *********************************************************/
- u8 enroll()
- {
- u8 temp=0,count=0;
- while(1)
- {
- temp=ImgProcess(1);//生成特征1
- if (temp==1) //生成特征文件成功
- {
- break;
- }
- else
- {
- if (temp==0)//采集指紋沒有成功
- {
- count++;
- if (count>=40)//如果采集了40次,還不成功,直接采集失敗,直接退出enroll函數----返回0
- return(0);
- }
- }
- }
- //采集第一個特征成功
- count=0;
- delay1ms(500);//延時0.5S開始采集下一個特征
- //開始采集第二個特征
- while(1)
- {
- temp=ImgProcess(2);//生成特征2
- if (temp==1) //生成特征文件2成功
- {
- if((Command(MERG,40)&& (FifoNumber==11) && (FIFO[9]==0x00))==0) //合并不成功返回0,成功返回1
- {
- return 0;
- }
- else//特征文件合并生成模板,結果存于ModelBuffer
- {
- return 1;
- }
- }
- else
- {
- if (temp==1)//采集指紋沒有成功
- {
- count++;
-
- if (count>=25)
-
- return(0);
- }
- }
- }
- }
復制代碼
pcb和原理圖工程文件.zip
(1.09 MB, 售價: 3 E幣)
2021-6-13 02:51 上傳
點擊文件名下載附件
售價: 3 E幣 [記錄]
[ 購買]
指紋密碼鎖完整C源碼.zip
(113.33 KB, 售價: 5 E幣)
2021-6-13 02:53 上傳
點擊文件名下載附件
售價: 5 E幣 [記錄]
[ 購買]
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|
|