本帖最后由 立夏匆匆 于 2020-5-4 10:36 编辑
我的程序.zip
(94 KB, 下载次数: 18)
这个问题已经折磨我快一周了,怎么查程序的问题都查不出来,增加指纹这个函数只要一运行,就只能显示“请按指纹”这四个字,然后即便按指纹也不会运行下面的程序,确认码也能返回,就是不往下运行。附程序:#include <reg52.h>
#include <intrins.h>
sbit TCH = P3^7;//按指纹识别
uchar data querenma=11;//用于缓存确认码
uchar sum[2],sum1[2];//sum存放应答包的校验和,sum1存放指令包的校验和
int sum_ans,sum_ins;//定义整形变量用来存放2字节大小的校验和
uint page_ID;//存放注册函数中的页码
/**************************************************
函数名称:端口初始化
单片机:晶振11.0592MHz 波特率为9600bps
指纹模块:波特率为9600bps
***************************************************/
void UART_init()
{
SCON = 0x50;//串行寄存器设为串行口工作方式1(01010000)
PCON = 0x00;//一般默认为0
TMOD = 0x20;//定时器1,工作方式2
TH1 = 0xfd;//T1定时器装初值(波特率9600bps)
TL1 = 0xfd;//T1定时器装初值
TR1 = 1;//启动定时器1
EA = 1;//开总中断
}
/**************************************************
函数作用:串口发送1帧数据
***************************************************/
void UART_sent_byte(uchar c)
{
SBUF = c;//将要发送的数据放在SBUF中,单片机会自动发送
while (!TI);//判断一下TI有没有置1,如果TI等于0,说明没有
//发完,那么会一直等待。如果发送完了,那么TI
//等于1,1取反为0,那么会跳出这句话。
TI = 0;//发送完了,要把发送标志位清零
}
/**************************************************
函数作用:串口接收1帧数据
和发送函数原理一样,只是把发送标志位改为接收标志位。
***************************************************/
uchar UART_receive_byte()
{
uchar dat;
while (!RI);
RI = 0;
dat = SBUF;
return (dat);
}
/**************************************************
函数作用:录入指纹图像
***************************************************/
void getimage()
{
uchar i;
UART_sent_byte(0xef);
UART_sent_byte(0x01);//协议包头为0xef01
UART_sent_byte(0xff);
UART_sent_byte(0xff);
UART_sent_byte(0xff);
UART_sent_byte(0xff);//芯片地址为0xffffffff
UART_sent_byte(0x01);//包标识
UART_sent_byte(0x00);
UART_sent_byte(0x03);//包长度是2字节的03H
UART_sent_byte(0x01);//录入图像指令码
UART_sent_byte(0x00);
UART_sent_byte(0x05);//校验和是2字节的05H
for (i=0;i<9;i++)//接收应答包前9字节为包头,芯片地址,包识别,包长度
{
while (!RI);
RI = 0;
}
querenma = UART_receive_byte();
sum[1] = UART_receive_byte();
sum[0] = UART_receive_byte();
sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和
}
/**************************************************
函数作用:生成指纹特征,并存入bufferID中
***************************************************/
void genchar(uchar bufferID)
{
uchar i;
UART_sent_byte(0xef);
UART_sent_byte(0x01);//协议包头为0xef01
UART_sent_byte(0xff);
UART_sent_byte(0xff);
UART_sent_byte(0xff);
UART_sent_byte(0xff);//芯片地址为0xffffffff
UART_sent_byte(0x01);//包标识
UART_sent_byte(0x00);
UART_sent_byte(0x04);//包长度是2字节的04H
UART_sent_byte(0x02);//生成特征指令码
UART_sent_byte(bufferID);//输入特征缓冲区号
sum_ins = 0x07+bufferID;
sum1[0] = sum_ins;
sum1[1] = sum_ins>>8;
UART_sent_byte(sum1[1]);
UART_sent_byte(sum1[0]);
for (i=0;i<9;i++)//接收应答包前9字节为包头,芯片地址,包识别,包长度
{
while (!RI);
RI = 0;
}
querenma = UART_receive_byte();
sum[1] = UART_receive_byte();
sum[0] = UART_receive_byte();
sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和
}
/**************************************************
函数作用:自动注册模板。
采集一次指纹注册模板,在指纹库中搜索空位并存储,返回
储存ID。
***************************************************/
void enroll()
{
uchar i,ID1,ID2;
UART_sent_byte(0xef);
UART_sent_byte(0x01);//协议包头为0xef01
UART_sent_byte(0xff);
UART_sent_byte(0xff);
UART_sent_byte(0xff);
UART_sent_byte(0xff);//芯片地址为0xffffffff
UART_sent_byte(0x01);//包标识
UART_sent_byte(0x00);
UART_sent_byte(0x03);//包长度是2字节的03H
UART_sent_byte(0x10);//指令码
UART_sent_byte(0x00);
UART_sent_byte(0x14);//校验和
for (i=0;i<9;i++)////接收应答包前9字节为包头,芯片地址,包识别,包长度
{
while (!RI);
RI = 0;
}
querenma = UART_receive_byte();
ID1 = UART_receive_byte();
ID2 = UART_receive_byte();//存放页码
sum[1] = UART_receive_byte();
sum[0] = UART_receive_byte();
page_ID = (ID1<<8)+ID2;//存放16位页码
sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和
}
/**************************************************
函数作用:高速搜索。
1.以charbuffer1或charbuffer2中的特征文件高速搜索整个或
部分指纹库。若搜索到就返回页码。
2.该指令对于的确存在于指纹库中,且登录时质量很好的指纹,
会很快给出搜索结果。
***************************************************/
void fastsearch(uchar BufferID)
{
uchar i,ID1,ID2;
UART_sent_byte(0xef);
UART_sent_byte(0x01);//协议包头为0xef01
UART_sent_byte(0xff);
UART_sent_byte(0xff);
UART_sent_byte(0xff);
UART_sent_byte(0xff);//芯片地址为0xffffffff
UART_sent_byte(0x01);//包标识
UART_sent_byte(0x00);
UART_sent_byte(0x08);//包长度
UART_sent_byte(0x1b);//指令码
UART_sent_byte(BufferID);//缓冲区号
UART_sent_byte(0x00);
UART_sent_byte(0x00);//起始页码
UART_sent_byte(0x00);
UART_sent_byte(0xb4);//页码数量180
sum_ins = 9+0x1b+BufferID+0xb4;//校验和
sum1[0] = sum_ins;
sum1[1] = sum_ins>>8;
UART_sent_byte(sum[1]);
UART_sent_byte(sum[0]);
for (i=0;i<9;i++)////接收应答包前9字节为包头,芯片地址,包识别,包长度
{
while (!RI);
RI = 0;
}
querenma = UART_receive_byte();
ID1 = UART_receive_byte();
ID2 = UART_receive_byte();//存放页码
while(!RI);
RI = 0;
while(!RI);
RI = 0; //2字节的得分
sum[1] = UART_receive_byte();
sum[0] = UART_receive_byte();
page_ID = (ID1<<8)+ID2;//存放16位页码
sum_ans = (sum[1]<<8)+sum[0];//存放16位校验和
}
/**************************************************
增加指纹函数
***************************************************/
void addfinger()
{
uchar IDa,IDb,IDc;//存储返回的指纹序号
PutStr(1,2,"请按手指");
getimage();
while (querenma != 0)
getimage();
genchar(bufferID1);
UART_init();
fastsearch(bufferID1);
while (querenma == 1)
fastsearch(bufferID1);
if (querenma == 0)
{
lcdclear();
PutStr(1,1,"指纹已被录入");
PutStr(2,1,"请按任意键继续");
while(keycheck()==0);
}
else if (querenma == 9)
{
lcdclear();
PutStr(1,1,"请再按手指");
enroll();
while (querenma == 2)
enroll();
lcdclear();
if (querenma == 0)
{
IDa = page_ID /100;//取百位
IDb = (page_ID-IDa*100)/10;//取十位
IDc = page_ID%10;//取个位
PutStr(1,1,"指纹录入成功");
PutStr(2,1,"编号为:");
lcd_wcmd(0x8d);
lcd_wdat(0x30+IDa);lcd_wdat(0x30+IDb);lcd_wdat(0x30+IDc);//通过ASC码值进行输出
}
else if(querenma != 0)
{
PutStr(1,1,"指纹录入失败");
PutStr(2,1,"请重新操作");
}
PutStr(3,0,"请按任意键继续");
while (keycheck() == 0);
}
}
|