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

时间: 2024-02-05 16:10:30 浏览: 18
以下是基于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 为核心设计一款出租车计费器, 使能够实现里程及对应价格的显示,由于采用芯片的自动定时计数,所以能够准确的计算出总的行车里程并能转换成对应的价格来,这样能够避免出租车司机作弊的可能性...
recommend-type

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

单片机使用12MHz的晶体振荡器时,读写速度和功耗都基本...本文详细阐述了用AT89C52单片机对SD卡进行操作的过程,提出了一种不带SD卡控制器,MCU读写SD卡的方法,实现了SD卡在电能监测及无功补偿数据采集系统中的用途。
recommend-type

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

在学习AltiumDesigner或者51单片机的过程中,当我们要绘制一个...所以,在这里呢,小编将结合自己的经历向大家介绍如何用AltiumDesigner软件来绘制自己的原理图库,并绘制STC89C51单片机的原理图,希望能对大家有所帮助
recommend-type

STC89C51单片机EEPROM读写例程

今天无意间看到STC系列芯片手册上关于片上EEPROM的介绍,狂喜。原来STC单片机本身就有EEPROM的,可惜发现晚了点,不然很多同学的...下午花了点时间看了资料,然后写了个例子程序,本程序在STC89C52RC上测试,运行成功。
recommend-type

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

本文基于STC89C516RD单片机的智能冰箱设计, 系统以STC89C516RD单片机为控制核心,采用220V电源供电,通过液晶显示当前时间以及由温度传感器采集到的冷藏室、冷冻室以及室外温度。时间和各室温度值均可通过按键设置...
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

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

:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向

![:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向](https://img-blog.csdnimg.cn/7e3d12895feb4651b9748135c91e0f1a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKJ6YaJ77yM5LqO6aOO5Lit,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. YOLO目标检测算法简介 YOLO(You Only Look Once)是一种
recommend-type

def ObjFun(x,y,beta): # 目标函数 """ Logistic regression loss function :param beta: model parameter vector :param x: feature matrix :param y: label vector :return: loss value """ n = x.shape[0] p = x.shape[1] pred = 1 / (1 + np.exp(-np.dot(x, beta))) pred = np.clip(pred, 1e-15, 1 - 1e-15) # 将预测值限制在一个很小的区间内 ObjVal = -np.sum(y * np.log(pred) + (1 - y) * np.log(1 - pred)) / n return ObjVal

好的,根据上面的目标函数,我们可以推导出其对应的梯度向量函数,如下所示: def gradient(x, y, beta): """ Compute gradient of the logistic regression loss function :param beta: model parameter vector :param x: feature matrix :param y: label vector :return: gradient vector """ n = x.shape[0] pred = 1 /
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。