【32项目】基于stm32f103c8t6的智能门禁系统(含代码和hex文件)

本人主要分享自己做项目的经验和,以下的由本人查资料自己整理而来,很乐意和有兴趣的小伙伴一起分享一下小项目的经验总结,同时如果有什么说的不对的地方可以评论出来,我尽可能快的回复大家。如 果 感 兴 趣 的 可 以 关 注 我 之 后 还 会 继 续 更 新 关 于 3 2 的 一 些 小 项 目 , 谢 谢 大 家 !!!!)

文 章 末 尾 有 完 整 的 代 码 和 P c b 文 件

设计背景:

智能门禁系统的设计背景源于信息技术和智能硬件的快速发展,以及人们对安全、便捷、高效生活环境的需求不断提升。以下是一些主要的设计背景因素:

  1. 安全需求增加:随着城市化进程的加快,人口密集区域的安全隐患增多,人们对入门安全的关注度提高,智能门禁系统能够有效防止非法入侵和保障财产安全。

  2. 技术进步:生物识别技术(如指纹识别、面部识别)、射频识别(RFID)技术以及物联网(IoT)技术的发展,为智能门禁系统的实现提供了强有力的技术支持。这些技术的应用使得门禁系统更加智能化和便捷。

  3. 用户体验提升:现代家庭和商业用户对便捷性的追求越来越高,传统门禁系统的钥匙管理不够灵活,智能门禁系统可以通过手机应用、卡片、指纹等多种方式进行身份验证,提升用户体验。

  4. 管理效率提高:在企业和公共场所,智能门禁系统不仅可以提高安全性,还能通过记录访问数据,帮助管理者进行人员流动的分析和管理,提高工作效率。

  5. 疫情影响:近年来的疫情促使许多地方重视接触式管理的问题,智能门禁系统通过无接触技术、远程管理等功能,能够有效降低病毒传播的风险。

  6. 环保与可持续发展:智能门禁系统通常伴随着节能设计,减少了不必要的能源消耗,符合现代社会的可持续发展理念。

综上所述,智能门禁系统的设计背景是多方面的,它融合了安全技术进步、用户需求变化以及社会环境的发展,旨在为用户提供一个安全、便捷、高效的管理解决方案。

设计目标:

本设计是一个智能解锁系统,应该取代传统的解锁系统,更加智能化。使用的时候按在指纹传感器上面,就能做出判断,决定是否开锁,能够完成解锁的基本功能。而且还避免了传统开锁的工具容易被盗用、破解、遗忘等弊端,造成不必要的损失。

同时考虑到实际生活中有访客到家来这种情况并没有提前录入指纹的,我们还设计了射频卡解锁和密码解锁,多种解锁方式供用户选择。

既然要指纹解锁,就需要有录入指纹的功能,还要实现管理指纹这项功能,也需要有删除指纹的作用。同时读卡器也需要有读卡和写卡的功能,可以通过按键输入密码来进入管理员模式,进行指纹的录入、识别、删除;卡的读写;密码修改等功能。

所需材料:

STM32最小系统板STM32F103C8T6核心板
LCD12864模块12864液晶屏5V带中文字库
蓝牙模块HC-05
RFID模块RC522
指纹识别模块AS608
有源蜂鸣器一体式3V
自锁开关6脚7*7自锁开关
继电器松乐继电器;5V,5脚
24C02芯片AT24C02 DIP8
3.3k贴片0603封装
4.7k贴片电阻0603封装
47k贴片电阻0603封装
1N5819二极管SMA丝印SS14
1N4001二极管SMA丝印M1
S8050三极管S8050 NPN 丝印J3Y
S8550三极管S8550 PNP 丝印2TY
LED灯0603封装
10uF贴片电容0805封装
电感4.7uhCD54
机械按键6*6*5贴片
MicroUSB接口母座四脚插7.2固定脚长1.8亮面
2PIN端子2P 直针
2.54mm排母20PIN单排
2.54mm排母8PIN单排
2.54mm排母6PIN单排
1.25mm间距贴片插座8p立贴

原理图:

PCB图:

部分代码:

