编写基于STC89C51单片机代码,要求如下: 1、基于RC522读写卡模块,设计程序实现RFID卡号读取。 2、单片机片内EEPROM或外界EEPROM存储,多组卡号 3、实现刷卡开门(开门使用继电器模拟) 4、设计适当界面完成行卡注册和删除等管理工作。 5、刷卡时卡号读取成功蜂鸣器叫一下,卡号与EEPROM中的卡号比对成功继电器吸合,15秒后释放。 6、使用LCD1602或12864显示必要的提示信息。

时间: 2024-02-05 16:10:30 浏览: 225
ZIP

C51单片机使用RFID-RC522模块实现读卡、写卡等等.zip

以下是基于STC89C51单片机的代码实现,实现了基于RC522读写卡模块,卡号存储在单片机内部EEPROM中,刷卡开门,卡号读取成功蜂鸣器叫一下,卡号与EEPROM中的卡号比对成功继电器吸合,15秒后释放,并使用LCD1602显示必要的提示信息。 首先,需要配置RC522读写卡模块和LCD1602屏幕的引脚和初始化函数。 ```c #include<reg51.h> #include<RC522.h> #include<LCD1602.h> #define uchar unsigned char #define uint unsigned int sbit beep=P2^3; //蜂鸣器接口 sbit led=P2^4; //LED接口,用于调试 sbit relay=P2^5; //继电器接口 sbit beep=P2^3; //蜂鸣器接口 // RC522读写卡模块引脚定义 sbit SDA = P1^7; //数据线 sbit SCK = P1^5; //时钟线 sbit MOSI = P1^6; //MOSI线 sbit MISO = P1^4; //MISO线 sbit NSS = P1^3; //NSS线 void init_RC522(); //初始化RC522模块 uchar read_card(uint *id); //读取卡号 void init_eeprom(); //初始化EEPROM void write_eeprom(uchar addr, uchar dat); //写入EEPROM uchar read_eeprom(uchar addr); //读取EEPROM void register_card(); //注册卡号 void delete_card(); //删除卡号 void open_door(); //开门 void display_id(uint id); //在LCD上显示卡号 ``` 接下来是主函数部分,包括初始化和主循环。 ```c void main() { uchar mode, i; uint id[5]; init_RC522(); //初始化RC522模块 init_lcd(); //初始化LCD1602 init_eeprom(); //初始化EEPROM while(1) { mode = read_card(id); //读取卡号 if(mode == MI_OK) { beep = 1; //蜂鸣器叫一下,表示读取成功 delay(1000); beep = 0; for(i = 0; i < 5; i++) { if(read_eeprom(i) == (id[i] & 0xff)) //比对卡号 { open_door(); //开门 break; } } if(i == 5) //卡号不匹配 { lcd_clear(); lcd_write_string("Card Not Found"); delay(1000); } } } } ``` 接下来是各个函数的实现。 初始化RC522模块: ```c void init_RC522() { uchar i; init_io(); //初始化IO口 P2 = 0x00; //清除端口 delay(1000); //延时1ms RC522_Reset(); //复位RC522 write_MFRC522(TModeReg, 0x8D); //设置定时器的时钟频率 write_MFRC522(TPrescalerReg, 0x3E); //设置定时器分频系数 write_MFRC522(TReloadRegL, 30); //设置定时器重载值 write_MFRC522(TReloadRegH, 0); write_MFRC522(TxAutoReg, 0x40); //设置发送自动模式 write_MFRC522(ModeReg, 0x3D); //设置RC522为工作模式 write_MFRC522(CommandReg, 0x00); //清空命令缓冲区 for(i=0; i<6; i++) //写入卡片的默认密钥,用于验证卡片 { write_MFRC522(KeyReg+i, 0xFF); } } ``` 读取卡号: ```c uchar read_card(uint *id) { uchar status; uchar i, len; status = MFRC522_Request(PICC_REQIDL, id); //寻卡 if(status == MI_OK) { status = MFRC522_Anticoll(id); //防冲撞 len = 4; for(i = 0; i < len; i++) { *(id + i) = id[i]; } return MI_OK; } else { return MI_ERR; } } ``` 初始化EEPROM: ```c void init_eeprom() { uchar i; for(i = 0; i < 5; i++) { write_eeprom(i, 0xFF); //EEPROM清零 } } ``` 写入EEPROM: ```c void write_eeprom(uchar addr, uchar dat) { IAP_CONTR = 0x87; //打开IAP功能 IAP_ADDRH = 0x00; //设置要写入的地址 IAP_ADDRL = addr; IAP_DATA = dat; //设置要写入的数据 IAP_CMD = 0x02; //执行写入操作 _nop_(); //等待IAP操作完成 IAP_CONTR = 0x00; //关闭IAP功能 } ``` 读取EEPROM: ```c uchar read_eeprom(uchar addr) { uchar dat; IAP_CONTR = 0x81; //打开IAP功能 IAP_ADDRH = 0x00; //设置要读取的地址 IAP_ADDRL = addr; IAP_CMD = 0x01; //执行读取操作 _nop_(); //等待IAP操作完成 dat = IAP_DATA; //获取读取的数据 IAP_CONTR = 0x00; //关闭IAP功能 return dat; } ``` 注册卡号: ```c void register_card() { uchar i; uint id[5]; uchar mode; lcd_clear(); lcd_write_string("Place Card"); while(1) { mode = read_card(id); if(mode == MI_OK) { for(i = 0; i < 5; i++) { write_eeprom(i, (id[i] & 0xff)); //将卡号写入EEPROM } break; } } lcd_clear(); lcd_write_string("Card Registered"); delay(1000); } ``` 删除卡号: ```c void delete_card() { uchar i; uint id[5]; uchar mode; lcd_clear(); lcd_write_string("Place Card"); while(1) { mode = read_card(id); if(mode == MI_OK) { for(i = 0; i < 5; i++) { write_eeprom(i, 0xFF); //将EEPROM中对应的卡号清除 } break; } } lcd_clear(); lcd_write_string("Card Deleted"); delay(1000); } ``` 开门: ```c void open_door() { relay = 1; //继电器吸合 delay(15000); //保持15秒 relay = 0; //继电器释放 } ``` 在LCD上显示卡号: ```c void display_id(uint id) { uchar i; lcd_clear(); for(i = 0; i < 5; i++) { lcd_write_hex(id[i]); //将卡号以十六进制形式显示在LCD上 lcd_write_char(' '); } } ```
阅读全文

