目录
1.课题研究目的和内容
1.1 课题研究目的
1.2 课题研究内容
2.系统总体方案设计及功能模块介绍
2.1总体方案设计
2.2 ATK-301模块介绍
2.3 TFTLCD显示功能模块介绍
2.4 蜂鸣器报警功能模块介绍
2.5 时钟模块介绍
3.系统硬件设计与实现
3.1 系统硬件电路图
3.2 STM32F103ZET6
3.3 ATK-301指纹识别模块
3.4 TFTLCD显示模块设计与实现
3.5蜂鸣器报警模块设计与实现
3.6时钟模块设计与实现
4.系统软件设计与实现
4.1主程序设计与实现
4.2 指纹识别模块子程序
4.3 TFTLCD显示子程序
4.4 蜂鸣器报警子程序
5.系统测试
5.1系统软件测试
5.2系统硬件测试
6.总结与展望
1.课题研究目的和内容
1.1 课题研究目的
指纹识别作为识别技术有着悠久的历史,这种技术通过分析指纹的全局特征和局部特征,从指纹中抽取的特征值可以非常的详尽以便可靠地通过指纹来确认一个人的身份。随着时代飞速发展,指纹识别也越来越普及,此实验就是运用ATK-LB301指纹识别模块进行录指纹、删除指纹、设置波特率及对比等级,以及对电阻屏(led屏)字库函数运用等功能。该系统成本低,拓展性强,能够适用于各类场景。
1.2 课题研究内容
学习各种传感器及设备的一般技术和特殊技术的学习,总体方案的选型设计,STM32单片机及外围设备的软硬件系统的技术开发,还有系统的调试和总体运行原理,软件以流程图的方式表示。LCD显示模块与语音模块相互配合,显示考勤信息。
1,删指纹——与模块握手通过之后,屏幕将虚拟一个键盘,按‘删指纹’进入删除界面。在此界面可以按照提示输出一个数值按‘Enter’删除单个指纹,也可按‘清空指纹’清空指纹库。如果是误操作也可以按‘返回’主界面。
2,录指纹——按‘录指纹’进入此项。录指纹流程:按第一次手指-->按第二次手指-->自动生成模板-->输入存储ID-->存储指纹成功。其中两次按指纹操作,如果超过10次无手指按下则退回主界面。模块感应到手指按下0.3S(最少停留0.3S)后,蜂鸣器会“滴”一声!
3,刷指纹--与模块握手成功之后,主函数中不断查询验证指纹,有自动验证指纹和分布验证方式,可以 改变USE_AUTO_IDETIFY宏定义值来选择。验证通过模块亮绿色灯,不通过亮红色灯。
2.系统总体方案设计及功能模块介绍
2.1总体方案设计
在本设计中首先使用杜邦线将模块连接到开发板,触摸校准界面,随后进入指纹测试主界面,按下录指纹,系统会提示按指纹,后续一共需要录入四次再按一次指纹 ,录入第四次指纹成功之后系统会提 示。 当第四次指纹也录入成功, 系统就会生成指纹模板, 接着就会提示 “ 请输 入存储 I D , 按 Enter 保存 ” 。 最后显示录入指纹成功。
录入指纹和验证指纹流程图
2.2 ATK-301模块介绍
ATK-301 电容 指纹识别模块 简介 ATK-301 电容 指纹识别模块(以下简称 LB301 模块)是 ALIENTEK 推出的一款高性 能的电容半导体指纹识别模块。 LB301 采用了瑞典 FPC 公司按压式电容指纹传感器,该传 感器具有功耗低、稳定、图像一致性效果好、耐静电等级高的特点
2.3 TFTLCD显示功能模块介绍
本次设计使用的4.3寸TFTLCD。分辨率为800*480,16 位真彩显示,自带触摸屏,可以用来作为控制输入。LCD 接口连接在 STM32F103ZET6 的 FSMC 总线上面,可以显著提高 LCD 的刷屏速度。
2.4 蜂鸣器报警功能模块介绍
本设计采用电磁式有源蜂鸣器,电磁式有源蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,是电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
2.5 时钟模块介绍
本设计中使用的实时时钟作为本系统中重要部分,必须在保证系统断电时能够正常工作,同时具备一定的时间准确性。DS1302是一款微小电流充电时钟芯片,内含有一个实时时钟/日历和31字节静态 RA M ,通过 SPl 接口与单片机进行连接[3]。芯片内置时间日历存储器,用于保存时间信息,包括年、月、日等基础信息。在供电模式选择使用双电源供电。当主电源比备用电源高0.2V时,主电源供电;否则,备用电源供电。选择3V纽扣电池作为备用电源。
3.系统硬件设计与实现
3.1 系统硬件实物图
图3-1-1 系统硬件实物图
3.2 STM32F103ZET6
STM32系列产品基于ARM Cortex-M0,M0+,M3,M4和M7内核,具有高性能、低成本、低功耗等特点,适用于各种嵌入式应用开发。
本次设计采用STM32F103ZET6开发板,共有54个可供用户使用的引脚,以及一个34引脚的LCD屏幕插槽。属于中低端的32位ARM微控制器,基于高性能内核Cortex-M3,频率约为1.25DMips/MHz。拥有1μs的双12位ADC,4M/s的UART,18MHz的I/O翻转速度,18M/s的SPI。同时保持低功耗的特点。该芯片集成了UART,USB,定时器,ADC,CAN,I2C,SPI等多项功能。是一款非常常用的微型控制器。STM32系列产品成本比51单片机要高出不少,但其性能及可供使用引脚也较之提高不少,相信随着成本的不断降低,市场上将会有更多基于STM32的诸如医疗用品、电力电子系统应用、编程控制器、电机驱动、警报系统等产品。原理图如下图所示。
图3-2-1 STM32F103ZET6原理图
3.3 ATK-301指纹识别模块
ATK-301 电容指纹识别模块(以下简称 LB301 模块)是 ALIENTEK 推出的一款高性 能的电容半导体指纹识别模块。 LB301 采用了瑞典 FPC 公司按压式电容指纹传感器,该传 感器具有功耗低、稳定、图像一致性效果好、耐静电等级高的特点。模块搭配 GigaDevice (兆易创新)生产的指纹控制专用芯片,针对指纹传感器做出了大量的图像优化、速度优化、 算法优化, 使模块具有识别速度快,通过率高的等特点。相对传统光学指纹模块,本模块具 有识别速度更快、体积更小、功耗更低等特点。 模块配备了串口通讯接口,用户无需研究复杂的图像处理及指纹识别算法, 只需通过简 单的串口通讯按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门 禁系统、指纹锁等场合。
图3-3-1 ATK301模块原理图
3.4 TFTLCD显示模块设计与实现
TFTLCD引脚如图,图中的CS:TFTLCD片选信号,WR:向TFTLCD 写入数据,RD:从TFTLCD读取数据、D[15:0]:16位双向数据线,RST:硬复位TFT LCD,RS:命令/数据标志(0,读写命令;1,读写数据)。
图3-4-1 TFTLCD引脚图
3.5蜂鸣器报警模块设计与实现
蜂鸣器与STM32连接原理图如图,图中Q1是用来扩流,R38则是一个下拉电阻,避免MCU复位的时候,蜂鸣器可能发声的。BEEP信号直接连接在MCU的PB8上面,PB8可以做PWM 输出。蜂鸣器的驱动信号连接在 STM32 的 PB8 上。
在系统检测到实际距离小于安全距离时,会输出一个低电平,使蜂鸣器报警。本次设计中蜂鸣器在硬件上是直接连接好了的,不需要经过任何设置,直接编写代码就可以了。
图3-5-1蜂鸣器与STM32连接原理图
3.6时钟模块设计与实现
时钟不是日常显示时间的时钟,是指数字系统里的时钟电路。
几乎所有的数字系统在处理信号都是按节拍一步一步地进行的,系统各部分也是按节拍做的,要使电路的各部分统一节拍就需要一个“时钟信号”,产生这个时钟信号的电路就是时钟电路。
时钟电路的核心是个比较稳定的振荡器(一般都用晶体振荡器),振荡器产生的是正弦波,频率不一定是电路工作的时钟频率,所以要把这正弦波进行分频,处理,形成时钟脉冲,然后分配到需要的地方。让系统里各部分工作时使用。
任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。时钟电路一般由晶体振荡器、晶震控制芯片和电容组成。
图3-6-1时钟模块原理图
4.系统软件设计与实现
4.1主程序设计与实现
当系统接入电源并打开开发板开关后,主程序将会自动完成系统的初始化工作,主要包括头文件及一些变量定义的初始化。随后启动TFTLCD显示模块和指纹识别模块。首先录入指纹,正确录入后,蜂鸣器会“滴”一声!将自动生成模板和数据ID交给STM32进行处理,将处理好的数据发送给TFTLCD进行显示,将已存储的指纹与正在识别的指纹进行比对,通过模块亮绿色灯,不通过亮红色灯。系统主程序流程图如图4-1-1所示。
图4-1-1 主程序流程图
int main(void)
{
u8 ensure;
u8 key_num;
char *str;
u16 count = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init();
uart_init(115200);
usart2_init(usart2_baund);
BEEP_Init();
KEY_Init();
LCD_Init();
W25QXX_Init();
tp_dev.init();
usmart_dev.init(72);
my_mem_init(SRAMIN);
exfuns_init();
f_mount(fs[1],"1:",1);
POINT_COLOR=RED;
while(font_init()) {
LCD_ShowString(60,50,240,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(60,50,240,66,WHITE);
delay_ms(200);
}
if(!(tp_dev.touchtype&0x80)) {
Show_Str_Mid(0,30,”是否进行触摸屏校准”,16,240);
POINT_COLOR=BLUE;
Show_Str_Mid(0,60,”是:KEY2 否:KEY0“,16,240);
while(1)
{
key_num=KEY_Scan(0);
if(key_num==KEY0_PRES)
break;
if(key_num==KEY2_PRES)
{
LCD_Clear(WHITE);
TP_Adjust();
TP_Save_Adjdata();
break;
}
}
}
4.2 指纹识别模块子程序
首先对超声波传感器的IO端口进行配置,配置PE4为输出模式,让该引脚实现输出高低电平功能,用于触发超声波的传播。配置PE2为输入模式,让该引脚实现识别高低电平功能,用于检测超声波信号的传输时间。将中断模式设置为定时器中断,使用的是定时器为定时器3。根据超声波传感器时序图3-2-1-2可得,触发超声波信号与检测回响信号之间有一定的时间间隔,为避免发射的超声波信号对接受的回响信号产生影响,因此将测量周期设置为100ms。超声波测距模块流程图如图4-2-1所示。
图4-2-1超声波测距模块子程序流程图
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,0,”指纹考勤系统”,16,240);
Show_Str_Mid(0,20,”又是元气满满的一天”,16,240);
POINT_COLOR=BLUE;
Show_Str_Mid(0,40,"信号接收中...",16,240);
while(PS_GetImage() == 0xff)
{
delay_ms(400);
LCD_Fill(0,40,240,80,WHITE);
Show_Str_Mid(0,40,"掉线了!!!",16,240);
delay_ms(800);
LCD_Fill(0,40,240,80,WHITE);
Show_Str_Mid(0,40,"勿扰,信号接收中",16,240);
}
LCD_Fill(30,40,240,100,WHITE);
Show_Str_Mid(0,40,"加载完成,可以签到了!!!",16,240);
str=mymalloc(SRAMIN,30);
sprintf(str,"波特率 :%d 地址:%x",usart2_baund,LB301Addr);
Show_Str(0,60,240,16,(u8*)str,16,0);
ensure=PS_ValidTempleteNum(&ValidN); if(ensure!=0x00)
ShowErrMessage(ensure);
ensure=PS_ReadSysPara(&LB301Para);
if(ensure==0x00)
{
mymemset(str,0,50);
sprintf(str,”:%d :%d”,LB301Para.PS_max-ValidN,LB301Para.PS_level);
Show_Str(0,80,240,16,(u8*)str,16,0);
}
else
ShowErrMessage(ensure);
myfree(SRAMIN,str);
LB301_load_keyboard(0,170,(u8**)kbd_menu);
while(1)
{
key_num=LB301_get_keynum(0,170);
if(key_num)
{
if(key_num==1)Del_FR();
if(key_num==3)Add_FR();
}
if(++count > 10)
{
count = 0;
press_FR();
}
delay_ms(1);
}
}
4.3 TFTLCD显示子程序
本设计显示模块为TFT屏幕,主要用于显示摄像头拍摄画面及超声波传感器测距距离。为保证TFT液晶屏幕正常工作,我们需要对TFT屏幕进行初始化。
由于从ILI9341中读取的数据格式为GBR而我们写入的格式为RGB,因此需要进行数据格式转换,转换的方法为将数据向左位移8位,使得格式可以对其。
本次设计需要显示摄像头拍摄图像,扫描方向为从左下角到右上角,若想要显示中英文则为从左上角到右下角,若想要显示BMP图像为右上角到左下角或从右下角到左上角。
由于需要在TFT屏幕上方显示超声波测距结果,因此我们需要在指定区域上显示字符,具体方法为先设置字符显示起始坐标,然后设置需要显示的字符,需要显示的字体大小。摄像头模块在运行时的具体流程为先读取OV7670摄像头数据,并在屏幕中显示,然后读取超声波测距数据,流程图如图4-3-1所示。
图4-3-1 TFTLCD显示子程序流程图
void LB301_load_keyboard(u16 x,u16 y,u8 **kbtbl)
{
u16 i;
POINT_COLOR=RED;
kbd_tbl=kbtbl;
LCD_Fill(x,y,x+240,y+150,WHITE);
LCD_DrawRectangle(x,y,x+240,y+150);
LCD_DrawRectangle(x+80,y,x+160,y+150);
LCD_DrawRectangle(x,y+30,x+240,y+60);
LCD_DrawRectangle(x,y+90,x+240,y+120);
POINT_COLOR=BLUE;
for(i=0;i<15;i++)
{
Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)kbd_tbl[i],16,80);
}
}
void LB301_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{
u16 i=keyx/3,j=keyx%3;
if(keyx>16)return;
if(sta &&keyx!=1) LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN);
else if(keyx!=1)
LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);
if(keyx!=1)¯
Show_Str_Mid(x+j*80,y+7+30*i,(u8*)kbd_tbl[keyx],16,80);
}
u8 LB301_get_keynum(u16 x,u16 y)
{
u16 i,j;
static u8 key_x=0;
u8 key=0;
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN)
{
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
if(tp_dev.x[0]<(x+j*80+80)&&tp_dev.x[0]>(x+j*80)&&tp_dev.y[0]<(y+i*30+30)&&tp_dev.y[0]>(y+i*30))
{
key=i*3+j+1;
break;
}
}
if(key)
{
if(key_x==key)key=0;
else
{
LB301_key_staset(x,y,key_x-1,0);
key_x=key;
LB301_key_staset(x,y,key_x-1,1);
}
break;
}
}
}else if(key_x)
{
LB301_key_staset(x,y,key_x-1,0);
key_x=0;
}
return key;
}
u16 GET_NUM(void)
{
u8 key_num=0;
u16 num=0;
while(1)
{
key_num=LB301_get_keynum(0,170);
if(key_num)
{
if(key_num==1)return 0xFFFF;
if(key_num==3)return 0xFF00;
if(key_num>3&&key_num<13&&num<99)
num =num*10+key_num-3;
if(key_num==13)num =num/10;
if(key_num==14&&num<99)num =num*10;
if(key_num==15)return num;
}
LCD_ShowNum(80+15,170+7,num,6,16);
}
}
void ShowErrMessage(u8 ensure)
{
LCD_Fill(0,120,lcddev.width,160,WHITE);
Show_Str_Mid(0,120,(u8*)EnsureMessage(ensure),16,240);
}
4.4 蜂鸣器报警子程序
蜂鸣器报警,当存储指纹成功时,蜂鸣器将会发出声音警报,其中两次按指纹操作,如果超过10次无手指按下则蜂鸣器关闭,退回主界面。
主要代码如下所示:
void press_FR(void)
{
SearchResult seach;
u8 ensure;
char *str;
#if (USE_AUTO_IDETIFY == 1)
ensure=PS_AutoIdentify(&seach);
if(ensure==0x00)
{
BEEP=1;
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"签到成功",16,240);
str=mymalloc(SRAMIN,2000);
sprintf(str,"确有此人%d",seach.pageID,seach.mathscore);
Show_Str_Mid(0,140,(u8*)str,16,240);
myfree(SRAMIN,str);
delay_ms(500);
BEEP=0;//关闭蜂鸣器
LCD_Fill(0,100,lcddev.width,160,WHITE);
}
else if(ensure != 0xff)
{
BEEP=1;//打开蜂鸣器
ShowErrMessage(ensure);
delay_ms(500);
BEEP=0;//关闭蜂鸣器
LCD_Fill(0,100,lcddev.width,160,WHITE);
}
#else
ensure=PS_GetImage();
if(ensure==0x00)
{
BEEP=1;
delay_ms(100);
ensure=PS_GenChar(CharBuffer1);
if(ensure==0x00)
{
BEEP=0;
ensure=PS_Search(CharBuffer1,0,299,&seach);
if(ensure==0x00)
{
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"删除指纹",16,240);
str=mymalloc(SRAMIN,2000);
sprintf(str,":%d",seach.pageID,seach.mathscore);
Show_Str_Mid(0,140,(u8*)str,16,240);
myfree(SRAMIN,str);
}
else
ShowErrMessage(ensure);
}
else
ShowErrMessage(ensure);
delay_ms(500);
BEEP=0;
LCD_Fill(0,100,lcddev.width,160,WHITE);
}
#endif
}
5.系统测试
5.1系统软件测试
倒车雷达系统是利用C语言程序,使用Keil作为开发工具。使用Keil软件完成该系统的软件设计,通过新建源文件、建立工程文件、编译和连接,最后生成所需单片机烧录的HEX文件。
本次设计主要用到Keil uvision4进行程序代码编写、编译、调试并生成.HEX文件,通过USB接口将所生成的.HEX文件烧写到开发板上进行测试。主函数调试运行成功并生成 .hex文件如图5-1-1所示。
图5-1-1 主函数运行结果图
5.2系统硬件测试
本次设计中选择STM32F1战舰V3开发板作为本次设计的硬件测试。
代码编译运行通过后,开始对设计进行测试。在STM32F1战舰V3开发板中将所有电路、电子元件准确连接。
实物各种元器件的参考值及数量如表5-2-1所示。
元件 | 数量 |
STM32FI战舰V3开发板 | 1个 |
4.3寸FTFLCD显示器 | 1个 |
ATK-LB301指纹识别模块 | 1个 |
导线 | 6根 |
表5-2-1 元器件清单
将各个元器件连接到开发板以后,给开发板供电,开始硬件测试,实物设计正常执行,并得到预期结果。如图5-2-1所示。
图5-2-1 实物图
6.总结与展望
这次的课程设计,用时两个星期,这两个星期不敢说自己有多大的进步,获得了多少知识,但起码是了解了stm32与传感器连接的部分过程。通过这次课程设计发现这其中需要的很多知识我们没有接触过,去图书馆查资料的时候发现我们前边所学到的仅仅是皮毛,还有很多需要我们掌握的东西我们根本不知道。同时也发现有很多已经学过的东西我们没有理解到位,不能灵活运用于实际,不能很好的用来解决问题,这就需要我们不断的大量的实践,通过不断的自学,不断地发现问题,思考问题,进而解决问题。在这个过程中我们将深刻理解所学知识,同时也可以学到不少很实用的东西。
从各种文档的阅读到开始的挑选题目、硬件结构设计、软件结构设计、程序烧写。亲身体验了一回系统的设计开发过程。很多东西书上写的很清楚,貌似看着也很简单,思路非常清晰。但真正需要自己想办法去设计一个的时候才发现其中的难度。经常做到后面突然就发现自己一开始的设计有问题,然后又回去翻工,在各种反复中不断完善自己的想法。
这次课程设计有个比较大的遗憾就是还没有实现云平台的一个上传,但在下学期有学习到云平台,目前已经初步掌握云平台的上传,但代码编写还存在问题,相信在下个学期的学习中可以将课设进行一个延申,实现数据上传云端。