赞
踩
资料链接:待更新~
哔哩哔哩视频链接:https://www.bilibili.com/video/BV17D4y1V7HG/?vd_source=e5082ef80535e952b2a4301746491be0(bilibili:化作尘my)
资料链接:https://pan.baidu.com/s/1qObK7KBl50RmFrAtoX12kw
提取码:iih4
实物链接:https://m.tb.cn/h.5h5mDXI?tk=MdxLWYHgKnz CZ0001
1、OLED显示当前楼层、目标楼层等信息
2、可以刷卡到达指定楼层
3、可以刷指纹到达指定楼层
4、可以输入密码进入管理员模式,进行录入卡片与对应楼层信息,录入指纹与对应楼层信息,并可以修改删除指纹与卡片信息
5、用步进电机驱动上下楼层
6、用舵机控制开门关门(本工程未实现)
7、有报警功能,当密码错误、指纹错误、卡片错误,都会进行报警
8、外观用木板搭建
1、显示选择0.96寸SPIOLED
2、刷卡模块选择RF522
3、指纹模块选择AS608
4、报警模块选择蜂鸣器
5、输入密码选择矩阵按键
6、电源电路选择USB接口输入,AMS1117降压芯片转3.3V给单片机供电
7、主控芯片选择STM32F103C8T6
主控芯片需要能够驱动OLED,刷卡模块、指纹模块、矩阵按键,理论上51单片机就可以满足要求,但是代码量大,内存会有比较高得要求,所以选择熟悉的stm32f103c8t6,64K FLASH内存足够存储代码与显示大量汉字。
1、单片机最小系统设计
2、电源部分设计
3、单片机供电与下载接口设计
4、指纹、按键、RFID、蜂鸣器、步进电机等电路设计
(一)程序设计思想:
1、寻找指纹模块代码并移植调试使用
2、商家或者网络获取RFID驱动、OLED驱动
3、自己编写原理比较简单的矩阵按键驱动、步进电机驱动
4、写一个系统需要参数结构体方便管理
typedef struct
{
u32 HZCFlag; //化作尘保存标志 上电会初始化参数,后保存参数到单片机FLASH
u8 passwd1[7]; //管理员密码1
u8 passwd2[7]; //管理员密码2
u8 cardid[10][6]; //可以存储10张卡片ID
u8 cardFloor[10];//卡片对应楼层保存数组
u8 CurrFloor;//当前楼层
u8 TgtFloor; //目标楼层
u8 errCnt;//错误计数
u8 errTime;//等待错误时间
u8 fingerFloor[100];//指纹ID对应楼层
u16 fingNum;//指纹个数
u16 cardNum;//RFID个数
}SysTemPat;
5、增删改查都基于结构体操作,要保证数据实时同步
#include "main.h" #include <string.h> SysTemPat sys; #define MAXERRTIMES 5 #define usart2_baund 57600//串口2波特率,根据指纹模块波特率更改 //要写入到STM32 FLASH的字符串数组 const u8 TEXT_Buffer[]={0x17,0x23,0x6f,0x60,0,0}; #define TEXT_LENTH sizeof(TEXT_Buffer) //数组长度 #define SIZE TEXT_LENTH/4+((TEXT_LENTH%4)?1:0) #define FLASH_SAVE_ADDR 0X0802C124 //设置FLASH 保存地址(必须为偶数,且所在扇区,要大于本代码所占用到的扇区. //否则,写操作的时候,可能会导致擦除整个扇区,从而引起部分程序丢失.引起死机. SysPara AS608Para;//指纹模块AS608参数 u16 ValidN;//模块内有效指纹个数 u8** kbd_tbl; void Display_Data(void);//显示时间 void Add_FR(void); //录指纹 void Del_FR(void); //删除指纹 int press_FR(void);//刷指纹 void ShowErrMessage(u8 ensure);//显示确认码错误信息 int password(void);//密码锁 void SetPassworld(void);//修改密码 void starting(void);//开机界面信息 u8 MFRC522_lock(void);//刷卡解锁 u8 Add_Rfid(void); //录入 void Set_Time(void); void Massige(void); void SysPartInit(void ); //系统参数初始化 //u8 Pwd[7]=" "; //解锁密码1 //u8 Pwd2[7]=" "; //解锁密码2 //u8 cardid[6]={0,0,0,0,0,0}; //卡号1 int Error; //密码验证信息 u8 DisFlag = 1,ArrowDisFlag=1; //数字的ASCII码 uc8 numberascii[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; //显示缓冲区 u8 dispnumber5buf[6]; u8 dispnumber3buf[4]; u8 dispnumber2buf[3]; //MFRC522数据区 u8 mfrc552pidbuf[18]; u8 card_pydebuf[2]; u8 card_numberbuf[5]; u8 card_key0Abuf[6]={0xff,0xff,0xff,0xff,0xff,0xff}; u8 card_writebuf[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; u8 card_readbuf[18]; //SM05-S数据区 u8 sm05cmdbuf[15]={14,128,0,22,5,0,0,0,4,1,157,16,0,0,21}; //extern声明变量已在外部的C文件里定义,可以在主文件中使用 extern u8 sm05receivebuf[16]; //在中断C文件里定义 extern u8 sm05_OK; //在中断C文件里定义 //u8 * week[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"}; u8 * week[7]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; u8 * setup[7]={"1、录入指纹","2、删除指纹","3、修改密码","4、修改时间","5、录入卡片","6、查看信息"}; int main(void) { // u16 set=0; // u8 err=0; // int key_num; int time1; // int time2; //锁屏时间 char arrow=0; //箭头位子 //SysHSI_Init(); delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为9600 printf("串口功能正常\r\n"); Button4_4_Init(); //初始化与按键连接的硬件接口 OLED_Init(); //显示初始化 Walkmotor_Init(); //步进电机初始化 BEEP_Init(); //蜂鸣器初始化 usart2_init(usart2_baund); //初始化指纹模块 PS_StaGPIO_Init(); OLED_Clear(); starting();//开机信息 logo // err = RTC_Init(); //RTC初始化 // if(err) // { // OLED_Clear(); // Show_Str(12,13,128,20,"RTC CRY ERR!",12,0); // OLED_Refresh_Gram();//更新显示 // delay_ms(3000); // } SysPartInit(); //系统参数初始化 while(1) { time1++; if(DisFlag == 1) { OLED_ShowNum(58,20,sys.CurrFloor,1,24);//显示当前楼层 } if(ArrowDisFlag == 1) { } if(sys.TgtFloor != sys.CurrFloor)//需要到达目标楼层 { if(sys.TgtFloor > sys.CurrFloor) for(; sys.CurrFloor<sys.TgtFloor; )//上楼 { sys.CurrFloor++; Walkmotor_ON(); OLED_ShowNum(58,20,sys.CurrFloor,1,24);//显示当前楼层 }else if(sys.TgtFloor < sys.CurrFloor) for(; sys.CurrFloor>sys.TgtFloor;)//下楼 { sys.CurrFloor--; Walkmotor_OFF(); OLED_ShowNum(58,20,sys.CurrFloor,1,24);//显示当前楼层 } } if(sys.TgtFloor == sys.CurrFloor && sys.CurrFloor!=1)//如果电梯不在1楼停下,返回1楼 { for(; sys.CurrFloor>1; )//下楼 { sys.CurrFloor--; Walkmotor_OFF(); OLED_ShowNum(58,20,sys.CurrFloor,1,24);//显示当前楼层 } } /******************检测刷卡与指纹********************/ if((time1%100)==1) { //MFRC522解锁 time1=0; MFRC522_Initializtion(); Error=MFRC522_lock(); if(Error==0) { } } //指纹解锁 if(PS_Sta) //检测PS_Sta状态,如果有手指按下 { while(PS_Sta){ Error=press_FR();//刷指纹 if(Error==0) { //DisUnLock(); //跳到解锁界面 } } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。