相关推荐

最新推荐

recommend-type

基于STC89C51单片机的出租车计费器设计

基于STC89C51单片机的出租车计费器设计是一款利用微控制器技术实现的智能化仪表,旨在提供精确的计费服务,确保公平公正的交易环境。STC89C51是一款51系列的单片机,具有高性能、低功耗的特点,适合用于各种嵌入式...
recommend-type

如何用AltiumDesigner绘制STC89C51单片机原理图

然而,在实际使用过程中,有时我们需要设计一些特殊元器件,例如本文提到的STC89C51单片机,这可能不在Altium Designer自带的元件库中。以下将详细介绍如何使用Altium Designer创建自己的原理图库并绘制STC89C51...
recommend-type

STC89C51单片机EEPROM读写例程

STC89C51单片机是一款广泛应用的8位微控制器,其具有内置的EEPROM功能,这使得用户可以在不额外添加外部存储芯片的情况下,实现数据的非易失性存储。在本例程中,重点是展示了如何利用STC89C51的EEPROM进行读写操作...
recommend-type

基于AT89C52单片机的SD卡读写设计

在电子设计领域,基于AT89C52单片机的SD卡读写设计是一个常见的实践项目,尤其适用于数据采集和存储系统。AT89C52是一款经典的8位微控制器,具有内置闪存和丰富的功能,适用于各种嵌入式应用。在12MHz的晶体振荡器...
recommend-type

基于STC89C516RD单片机的智能冰箱设计

本文探讨了基于STC89C516RD单片机设计的智能冰箱系统,该系统采用这款高性能的8位微控制器作为核心控制单元。STC89C516RD单片机拥有丰富的资源和强大的处理能力,适用于各种嵌入式应用,尤其在家电智能化领域表现...
recommend-type

正整数数组验证库:确保值符合正整数规则

资源摘要信息:"validate.io-positive-integer-array是一个JavaScript库,用于验证一个值是否为正整数数组。该库可以通过npm包管理器进行安装,并且提供了在浏览器中使用的方案。" 该知识点主要涉及到以下几个方面: 1. JavaScript库的使用:validate.io-positive-integer-array是一个专门用于验证数据的JavaScript库,这是JavaScript编程中常见的应用场景。在JavaScript中,库是一个封装好的功能集合,可以很方便地在项目中使用。通过使用这些库,开发者可以节省大量的时间,不必从头开始编写相同的代码。 2. npm包管理器:npm是Node.js的包管理器,用于安装和管理项目依赖。validate.io-positive-integer-array可以通过npm命令"npm install validate.io-positive-integer-array"进行安装,非常方便快捷。这是现代JavaScript开发的重要工具,可以帮助开发者管理和维护项目中的依赖。 3. 浏览器端的使用:validate.io-positive-integer-array提供了在浏览器端使用的方案,这意味着开发者可以在前端项目中直接使用这个库。这使得在浏览器端进行数据验证变得更加方便。 4. 验证正整数数组:validate.io-positive-integer-array的主要功能是验证一个值是否为正整数数组。这是一个在数据处理中常见的需求,特别是在表单验证和数据清洗过程中。通过这个库,开发者可以轻松地进行这类验证,提高数据处理的效率和准确性。 5. 使用方法:validate.io-positive-integer-array提供了简单的使用方法。开发者只需要引入库,然后调用isValid函数并传入需要验证的值即可。返回的结果是一个布尔值,表示输入的值是否为正整数数组。这种简单的API设计使得库的使用变得非常容易上手。 6. 特殊情况处理:validate.io-positive-integer-array还考虑了特殊情况的处理,例如空数组。对于空数组,库会返回false,这帮助开发者避免在数据处理过程中出现错误。 总结来说,validate.io-positive-integer-array是一个功能实用、使用方便的JavaScript库,可以大大简化在JavaScript项目中进行正整数数组验证的工作。通过学习和使用这个库,开发者可以更加高效和准确地处理数据验证问题。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【损失函数与随机梯度下降】:探索学习率对损失函数的影响,实现高效模型训练

