久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機指紋程序 1602液晶顯示(移植)
[打印本頁]
作者:
1536730359
時間:
2017-5-18 13:01
標題:
51單片機指紋程序 1602液晶顯示(移植)
指紋識別+1602
0.png
(65.59 KB, 下載次數: 66)
下載附件
2017-5-18 17:39 上傳
單片機源程序如下:
#include <reg52.h>
#include <intrins.h>
#include"lcd1602.h"
sbit relay =P1^4; //繼電器引腳
sbit buzzer=P1^5; //蜂鳴器引腳
sbit red= P2^7;//錄入模式指示燈 在板子靠近單片機處
sbit green= P2^0;//識別模式指示燈 在板子遠離單片機處
sbit k2=P3^4; //錄入一次指紋
sbit k1=P3^3; //模式識別轉換
sbit k3=P3^2; //清除所有指紋(10個指紋清除)
#define Max_User 10
#define error 2
unsigned char SaveNumber=0,searchnum=0;
unsigned int SearchNumber=0;
unsigned int clk0=0;
unsigned char str[3]={0,'\0','\0'};
unsigned char code Identify[16]="Lock: Idenfity";
unsigned char code Input[16] ="Lock: Input ";
bit modeflag=0,clearallflag=0,changeflag=0;//默認為識別模式,如果為1為錄入指紋模式,每錄入一次SaveNumber++
//////////////////////////////////////常用指令定義/////////////////////////////
//Verify Password :驗證設備握手口令
unsigned char code VPWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b}; //回送12個
//設置設備握手口令
unsigned char code STWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a}; //回送12個
//GetImage :探測手指并從傳感器上讀入圖像
unsigned char code GIMG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05}; //回送12個
//Gen Templet1 :根據原始圖像生成指紋特征1
unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08}; //回送12個
//Gen Templet2 :根據原始圖像生成指紋特征2
unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //回送12個
//Search Finger :以CharBufferA或CharBufferB中的特征文件搜索整個或部分指紋庫
unsigned char code SEAT[18]={17, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,8, 4,1,0,0, 0,0x65, 0x00,0x73}; //回送16個
//Merge Templet ;將CharBufferA與CharBufferB中的特征文件合并生成模板,結果存于ModelBuffer。
unsigned char code MERG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,5 , 0x00,0x09};//回送12個
//Store Templet :將ModelBuffer中的文件儲存到flash指紋庫中
unsigned char code STOR[16]={15, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,6,6,2, 0x00,0x00, 0x00,0x0f}; //回送12個
//Read Note
unsigned char code RDNT[14]={13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,4,0x19, 0, 0x00,0x1e};
//Clear Note
unsigned char code DENT[46]={45,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,36,0x18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00,0x3d};
//DEL one templet
unsigned char code DELE_one[16]={16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,7, 0x0c, 0x00,0x00, 0,1, 0x00,0x15};
//DEL templet ;清空指紋庫
unsigned char code DELE_all[12]={12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3, 0x0d,0x00,0x11};
//////////////////////////////////////常用指令定義-------結束///////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////宏定義////////////////////////////////////////////////////////////////////////
#define FALSE 0
#define TURE 1
//狀態定義表
#define on 1
#define off 0
#define MAX_NUMBER 63
#define _Nop() _nop_()
//////////////////////////////////////宏定義------------結束////////////////////////////////////////////////////////
unsigned char FifoNumber=0;
xdata unsigned char FIFO[MAX_NUMBER+1]={0};
/*********1毫秒延時程序**********/
void delay1ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
void TxdByte(unsigned char dat)//串口發送信息,通過查詢方式發送一個字符
{
TI = 0; //讓TI=0
SBUF = dat; //讀入數據
while(!TI); //等待發送完畢
TI = 0; //清零
}
bit Command(unsigned char *p,unsigned char MaxTime) //命令解析,給模塊發送一個命令
{
unsigned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;
bit result=0, start=0,stop=0;
TxdByte(0xef);//數據包包頭識別碼
TxdByte(0x01);//數據包包頭識別碼
i=*p; //數組的第“0”個元素、里面存放了本數組的長度,把這個長度給變量i,方便進行操作
p++;
p++;
for (count=i-1; count!=1;count--) //Sent command String
{
temp=*p++;//取第個“1”個元素的內容,然后發送
TxdByte(temp);//將數據發送出去
}
result=TURE;//發送完成,結果為真 (真為1)
FifoNumber=0;
for (count=MAX_NUMBER+1; count!=0; count--)//清空所有FIFO[]數組里面的內容,寫入0X00
FIFO[count-1]=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];
if(checksum!=FIFO[count]&0xff)
result=FALSE; //校驗失敗,置結果標志為0
else
result=TURE;
flag=0;
break;
}
}
}
}
}/////////////////////////////do的內容----------------結束////////////////////////////////
while ((clk0<=MaxTime)&&(count<=MAX_NUMBER)&& (changeflag==0) ); //由定時器以及最大接收數據來控制,保證不會在此一直循環
FifoNumber=count; //保存接收到的數據個數
}
return (result);
}
bit VefPSW(void)//驗證設備握手口令,成功返回1
{
unsigned char count=0;
while (1)
{
if(Command(VPWD,20) && (FifoNumber==11) && (FIFO[9]==0x00))
return(1);
count++;
if (count>=2)//如果不成功,再驗證一次,如果兩次不成功,返回失敗
{
return(0);
}
}
}
void Clear_All(void) //清空指紋庫
{
delay1ms(200);
Command(DELE_all,50); //清空指紋庫
}
unsigned char ImgProcess(unsigned char BUFID) //發獲取圖像并生成特征文件,存入BUFID中//輸入參數為緩沖區號
{
if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00))
{
if(BUFID==1)
{
if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00))
{
return 1;
}
else
{
return 0;
}
}
else if(BUFID==2)
{
if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00))
{
return 1;
}
else
{
return 0;
}
}
}
else
{
return 0;
}
return 0;
}
bit Searchfinger(void)//搜索指紋(發送搜索命令、以及根據返回值確定是否存在)
{
if( Command(SEAT,60) && (FifoNumber==15) && (FIFO[9]==0x00) ) //搜索到指紋
{
SearchNumber=FIFO[10]*0x100+FIFO[11];//搜索到的頁碼
//MatchScore=FIFO[12]*0x100+FIFO[13] 可以在此計算得分,從而進行安全級別設定,本程序忽略
return 1;
}
else
{
return 0;
}
}
unsigned char search(void)//搜索用戶
{
unsigned char SearchBuf=0,i=0;
while (i<20)
{
if (ImgProcess(1)==1)//首先讀入一次指紋
{
SearchBuf=Searchfinger();//進行指紋比對,如果搜索到,返回搜索到的指紋序號
if(SearchBuf==1)
{
return SearchNumber;
}
else
{
return 255;//表示搜索到的指紋不正確
}
}
i++;
}
return 0;
}
bit savefingure(unsigned char ID)//保存指紋
{
unsigned char i=0;
//現在開始進行存儲指紋模板的操作
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)//不成功返回0 //此處進行存放指紋模板的命
{return(1);}
else
{return(0);} //不成功返回0
}
//unsigned char enroll(void) //采集兩次指紋,生成1個 指紋模板
//{
// unsigned char 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;
// buzzer=0;
// delay1ms(100);
// buzzer=1;
// delay1ms(2000);//延時2S開始采集下一個特征
//
// //開始采集第二個特征
// 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
// {
// buzzer=0;
// delay1ms(100);
// buzzer=1;
// delay1ms(100);
// buzzer=0;
// delay1ms(100); //響兩聲,表示生成一個模板成功
// buzzer=1;
// return 1;
// }
// }
// else
// {
// if (temp==1)//采集指紋沒有成功
// {
// count++;
//
// if (count>=25)
//
// return(0);
// }
// }
// }
//}
unsigned char enroll(void) //采集兩次指紋,生成1個 指紋模板 /////////////////我修改=========================
{
unsigned char temp=0,count=0;
while(1)
{
temp=ImgProcess(1); //生成特征1
if (temp==1)//生成特征文件成功
{
//采集第一個特征成功
count=0;
buzzer=0;
delay1ms(100);
buzzer=1;
break;
}
else
{
if (temp==0)//采集指紋沒有成功
{
count++;
if (count>=40)//如果采集了40次,還不成功,直接采集失敗,直接退出enroll函數----返回0
return(0);
}
}
}
//采集第一個特征成功
count=0;
buzzer=0;
delay1ms(100);
buzzer=1;
delay1ms(2000);//延時2S開始采集下一個特征
//開始采集第二個特征
while(1)
{
temp=ImgProcess(2); //生成特征2
if (temp==1)//生成特征文件2成功
{
if ( (Command(MERG,40)&& (FifoNumber==11) && (FIFO[9]==0x00))==1 ) //合并成功返回1
{
buzzer=0;
delay1ms(100);
buzzer=1;
delay1ms(100);
buzzer=0;
delay1ms(100); //響兩聲,表示生成一個模板成功
buzzer=1;
return(1);
}
else
{
return(0);
}
}
else
{
if (temp==0)//采集指紋沒有成功
{
count++;
if (count>=25)
return(0);
}
}
}
}
void shownum(unsigned char dat)
{
unsigned char numdat=0;
numdat=dat;
GotoXY(0,1);//x,y
Print("Finger:");
GotoXY(0,8);//x,y
str[0]=0x30+numdat/10;
str[1]=0x30+numdat%10;
Print(str);
}
void mode(void)
{
if(modeflag==0)
{
GotoXY(0,0);//x,y
Print(Identify);
green=0;
red=1;
}
else
{
GotoXY(0,0);//x,y
Print(Input);
red=0;
green=1;
}
shownum(0);
}
void main(void)//主函數
{
unsigned char i=0;
ET0=1; //定時器0開中斷
TL0=0x97; //17ms的初值
TH0=0xBD;
delay1ms(5);
LcdRw=0; //只對液晶進行寫操作,不進行讀操作
delay1ms(5);
LCD_Initial();//液晶初始化
delay1ms(5);
GotoXY(0,0);//x,y
Print(Identify);
//串口初始化
SCON=0x50; //UART方式1:8位UART; REN=1:允許接收
PCON=0x00; //SMOD=0:波特率不加倍
TMOD=0x21; //T1方式2,用于UART波特率
TH1=0xFD;
TL1=0xFD; //UART波特率設置:9600
TR1=1;
TR0=1;// 開定時器0
IT0=0;//中斷0低電平中斷
IT1=1;//中斷1低電平中斷
EX0=1;//開中斷0
EX1=1;//開中斷1
EA=1;
mode();//看當前是什么模式
for(i=0;i<6;i++)//開始握手6次,如果沒有一次成功,表示模塊通信不正常。只要成功就跳出此循環
{
if(VefPSW())//與模塊握手通過,綠燈亮起。進入識別模式
{
green=0; //讀一次
buzzer=0;
shownum(0);
delay1ms(300);
buzzer=1;
break;
}
else
{
red=1;
green=1;
break;
}
}
while(1)
{
if(k2==0)//錄入一個指紋
{
delay1ms(10);
if(k2==0)//如果仍為低電平,表示按鍵有效
{
while(k2==0);//等待松手
if(VefPSW()==1&&modeflag==1&&SaveNumber<10)//與模塊握手通過
{
if(enroll()==1)//采集兩次,生成1個指紋模板成功
{
if(savefingure(SaveNumber+1)==1)//保存也成功
{
SaveNumber++;//加一次
shownum(SaveNumber);
}
}
}
else
{
buzzer=0;
for(i=0;i<8;i++)
{
delay1ms(100);
red=~red;
}
red=0;
buzzer=1;
}
}
}
if(modeflag==0)//為識別模式
{
searchnum=search();
if(searchnum>=1&&searchnum<=162)//最多是162個指紋
{
shownum(searchnum);
//蜂鳴器響一聲
relay=0;
buzzer=0;
delay1ms(100);
buzzer=1;
for(i=0;i<20;i++)
{
delay1ms(150);
}
relay=1;
}
if(searchnum==255)//不正確的指紋 蜂鳴器響三聲
{
shownum(0);
buzzer=0;delay1ms(100); buzzer=1;delay1ms(100);
buzzer=0;delay1ms(100); buzzer=1;delay1ms(100);
buzzer=0;delay1ms(100); buzzer=1;delay1ms(100);
}
}
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
01 1602液晶指紋程序 (移植).rar
(55.34 KB, 下載次數: 106)
2017-5-18 13:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
ssruos
時間:
2019-11-15 11:29
怎么用
作者:
Kazuto
時間:
2021-11-19 22:13
液晶的頭文件有嗎
作者:
heicad
時間:
2021-11-19 23:07
Kazuto 發表于 2021-11-19 22:13
液晶的頭文件有嗎
lcd1602.h在src目錄里面
作者:
tang聽
時間:
2021-11-28 20:24
誰能分享下原理圖嗎?或者告知怎么接線
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日本福利在线观看
|
亚洲成年影院
|
999久久久
|
日韩影院在线观看
|
综合久久综合久久
|
亚洲免费高清
|
天天插天天舔
|
久久精品国产亚洲一区二区
|
国产成人免费视频
|
日韩视频区
|
国精产品一品二品国精在线观看
|
国产高清免费视频
|
久久性色
|
免费视频99
|
欧美男人亚洲天堂
|
国产精品久久久久久久模特
|
亚洲精品68久久久一区
|
日韩精品成人一区二区三区视频
|
亚洲第一视频网站
|
a级大片免费观看
|
亚洲第一网站
|
欧美一区永久视频免费观看
|
91av精品
|
久久久精品一区
|
国产在线精品一区
|
精品日韩一区二区三区
|
久久精品a级毛片
|
91久久综合亚洲鲁鲁五月天
|
777zyz色资源站在线观看
|
亚洲精品一区二区三区免
|
91免费观看在线
|
成人在线精品视频
|
91精品国产自产在线老师啪
|
日韩精品亚洲专区在线观看
|
麻豆一区
|
亚洲欧美在线视频
|
在线观看中文字幕
|
男人天堂久久
|
亚洲成av人片在线观看无码
|
自拍偷拍一区二区三区
|
一级二级三级在线观看
|