门禁系统设计方案 基于STM32F103C8T6单片机+RFID-RC522模块+SG90舵机

一、项目背景 门禁系统是现代社会中非常重要的安全控制系统之一,其功能是在保障建筑物安全的同时,为合法用户提供便利。当前设计一种基于stm32+rc522的门禁系统设计方案,通过rfid-rc522模块实现了对用户卡的注册、识别及身份验证,通过控制sg90舵机实现门锁的开关,具有较高的安全性和可靠性。实验结果表明,该门禁系统可以有效地保障建筑物的安全性。
门禁系统广泛应用于各种建筑物、企事业单位,用于管理人员的进出、控制人员活动范围、实现安全监控等功能。传统的门禁系统采用密码输入或刷卡的方式进行身份验证,但存在易被破解的风险。基于rfid的门禁系统已经成为一种相对先进的安全控制方案。
本次设计的stm32+rc522门禁系统,通过rfid-rc522模块对用户的卡进行注册、识别完成身份识别,对门锁进行开关。系统带了oled显示屏,输入用户密码登录之后,可以对新卡片进行注册,添加新卡片,对不使用的卡片进行注销。在系统里,ic卡的数据都存储在卡的内部扇区里,通过卡的内部空间进行管理。
采用5v-步进电机的版本:
二、系统设计 门禁系统由stm32f103c8t6单片机、rfid-rc522模块、sg90舵机、lcd1602液晶显示屏、键盘模块等组成。其中,stm32f103c8t6单片机作为系统的核心控制器,控制程序的执行;rfid-rc522模块作为识别用户卡片的设备;sg90舵机作为门锁控制设备;oled显示屏提供用户输入信息和系统信息的显示;键盘模块方便用户进行密码和卡片信息的输入。
2.1 软件设计 【1】rfid卡信息管理 本系统采用卡的内部空间进行ic卡信息的管理。每个ic卡可以分为多个扇区,每个扇区包含多个块,每个块包含16个字节。扇区0是厂家已经预留好的,用于存储卡片的序列号,扇区1-15可以由用户自己配置,用于存储一些私有数据,如用户身份、车牌号、员工编号等。
在本系统中,ic卡信息的管理主要包括三个方面:新卡片注册、卡片识别和注销卡片。
对于新卡片的注册,用户需要按下键盘上的“#”键进入注册模式,接着输入管理员密码,然后将新卡放到rfid读写器上,系统将读取卡片序列号,并在卡片的扇区中存储用户名和密码信息等。
对于卡片的识别,当用户按下门禁系统的确认键时,系统将读取rfid模块中读取的卡片序列号,并去卡片扇区中查询用户名和密码信息,进行身份验证。如果卡片识别成功,系统将控制舵机旋转一圈实现开锁功能。
对于注销卡片,管理员需要输入密码进行身份验证后,再将要注销的卡片放到rfid读写器上,系统将清空该卡片的扇区内所有数据。
【2】门禁系统安全控制 本门禁系统采用密码验证和卡片识别相结合的方式,提高了系统的安全性。具体来说,系统要求用户输入密码或刷卡进行身份验证,只有在验证成功后才能控制门锁进行开关操作。同时,系统还可以记录每一次开启门锁的时间和用户信息,以便管理员进行安全监控。
【3】门锁控制 本门禁系统采用sg90舵机控制门锁的开关,具有结构简单,控制方便的优点。在门锁控制过程中,系统对舵机控制信号的频率和占空比进行精细控制,以实现门锁的准确开关。
2.2 硬件设计 【1】stm32f103c8t6单片机 stm32f103c8t6单片机是st公司推出的一款基于cortex-m3内核的可编程32位单片机,常常被广泛应用于工业控制、智能家居、嵌入式控制等领域。
它的主要特点包括:
1. cortex-m3内核:stm32f103c8t6使用cortex-m3内核,具有高性能、低功耗、硬实时等特点,可支持多个串口、i2c、spi、usb等外设,为使用者带来更大的灵活性。
2. 32位处理能力:stm32f103c8t6是一款32位单片机,具有比8位、16位单片机更高的数据运算能力、编程灵活度和计算精度。
3. 较强的系统时间管理能力:stm32f103c8t6内部具备rtc实时时钟模块,可实现精准的时间管理和时间标记功能,在一些需要时间同步的应用场景下具有较大的优势。
4. 大存储容量:stm32f103c8t6内置64k字节的闪存和20k字节的sram,能够满足大型嵌入式应用的存储需求。
5. 丰富的外设接口:stm32f103c8t6支持多个外设接口,如spi、i2c、can总线等,方便开发者扩展相关应用场景。
6. 代码可移植性强:由于该芯片应用广泛,可以使用多种开发工具进行开发,例如keil、stm32cubemx等,而且支持多种编程语言,如c语言、c++等,因此优点很容易在不同的平台、不同开发者之间实现代码的移植。
【2】rfid-rc522模块 rfid-rc522模块是一种低成本、高性价比的rfid读写模块。它具有高精度、快速读取等特点,广泛应用于门禁系统、智能卡管理、物流追踪等领域。
rfid-rc522模块的特点如下:
1. 高精度:rfid-rc522模块采用射频感应技术进行信号传输和读写,具有高精度、稳定性强等优点。
2. 快速读取:rfid-rc522模块读取速度快,一般只需0.1秒左右就可以完成读取操作。
3. 支持多种协议:rfid-rc522模块支持iso14443a/b、felica等多种rfid协议,可满足不同应用场合的需求。
4. 低功耗:rfid-rc522模块功耗低,工作电流为13-26ma,待机电流为10a。
5. 接口简单:rfid-rc522模块采用spi接口进行通信,模块上的引脚有7个,具有很好的兼容性。
6. 支持多种开发语言:rfid-rc522模块支持多种开发语言,如c++、python等,方便开发者进行二次开发。
rfid-rc522模块的使用需要配合相关的库文件,在arduino、raspberry pi等开发板上进行代码编写和开发。常见的使用场景包括门禁系统、智能卡管理、出入库管理、物流追踪等领域。
【3】sg90舵机 该舵机小巧耐用,可以精确地控制门锁的开关。
sg90舵机是一种小型舵机,体积小、重量轻、价格低廉,常常被用于模型飞机、小型机械臂、玩具模型等领域。它采用了直流电机,利用pid控制技术,以及精密的小齿轮减速箱实现转向角的控制。
sg90舵机的特点如下:
1. 小体积:sg90舵机体积为23mm * 12.2mm * 29mm,重量仅为9g,非常适合小型电子设备。
2. 高精度:sg90舵机的控制精度比较高,可控制角度范围为0 ~ 180度,分辨率为1度,可以实现精确到角度的控制。
3. 低噪音:sg90舵机采用了精密减速齿轮箱,转动非常平稳,并且噪音非常低。
4. 低功耗:sg90舵机的电机非常省电,一般使用3v到6v的电源,仅需20 ma的电流,可大大节省电力消耗。
5. 价格适中:sg90舵机价格相对较低,非常适合初学者或需求量较大的用户使用。
sg90舵机在使用时需要通过pwm信号进行控制。
【4】0.96寸oled显示屏 0.96寸spi接口oled显示屏是一种小型化的屏幕,属于oled显示技术,采用spi接口连接,外观尺寸约为12mm * 12mm,分辨率一般为128 * 64或者128 * 32。它可以用于各种小型电子设备,例如手持设备、小型仪器、智能家居控制面板等等。
oled即有机发光二极管,与传统的液晶显示屏相比,oled具有响应速度快、视角范围广、色彩鲜艳、亮度高等优势。spi接口则是一种串行外设接口,具有简单、灵活、高速等特点。
0.96寸spi接口oled显示屏的驱动芯片一般为ssd1306,有128个列和64个行的像素,还有一些有128个列和32个行的像素。其中,128 * 64像素的屏幕显示面积较大,在显示图像和文字时更加清晰和细腻。0.96寸spi接口oled显示屏具有小巧、高清、高速等优点,被广泛使用在各种小型电子设备中。
【5】键盘模块 该模块可以方便地输入密码和卡片信息。
iic接口的4x4电容矩阵键盘模块是一种基于iic总线通信的电容式按键模块,常常被应用在工控、家电、医疗器械等领域。
它的主要特点包括:
1. 采用iic总线通信:iic接口的4x4电容矩阵键盘模块通过iic总线通信连接到mcu,简化了连接方式,方便使用。
2. 采用电容式按键设计:每个按键上放置一个电容器,当手指触摸到按键时,电容器的电容值发生变化,通过检测电容的变化实现按键检测。
3. 4x4矩阵排列式设计:4x4电容矩阵键盘模块采用矩阵排列式设计,一共有16个按键,可以满足较为复杂的应用场景。
4. 接口简单:iic接口的4x4电容矩阵键盘模块只需要scl和sda两条线连接到mcu即可。
5. 高灵敏度:电容式按键设计使得按键检测更加灵敏,而且不会产生按键轻微弹起的误触情况,使用更加舒适。
6. 代码简洁:使用该模块并不需要编写复杂的按键扫描程序,只需要通过读取iic总线上的按键值即可。
iic接口的4x4电容矩阵键盘模块是一种方便易用、高灵敏度的按键模块,通过电容式按键设计实现按键的检测和响应,并且通过iic总线通信简化了连接方式。它适合于应用于许多领域,如工控、家电和医疗器械等,能够为使用者的产品带来更为方便和高效的控制方式。
三、核心代码 3.1 sg90舵机控制代码下面是基于gpio模拟时序控制stm32f103c8t6驱动sg90舵机旋转指定的角度的代码,并封装成子函数调用。#include stm32f10x.h#include stm32f10x_gpio.h#include stm32f10x_rcc.h#include delay.h#define servo_pin gpio_pin_5#define servo_port gpioavoid sg90_init(void){rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);gpio_inittypedef gpio_initstructure;gpio_initstructure.gpio_pin = servo_pin;gpio_initstructure.gpio_mode = gpio_mode_out_pp;gpio_initstructure.gpio_speed = gpio_speed_50mhz;gpio_init(servo_port, &gpio_initstructure);}void sg90_setangle(uint8_t angle){if(angle>180) angle=180;if(angle<0) angle = 0;uint8_t temp = angle/2 + 15;for(int i=0;i<5;i++){gpio_setbits(servo_port, servo_pin);delay_us(temp);gpio_resetbits(servo_port, servo_pin);delay_us(20000-temp);}}int main(void){systeminit();delay_init();sg90_init();while(1){for(int i=0;i 0){delay_us_tick--;}if (delay_ms_tick > 0){ delay_ms_tick--; } } 其中,delayinit()函数用于配置系统时钟源和systick定时器,实现每个systick时钟产生一个中断的功能。delayus()函数和delayms()函数分别用于实现微秒级别和毫秒级别的延时,通过限制delayustick和delaymstick的值实现延时的效果。systickhandler()为中断处理函数,每次systick定时器计数减1,当减到0时,相应的delayustick或delaymstick也减1,通过循环等待该值为0实现延时。
在代码中的sg90setangle()函数中,需要精确控制gpio的电平时间,使其产生相应的脉冲宽度,从而控制舵机转动角度。因此,需要配置gpio口的输出模式和速度、设定delayus()函数中根据角度计算的电平时间,使得舵机能够准确地执行旋转。
3.2 rc522读写代码 下面是基于spi接口控制stm32f103c8t6驱动rfid-rc522模块完成卡片识别和扇区读写的代码示例。在该代码中,使用的是spi1的接口,rfid-rc522模块通过spi1接口连接到stm32f103c8t6。
代码中通过封装spi相关操作和mfrc522库函数,实现了读取卡片信息和完成扇区读写的功能。
#include stm32f10x.h#include stm32f10x_spi.h#include stm32f10x_gpio.h#include stm32f10x_rcc.h#include delay.h#include mfrc522.h#include stdio.h#define spi_ce_low() gpio_resetbits(gpioa,gpio_pin_4)#define spi_ce_high() gpio_setbits(gpioa,gpio_pin_4)void spi1_init(void){rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);rcc_apb2periphclockcmd(rcc_apb2periph_spi1, enable);gpio_inittypedef gpio_initstructure; gpio_initstructure.gpio_pin = gpio_pin_5 | gpio_pin_6 | gpio_pin_7; gpio_initstructure.gpio_mode = gpio_mode_af_pp; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_init(gpioa, &gpio_initstructure); gpio_initstructure.gpio_pin = gpio_pin_4; gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_init(gpioa, &gpio_initstructure); spi_inittypedef spi_initstructure; spi_initstructure.spi_direction = spi_direction_2lines_fullduplex; spi_initstructure.spi_mode = spi_mode_master; spi_initstructure.spi_datasize = spi_datasize_8b; spi_initstructure.spi_cpol = spi_cpol_high; spi_initstructure.spi_cpha = spi_cpha_2edge; spi_initstructure.spi_nss = spi_nss_soft; spi_initstructure.spi_baudrateprescaler = spi_baudrateprescaler_2; spi_initstructure.spi_firstbit = spi_firstbit_msb; spi_initstructure.spi_crcpolynomial = 7; spi_init(spi1, &spi_initstructure); spi_cmd(spi1, enable); }uint8_t spi1_sendbyte(uint8_t byte){while(spi_i2s_getflagstatus(spi1, spi_i2s_flag_txe) == reset);spi_i2s_senddata(spi1, byte);while(spi_i2s_getflagstatus(spi1, spi_i2s_flag_rxne) == reset); return spi_i2s_receivedata(spi1); }void mfrc522_reset(void) { spi_ce_low(); spi1_sendbyte(0x1b); spi_ce_high(); }uint8_t mfrc522_readregister(uint8_t addr) { spi_ce_low(); uint8_t data; spi1_sendbyte(0x80 | addr); data = spi1_sendbyte(0x00); spi_ce_high(); return data; }void mfrc522_writeregister(uint8_t addr, uint8_t val) { spi_ce_low(); spi1_sendbyte(0x7f & addr); spi1_sendbyte(val); spi_ce_high(); }void mfrc522_readregisters(uint8_t addr, uint8_t count, uint8_t *values) { spi_ce_low(); spi1_sendbyte(0x80 | addr); for(uint8_t i=0;i 解释代码的思路:
该代码实现了读取 rfid 标签(卡片)的数据功能,主要利用 mfrc522 rfid 模块与单片机的通信,对标签发送指令并读取标签数据。整个过程主要分为以下几步:
1. 初始化 mfrc522 模块。
2. 检测是否存在标签,并获取标签类型和 id 信息。
3. 在多张同种类型的标签中,使用防冲撞机制选取一张进行操作。
4. 鉴权,使用指定的密钥验证对应的扇区,并获取读写操作的权限。
5. 读取数据,将指定的块的内容读取到缓冲区。
6. 解析标签数据并进行相应操作,例如打印块数据。
7. 暂停 rfid 模块,等待下一次操作。
代码中的注释也详细说明了每个函数和变量的作用和用法。
3.3 0.96寸oled-spi接口代码 以下是使用stm32f103c8t6驱动spi接口的0.96寸oled显示字符串的示例代码,该代码使用了hal库:
ccopy code#include main.h#include spi.h#include gpio.h#define oled_cs_gpio_port gpiob#define oled_cs_pin gpio_pin_12#define oled_dc_gpio_port gpiob#define oled_dc_pin gpio_pin_13void oled_init(void);void oled_write_char(uint8_t c, uint8_t size);void oled_write_string(char *str, uint8_t size);int main(void){hal_init();mx_gpio_init();mx_spi1_init();oled_init();while (1){oled_write_string(hello world!, 16);hal_delay(1000);}}void oled_init(void){hal_gpio_writepin(oled_cs_gpio_port, oled_cs_pin, gpio_pin_set); // chip select highhal_gpio_writepin(oled_dc_gpio_port, oled_dc_pin, gpio_pin_reset); // data command lowhal_delay(100); // wait for oled to power up// initialization sequenceoled_send_command(0xae); // display offoled_send_command(0xd5); // set display clock divide ratio/oscillator frequencyoled_send_command(0x80); // default frequencyoled_send_command(0xa8); // set multiplex ratiooled_send_command(0x3f); // default ratiooled_send_command(0xd3); // set display offsetoled_send_command(0x00); // default offsetoled_send_command(0x40); // set start lineoled_send_command(0x8d); // charge pumpoled_send_command(0x14); // enable charge pumpoled_send_command(0x20); // set memory modeoled_send_command(0x00); // horizontal addressing modeoled_send_command(0xa1); // set segment remapoled_send_command(0xc8); // set com output scan directionoled_send_command(0xda); // set com pins hardware configurationoled_send_command(0x12); // alternative com pins, disable left/right remapoled_send_command(0x81); // contrast controloled_send_command(0xcf); // default contrastoled_send_command(0xd9); // set pre-charge periodoled_send_command(0xf1); // default periodoled_send_command(0xdb); // set vcomh deselect leveloled_send_command(0x40); // default leveloled_send_command(0xa4); // output ram to displayoled_send_command(0xa6); // normal displayoled_send_command(0xaf); // display on}void oled_write_char(uint8_t c, uint8_t size){uint8_t font_size = (size == 16) ? 16 : 12;const uint8_t *font = (size == 16) ? font16x16 : font12x16;if (c == 'n') // new line{oled_current_row += font_size;oled_current_col = 0;return;}if (c '~') // unsupported character{c = '?';}uint8_t b = c - ' ';const uint8_t *glyph = font + (b * font_size);for (uint8_t i = 0; i < font_size; i++){oled_send_data(*glyph++);}oled_current_col += size;}void oled_write_string(char *str, uint8_t size){while (*str){oled_write_char(*str++, size);}}11111111111111111111111
中国广电预计2020年正式推出5G商用业务
SIC功率器件是电力电子工业的基础!
芯片封装内MLCC的特点及应用
是德科技宣布推出适用于 25/100/400 Gb/s 光测试的低成本、高精度解决方案
2023 惠州新能源汽车产业峰会
门禁系统设计方案 基于STM32F103C8T6单片机+RFID-RC522模块+SG90舵机
音频放大器的工作原理及如何挑选(上)
光电倍增管暗电流产生的原因_减少光电倍增管的暗电流方法
EA回应PC版FIFA 21画质不如新主机:太高了你们玩不动
区块链落地场景将会如何为影响我们的生活
全方位测评海马福美来M5 1.6L
电力系统中接地的作用和种类
iPhone8上市时间确定:实拍iPhone8中国生产,运往美国,卖回中国!搞事情
兽医实验室非洲猪瘟检测设备价格是多少?
可变耦合器:60-100 dB范围
松下推出Toughbook FZ-A2三防平板 安装Atom处理器配10寸屏幕
中兴通讯推动2.1G产业链加速发展,完成首个2.1G SA系统性组网验证
LED、LED背光和OLED区别和联系详解
宇视平安城市系统的治安防控体系和应用特点分析
“迈向F5.5G,携手共促产业发展”的主题演讲