這是一個基于AS608+STC89C52單片機的指紋識別和鍵盤密碼鎖。
里面包括程序,原理圖,pcb圖和實物圖。
話不多說直接上圖
制作出來的實物圖如下:
51hei圖片_20210523225053.jpg (86.54 KB, 下載次數: 93)
下載附件
2021-5-23 22:51 上傳
51hei圖片_20210523225102.jpg (79.8 KB, 下載次數: 93)
下載附件
2021-5-23 22:52 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
捕獲.PNG (108.99 KB, 下載次數: 83)
下載附件
2021-5-23 22:55 上傳
51hei.png (49.47 KB, 下載次數: 105)
下載附件
2021-5-24 02:20 上傳
單片機AS608源程序如下:
- /*********************************************************
- 函數名稱: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);
- }
- }
- }
- }
復制代碼
- #include "all.h"
- /************************引腳定義************************/
- sbit relay=P3^6;//繼電器
- sbit buzz=P3^2;//蜂鳴器
- sbit led=P0^0;//LED指示燈
- /************************變量定義************************/
- #define MAX 6 //指紋最大數量
- #define ID_MAX 3//輸入ID最大位數
- u16 T0_num=0;
- u8 mode=0; //0正常打卡,1管理界面,2注冊模式,3刪除模式,4查詢模式,5修改密碼,6校準時鐘,7工作時間
- u8 mode_num=0;
- u16 ID=0; //存儲輸入編號ID
- u8 n=0; //輸入的位數
- bit zhiwen_f=0; //1=標記進入指紋采集
- u8 shu;
- u8 a; //存儲按鍵值
- u8 num; //記錄輸入的密碼位數
- bit in_f; //輸入密碼的標志
- bit reset_f; //重設密碼的標志
- bit input_f; //六位密碼按完的標志
- u8 reset_num; //標記修改密碼階段,=1輸入舊密碼,=2輸入新密碼,=3再次輸入新密碼
- u32 low_mima=0;//系統密碼
- u32 in_mima=0; //暫存輸入的密碼
- u32 new_mima=0;//暫存輸入新密碼
- u8 set_f=0;
- u8 temp[5]=" \0";
- /********************************************************
- 函數名稱:void delayms(uint ms)
- 函數作用:毫秒延時函數
- 參數說明:
- ********************************************************/
- void delayms(u16 ms)
- {
- u8 i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函數名稱:void didi(uchar i)
- 函數作用:蜂鳴器鳴叫
- 參數說明:i為鳴叫次數
- ********************************************************/
- void didi(u8 i)
- {
- u8 j;
- for(j=0;j<i;j++)
- {
- led=0;
- buzz=0;
- delayms(20);
- led=1;
- buzz=1;
- delayms(15);
- }
- }
- /********************************************************
- 函數名稱:void diaplay_mode0()
- 函數作用:顯示打卡主界面
- 參數說明:
- ********************************************************/
- void diaplay_mode0()
- {
- LCD12864_display_string(1,1,"指紋密碼鎖");
- LCD12864_display_string(0,2,"編號: ");
- LCD12864_display_string(0,3,"狀態: ");
- }
- /********************************************************
- 函數名稱:void xunzhiwen()
- 函數作用:查找指紋
- 參數說明:
- ********************************************************/
- void xunzhiwen()
- {
- searchnum=search();//搜索指紋
- if((searchnum>=1&&searchnum<=MAX)||searchnum==255)//最多是MAX個指紋
- {
- if(searchnum>=1&&searchnum<=MAX)//指紋識別成功
- {
- temp[0]=searchnum%1000/100+0x30;
- temp[1]=searchnum%100/10+0x30;
- temp[2]=searchnum%10+0x30;
- temp[3]=' ';
- LCD12864_display_string(3,2,temp);
- LCD12864_display_string(3,3,"指紋解鎖");
- LCD12864_display_string(1,4," ");
- in_mima=0;
- num=0;
- input_f=0;
- relay=0;
- T0_num=0;
- }
- else//不正確的指紋
- {
- LCD12864_display_string(3,3,"無效指紋");
- didi(3);
- }
- delay1ms(500);
- LCD12864_display_string(3,2," ");
- LCD12864_display_string(3,3," ");
- }
- }
- /********************************************************
- 函數名稱:void cunchu()
- 函數作用:存儲指紋
- 參數說明:
- ********************************************************/
- void cunchu()
- {
- LCD12864_display_string(0,3,"狀態: ");
- if(ID>0&&ID<=MAX)
- {
- if(enroll()==1)//采集兩次,生成1個指紋模板成功
- {
- if(savefingure(ID)==1)//保存也成功
- {
- LCD12864_display_string(3,3,"錄入成功");
- AT24C02_write_date(ID,1);
- }
- else
- LCD12864_display_string(3,3,"存儲失敗");
- }
- else
- LCD12864_display_string(3,3,"采集失敗");
- }
- else
- LCD12864_display_string(3,3,"編號錯誤");
- n=0;
- ID=0;
- zhiwen_f=0;
- }
- /********************************************************
- 函數名稱:void shanchu()
- 函數作用:刪除指紋
- 參數說明:
- ********************************************************/
- void shanchu()
- {
- u16 i;
- LCD12864_display_string(0,3,"狀態: ");
- if(ID>0&&ID<=MAX)
- {
- if(dellfingure(ID)==1)
- {
- LCD12864_display_string(3,3,"清空成功");
- AT24C02_write_date(ID,0);
- }
- else
- LCD12864_display_string(3,3,"1清空失敗");
- }
- else
- {
- if(ID==999)
- {
- if(Clear_All()==1)
- {
- for(i=1;i<6;i++)
- AT24C02_write_date(i,0);
- LCD12864_display_string(3,3,"清空指紋");
- }
- else
- LCD12864_display_string(3,3,"清空失敗");
- }
- else
- LCD12864_display_string(3,3,"編號錯誤");
- }
-
- n=0;
- ID=0;
- zhiwen_f=0;
- }
- /********************************************************
- 函數名稱:void display_guanli()
- 函數作用:顯示管理界面
- 參數說明:
- ********************************************************/
- void display_guanli()
- {
- LCD12864_display_string(0,1," 管理系統界面 ");
- LCD12864_display_string(0,2," 錄入指紋 ");
- LCD12864_display_string(0,3," 清空指紋 ");
- LCD12864_display_string(0,4," 修改密碼 ");
- switch(mode_num)
- {
- case 0: LCD12864_display_string(0,2," >> "); break;
- case 1: LCD12864_display_string(0,3," >> "); break;
- case 2: LCD12864_display_string(0,4," >> "); break;
- default: break;
- }
- }
- /*********************************************************
- 函數名稱:void chuli()
- 函數作用:對所按下的按鍵進行處理
- 參數說明:
- *********************************************************/
- void chuli()
- {
- if(key_f==1) //先判斷是否有按鍵按下
- {
- if(a==11&&mode==0&&in_f==0)
- {
- shu++;
- if(shu>=4)
- {
- AT24C02_write_date(200,0);
- AT24C02_write_date(201,0);
- AT24C02_write_date(202,0);
- low_mima=0;
- shu=0;
- }
- }
- else
- shu=0;
- if((mode==2||mode==3)&&a<10) //如果輸入ID狀態,并且按下的是數字鍵
- {
- if(n<ID_MAX)//判斷是否為輸入狀態,并且輸入未滿最大整數位數,才可以繼續輸入
- {
- if(n==0) //判斷為編號第1位
- {
- LCD12864_display_string(3,2," ");
- LCD12864_display_string(0,3," ");
- }
- LCD12864_display_char(3+n,2,a+0x30);//顯示出輸入的數字 ASCII[a]
- ID=ID*10+a;//編號計算
- n++; //編號輸入位數+1
- }
- }
- if((mode==0||mode==4)&&input_f==0&&a<10)//如果在in_f=1(輸入密碼狀態),并且按下的是數字鍵
- {
- if(in_f==1||mode==4)
- {
- if(num==0) //清除顯示后、顯示輸入新密碼
- LCD12864_display_string(1,3," ");
- if(reset_f==1&&reset_num>1)
- LCD12864_display_char(num+1,2,a+0x30);//ASCII[a]
- else
- LCD12864_display_char(num+1,2,'*');//顯示“*”
- }
- else
- LCD12864_display_char(num+1,4,'*');//顯示“*”
- in_mima=in_mima*10+a;//讀入密碼
- num++; //密碼輸入次數加一
- if(num==6) //六位密碼輸入完成
- input_f=1; //標記六位密碼輸入完成
- }
- if(a==10)
- {
- if(mode==0&&in_f==0)//輸入密碼
- {
- num=0;
- in_f=1;
- in_mima=0;
- input_f=0; //清除確定標志
- write_com(0x01);
- LCD12864_display_string(0,1,"請輸入管理密碼: ");//顯示輸入密碼
- }
- }
- if(a==15) //返回上一級菜單
- {
- if(mode>1) //在管理操作中
- {
- write_com(0x01);
- LCD12864_clear12864();
- mode=1; //回到管理選擇界面
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有程序51hei提供下載,PCB在2樓:
指紋密碼鎖.zip
(113.33 KB, 下載次數: 327)
2021-5-23 23:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|