⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 finger.c

📁 程序是智能指纹锁的
💻 C
字号:
#include "Include.h"

extern uchar NowKey;//当前按键
extern uint  Tc;//超时计时器
extern uchar Timer;//超时计数
extern uchar Timer2;//超时计数2
extern uchar BellTimer;
extern uchar Rx_Cnt;//串口接收计数器
extern bit ReceiveOK;//数据包接收完成标志位
sbit FINGER_POWER=P1^0;//模块电源控制,低电平有效
unsigned char FingerRecord[26];//指纹记录数组,每位代表对应编号指纹有无
unsigned char xdata CommBuf[MAX_BUF_NUMBER];//串口缓冲
unsigned char xdata SCC;//串口接收和校验
//打开模块电源
void FingerOn(void)
	{
	        FINGER_POWER=0;
        DelayNuS(10);}
//关闭模块电源
void FingerOff(void)
{		FINGER_POWER=1;
        DelayNuS(10);}
//初始化
void FingerInit(void)
{	    UARTInit();
        FingerOff();
        memset(FingerRecord,0,sizeof(FingerRecord));}//初始化记录
//复位UART变量
void Clear_Uart_Variable(void)
{		ReceiveOK = 0;Rx_Cnt = 0;}
//发送命令
//内含编码
//入口参数:
//      BaoBS:包标识
//      Number:包内容长度
//      p:待发包内容
//返回值:
//      1:操作成功
//      0:参数错误
//      2:超时
uchar SendCommand(uchar BaoBS,uchar Number,uchar *p)
{
        uchar i = 0;
        uchar Sum = 0;
        uchar* pt = p;
        if(Number>MAX_LR_NUMBER)return FALSE;//参数错误
        //发送包头
        UARTSendByte('M');
        Sum += 'M';
        UARTSendByte('X');
        Sum += 'X';
        //发送包标识
        UARTSendByte(BaoBS);
        Sum += BaoBS;
        //发送包长度
        UARTSendByte(Number);
        Sum += Number;
        //发送包内容
        for(i = 0;i<Number;i++)
        {       UARTSendByte(*p);
                Sum += *p;
                p++;}
        //发送校验和
        UARTSendByte(Sum);
		return	0;}
//清空指纹
//返回值:
//      OK:操作成功
//      其它:通讯错误
uchar EmptyFinger(void)
{
        uchar Command = C_EMPTY_FINGER;
		Clear_Uart_Variable();
		SendCommand(C_COMMAND,1,&Command);
		Tc = 2;
		while(!ReceiveOK&&Tc);
		Clear_Uart_Variable();
		if(0==Tc)	return	FALSE;
		if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
		{	if((C_ANSWER==CommBuf[2])&&(0x01==CommBuf[4]));
			else return	ANSWER_NUMBER_E;}
		else return	C_GET_FAIL;
		Tc = 2;
		while(!ReceiveOK&&Tc);
		Clear_Uart_Variable();
		if(0==Tc)	return	FALSE;
		if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
		{	if((C_ANSWER==CommBuf[2])&&(C_EMPTY_FINGER==CommBuf[4]))return OK;
			else return	ANSWER_NUMBER_E;}
		else{return	C_GET_FAIL;}
        return FALSE;}
//写Flash
//入口参数:
//      p:待写数据存放地址
//      Number:读取个数
//      AddrH:地址高字节
//      AddrL:地址低字节
//返回值:
//      OK:操作成功
//      其它:通讯错误
uchar WriteFingerFlash(uchar *p,uchar Number,uchar AddrH,uchar AddrL)
{       CommBuf[0] = C_WRITE_FLASH;
        CommBuf[1] = AddrH;
        CommBuf[2] = AddrL;
        CommBuf[3] = Number;
        memcpy(&CommBuf[4],p,Number);
		Clear_Uart_Variable();
		SendCommand(C_COMMAND,Number+4,CommBuf);
		Tc = 2;
		while(!ReceiveOK&&Tc);
		Clear_Uart_Variable();
		if(0==Tc)	return	FALSE;
		if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
		{	if((C_ANSWER==CommBuf[2])&&(0x01==CommBuf[4]));
			else return	ANSWER_NUMBER_E;}
		else return	C_GET_FAIL;
		Tc = 2;
		while(!ReceiveOK&&Tc);
		Clear_Uart_Variable();
		if(0==Tc)	return	FALSE;
		if(SCC==CommBuf[CommBuf[3]+4])					//数据包和校验判断
		{	if((C_ANSWER==CommBuf[2])&&(C_WRITE_FLASH==CommBuf[4]))return OK;
			else return	ANSWER_NUMBER_E;}
		else return	C_GET_FAIL;
        return FALSE;}