main.c部分代码(完整代码在文章末尾

//头文件
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
//#include "bmp.h"
#include "button.h"
#include "lcd12864.h"
//#include "oled.h"
#include "as608.h"
#include "timer.h"
#include "usart2.h"
#include "rc522.h"
#include "usart.h"
#include "24cxx.h"

//取密码和卡号长度,方便存放在AT24C02中	
#define size_card sizeof(my_card)		//AT24C02  0-9
#define size_card1 sizeof(my_card1)	//AT24C02  10-19
#define size_card2 sizeof(my_card2)	//AT24C02  20-29
#define size_pass sizeof(my_pass_word)	//AT24C02  30-39
#define size_admin sizeof(admin_key)	//AT24C02  40-49

void clear_pass_word(void);  	//清除密码暂存数组 清除为{16,16,16,16,16,16}
void admin_flag_limit(void);	//限制功能选择的大小
void admin_zhiwen_limit(void);//限制指纹功能选择的大小

void add_IDcard(u8 cardID);	//添加ID卡函数
void del_IDcard(u8 cardID);	//删除ID卡函数

void admin_show(void); 		//管理界面功能选择显示
void admin_zhiwen_show(void); //管理指纹界面功能选择显示
void admin_mima_show(void); 	//管理指纹界面功能选择显示
void admin_IDcard_show(void); //管理ID卡界面功能选择显示

void AT24CXX_Config(void);//上电后密码配置

void num2char(uint8_t *str, float number, u8 g, u8 l);

extern u8 status;		//刷ID卡时的状态
extern uint8_t str[25];  //用于整型转字符型的中间数组
extern u8 Key_flag; 	//按键按下标志位,区分按键按下一次的
extern u8 SN[4]; 		//卡号
extern u8 CT[2];		//卡类型

u16 zhiwen_ID=0;  	//刷卡后存放指纹ID号
u8 state=3;  		//显示界面状态标志  初始5为第一解锁界面
u8 key;  			//按键值

u8 my_pass_word_init[6] = {1,1,1,1,1,1};
u8 admin_key_init[6] = {2,2,2,2,2,2};

u8 pass_word[6];  					//暂时存放输入的密码
u8 my_pass_word[6];  	//我的密码(解锁密码)
u8 admin_key[6]; 	//管理员密码
u8 my_card[4]; 		//卡0 默认卡
u8 my_card1[4];			  		//卡1
u8 my_card2[4];					//卡2  这里卡还可继续添加

//一些标志位的定义
u8 my_card_flag=0;   	//判断是否是自己的卡
u8 serch_card_flag=0;  	//判断是否刷过卡
u8 zhi_wen_flag=0;  	//判断指纹是否正确标志
u8 pass_word_state=0;   	//输密码时判断是输入了第几位
u8 mima_show_state=0;  	//密码显示标志位
u8 admin_flag=1;  		//管理员功能选择标志位
u8 admin_zhiwen_flag=1; 	//指纹管理功能标志位
u8 add_zhiwen_flag=0;  	//判断录取指纹是否成功

static char table[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

int main(void)
{	
//	u16 len;
#include <stm32f10x.h>
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

	SystemInit();		// 配置系统时钟为72M 
	delay_init();    	//延时初始化	
	uart_init(9600);	//串口初始化为9600
	
	RC522_Init();       //初始化射频卡模块
	AT24CXX_Init();	//AT24C02初始化 
	usart2_init(usart2_baund);//初始化串口2 与指纹通信用,同时初始化定时器
	PS_StaGPIO_Init();	//初始化指纹模块读状态的引脚
	
	Lcd_Init();	
	KEY_Init();
	
	//若未正确连接指纹模块,将在这一步卡住,可更改这个函数使程序向下进行
 	Shake_to_AS608();  //用来与指纹模块握手,检测指纹模块和获取一些模块的信息

	//若未正确连接AT24C02模块,将在这一步卡住,可更改这里使程序向下进行
	while(AT24CXX_Check())//检测不到24c02
	{
		LCD_Display_Words(0,0,"未检测到存储模块");
		delay_ms(500);
	}
	LCD_Display_Words(0,0,"存储模块通讯成功");
	delay_ms(500);
	
	//每次运行函数从外部存储器调出密码,达到调电存储的目的
	//从外部存储读取密码
	AT24CXX_Config();

	while(1)
        {
		//每一个case是一个界面,在此界面里执行相应操作,满足条件后跳出
		//再次判断state而进入另一个界面
		//以此进行菜单的设计

		switch(state)
		   { 
			//录入指纹	
			case 1:
					LCD_Clear();
					LCD_Display_Words(0,0,"****指纹录入****");
					LCD_Display_Words(1,0,"按数字选择指纹ID");
					LCD_Display_Words(2,0,"  ID范围:1-9");
					LCD_Display_Words(3,0,"Back");
					while(1)
					{
						key=Key_Scan();	//按键扫描
						if(key==back)		//如果按下返回键
						{
							state=6;  	//返回指纹管理功能选择界面
							break;		//跳出此while循环
						}
						else if(0<key&&key<10)	//按下的按键值为1-9
						{
							Add_FR(key);	//执行添加指纹函数
							break;   		//跳出此while循环
						}							
					}						
					continue;	
			//删指纹		
			case 2 :
					LCD_Clear();	
					LCD_Display_Words(0,0,"****指纹删除****");
					LCD_Display_Words(1,0,"按数字选择指纹ID");
					LCD_Display_Words(2,0,"  ID范围:1-9");
					LCD_Display_Words(3,0,"Back");			
					while(1)
					{
						key=Key_Scan();	//按键扫描
						if(key==back)		//如果按下返回键
						{
							state=6;  	//返回指纹管理功能选择
							break;
						}						
						else if(0<key&&key<10)//按下的按键值为1-9
						{
							Del_FR(key);	//执行删除指纹函数
							break;
						}						
					}
					continue;							
			//第一解锁主界面				
			case 3 : 
					LCD_Clear();
					pass_word_state=0;  //清零按键次数记录位
			          Key_flag=0;		//清零按键按下标志位
					while(1)
					{
						//解锁界面,先判断有没有手指按下,
						//没有手指按下再判断有没有卡放在读卡器上
						//没有刷指纹也没有刷卡就判断按键,进行密码解锁
						
						LCD_Display_Words(0,0,"智能电子密码锁");
						LCD_Display_Words(3,0,"          Enter");

						
						if(USART_RX_STA&0x8000)//判断是否接受到蓝牙信息
						{
							if(USART_RX_BUF[0]-48==my_pass_word[0]&&USART_RX_BUF[1]-48==my_pass_word[1]&&USART_RX_BUF[2]-48==my_pass_word[2]&&USART_RX_BUF[3]-48==my_pass_word[3]&&USART_RX_BUF[4]-48==my_pass_word[4]&&USART_RX_BUF[5]-48==my_pass_word[5])
								{
									clear_pass_word(); //用完就清除pass_word里的密码,防止发生错误
									LCD_Display_Words(2,2,"密码正确");
									printf("解锁成功\r\n");									
									RELAY=1;	//开继电器
									delay_ms(1000);
									RELAY=0;	//关继电器
									LCD_Clear();
								}
							else
								{	
									LCD_Display_Words(2,2,"密码错误");
									printf("密码错误\r\n");									
									BEEP=0;    //开蜂鸣器
									delay_ms(500);
									BEEP=1;    //关蜂鸣器
									LCD_Clear();
								}
	
							USART_RX_STA=0;
						}
						else
						{
							USART_RX_STA = 0;
						}
						 
						if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下
						{
							press_FR();//刷指纹
							if(zhi_wen_flag==1)  //如果指纹正确
							{
								zhi_wen_flag=0;//识别到指纹按下只执行1次,所以清零
								LCD_Display_Words(1,2,"成功解锁");
								int2str(zhiwen_ID, str);//把指纹ID转成字符类型方便显示
								LCD_Display_Words(2,0,"     ID:");
								LCD_Display_Words(2,4,str);
								printf("解锁成功\r\n");
								RELAY=1;	//开继电器
								delay_ms(1000);
								RELAY=0;	//关继电器
								LCD_Clear();							
							}
							else	//如过指纹不正确
							{	
							LCD_Display_Words(2,2,"指纹错误");	
							printf("指纹错误\r\n");
							BEEP=0;    //开蜂鸣器
							delay_ms(500);
							BEEP=1;    //关蜂鸣器
							LCD_Clear();
							}							
						}
					
						RC522_Handel();  //射频卡处理程序
						if(serch_card_flag==1)  //如果刷过1次卡
						{
							serch_card_flag=0;  //进入一次标志位清零
							if(my_card_flag==1)  //如果是自己的卡
							{
								my_card_flag=0;//识别到只执行1次,所以清零
								LCD_Display_Words(1,2,"成功解锁");
								printf("解锁成功\r\n");
								RELAY=1;	//开继电器
								delay_ms(1000);
								RELAY=0;	//关继电器
								LCD_Clear();							
							}
							else	//如过卡不正确
							{	
							LCD_Display_Words(2,2,"刷卡错误");
							printf("刷卡错误\r\n");								
							BEEP=0;    //开蜂鸣器
							delay_ms(500);
							BEEP=1;    //关蜂鸣器
							LCD_Clear();
							}
						}
						
						key=Key_Scan(); //开始扫描按键
						
						if(key==enter)
						{
							state=4;//进入输入管理员密码界面
							break;
						}
						if(key==xx)
						{
							LED0 = !LED0;
						}
						if(0<key&&key<10)	 
						{	
							mima_show_state=pass_word_state; //这是显示相关的标志位赋值 
							pass_word[pass_word_state]=key;  //将按键按下的值放入临时的密码数组
							LCD_Display_Words(1,++mima_show_state,"*");
							if(mima_show_state<6)  //这是显示相关的标志判断
								{
								LCD_Display_Words(1,++mima_show_state,"_"); //输完6位密码就不显示了	
								}
							pass_word_state++;//输入密码的标志位自加
								
							if(pass_word_state==6) //如果输完了6位密码,开始比较
							{	
								pass_word_state=0;//密码为数标志位清零
								
								if(pass_word[0]==my_pass_word[0]&&pass_word[1]==my_pass_word[1]&&pass_word[2]==my_pass_word[2]&&pass_word[3]==my_pass_word[3]&&pass_word[4]==my_pass_word[4]&&pass_word[5]==my_pass_word[5])
									{
									clear_pass_word(); //用完就清除pass_word里的密码,防止发生错误
									LCD_Display_Words(2,2,"密码正确");
									printf("解锁成功\r\n");
									RELAY=1;	//开继电器
									delay_ms(1000);
									RELAY=0;	//关继电器
									LCD_Clear();
									}
								else
									{	
									LCD_Display_Words(2,2,"密码错误");	
									printf("密码错误\r\n");
									BEEP=0;    //开蜂鸣器
									delay_ms(500);
									BEEP=1;    //关蜂鸣器
									LCD_Clear();
									}
							}							
						}						
					}					
					continue;
			//输入管理员密码界面		
			case 4:
					LCD_Clear();
					pass_word_state=0;  //清零按键次数记录位
			          Key_flag=0;		//清零按键按下标志位	
					LCD_Display_Words(0,0,"请输入管理员密码");
					LCD_Display_Words(3,0,"Back");			
					while(1)
					{
						key=Key_Scan();//按键扫描
						if(key==back)
						{
							state=3;  //回到刷卡界面
							break;
						}
						if( Key_flag==1)	 //检测Key_flag状态,如果有按键按下
						{	
							Key_flag=0;	//按键按下一次标志位清零
							mima_show_state=pass_word_state;   //这是显示相关的标志位赋值 
							pass_word[pass_word_state]=key;	//将按键按下的值放入临时的密码数组
							LCD_Display_Words(1,++mima_show_state,"*");
							if(mima_show_state<6)	//这是显示相关的标志判断
								{
								LCD_Display_Words(1,++mima_show_state,"_"); //输完6位密码就不显示了	
								}
							pass_word_state++;		//输入密码的标志位自加
								
							if(pass_word_state==6)	//如果输完了6位密码,开始比较
							{	
								pass_word_state=0;	//密码为数标志位清零
								if(pass_word[0]==admin_key[0]&&pass_word[1]==admin_key[1]&&pass_word[2]==admin_key[2]&&pass_word[3]==admin_key[3]&&pass_word[4]==admin_key[4]&&pass_word[5]==admin_key[5])
									{
									state=5;  //管理员密码正确,进入管理员界面
									clear_pass_word();//用完就清除pass_word里的密码,防止发生错误
									LCD_Display_Words(2,2,"密码正确");	
									delay_ms(1000);
									LCD_Clear();
									break;
									}
								else
									{	
									LCD_Display_Words(2,2,"密码错误");	
									delay_ms(1000);
									LCD_Clear();
									break;
									}
							}							
						}
					}						
					continue;	
			//管理员功能选择界面	
			case 5:
					LCD_Clear();
					admin_flag=1;//管理员功能标志位
			          Key_flag=0;		//清零按键按下标志位
					admin_show(); //管理界面功能选择显示			
					while(1)
					{
						key=Key_Scan();	//按键扫描
						if(key==back)
						{
							state=3;  	//返回解锁界面
							break;
						}									
						else if(key==add)	//界面功能选择加减
						{
							admin_flag--;
							admin_flag_limit();	//限制admin_flag大小为1-3
							admin_show(); 		//管理界面功能选择显示
						}
						else if(key==sub)	//界面功能选择加减
						{
							admin_flag++;
							admin_flag_limit();	//限制admin_flag大小为1-3
							admin_show(); 		//管理界面功能选择显示
						}
						
						else if(key==enter)	//如果按下确认键,判断admin_flag,判断选择的哪个功能
						{
							if(admin_flag==1)
							{
								state=6;  //指纹管理
								break;
							}
							if(admin_flag==2)
							{
								state=7;  //密码管理
								break;
							}
							if(admin_flag==3)
							{
								state=8;  //ID卡管理
								break;
							}															
						}	
					}								
										
					continue;	
			//指纹管理功能选择
			case 6 : 
					LCD_Clear();
					admin_zhiwen_flag=1;	//指纹功能选择标志位为1
					admin_zhiwen_show(); 	//指纹功能选择显示	
					while(1)
					{
						key=Key_Scan();	//按键扫描
						if(key==back)
						{
							state=5;  //返回管理员功能选择界面
							break;
						}						
						else if(key==add)	//界面功能选择加减
						{
							admin_zhiwen_flag--;
							admin_zhiwen_limit();//限制admin_zhiwen_flag大小为1-2
							admin_zhiwen_show(); //指纹功能选择显示	
						}
						else if(key==sub)
						{
							admin_zhiwen_flag++;
							admin_zhiwen_limit();//限制admin_zhiwen_flag大小为1-2
							admin_zhiwen_show(); //指纹功能选择显示	
						}
						else if(key==enter)		//如果按下确认键,判断admin_zhiwen_flag以判断选择的哪个功能
						{
							if(admin_zhiwen_flag==1)
							{
								state=1;  //进入添加指纹界面
								break;
							}
							if(admin_zhiwen_flag==2)
							{
								state=2;  //进入删除指纹界面
								break;
							}
						}
					}					
					continue;	
			//密码管理功能选择		
			case 7 : 
					LCD_Clear();
					admin_zhiwen_flag=1;  //两项功能选择,这个标志位也可以用
					admin_mima_show(); 	//密码功能选择显示	
					while(1)
					{
						key=Key_Scan();//按键扫描
						if(key==back)
						{
							state=5;  //返回管理员功能选择界面
							break;
						}						
						else if(key==add)	//界面功能选择加减
						{
							admin_zhiwen_flag--;
							admin_zhiwen_limit();	//限制admin_zhiwen_flag大小为1-2
							admin_mima_show();	 	//密码功能选择显示	
						}
						else if(key==sub)	//界面功能选择加减
						{
							admin_zhiwen_flag++;
							admin_zhiwen_limit();	//限制admin_zhiwen_flag大小为1-2
							admin_mima_show(); 		//密码功能选择显示	
						}
						else if(key==enter)
						{
							if(admin_zhiwen_flag==1)
							{
								state=9;  //进入修改解锁密码
								break;
							}
							if(admin_zhiwen_flag==2)
							{
								state=10;  //进入修改管理密码
								break;
							}
						}
					}					
					continue;			
			//ID卡管理		
			case 8 : 
					LCD_Clear();
					admin_zhiwen_flag=1;  //两项功能选择,这个标志位也可以用
					admin_IDcard_show(); //密码功能选择显示	
					while(1)
					{
						key=Key_Scan();
						if(key==back)
						{
							state=5;  //返回管理员界面
							break;
						}						
						else if(key==add)
						{
							admin_zhiwen_flag--;
							admin_zhiwen_limit();	//限制admin_zhiwen_flag大小为1-2
							admin_IDcard_show(); 	//密码功能选择显示	
						}
						else if(key==sub)
						{
							admin_zhiwen_flag++;
							admin_zhiwen_limit();	//限制admin_zhiwen_flag大小为1-2
							admin_IDcard_show(); 	//密码功能选择显示	
						}
						else if(key==enter)
						{
							if(admin_zhiwen_flag==1)
							{
								state=11;  //进入添加ID卡
								break;
							}
							if(admin_zhiwen_flag==2)
							{
								state=12;  //进入删除ID卡
								break;
							}
						}
					}					
					continue;
			//修改解锁密码		
			case 9 : 
					LCD_Clear();
					LCD_Display_Words(0,0,"请输入新解锁密码");
					LCD_Display_Words(3,0,"Back");
					pass_word_state=0;  //清零按键次数记录位		
					while(1)
					{
						key=Key_Scan();	//按键扫描
						if(key==back)
						{
							state=7;  //返回密码管理界面
							break;
						}
						if( 0<key&&key<10)	 //如果按下的按键值为1-9
						{	
							mima_show_state=pass_word_state;  //这是显示相关的标志位赋值 
							my_pass_word[pass_word_state]=key;   //直接修改解锁密码
							
							num2char(str,key,1,0);//将按键值转为字符型好显示	
							LCD_Display_Words(1,++mima_show_state,str);
							
							if(mima_show_state<6)
								{	
								LCD_Display_Words(1,++mima_show_state,"_"); //输完6位密码就不显示了	
								}
							pass_word_state++;
								
							if(pass_word_state==6)//如果输完6个密码
							{
								AT24CXX_Write(30,(u8*)my_pass_word,size_pass);//将修改后的解锁密码放入AT24C02 //30
								
								state=7;  //返回密码管理功能选择界面								
								pass_word_state=0; 	
								LCD_Display_Words(1,0,"解锁密码修改成功");	
								delay_ms(1000);
								break;
							}							
						}
					}					
					continue;  //跳出switch直接对最外层的while进行条件判断
					
			//修改管理密码		
			case 10 : 
					LCD_Clear();
					LCD_Display_Words(0,0,"请输入新管理密码");
					LCD_Display_Words(3,0,"Back");
					pass_word_state=0;  //清零按键次数记录位		
					while(1)
					{
						key=Key_Scan();
						if(key==back)
						{
							state=7;  //返回密码管理界面
							break;
						}
						if( 0<key&&key<10)	 //如果按下的按键值为1-9
						{	
							mima_show_state=pass_word_state;  
							admin_key[pass_word_state]=key;   //直接修改解锁密码
							
							num2char(str,key,1,0);	
							LCD_Display_Words(1,++mima_show_state,str); //直接显示输入的密码
							
							if(mima_show_state<6)
								{
								LCD_Display_Words(1,++mima_show_state,"_"); //输完6位密码就不显示了	
								}
							pass_word_state++;
								
							if(pass_word_state==6)
							{
								AT24CXX_Write(40,(u8*)admin_key,size_admin);//将修改后的管理密码放入AT24C02  //40
								state=7;  //返回密码管理功能选择界面								
								pass_word_state=0;
								LCD_Display_Words(1,0,"管理密码修改成功");	
								delay_ms(1000);
								break;
							}							
						}
					}					
					 continue;  //跳出switch直接对最外层的while进行条件判断					
			//添加ID卡
			case 11 : 
					LCD_Clear();
					LCD_Display_Words(0,0,"按数字键选择卡号");
					LCD_Display_Words(1,0,"卡号范围:0-2");
					LCD_Display_Words(2,0,"卡0 为默认卡");
					LCD_Display_Words(3,0,"Back");
					while(1)
					{	
						key=Key_Scan();
						if(key==back)
						{
							state=8; //返回ID卡管理
							break;
						}
						else if(key<3)
						{
							add_IDcard(key);//添加卡
							break;  //返回到添加卡界面
						}
					}					
					continue;  //跳出switch直接对最外层的while进行条件判断
			//删除ID卡		
			case 12 : 
					LCD_Clear();
					LCD_Display_Words(0,0,"按数字键选择卡号");
					LCD_Display_Words(1,0,"卡号范围:0-2");
					LCD_Display_Words(2,0,"卡0 为默认卡");
					LCD_Display_Words(3,0,"Back");
					while(1)
					{	
						key=Key_Scan();
						if(key==back)
						{
							state=8; //返回ID卡管理
							break;
						}
						else if(key<3)
						{
							del_IDcard(key);//删除卡
							break;  //返回到添加卡界面
						}
					}					
					continue;  //跳出switch直接对最外层的while进行条件判断			
		   }   
        }
	   

}





	

void admin_flag_limit(void)  //限制功能选择的大小  1-3选择
{
   if(admin_flag>3)
   {
	admin_flag=1;
   }
   else if(admin_flag<1)
   {
	admin_flag=3;
   }
}		

void admin_zhiwen_limit(void)//限制指纹功能选择的大小  1-2选择
{
   if(admin_zhiwen_flag>2)
   {
	admin_zhiwen_flag=1;
   }
   else if(admin_zhiwen_flag<1)
   {
	admin_zhiwen_flag=2;
   }
}

void clear_pass_word(void)  //清除密码暂存数组,全部赋值为16
{
	u8 i;
	for(i=0;i<6;i++)
	{
	pass_word[i]=16;
	}
}

void admin_show(void) //管理界面功能选择显示
{
	switch(admin_flag)
	{
		case 1:
		LCD_Display_Words(0,0," *  指纹管理");
		LCD_Display_Words(1,0,"    密码管理");
		LCD_Display_Words(2,0,"    ID卡管理");
		LCD_Display_Words(3,0,"Back       Enter");
		break;
		
		case 2:
		LCD_Display_Words(0,0,"    指纹管理");
		LCD_Display_Words(1,0," *  密码管理");
		LCD_Display_Words(2,0,"    ID卡管理");
		LCD_Display_Words(3,0,"Back       Enter");
		break;
				
		case 3:
		LCD_Display_Words(0,0,"    指纹管理");
		LCD_Display_Words(1,0,"    密码管理");
		LCD_Display_Words(2,0," *  ID卡管理");
		LCD_Display_Words(3,0,"Back       Enter");
		break;
	}

}

void admin_zhiwen_show(void)//指纹管理界面功能选择显示
{
	switch(admin_zhiwen_flag)
	{
		case 1:
		LCD_Display_Words(0,0,"****指纹管理****");
		LCD_Display_Words(1,0," *  添加指纹");
		LCD_Display_Words(2,0,"    删除指纹");
		LCD_Display_Words(3,0,"Back       Enter");
		break;
		
		case 2:
		LCD_Display_Words(0,0,"****指纹管理****");
		LCD_Display_Words(1,0,"    添加指纹");
		LCD_Display_Words(2,0," *  删除指纹");
		LCD_Display_Words(3,0,"Back       Enter");
		break;				
	}

}

//管理指纹界面功能选择显示
void admin_mima_show(void) 
{
	switch(admin_zhiwen_flag)
	{
		case 1:
		LCD_Display_Words(0,0,"****密码管理****");
		LCD_Display_Words(1,0,"* 修改解锁密码");
		LCD_Display_Words(2,0,"  修改管理密码");
		LCD_Display_Words(3,0,"Back       Enter");
		break;
		
		case 2:
		LCD_Display_Words(0,0,"****密码管理****");
		LCD_Display_Words(1,0,"  修改解锁密码");
		LCD_Display_Words(2,0,"* 修改管理密码");
		LCD_Display_Words(3,0,"Back       Enter");
		break;				
	}

}


//管理ID卡界面功能选择显示
void admin_IDcard_show(void) 
{
	switch(admin_zhiwen_flag)
	{
		case 1:
		LCD_Display_Words(0,0,"****ID卡管理****");
		LCD_Display_Words(1,0," *  添加ID卡");
		LCD_Display_Words(2,0,"    删除ID卡");
		LCD_Display_Words(3,0,"Back       Enter");
		break;
		
		case 2:
		LCD_Display_Words(0,0,"****ID卡管理****");
		LCD_Display_Words(1,0,"    添加ID卡");
		LCD_Display_Words(2,0," *  删除ID卡");
		LCD_Display_Words(3,0,"Back       Enter");
		break;				
	}

}

//添加ID卡函数
void add_IDcard(u8 cardID)
{
	u8 i;
	LCD_Clear();
	LCD_Display_Words(0,0,"    请放新卡");
	LCD_Display_Words(3,0,"Back");
	while(1)
	{
		key=Key_Scan();//按键扫描
		if(key==back)
		{
			state=11; //返回添加卡界面
			break;
		}
		status = PcdRequest(PICC_REQALL,CT);//寻卡
		if(status==MI_OK)// 寻卡成功
		{
		   serch_card_flag=1;//如果刷过卡,标志位置1
		   status=MI_ERR;
		   status = PcdAnticoll(SN);// 防冲撞
		}
		if(serch_card_flag==1)//如果检测到刷过一次卡
		{
			serch_card_flag=0;
			if(cardID==0)//如果是选择的卡0
			{
				for(i=0;i<4;i++)
				{
					my_card[i]=SN[i];	//将该卡的卡号存入
				}
				AT24CXX_Write(0,(u8*)my_card,size_card);  //存入外部存储器  /0
				state=11;  //返回添加卡界面
				LCD_Display_Words(1,0,"  添加新卡成功");
				delay_ms(1000);
				break;
			}

			if(cardID==1)//如果是选择的卡1
			{
				for(i=0;i<4;i++)
				{
					my_card1[i]=SN[i];	//将该卡的卡号存入
				}
				AT24CXX_Write(10,(u8*)my_card1,size_card1);  //存入外部存储器  /10
				state=11;  //返回添加卡界面
				LCD_Display_Words(1,0,"  添加新卡成功");
				delay_ms(1000);
				break;
			}
			
			if(cardID==2)//如果是选择的卡2
			{
				for(i=0;i<4;i++)
				{
					my_card2[i]=SN[i];	//将该卡的卡号存入
				}
				AT24CXX_Write(20,(u8*)my_card2,size_card2);  //存入外部存储器  /20
				state=11;  //返回添加卡界面
				LCD_Display_Words(1,0,"  添加新卡成功");
				delay_ms(1000);
				break;
			}
		}		
	}
}

//删除ID卡函数
void del_IDcard(u8 cardID)
{
	u8 i;
	if(cardID==0)
	{
		for(i=0;i<4;i++)
		{
			my_card[i]=0;//将卡号清零	
		}
		//同时清除AT24C02里存放的卡号
		AT24CXX_Write(0,(u8*)my_card,size_card);	//存入外部存储器  /0
		state=12;  //返回删除卡界面
		LCD_Display_Words(1,0,"  删除卡成功   ");
		delay_ms(1000);
	}

	if(cardID==1)
	{
		for(i=0;i<4;i++)
		{
			my_card1[i]=0;	//将卡号清零
		}
		//同时清除AT24C02里存放的卡号
		AT24CXX_Write(10,(u8*)my_card1,size_card1);  //存入外部存储器  /10
		state=12;  //返回删除卡界面
		LCD_Display_Words(1,0,"  删除卡成功   ");
		delay_ms(1000);
	}
	
	if(cardID==2)
	{
		for(i=0;i<4;i++)
		{
			my_card2[i]=0;	//将卡号清零
		}
		//同时清除AT24C02里存放的卡号
		AT24CXX_Write(20,(u8*)my_card2,size_card2);  //存入外部存储器  /20
		state=12;  //返回删除卡界面
		LCD_Display_Words(1,0,"  删除卡成功   ");
		delay_ms(1000);
	}

}

void AT24CXX_Config(void)
{
	u8 i = 0;

	AT24CXX_Read(0,my_card,size_card);
	AT24CXX_Read(10,my_card1,size_card1);
	AT24CXX_Read(20,my_card2,size_card2);
	AT24CXX_Read(30,my_pass_word,size_pass);
	for(i = 0; i < 6; i ++)
	{
		if(my_pass_word[i] != 0xFF)break;//AT24C02出厂时存储数据全为0xFF
	}
	if(i == 6)//读出的数据全为0xFF,表示第一次上电,将初始密码写入AT24C02
	{
		AT24CXX_Write(30,(u8*)my_pass_word_init,size_pass);
		delay_us(200);
		AT24CXX_Read(30,my_pass_word,size_pass);
	}
	
	AT24CXX_Read(40,admin_key,size_admin);
	for(i = 0; i < 6; i ++)
	{
		if(admin_key[i] != 0xFF)break;//AT24C02出厂时存储数据全为0xFF
	}
	if(i == 6)//读出的数据全为0xFF,表示第一次上电,将初始管理员密码写入AT24C02
	{
		AT24CXX_Write(40,(u8*)admin_key_init,size_admin);
		delay_us(200);
		AT24CXX_Read(40,admin_key,size_admin);
	}
}



void num2char(uint8_t *str, float number, u8 g, u8 l)  //浮点数转字符
{
    u8 i;
    int temp = number/1;
    float t2 = 0.0;
    for (i = 1; i<=g; i++)
    {
        if (temp==0)
            str[g-i] = table[0];
        else
            str[g-i] = table[temp%10];
        temp = temp/10;
    }
    *(str+g) = ' ';
    temp = 0;
    t2 = number;
    for(i=1; i<=l; i++)
    {
        temp = t2*10;
        str[g+i] = table[temp%10];
        t2 = t2*10;
    }
    *(str+g+l+1) = '\0';
}

完整代码及PCB文件:通过网盘分享的文件:智能门禁
链接: https://pan.baidu.com/s/11T7NjkJpBjknxUDVIW3c1Q?pwd=n6ra 提取码: n6ra

如  果喜 欢 就 加个  关注  吧, 每 天 不  定时 更 新 一 些 小  项 目! !!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱娆π(准备保研版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值