![【损失函数与随机梯度下降】:探索学习率对损失函数的影响,实现高效模型训练](https://img-blog.csdnimg.cn/20210619170251934.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjc4MDA1,size_16,color_FFFFFF,t_70) # 1. 损失函数与随机梯度下降基础 在机器学习中,损失函数和随机梯度下降(SGD)是核心概念,它们共同决定着模型的训练过程和效果。本
recommend-type

在ADS软件中,如何选择并优化低噪声放大器的直流工作点以实现最佳性能?

在使用ADS软件进行低噪声放大器设计时,选择和优化直流工作点是至关重要的步骤,它直接关系到放大器的稳定性和性能指标。为了帮助你更有效地进行这一过程,推荐参考《ADS软件设计低噪声放大器:直流工作点选择与仿真技巧》,这将为你提供实用的设计技巧和优化方法。 参考资源链接:[ADS软件设计低噪声放大器:直流工作点选择与仿真技巧](https://wenku.csdn.net/doc/9867xzg0gw?spm=1055.2569.3001.10343) 直流工作点的选择应基于晶体管的直流特性,如I-V曲线,确保工作点处于晶体管的最佳线性区域内。在ADS中,你首先需要建立一个包含晶体管和偏置网络
recommend-type

系统移植工具集:镜像、工具链及其他必备软件包

资源摘要信息:"系统移植文件包通常包含了操作系统的核心映像、编译和开发所需的工具链以及其他辅助工具,这些组件共同作用,使得开发者能够在新的硬件平台上部署和运行操作系统。" 系统移植文件包是软件开发和嵌入式系统设计中的一个重要概念。在进行系统移植时,开发者需要将操作系统从一个硬件平台转移到另一个硬件平台。这个过程不仅需要操作系统的系统镜像,还需要一系列工具来辅助整个移植过程。下面将详细说明标题和描述中提到的知识点。 **系统镜像** 系统镜像是操作系统的核心部分,它包含了操作系统启动、运行所需的所有必要文件和配置。在系统移植的语境中,系统镜像通常是指操作系统安装在特定硬件平台上的完整副本。例如,Linux系统镜像通常包含了内核(kernel)、系统库、应用程序、配置文件等。当进行系统移植时,开发者需要获取到适合目标硬件平台的系统镜像。 **工具链** 工具链是系统移植中的关键部分,它包括了一系列用于编译、链接和构建代码的工具。通常,工具链包括编译器(如GCC)、链接器、库文件和调试器等。在移植过程中,开发者使用工具链将源代码编译成适合新硬件平台的机器代码。例如,如果原平台使用ARM架构,而目标平台使用x86架构,则需要重新编译源代码,生成可以在x86平台上运行的二进制文件。 **其他工具** 除了系统镜像和工具链,系统移植文件包还可能包括其他辅助工具。这些工具可能包括: - 启动加载程序(Bootloader):负责初始化硬件设备,加载操作系统。 - 驱动程序:使得操作系统能够识别和管理硬件资源,如硬盘、显卡、网络适配器等。 - 配置工具:用于配置操作系统在新硬件上的运行参数。 - 系统测试工具:用于检测和验证移植后的操作系统是否能够正常运行。 **文件包** 文件包通常是指所有这些组件打包在一起的集合。这些文件可能以压缩包的形式存在,方便下载、存储和传输。文件包的名称列表中可能包含如下内容: - 操作系统特定版本的镜像文件。 - 工具链相关的可执行程序、库文件和配置文件。 - 启动加载程序的二进制代码。 - 驱动程序包。 - 配置和部署脚本。 - 文档说明,包括移植指南、版本说明和API文档等。 在进行系统移植时,开发者首先需要下载对应的文件包,解压后按照文档中的指导进行操作。在整个过程中,开发者需要具备一定的硬件知识和软件开发经验,以确保操作系统能够在新的硬件上正确安装和运行。 总结来说,系统移植文件包是将操作系统和相关工具打包在一起,以便于开发者能够在新硬件平台上进行系统部署。了解和掌握这些组件的使用方法和作用是进行系统移植工作的重要基础。