//读Flash
//入口参数:
//      p:读取数据存放地址
//      Number:读取个数
//      AddrH:地址高字节
//      AddrL:地址低字节
//返回值:
//      OK:操作成功
//      其它:通讯错误
uchar ReadFingerFlash(uchar *p,uchar Number,uchar AddrH,uchar AddrL)
	{
	        uchar Command = C_READ_FLASH; 

        CommBuf[0] = C_READ_FLASH;
        CommBuf[1] = AddrH;
        CommBuf[2] = AddrL;
        CommBuf[3] = Number;
		//发送读Flash指令
		Clear_Uart_Variable();
		SendCommand(C_COMMAND,4,CommBuf);
		//等待接收正确接收返回
		Tc = 2;
		while(!ReceiveOK&&Tc);
		Clear_Uart_Variable();
		if(0==Tc)	return	FALSE;
		if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
		{	if((C_ANSWER==CommBuf[2])&&(0x01==CommBuf[4]));
			else return	ANSWER_NUMBER_E;}
		else return	C_GET_FAIL;
		//等待返回数据
		Tc = 2;
		while(!ReceiveOK&&Tc);
		Clear_Uart_Variable();
		if(0==Tc) return FALSE;
		if(SCC==CommBuf[CommBuf[3]+4]) 					//数据包和校验判断
		{	if((C_ANSWER==CommBuf[2])&&(C_READ_FLASH==CommBuf[4]))
			{   memcpy(p,&CommBuf[5],Number);//复制数据					
				return OK;}
			else return	ANSWER_NUMBER_E;}
		else return	C_GET_FAIL;
        return FALSE;}							   
//查找某一地址的记录为空与否
//入口参数:
//AddrH:高地址位
//AddrH:低地址位
//返回值:
//OK:有指纹
//NOFINGER:无指纹
//其他:不成功
uchar Find_Finger(void)
{		FingerOn();
        CommBuf[0] = C_READ_INFO;//0x4B查询指纹库信息
        CommBuf[1] = 0;//高地址
        CommBuf[2] = 0;//低地址
		Clear_Uart_Variable();
		SendCommand(C_COMMAND,3,CommBuf);//1.发送查询是否存在指定编号的指纹命令
		//等待接收正确接收返回
		Tc = 2;
		while(!ReceiveOK&&Tc);
		Clear_Uart_Variable();
		if(0==Tc)	return	FALSE;
		if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
		{	if((0x30==CommBuf[2])&&(0x01==CommBuf[4]));//2。正确接收
			else return	ANSWER_NUMBER_E;}
		else return	C_GET_FAIL;
		//等待返回数据
		Tc = 2;
		while(!ReceiveOK&&Tc);
		Clear_Uart_Variable();
		if(0==Tc)	return	FALSE;
		if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
		{if((C_ANSWER==CommBuf[2])&&(C_READ_INFO==CommBuf[4]))//3。正确接收
			{ switch (CommBuf[5])
			   		{case ANSWER_HAVE_FINGER://37
						break;										
					case ANSWER_NUMBER_E://35 
						return	ANSWER_NUMBER_E;
					case ANSWER_NO_FINGER://38 
						return NOFINGER;}
					return OK;}
			else{return	ANSWER_NUMBER_E;}}
		else return	C_GET_FAIL;
return FALSE;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -