码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【毕业设计】20-基于单片机的指纹识别系统设计(原理图工程+源代码工程+实物操作图+答辩论文+答辩PPT)



    typora-root-url: ./

    【毕业设计】20-基于单片机的指纹识别系统设计(原理图工程+源代码工程+实物操作图+答辩论文+答辩PPT)

    文章目录

      • typora-root-url: ./
    • 【毕业设计】20-基于单片机的指纹识别系统设计(原理图工程+源代码工程+实物操作图+答辩论文+答辩PPT)
      • 设计说明书
        • 摘要
        • 设计框架架构
        • 设计说明书及设计文件
        • 源码展示

    设计说明书

    摘要

    对于如何实现家庭防盗这一问题,传统机械锁由于构造简单,被撬事件屡见不鲜;电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐。本设计以单片机STC89C52作为密码锁监控装置的检测和控制核心,采用矩阵键盘输入的电子密码和指纹密码解锁两种解锁方式。系统采用LCD12864液晶显示屏实时更新显示信息,并设有修改密码功能,在解锁或修改密码时如果在未确定时发现自己按错了可以进行退格或重输的操作,如果发现旁边有人看着或者不想输入密码了可以进行退出输入的操作,从一定程度上将确保安全性。测试结果表明,本系统各项功能已达到本设计的所有要求。

    原理图工程文件
    原理图截图
    搭建视频
    答辩论文低重复率文档,25354字
    英文文献及翻译
    答辩PPT
    实物操作图

    设计框架架构

    前 言… 1

    第一章 绪论… 2

    第一节 研究背景与研究意义… 2

    第二节 指纹识别应用及前景… 3

    第三节 本文的主要研究内容… 4

    第四节 本章小结… 4

    第二章 基于单片机的指纹识别系统设计系统方案分析… 5

    第一节 系统设计方案需求… 5

    第二节 系统元器件方案选择… 5

    一、主控芯片选择… 5

    二、指纹模块选择… 6

    三、显示器选择… 6

    四、数据存储芯片选择… 7

    五、人机交互按键选择… 7

    第三节 系统结构总框图… 7

    第四节 本章小结… 8

    第三章 基于单片机的指纹识别系统硬件设计… 9

    第一节 单片机最小系统电路设计… 9

    一、单片机介绍… 9

    二、单片机最小系统电路设计… 10

    第二节 电源电路设计… 11

    第三节 按键电路设计… 12

    第四节 LED显示模块电路… 12

    第五节 LCD液晶显示模块电路… 13

    一、LCD12864介绍… 13

    二、LCD12864电路设计… 13

    第六节 指纹识别电路设计… 14

    第七节 蜂鸣器报警模块电路… 15

    第八节 24C02存储电路设计… 16

    一、24C02芯片介绍… 16

    二、24C02电路设计… 16

    第九节 继电器电路设计… 17

    第十节 系统总电路图… 18

    第十一节 本章小结… 18

    第四章 基于单片机的指纹识别系统软件设计… 19

    第一节 Keil软件介绍… 19

    第二节 主函数设计… 19

    一、主函数流程… 19

    二、主函数程序源码… 21

    第三节 按键程序设计… 22

    一、按键程序流程… 22

    二、按键程序源码… 23

    第四节 LCD程序设计… 25

    一、LCD程序流程… 25

    二、LCD程序源码… 26

    第五节 蜂鸣器及LED程序设计… 26

    一、蜂鸣器及LED程序流程… 26

    二、蜂鸣器及LED程序源码… 27

    第六节 本章小结… 28

    第五章 基基于单片机的指纹识别系统的实现… 29

    第一节 系统调试及遇到的问题… 29

    第二节 系统功能测试… 31

    第三节 本章小结… 34

    总 结… 35

    致 谢… 36

    参考文献… 37

    附 录… 39

    一、英文原文… 39

    二、英文翻译… 44

    三、工程图纸… 48

    四、源代码… 49

    设计说明书及设计文件

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    源码展示

    
    #include			//头文件
    #include
    #include
    #include
    #include
    #define uchar unsigned char	//宏定义
    #define uint unsigned int
    #define ulong unsigned long
    #define MAX 5          //指纹最大数量
    #define ID_MAX 3//输入ID最大位数
    sbitjdq=P3^6;
    sbit buzz=P3^7;
    sbit led=P0^0;
    uint T0_num=0;
    uchar mode=0;   //0正常打卡,1管理界面,2注册模式,3删除模式,4查询模式,5修改密码,6校准时钟,7工作时间
    uchar mode_num=0;
    uint ID=0;		 //存储输入编号ID
    uchar n=0;	     //输入的位数
    bit zhiwen_f=0;	 //1=标记进入指纹采集
    uchar shu;
    uchar a;										//存储按键值
    uchar num;										//记录输入的密码位数
    bit   in_f;										//输入密码的标志
    bit   reset_f;									//重设密码的标志
    bit   input_f;									//六位密码按完的标志
    uchar reset_num;								//标记修改密码阶段,=1输入旧密码,=2输入新密码,=3再次输入新密码
    ulonglow_mima=0;//系统密码
    ulongin_mima=0; //暂存输入的密码
    ulongnew_mima=0;//暂存输入新密码
    uchar set_f=0;
    uchar temp[5]="    \0";  
    /********************************************************
    函数名称:void delayms(uintms)
    函数作用:毫秒延时函数
    参数说明:
    ********************************************************/ 
    void delayms(uintms)
    {
    	unsigned char i=100,j;
    	for(;ms;ms--)
    	{
    		while(--i)
    		{
    			j=10;
    			while(--j);
    		}
    	}
    }
    /********************************************************
    函数名称:void didi(uchar i)
    函数作用:蜂鸣器鸣叫
    参数说明:i为鸣叫次数
    ********************************************************/ 
    void didi(uchar i)
    {
    	uchar j;
    	for(j=0;j=1&&searchnum<=MAX)||searchnum==255)//最多是N个指纹
    	{	
    		if(searchnum>=1&&searchnum<=MAX)//指纹识别成功
    		{
    			temp[0]=searchnum%1000/100+0x30;
    			temp[1]=searchnum%100/10+0x30;
    			temp[2]=searchnum%10+0x30;
    			temp[3]=' ';
    			LCD12864_display_string(3,2,temp);
    			LCD12864_display_string(3,3,"指纹解锁");
    			LCD12864_display_string(1,4,"            ");
    			in_mima=0;
    			num=0;
    			input_f=0;
    			jdq=0;
    			T0_num=0;	
    		}
    		else//不正确的指纹
    		{
    			LCD12864_display_string(3,3,"无效指纹");
    			didi(3);
    		}
    		delay1ms(500);
    		LCD12864_display_string(3,2,"    ");
    		LCD12864_display_string(3,3,"        ");
    	}										
    }
    
    /********************************************************
    函数名称:void cunchu()
    函数作用:存储指纹
    参数说明:
    ********************************************************/
    void cunchu()
    {
    	LCD12864_display_string(0,3,"状态: ");
    	if(ID>0&&ID<=MAX)
    	{
    		if(enroll()==1)//采集两次,生成1个指纹模板成功
    		{
    			if(savefingure(ID)==1)//保存也成功
    			{
    				LCD12864_display_string(3,3,"录入成功");
    				AT24C02_write_date(ID,1);
    			} 
    			else
    				LCD12864_display_string(3,3,"存储失败");	
    		}
    		else
    			LCD12864_display_string(3,3,"采集失败");	
    	}
    	else
    		LCD12864_display_string(3,3,"编号错误");
    	n=0;
    	ID=0;
    	zhiwen_f=0;
    }
    /********************************************************
    函数名称:void shanchu()
    函数作用:删除指纹
    参数说明:
    ********************************************************/
    void shanchu()
    {
    	uinti;
    	LCD12864_display_string(0,3,"状态: ");
    	if(ID>0&&ID<=MAX)
    	{
    		if(dellfingure(ID)==1)
    		{
    			LCD12864_display_string(3,3,"删除成功");
    			AT24C02_write_date(ID,0);
    		}
    		else
    			LCD12864_display_string(3,3,"删除失败");	
    	}
    	else
    	{
    		if(ID==999)
    		{
    			if(Clear_All()==1)
    			{
    				for(i=1;i<6;i++)
    					AT24C02_write_date(i,0); 
    				LCD12864_display_string(3,3,"清空指纹");
    			}
    			else
    				LCD12864_display_string(3,3,"清空失败");	
    		}
    		else
    			LCD12864_display_string(3,3,"编号错误");
    	}		
    	n=0;
    	ID=0;
    	zhiwen_f=0;									
    }
    
    /********************************************************
    函数名称:void display_guanli()
    函数作用:显示管理界面
    参数说明:
    ********************************************************/
    void display_guanli()
    {
    	LCD12864_display_string(0,1,"  管理系统界面  ");
    	LCD12864_display_string(0,2,"    录入指纹    ");
    	LCD12864_display_string(0,3,"    删除指纹    ");
    	LCD12864_display_string(0,4,"    修改密码    ");
    	switch(mode_num)		
    	{
    	   case 0: LCD12864_display_string(0,2," >> "); break;
    	   case 1: LCD12864_display_string(0,3," >> "); break;
    	   case 2: LCD12864_display_string(0,4," >> "); break;
    	   default: break;
    	}
    }
    /*********************************************************
    函数名称:void chuli()
    函数作用:对所按下的按键进行处理
    参数说明:
    *********************************************************/
    void chuli()
    {
    	if(key_f==1)	//先判断是否有按键按下
    	{	
    		if(a==11&&mode==0&&in_f==0)
    		{
    			shu++;
    			if(shu>=4)
    			{
    				AT24C02_write_date(200,0);
    				AT24C02_write_date(201,0);
    				AT24C02_write_date(202,0);
    				low_mima=0;
    				shu=0;	
    			}
    		}	
    		else
    			shu=0;
    		if((mode==2||mode==3)&&a<10)  //如果输入ID状态,并且按下的是数字键
    		{
    	if(n1)
    				    LCD12864_display_char(num+1,2,a+0x30);//ASCII[a]
    				else
    					LCD12864_display_char(num+1,2,'*');//显示“*”
    			}
    			else
    				LCD12864_display_char(num+1,4,'*');//显示“*”
    			in_mima=in_mima*10+a;//读入密码	
    			num++;			//密码输入次数加一			
    			if(num==6)		//六位密码输入完成																				
    				input_f=1;	//标记六位密码输入完成						
    		}
    		if(a==10)
    		{
    			if(mode==0&&in_f==0)//输入密码
    			{
    				num=0;
    				in_f=1;
    				in_mima=0;
    				input_f=0;  //清除确定标志
    				write_com(0x01);
    				LCD12864_display_string(0,1,"请输入管理密码: ");//显示输入密码
    			}
    		}
    		if(a==15) //返回上一级菜单
    		{
    			if(mode>1)			  //在管理操作中
    			{	
    				write_com(0x01);
    				LCD12864_clear12864(); 
    				mode=1;		//回到管理选择界面
    			}
    			else
    			{
    				if(mode!=0||in_f==1)
    				{
    					write_com(0x01);
    					mode=0;
    					diaplay_mode0();
    					in_f=0;
    					num=0;
    					input_f=0;	
    				}
    			}			
    			if(jdq==0)
    			{
    				jdq=1;
    				T0_num=0;
    			}			
    		}				
    		if(a==11)//选择上一项
    		{
    			if(mode==1)//选择上一项管理	
    			{
    				if(mode_num==0)
    					mode_num=2;	
    				else
    					mode_num--;	
    			}
    		}
    		if(a==12)//选择下一项
    		{
    			if(mode==1)//选择下一项管理
    			{
    				if(mode_num>=2)
    					mode_num=0;	
    				else
    					mode_num++;		
    			}	
    		}
    		if(a==13) //退格
    		{										
    			 if(mode==0||mode==4)//在输入密码状态
    			 {
    				if(num!=0)
    				{			 //输入密码个数减1
    					num--;
    					if(in_f==1||mode==4)
    						LCD12864_display_char(num+1,2,' ');	
    					else
    						LCD12864_display_char(num+1,4,' ');					
    					in_mima=in_mima/10;
    					input_f=0;
    				}
    			 }
    			 if(mode==2||mode==3)//在ID编号输入状态
    			 {
    				if(n!=0)
    				{
    					LCD12864_display_char(2+n,2,' ');
    					n--;
    					ID=ID/10;
    					zhiwen_f=0;
    				}
    			 }
    		}
    		if(a==14)//确定
    		{
    			if(mode==1)		    //确定选择管理操作
    			{	
    				write_com(0x01);
    				mode=mode_num+2;
    				n=0;
    				ID=0;
    				zhiwen_f=0; 
    				input_f=0;   //清除确定标志
    				num=0;
    				in_mima=0;
    				new_mima=0;
    				switch(mode_num)		
    				{
    				   case 0:  	
    								LCD12864_display_string(0,1,">>录入指纹");
    								LCD12864_display_string(0,2,"编号: ");
    								break;
    				   case 1:  	
    								LCD12864_display_string(0,1,">>删除指纹");
    								LCD12864_display_string(0,2,"编号: ");
    								break;
    				   case 2:  	
    								reset_f=1;
    								reset_num=1;
    								LCD12864_display_string(0,1,"请输入旧密码: "); 
    								break;	
    				   default: break;
    				}	
    			}
    			else 
    			{
    				if(input_f==1)//密码输入完成确定
    				{
    					if(reset_f==1/*&&num==6*/) //修改密码区间
    					{
    						if(reset_num==3)
    						{	
    							if(new_mima==in_mima)
    							{	
    								low_mima=new_mima;
    								AT24C02_write_date(200,low_mima/10000);
    								AT24C02_write_date(201,low_mima%10000/100);
    								AT24C02_write_date(202,low_mima%100);
    								write_com(0x01);
    								LCD12864_display_string(1,1,"密码修改成功");
    								LCD12864_display_string(1,3,"请妥善保管好");
    							}
    							else
    							{
    								LCD12864_display_string(1,3,"密码修改失败");
    							}
    							reset_num=0;
    							reset_f=0;	
    						} 
    						if(reset_num==2)
    						{	
    							write_com(0x01);
    							LCD12864_display_string(0,1,"请再次输入新密码");		
    							new_mima=in_mima;
    							reset_num++;	
    						} 
    						if(reset_num==1)
    						{
    							if(low_mima==in_mima)
    							{	
    								write_com(0x01);
    								reset_num++;
    								LCD12864_display_string(0,1,"请输入新密码: ");//显示输入新密码
    							}
    							else
    							{
    								LCD12864_display_string(2,3,"密码错误");//显示密码错误
    								reset_num=1;
    								LCD12864_display_string(1,2,"            ");	
    							}
    						}
    					}
    					if(in_f==1)		   //进入管理输入密码时候
    					{
    						if(low_mima==in_mima)
    						{						
    							mode=1;
    							write_com(0x01);
    							in_f=0;
    						}
    						else
    						{
    							LCD12864_display_string(2,3,"密码错误");	//显示密码错误
    							LCD12864_display_string(1,2,"            ");	
    						}
    					} 
    					if(mode==0&&in_f==0)
    					{
    						if(low_mima==in_mima)
    						{					
    							LCD12864_display_string(3,3,"解锁成功");
    							jdq=0;
    							T0_num=0;
    						}
    						else
    						{
    							LCD12864_display_string(3,3,"密码错误");	//显示密码错误
    							didi(3);
    						}
    						LCD12864_display_string(1,4,"            ");
    						delay1ms(500);
    						LCD12864_display_string(3,3,"        ");	
    					}
    					in_mima=0;
    					num=0;		//清除密码计数。重新计算输入的密码个数
    					input_f=0;  //清除确定标志
    				}
    				if((mode==2||mode==3)&&n==ID_MAX)
    				{
    					zhiwen_f=1;		
    				}
    			}			
    		}						
    		key_f=0;        //清除按键标志	
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433
    • 434
    • 435
    • 436
    • 437
    • 438
    • 439
    • 440
    • 441
    • 442
    • 443
    • 444
    • 445
    • 446
    • 447
    • 448
    • 449
    • 450
    • 451
    • 452
    • 453
    • 454
    • 455
    • 456
    • 457
    • 458
    • 459
    • 460
    • 461
    • 462
    • 463
    • 464
    • 465
  • 相关阅读:
    oracle 分组合并字段,每组行显示
    antd vue 组件 使用下拉框的层级来显示后面的输入框
    angular+ionic+npm项目运行
    关于Keil编译程序出现“File has been changed outside the editor,reload?”的解决方法
    C语言实现用弦截法求 f(x)=x^3-5*x^2+16*x-80=0 的根
    C# OpenCvSharp 实现迷宫解密
    Linux内核存在缺陷发行陷困境
    Java进阶(一)面向对象进阶简介
    一码胜千言,博园Polo衫,上架预售啦
    面试后的反思与总结:不断进步的关键
  • 原文地址:https://blog.csdn.net/qq_22592979/article/details/128108641
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号