赞
踩
目 录
目 录 2
第一章 需求分析 3
第三章 详细设计 5
第四章 测试报告 5
第五章 安装及使用 6
第六章 项目总结 6
第四章 测试报告
RFID 测试报告:在高温环境下测试 RFID 读写时出现错误,在潮湿环境下测试 RFID 读写时出现错误。
指纹测试报告:在进行指纹进行测试时,手指必须保持清洁且保持按压强度适中。Openmv 测试报告:openmv 录入人脸时,需要保证周围无杂物,且让人脸保持占有 90%。密码测试报告:进行更改密码时,按压串口屏需要用力,否则无法输入密码。
第五章 安装及使用
本作品用一个屏幕进行操作,主要功能进行门锁功能。 安装:
本作品是将外设模块直接通过杜邦线连接到 STM32f103 主控板上,具体接口如下: 串口屏模块连接主控板的串口 1(PA9、PA10)和 VCC、GND。
指纹模块连接主控板的串口 3(PB10、PB11)和 VCC、GND。Openmv 模块连接主控板的串口 2(PA2、PA3)和 VCC、GND。
RFID 模块连接片选(PB12)、时钟线(PB13)、MOSI(PB15)、RST(PB9)、VCC、GND 舵机模块连接 PA1(调 PWM)、GND、VCC
开锁模式包括四种模式:
1 密码识别:密码与所存密码相同即可进行开锁。
2.指纹识别:指纹与所存指纹相同即可进行开锁。
3.RFID 卡片识别:卡片与所存卡片相同即可进行开锁。
4.人脸识别:面容信息与所存面容信息相同即可进行开锁。 开锁成功后会进入修改页面
在此页面可以对密码进行修改或者增加或删除指纹和 RFID 卡片。
#include "sys.h" #include "stm32f10x.h" #include "rc522.h" #include "delay.h" #include "usart.h" #include "led.h" #include "malloc.h" #include "sdio_sdcard.h" #include "stdio.h" #include "timer.h" #include "as608.h" #include "usart3.h" #include "oled_iic.h" #define Open_Lock PWM_Set_Compare2(2300) #define Close_lock PWM_Set_Compare2(1300) /*连线说明: *1--NSS(SDA/CS) <----->PB12 *2--SCK <----->PB13 *3--MOSI<----->PB15 *4--MISO<----->PB14 *5--悬空 *6--GND <----->GND *7--RST <----->PB9 *8--VCC <----->VCC */ /*全局变量*/ unsigned char CT[2];//卡类型 unsigned char SN[4]; //卡号 unsigned char RFID[16]; //存放RFID unsigned char card1_bit=0; //card1选中标志 u8 Data,Data1; u8 key_num=0; u8 ak[8]; u8 big=0; //指纹模块 黄线 TX 白线 RX uint8_t flag=0,Count=0,flag1; void add_id_card(u8 * nnn,unsigned char * sn); void qianyi(u8 * nnn,int a); u8 verify_id_card(const u8 * nnn,const unsigned char * sn); void delete_id_card(u8 * nnn,unsigned char * sn); int main() { extern const u8 BMP1[]; u8 fly=0; u32 sd_size; u8 *buf=0; unsigned char status; u8 i; HZ= GB16_NUM(); LED_Init(); delay_init(); InitRc522(); //Initialize RC522 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 my_mem_init(SRAMIN); //初始化内部内存池 Usart1_Init(); //串口1初始化 usart3_init(57600); USART2_Config(); PWM_Init(); OLED_Init(); OLED_Clear(); while(SD_Init())//检测不到SD卡 { //printf("SD Card Error!"); delay_ms(500); //printf("Please Check! "); delay_ms(500); LED0=!LED0;//DS0闪烁 } OLED_ShowCH(0,0,"指纹模块测试程序"); OLED_ShowCH(16,2,"K1键添加指纹"); OLED_ShowCH(16,4,"K3键删除指纹"); OLED_ShowCH(16,6,"K5键验证指纹"); while(1) { // 指纹模块 if(key_num==1)//添加指纹 { LED0 = 0; key_num=0; OLED_Clear(); HMISends("page 9"); //第9页为指纹的增加 HMISendb(0xff); Add_FR(); key_num=0; Close_lock; } if(key_num==3)//删除指纹 { key_num=0; //OLED_Clear(); HMISends("page 12"); //第12页为指纹的删除 HMISendb(0xff); Del_FR(); key_num=0; Close_lock; } if(key_num==5)//验证指纹 { key_num=0; printf("t1.txt=\"请按手指\"\xff\xff\xff"); //一次性发完命令和结束符 // OLED_Clear(); // OLED_ShowCH(16,2,"请按手指"); if(press_FR()==1) { Open_Lock; HMISends("page 8"); HMISendb(0xff); Open_Lock; } else { HMISends("t1.txt=\"无此指纹,请重试\""); HMISendb(0xff); key_num=5; } } if(key_num==6)//增加ID卡 { key_num=0; HMISends("t0.txt=\"请刷卡\""); HMISendb(0xff); while(status!=MI_OK) { status = PcdRequest(PICC_REQALL,CT);/*寻卡*/ if(status==MI_OK)//寻卡成功 { //printf("PcdRequest_MI_OK\r\n"); status=MI_ERR; status = PcdAnticoll(SN);/*防冲撞*/ } if (status==MI_OK)//防冲撞成功 { //printf("PcdAnticoll_MI_OK"); // status=MI_ERR; //printf("ID:%02x %02x %02x %02x\r\n",SN[0],SN[1],SN[2],SN[3]);//发送卡号 } } status=MI_ERR; buf=mymalloc(0,512); //申请内存 if(buf==0) { //printf("failed\r\n"); continue; } if(SD_ReadDisk(buf,0,1)==0) //读取0扇区的内容 { add_id_card(buf,SN); //printf("SECTOR 0 DATA:\r\n"); for(sd_size=0;sd_size<512;sd_size++);//printf("%x ",buf[sd_size]);//打印0扇区数据 //printf("\r\nDATA ENDED\r\n"); } else { //printf("\r\n SD_ReadDisk(buf,0,1) = %d \r\n",SD_ReadDisk(buf,0,1)); } myfree(0,buf);//释放内存 } if(key_num==7)//访问ID卡 { key_num=0; HMISends("t1.txt=\"请刷卡\""); HMISendb(0xff); while(status!=MI_OK) { status = PcdRequest(PICC_REQALL,CT);/*寻卡*/ if(status==MI_OK)//寻卡成功 { //printf("PcdRequest_MI_OK\r\n"); status=MI_ERR; status = PcdAnticoll(SN);/*防冲撞*/ } if (status==MI_OK)//防冲撞成功 { //printf("PcdAnticoll_MI_OK"); // status=MI_ERR; //printf("ID:%02x %02x %02x %02x\r\n",SN[0],SN[1],SN[2],SN[3]);//发送卡号 } } status=MI_ERR; buf=mymalloc(0,512); //申请内存 if(buf==0) { //printf("failed\r\n"); continue; } if(SD_ReadDisk(buf,0,1)==0) //读取0扇区的内容 { fly=verify_id_card(buf,SN); //printf("%d\r\n",fly); for(sd_size=0;sd_size<512;sd_size++);//printf("%x ",buf[sd_size]);//打印0扇区数据 //printf("\r\nDATA ENDED\r\n"); } if(fly==1) { Open_Lock; HMISends("page 8"); HMISendb(0xff); } else { HMISends("t1.txt=\"无此ID卡,请重试\""); HMISendb(0xff); key_num=7; } myfree(0,buf);//释放内存 } if(key_num==8)//删除ID卡 { key_num=0; HMISends("t1.txt=\"请刷卡\""); HMISendb(0xff); while(status!=MI_OK) { status = PcdRequest(PICC_REQALL,CT);/*寻卡*/ if(status==MI_OK)//寻卡成功 { //printf("PcdRequest_MI_OK\r\n"); status=MI_ERR; status = PcdAnticoll(SN);/*防冲撞*/ } if (status==MI_OK)//防冲撞成功 { //printf("PcdAnticoll_MI_OK"); // status=MI_ERR; //printf("ID:%02x %02x %02x %02x\r\n",SN[0],SN[1],SN[2],SN[3]);//发送卡号 } } status=MI_ERR; buf=mymalloc(0,512); //申请内存 if(buf==0) { //printf("failed\r\n"); continue; } if(SD_ReadDisk(buf,0,1)==0) //读取0扇区的内容 { delete_id_card(buf,SN); //printf("SECTOR 0 DATA:\r\n"); for(sd_size=0;sd_size<512;sd_size++);//printf("%x ",buf[sd_size]);//打印0扇区数据 //printf("\r\nDATA ENDED\r\n"); } myfree(0,buf);//释放内存 } if(key_num==9)//关锁 { key_num=0; Close_lock; HMISends("page 2"); HMISendb(0xff); } if(key_num==10)//验证密码 { //printf("请输入密码2"); key_num=50; } if(key_num==11)//修改密码 { //printf("请输入密码2"); key_num=51; } if(key_num==50)//验证密码 { if(big==100) { key_num=0; buf=mymalloc(0,512); //申请内存 if(buf==0) { //printf("failed\r\n"); continue; } if(SD_ReadDisk(buf,1,1)==0) //读取0扇区的内容 { //for(sd_size=0;sd_size<512;sd_size++)printf("%x ",buf[sd_size]);//打印0扇区数据 } for(i=0;i<6;i++) { if(ak[i]!=buf[i]) { break; } } if(i==6) { Open_Lock; HMISends("page 8"); HMISendb(0xff); } else { //printf("密码错误,请重试"); HMISends("t2.txt=\"密码错误,请重试\""); HMISendb(0xff); key_num=50; } myfree(0,buf);//释放内存 big=0; } } if(key_num==51)//修改密码 { if(big==100) { key_num=0; buf=mymalloc(0,512); //申请内存 if(buf==0) { //printf("failed\r\n"); continue; } if(SD_ReadDisk(buf,1,1)==0) //读取0扇区的内容 { for(sd_size=0;sd_size<512;sd_size++);//printf("%x ",buf[sd_size]);//打印0扇区数据 } for(i=0;i<6;i++) { buf[i]=ak[i]; } if(SD_WriteDisk(buf,1,1)==0) { HMISends("t0.txt=\"修改成功\""); HMISendb(0xff); delay_ms(1000); HMISends("page 1"); HMISendb(0xff); Close_lock; } myfree(0,buf);//释放内存 big=0; } } if(key_num == 12) //人脸识别 { key_num = 0; USART_SendData(USART2,0x43); HMISends("t0.txt=\"识别中...\""); HMISendb(0xff); } } } void USART1_IRQHandler(void) //USART_IT_TC 发送标志 USART_IT_RXNE接收标识 { if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET) { Data = USART_ReceiveData(USART1); //串口接收的数据 if(Data=='A') { big=1; } else if(Data=='B') { big=100; } else if(big!=0) { ak[big-1]=Data; big++; } else { key_num = Data - '0' ; } USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清空串口中断标识 } } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET) { Data1 = USART_ReceiveData(USART2); //串口接收的数据 if(Data1 == '0') { HMISends("t1.txt=\"识别错误\""); HMISendb(0xff); } else if(Data1 == '1') { HMISends("t1.txt=\"识别成功\""); HMISendb(0xff); delay_ms(1000); Open_Lock; HMISends("page 8"); HMISendb(0xff); } USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清空串口中断标识 } } void add_id_card(u8 * nnn,unsigned char * sn) { int i,j=0; if(nnn[0]!=0) { for(i=1;i<=nnn[0]*4-3;i=i+4) { if(nnn[i]==sn[0]&&nnn[i+1]==sn[1]&&nnn[i+2]==sn[2]&&nnn[i+3]==sn[3]) { //printf("已存在,不能存了"); HMISends("t1.txt=\"已存在,不能存了\""); HMISendb(0xff); delay_ms(1000); HMISends("page 1"); HMISendb(0xff); Close_lock; //关锁 return ; } } } j=nnn[0]*4+1; nnn[j]=sn[0]; nnn[j+1]=sn[1]; nnn[j+2]=sn[2]; nnn[j+3]=sn[3]; nnn[0]++; if(SD_WriteDisk(nnn,0,1)==0) { //printf("存入成功"); HMISends("t1.txt=\"存入成功\""); HMISendb(0xff); delay_ms(1000); HMISends("page 1"); HMISendb(0xff); Close_lock; //关锁 } } void delete_id_card(u8 * nnn,unsigned char * sn) { int i; if(nnn[0]!=0) { for(i=1;i<=nnn[0]*4-3;i=i+4) { if(nnn[i]==sn[0]&&nnn[i+1]==sn[1]&&nnn[i+2]==sn[2]&&nnn[i+3]==sn[3]) { //printf("%02x %02x ",nnn[i],sn[0]); qianyi(nnn,i); if(SD_WriteDisk(nnn,0,1)==0) { //printf("删除成功"); HMISends("t1.txt=\"删除成功\""); HMISendb(0xff); delay_ms(1000); HMISends("page 1"); HMISendb(0xff); Close_lock; //关锁 } return ; } } //printf("没有此卡"); HMISends("t1.txt=\"没有此卡\""); HMISendb(0xff); } } u8 verify_id_card(const u8 * nnn,const unsigned char * sn) { int i; if(nnn[0]!=0) { for(i=1;i<=nnn[0]*4-3;i=i+4) { if(nnn[i]==sn[0]&&nnn[i+1]==sn[1]&&nnn[i+2]==sn[2]&&nnn[i+3]==sn[3]) { return 1; } } } return 0; } void qianyi(u8 * nnn,int a) { int i; for(i=a;i<=nnn[0]*4-3;i=i+4) { nnn[i]=nnn[i+4]; nnn[i+1]=nnn[i+5]; nnn[i+2]=nnn[i+6]; nnn[i+3]=nnn[i+7]; } nnn[0]--; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。