基于51单片机的公交ic卡系统设计

目 录

摘 要 I
Abstract II
引 言 1
1 总体方案设计 3
1.1 方案选择 3
1.2 硬件选择 3
1.3 系统工作原理 4
1.4 总体方案确定 5
2 系统硬件电路设计 6
2.1 主控模块电路设计 6
2.2 电源电路设计 8
2.3 显示电路模块设计 8
2.4 报警模块电路设计 10
2.5 RC522刷卡模块 10
2.6 独立按键模块设计 11
2.7 硬件电路原理图 11
3 系统软件设计 13
3.1 系统软件编程环境介绍 13
3.2 整体软件设计流程概述 14
4 系统的焊接与调试 16
4.1 电路焊接 16
4.2 电路的调试 17
4.3设计实物测试 18
结 论 19
参考文献 20
附录1 硬件原理图 22
附录2 源程序代码 23
致 谢 29

摘 要

刷卡消费已经是我们消费的一种主流方式,刷卡购物、刷卡乘车……为了使IC卡能更好的服务于大众,给人们的出行带来便捷,我设计了一款基于51单片机的公交IC卡系统。
该系统以STC89C51单片机作为主控系统,硬件设计系统由单片机及其最小系统、LCD1602液晶显示屏、RC522刷卡模块和独立按键系统等来组成[1]。把射频技术作为系统的核心技术,利用无线通信结合数据访问技术,将飞利浦公司的一个分公司恩智浦研发出来的NXP Mifare1芯片作为传输信息的途径,通过连接数据控制中心的系统,以实现在不接触的情况下完成消息的互相传递。
结果表明,通过单片机作为控制器的IC卡读写系统在公交收费领域上的应用有了非常显著的变化。这套系统有着安全系数高、功能多、使用方便的特点,可以独立完成注册、充值和消费等功能,真正解决了公交行业在城市交通方面的一系列复杂、繁琐的问题,有着很大的的市场前景及应用。

关键词:单片机; 射频技术; IC卡; LCD1602

Abstract

Credit card consumption is already a mainstream way of our consumption. Credit card shopping, credit card ride … In order to make the IC card better serve the public and bring convenience to people’s travel, I designed a bus based on 51 single chip microcomputer IC card system.
The system uses STC89C51 single-chip microcomputer as the main control system. The hardware design system consists of single-chip microcomputer and its minimum system, LCD1602 liquid crystal display, RC522 card swiping module and independent key system. Taking radio frequency technology as the core technology of the system, using wireless communication combined with data access technology, the NXP Mifare1 chip developed by NXP, a branch of Philips, was used as a way to transmit information. In the case of contact, complete the transfer of messages.
The results show that the application of the IC card reading and writing system using the single-chip microcomputer as the controller in the field of bus toll collection has changed significantly. This system has the characteristics of high safety factor, multiple functions, and easy to use. It can independently complete functions such as registration, recharge, and consumption. It truly solves a series of complex and cumbersome problems in the public transport industry in urban transportation. Market prospects and applications.

Keywords: single chip microcomputer; radio frequency technology; IC card; LCD1602

引 言

回顾这几年,随着时代的进步与科技的发展,不论是在我们的生活中,还是在我们的工作中,科技的发展和运用在我们身边随处可见。同样的,单片机凭借着强大的数据处理能力和微小的体积在生活中的应用也变的越发的广泛,家庭生活中用的电器、工作中用到的工作设备还有实验室里的精密仪器,这些无一不是靠着单片机来实现的,价格低廉而功能强大的优点让它成为设计嵌入式系统方案的第一选择。
IC卡的全称为集成电路卡,IC卡是一个由聚氯乙烯(PVC)或者聚氯乙烯酸酯(PVCA)材料制作而成的塑料卡片形状的外形[2],里面安装插入一个集成电路芯片,按照ISO7816的标准设计了它的外形和尺寸,通常情况来说,我们把存储卡芯片和微处理卡芯片都叫做集成电路芯片。目前我们经常接触到的IC卡有两种,分别是接触式的和非接触式的IC卡。接触式的IC卡根据接触的地方从系统中获得能量并且读取卡内的数据;而非接触式IC卡不需要接触,只需要通过线圈射频的感应就可以完成接触时IC卡一样的功能,所以我们又把它称为射频卡。
无线射频识别技术因为有了很长一段时间的发展,所以技术也很先进,在生活当中有着随处可见的用途,此技术往往是通过体积较小的的无线收发器作为标签来对某一个物品做暗号,我们把做暗号的这个物品叫做“对象”[3]。标签上存储着跟此对象有关的一些数据及信息。无线收发器通过无线电波将这些数据发射到附近的识读器,然后识读器对这些数据进行一定的收集和一定的处理,可以通过计算机和互联网处理和传输这些数据。
目前来看,在社会上出现频率较高的就是我们上文提到的接触式IC卡。它的特点是存储量较大,保密安全性较强(可以设置多重密码,还可以设置认证),还可以将一张IC卡用作多个用途。但是,接触式IC卡也有一些缺点,例如它的读写操作速度相对来说很慢,在实际操作中也不是那样的便捷,每次使用的时候想要完成读取工作必须把卡正确地插入到读写器的插口中才可以,这样来看,不管是在车上还是在工作中等需要每天使用刷卡的地方使用就很不方便,需要非常多的时间,并且刷卡工具的机体外部和IC卡的触脚每天都要露在空气中,很容易就造成故障和搞脏,从而造成两者之间接触但是却不能识别。非接触式IC卡的产生是根据射频电磁感应这一原理,它的数据传输只需将卡片放在读写器附近一定范围之间就能完成之间的信息互通,不需要两者接触[4],使用中有着使用简单、操作方便、不容易故障的特点。非接触式IC卡由芯片和感应天线组成,安装在标准的PVC卡片内,它的芯片及天线都没有露在空气中。它成功的将射频技术和IC卡联系到一起,是世界上最近几年发展起来的一项新成果,成功解决了卡中没有电源和不需要接触这两大难题[5]。
本次设计中公交IC卡系统的大多数功能通过单片机来控制及操作来实现的,控制系统是以硬件设计的工作原理和软件设计的工作流程两大部分组成。硬件电路包括单片机电路、刷卡电路模块、屏幕显示电路、独立按键电路、蜂鸣器电路和电源电路等组成[6],单片机控制电路采用51系列单片机,用户的输入指令通过单片机转换处理,发送到各个外部电路信号来完成IC卡的注册、充值还有消费等一系列功能,安全指数高、实际用途广、操作快速、使用便捷这几大特点,真正解决了公共行业在城市服务中繁琐等一系列的收费问题,在现在的生活当中,IC卡在现代社会中有着相当大的作用,对于我们学习和理解单片机的使用,是一种难得的实践机会,为以后的正式进入社会后奠定基础。设计不仅具有实用价值,更重要的是能够实践和经验积累的内在意义。本设计注重基础知识和实际情况的紧密结合,并且对学生的独立思考和分析问题的能力进行进一步的培养,加深学生对知识的理解,为以后的工作和学习打下坚实的基础。

1 总体方案设计

1.1 方案选择
根据公共交通发展的要求不断提升,经过多年的经营管理,城市公交系统已经越来越完善。与传统的手动售票相比,通过使用非接触式IC卡为实现城市公交车的售票系统提供了更加先进的技术。结合计算机、互联网等现代技术,以IC卡做为存储卡片,为用户提供一个更加完善的售票系统。根据上面的分析,做出以下两种设计方案进行对比。
(1)方案一
本设计的主控制器选用复杂可编程逻辑器件CPLD,它可以完成各种复杂功能,这些功能属于大型集成电路的范围,并且同时具有高密度,小尺寸,特别稳定和广泛的I/O资源的优势,同时需要对功能延伸也比较容易。由于它使用多行输入和输出方法,并且系统的处理效率得到了很明显的提高,所以更适合作为大型控制器的核心。但本设计功能的实现并不是十分复杂,且从成本的角度考虑,放弃了方案一。
(2)方案二
本设计的控制系统使用单片机。单片机将各种功能集中组合在一个芯片上,功能很多,但是体积依然很小。内部总线结构用于减少芯片之间的连接并使其有耐用性和在恶劣环境工作的能力。由于其体积不大,方便采取屏蔽电磁波或密封措施,因此适合在状况较差的环境下工作[7]。此外,该单片机具有广泛的指令,功率损耗小和所需电压小的特点,适用于可随身携带产品的制造,易于扩展,具有高耐用性、价格便宜和使用价值高的特点,并且可以实现预期的功能。
经过对比单片机操控简单,性能稳定并且价格低廉,符合本设计的要求,因此选用方案二。
1.2 硬件选择
1.2.1 IC卡的选择
与传统接触式IC卡相比,非接触式IC卡具有以下优点:
(1)错误率低:卡与刷卡模块之间没有机械接触,可防止在读写接触时出现各种错误。
(2)操作简便,快速:由于非接触式通讯,读卡器可以在1厘米至5厘米的范围内操作卡。
(3)互不干扰:非接触式IC卡中有快速防干扰功能,能够保证卡片之间不存在数据互通。
(4)加密信息完善:每张IC卡在离开生产地前就被商家将IC的编号设置好,他人无法再修改此编号,所以每一张卡的序列号都是只有一个的;并且在刷卡的同时,IC卡和读卡器属于双向验证,互相检测对方的合法性,不会出现错误的情况。
1.2.2 显示电路模块的选择
方案一:使用带有汉字库的LCD液晶显示器完成显示。128×64显示屏是此系统的最佳设计。但是我们考虑到系统的价格方面,带有汉字的LCD液晶显示屏价格偏高。 使用该解决方案不可避免地会增加设计成本。所以此设计当前不使用此方案。
方案二:1602液晶可以显示32个字符,分为两行显示,每行16个字符[8],液晶模块内部的存储器存储了很多的字和字符,这些字和字符足够完成我们的日常使用,使用它时,我们可以直接编译和编写软件程序以在特定时间运行。这种以英语显示相关信息的显示器类型实用且操作简单价格合理,所以非常适合本设计。
1.2.3 按键模块的选择
方案一:矩阵按键,接口适合按键较多且不使用专用键盘芯片的情况[9]。按键成矩状,由行和列组成,这种键盘价格便宜并且使用起来很方便。但是由于一些设计的要求,按键会有一系列问题,需要进行消抖、按键重复等处理。
方案二:独立按键,独立按键的每个按键都需要一个I/O口,并且每个键都是单独工作,不会影响对其他按键的造成影响。独立按键的结构不复杂,电路配置也很灵活,由于我们的设计需要的按键较少,所以该解决方案的使用不仅节省资源、方便,而且可以满足本设计的要求。
1.3 系统工作原理
本课题采用的方案系统原理为:通过MFRC522刷卡模块来识别IC卡完成刷卡,刷卡模块的内部主要安装了一片专门读取和操作IC卡的芯片,它是一个小型的读写设备中的主要元器件。当刷卡模块工作时,不间断的向外发射出13.56MHz的固定频率电磁波,IC卡的内部也有一个谐振电路,谐振电路的频率和刷卡模块发射出来的电磁波相同[10],由于二者频率相同,所以当IC卡靠近刷卡模块时,谐振电路会产生共振现象,这样就使电容里面有了电荷。电容里的电荷被电容另一端单向导电的电子泵送到了其他电容里面储存。等到电容器里够2V后,此电容就充当电源的作用,为卡上的其他电路提供工作电压,将数据传输到单片机中[11],系统处理完后,卡上收到的信息将传输到1602显示屏上,与此同时,LED灯和蜂鸣器也随之工作。系统原理框图如图1.1所示。
在这里插入图片描述

图1.1 系统原理框图
1.4 总体方案确定
通过上面的描述及对比,系统设计方案如下:系统的主控制器选择STC89C51单片机,RC522刷卡模块作为读写设备,还有LCD1602液晶显示及独立按键等组成IC卡消费充值系统。当刷卡模块检测到卡片时,单片机通过刷卡模块将收集到的信息及数据呈现在液晶屏上[12],操作按键就可以进行充值和消费,主要功能将在本设计完成之后实现:
(1)显示:LCD1602液晶可以显示出卡内的序列号和剩余钱数等信息;
(2)按键:通过按键可以完成注册信息、设置金额、销卡等功能;
(3)读卡速度:RC522仅需0.5s即可读取到卡内信息,识别距离为5CM之内。

2 系统硬件电路设计

2.1 主控模块电路设计
2.1.1 STC89C51单片机
在本次设计中,主控制器应该选用单片机,根据设计系统的要求,其应该具有计算功能的CPU、随机访问内存RAM、只读存储器ROM、多个I/O端口还有中断系统、计时器/计数器等[13]。所以决定选用STC公司研发出的单片机,具有价格划算,功能较多,耐用性强,适用场合多的特点。选取的单片机除了具备兼容性好,编写程序简单,价格适中,稳定性好等优点,还有重要的一点就是芯片资料详备,以便在遇到任何软硬件问题时可以得到解决。因此综合考虑来看,STC89C51单片机更为适合作为本系统的处理核心。其原理图如图2.1所示。
在这里插入图片描述

图2.1 单片机原理图
2.1.2 复位电路
复位电路系统是保证单片机设备正常运行的关键,也是单片机设计及制造过程中不能回避的关键。复位电路的主要功能就是满足上电复位要求,单片机的供电电压值误差值不能超过5%,合理的电压值应介于4.5~5.2V范围内。单片机电路本质上为基于时间序列的数字电路,在具体使用中必须结合时钟稳定信号才能正常工作,因此,单片机的电压处于合理范围内,单片机才能正常工作。复位电路原理图如图2.2所示。
在这里插入图片描述

图2.2 复位电路原理图

2.1.3 晶振电路
由于单片机需要时间序列来处理每个事件,因此需要时钟晶体振荡器电路,为系统的稳定运行提供保证。整个系统处理信号和其它各部分运行也是一个频率,晶振电路就是为它们提供一个稳定的振荡频率,使系统各部分保持同步。使用XTAL1和XTAL2,它们通过外部时钟设备直接进行操作。通常情况下,晶体振荡器可以选在在1.2~12MHz之间,甚至可以超过24MHz,但频率越高,功率的消耗也越多。本系统中用到的晶振是12MHz,因为经常用到的晶振就是12MHz,本设计主要是采用外部时钟方式的配合方法[14],电容器帮助石英晶体振荡器启动,电路可以正常工作。晶振电路原理图如图2.3所示。

在这里插入图片描述

图2.3 晶振电路原理图

2.2 电源电路设计
本系统电源处输入模块采用针孔式供电接口,针孔外部接电源负极,针头内部接电源正极,针头另一端使用USB接口。USB接口使用方便,无论在任何场合都可使用移动电源作为备用能源。开关采用自锁式开关,避免按钮式开关,保证系统供电的持续性。单片机和液晶显示屏所需要的电压都是5V。所以,本模块为系统的各个元件提供5V工作电压,并且系统的各部分电路再无单独供电的外接电源。电源电路原理图如图2.4所示。
在这里插入图片描述

图2.4 电源电路原理图

2.3 显示电路模块设计
本设计需要显示屏显示文本,要有两行文本显示,并且不需要彩色。LCD1602液晶其具有显示内容清楚、显示内容量大、操作简单快捷等优点。
此液晶显示屏的显示效果相对于其他型号要高,我们又把它称为字符型液晶。液晶显示屏可以显示出32个字符,分为两行,可以把想要显示出来的信息以文字、数据或图形的方式呈现出来[15],以便于得知系统的信息并展开处理。液晶显示屏模块在我们身边有很多,是很多数码产品的常用配件,对于我们来说很常见。在本次设计中,我们为了能够直观的反应出IC卡内的信息,所以直接采用LCD1602显示屏作为显示部分。其好处有以下几点:
(1)重量与其他型号的显示屏相比很小;
(2)显示出来的内容清晰直观;
(3)所需的电压小、功耗也小。
LCD1602选用标准的16脚接口,如表2.1所示。

表2.1 LCD1602引脚说明表

符号 引脚说明
VSS 电源地
VL 液晶显示偏压信号
RS 数据/命令选择端
R/W 读/写选择端
E 使能信号
VDD 电源正极
D0 Data I/O
D1 Data I/O
D2 Data I/O
D3 Data I/O
D4 Data I/O
D5 Data I/O
D6 Data I/O
D7 Data I/O
BLA 背光源正极
BLK 背光源负极

该LCD1602可以完成数字、字符还有字母的呈现和移动等功能。因此,LCD1602显示屏应用十分广泛。液晶显示电路原理图如图2.5所示。
在这里插入图片描述

图2.5 液晶显示电路原理图
2.4 报警模块电路设计
本设计需要蜂鸣器在本设计中起到识别到IC卡时的反馈的作用,三极管报警电路采用三极管是PNP型,用其进行驱动。当刷卡模块识别到IC卡,主控制器的引脚触动低电压,从而导致三极管导通,蜂鸣器开始工作。用R1来限制支路电流,在本电路中起到防止损坏元器件的作用。报警模块原理图如图2.6所示。
在这里插入图片描述

图2.6 报警模块电路原理图

2.5 RC522刷卡模块
本设计采用RC522刷卡模块进行刷卡操作。RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,本模块可直接安装到各种刷卡器的模具。该模块的运转所需电压为3.3V,和单片机的信息传输方式极其简单,只需要通过几条线将SPI接口与单片机引脚相连即可,可以保证模块稳定持续的工作、读取卡片之间的距离长[16]。其中RST脚与单片机引脚P1.5相连;MISO脚与单片机引脚P1.4相连;MOSI脚与单片机引脚P1.3相连;SCK脚与单片机引脚P1.2相连;SDA脚与单片机引脚P1.1相连;RC522刷卡模块原理图如图2.7所示。
在这里插入图片描述

图2.7 RC522刷卡模块原理图
2.6 独立按键模块设计
本设计中的充值和注册等功能需要通过按键来实现,通过按键来设置金额的加减,本设计需要实用性强,功耗低,键盘之间能够相互独立的按键。
IC卡充值系统可以由手动方式按钮来实现按键设定。其中S1代表注册充值,与单片机引脚P3.2相连;S2代表金额加,与单片机引脚P3.3相连;S3代表金额减,与单片机引脚P3.4相连;S4代表注销,与单片机引脚P1.7相连。按键模块原理图如图2.8所示。
在这里插入图片描述

图2.8 按键模块原理图

2.7 硬件电路原理图
本系统的主控制器选用STC89C51单片机,和按键操作电路、LED灯电路、RC522刷卡模块电路共同构成设计系统,由于刷卡模块正常所需电压是3.3V,电压低于5V,所以选用LM1117-3.3V型号的芯片来保持电压的稳固,刷卡模块与单片机的通信方式非常简单,只需要通过几条线将接口与单片机引脚相连即可,可以保证模块稳定可靠的工作所以用稳压芯片稳压供电。整个系统使用5V电源,指示灯电路会显示用户的类型,分别于单片机P35、P36、P37管脚相连。当系统连接电源后,按下总开关,系统进入最原始的状态,可以通过按下S1、S2、S3、S4对系统进行控制。系统原理图2.9所示。
在这里插入图片描述

图2.9 系统原理图

3 系统软件设计

3.1 系统软件编程环境介绍
本设计选用的编程软件是Keil uVision5。此编程软件是由国外开发的,Keil uVision5可以兼容单片机的C语言[17],使用语言较为广泛,在软件编程时,设计人员可按照自身需求确定编程语言,Keil uVision5的功能具有极强的可扩展性,可以进行下载、编译或者编程等操作。
C语言是国际通行的标准语言,可作为其他编程语言的标准,基于C语言,并充分衡量单片机的具体特性,扩展出Keil C51编程语言,可以有效应用于单片机相关的软件编程。当前,Keil C51编程语言由于其高效简洁的特点,在软件设计中的普及度不断提高。鉴于Keil C51编程语言的实用性较强,Keil C51具备编写、编译、管理、软件仿真等多方面功能,在Keil C51编程环境中的操作具有较高的便捷性。本文设计系统所采用Keil软件的操作界面可参照图3.1。
在这里插入图片描述
图3.1 KEIL软件打开界面

程序烧写时需要使用烧录软件stc-isp-15xx-v6.85O。进入软件后首先选择单片机型号,之后选择串行口,最后选择程序文件下载/编程即可。烧写软件界面如下图3.2所示。
在这里插入图片描述

图3.2 程序烧录界面

3.2 整体软件设计流程概述
首先对程序进行初始化设置,按下S1键,系统进入等待注册状态,当RC522刷卡模块识别到IC卡时,蜂鸣器工作,LCD1602上可以显示卡片的序列号,注册完成;按下S2、S3键设置充值金额,按下S4键选择IC卡类型,选择完后再次按下S1完成充值。按下S4键,蜂鸣器鸣叫一声,当RC522刷卡模块识别到IC卡时,系统进入IC卡注销状态,再次按下S4键完成注销。系统流程图如图3.3所示。
在这里插入图片描述

图3.3 系统流程图

4 系统的焊接与调试

4.1 电路焊接
手动焊接是最常见的焊接方式,目前我国的制造车间在生产制造方面已经不使用手动焊接的方式焊接了,但是对于普通的电子元件维修、对系统的检测维修上依然使用手动焊接。如果焊接本质上有漏洞,则会影响到整个系统设计的完成与实现。手动焊接主要有以下四个步骤构成。
(1)第一步开始焊接
需要把即将要焊接的地方进行清理,主要是清理表面的尘土,然后把需要焊接的电子器件的两个角向一定方向掰一掰,不能让两个的引脚接触在一起,不然会对焊接有影响。接下来让电烙铁的头部触到需要焊接的元器件引脚下方,在此处放上焊锡丝。此处需要注意的是,不能让烙铁头触到其他元件,要不然会把两个元器件焊接在一起。
(2)第二步给焊件加热
当在完成上面的操作后,接下来就应该加热焊锡丝了,主要要做的是将温度达到一定程度的电烙铁放在元器件的引脚一边,渐渐使焊锡丝融化,在这个时候我们需要注意电烙铁的温度是否合适,另外也要根据器件种类做出具体区别。在焊接的时候,如果需要把焊接好的元器件拆卸下来,那也需要对焊接的地方进行加热,主要操作是首先在焊接的地方补好焊锡丝,使焊接的地方是光滑饱满的,然后使用电烙铁在焊接的地方进行加热,在加热的过程中就可以取下元器件了,此操作一定要观察时间,不然会对焊盘造成损坏。
(3)清理焊接面
在进行完上一步骤后,有的时候会观察到焊接的地方有点小问题或者认为焊接的不牢固,这个时候需要对焊接的地方进行修改。通常来说有两种情况,第一种是缺少焊锡,焊接的地方过于粗糙不光滑,这时需要给焊接的地方加一些焊锡,同时也要注意焊锡也不应该补的过多,不然容易不小心连接到其他元器件。另一种是焊锡的量太多,此时可以使用电烙铁放在焊接的地方左右摆动,用电烙铁吸走过量的焊锡,也可以使用吸锡器来进行除焊锡。
(4)检查焊点
当完成上面所有的步骤后,我们需要仔细观察整个焊盘,主要检查焊接连接的地方是否圆润光滑,是否有虚焊的情况,以及是否与其他引脚相连在一起的情况等等。
在这里插入图片描述

图4.1 设计实物焊接背面图

4.2 电路的调试
以上步骤完成后的实物在连接电源之前必须得经过测试,以防止发生短路对元器件造成损害或者导致其他模块无法工作的情况。
(1)单片机电路调试
单片机是整个系统设计中最主要的部件。在最开始的测试中,出现了调节按键没反应,还有1602显示屏显示文字不全等情况。经过多次测试调试后发现是由于单片机的P1.4、P1.5引脚以及单片机P3.6、P3.7引脚与按键位置和显示屏位置的接口没有焊接好造成的,经过再次补焊后此问题便消除了。
(2)系统电源供电路调试
在接通总电源时,闭合自锁开关,发现系统没有通电,之后用万用表检测USB供电口的引脚发现没有电压。将引脚重新焊接后再检测发现电压正常,可以为系统提供正常供电。
4.3设计实物测试
根据本设计要求,对实物设计功能进行整体测试,接通电源后,公交IC卡系统可以正常完成注册充值及消费,显示屏显示数值,按键功能可以实现,LED灯和蜂鸣器接通时开始正常工作。经过测试后系统运行正常,没有出现问题。
在这里插入图片描述

图4.2 设计实物图

结 论

本项目设计了一种集注册、充值、消费和注销于一体的公交IC卡系统。通过对项目课题的分析,确定了需要执行的功能和项目组成器件。改善了传统公交充值系统在充值和消费方面操作繁杂的弊端,优化了公交IC卡系统的结构。
本设计以单片机为核心,RC522刷卡模块作为IC卡识别器,并选用1602液晶显示屏及独立按键,共同构成一个公交IC卡消费系统。在系统初步阶段,需要考虑到很多地方,每一个细微的问题中,都有可能会出现难以料到的事情,有时候一个不起眼的小问题,需要花费很长时间和心思,需要持之以恒的毅力,通过不懈努力,本次设计正常实现预计的功能,而且经过测试系统已达到设计的要求。通过本次设计,较为系统的了解和掌握了有关单片机方面的一系列问题,对STC89C1单片机的结构、功能等有所了解,并对其进行测试和加以应用的知识得到学习。实现了公交自动售票系统的功能,本设计操作起来很便捷。但是,本设计也存在一些不足,例如1602液晶屏幕只能显示出字母和数字,而不能显示出汉字,这样一来,显示的部分不能直接反馈给用户,还有在IC卡刷卡方面,还存在距离较近的缺点。在本设计的基础上很容易通过改善设备,对系统进行优化使功能更加完善。通过本次的毕业设计,我认识到了应该掌握更多的知识,知识是进行设计的基础,但是同时也不能仅仅依靠书上的知识,要多研究、多实践,这样才能将书本上的理论和实际的工作联系到一起。
在本次设计阶段,认识到了自己在元器件的了解方面,还存在很大的不足,对它们的功能、参数都不是非常了解。但是通过这次设计项目后,认识比以前有了很大的提高,在其他知识的积累上也有了长足的进步。

参考文献

[1] 张俊谟. 单片机中级教程原理与应用[M]. 北京航空航天大学出版社, 2002.1:324-375
[2] 孙宝元,杨宝清. 传感器及其应用手册[M]. 北京: 机械工业出版社, 2004:368-375
[3] 谭浩强. C程序设计教程学习辅导[M]. 北京: 清华大学出版社, 2011.8:125-165
[4] 耿永刚. 单片机技术与应用[M]. 上海: 上海科学技术出版社,2012:156-352
[5] 刘莹.基于单片机控制的RFID读写器的设计与实现[J].电子技术与软件工程,2014,8(03):158-159
[6] 史磊. 单片机与嵌入式系统开发方法[J]. 西安: 电子科技大学出版社, 201822:242
[7] 林伸茂. 8051单片机彻底研究[M]. 北京: 中国电力出版社, 2007:56-67.
[8] 胡汉才. 单片机原理及系统设计[M]. 清华大学出版社, 2002:33-42
[9] 鲁刚强. 基于液晶显示器的单片机系统设计[J]. 科技资讯,2008:152-255
[10] 张振荣.MCS-51单片机原理及实用技术[M].北京: 人民邮电出版社,2000.1:10-13
[11] 范风强,兰婵丽.单片机语言C51应用实战集锦.电子工业出版社,2003.3 :15-20
[12] 王宜怀.单片机原理及其嵌入式应用教程.北京希望电子出版社,2002.8:36-45
[13] 马建国. 电子系统设计[M]. 北京: 高等教育出版社, 2004.3:19-25
[14] 徐根耀.电子元器件与电子制作[M]. 北京:机械工业出版社,2017.8:12
[15] 周航慈. 单片机程序设计基础[M]. 北京航空航天大学出版社, 1997,102-105
[16] 赵亚男,王文清,高利,孙明星.物流园区中非接触式IC卡读卡器硬件设计[M]. 北京交通大学出版社,2007.6:102-113
[17] 潘利华.我国IC卡行业的现状及发展趋势[J]. 信息技术与标准化,2004(7):35-39
[18] 胡斌,胡松.电子元器件知识与典型应用[M]. 北京: 电子工业出版社, 2014.1:123-130
[19] 王为青,程国钢. 单片机Keil Cx51应用开发技术[J]. 人民邮电出版社, 2007.2:15-16
[20] Liu Penghou, Chen Haichao, Du Yanzhe. Design of Multifunctional Intelligent Security Robot Based on Single Chip Microcomputer[J]. Journal of Physics: Conference Series, 2019, 1187(3):23-28
[21] Steven J. Johnston, Philip J. Basford, Colin S. Perkins, Herry Herry, Fung Po Tso, Dimitrios Pezaros, Robert D. Mullins, Eiko Yoneki, Simon J. Cox, Jeremy Singer. Commodity single board computer clusters and their applications[J]. Future Generation Computer Systems, 2018, 89(4):48-52

附录1 硬件原理图

在这里插入图片描述

附录2 源程序代码

#include <REG52.H>
#include <string.h>
#include “lcd1602.h”
#include “delay.h”
#include “key_S.h”
#include “buzzer.h”
#include “LED.h”
#include “RC522.h”
//#include “eeprom.h”

u8 ICcode[5][4]={0};//可存储5个IC卡
u8 ICbuf[4]={0};
u8 ICtype[5]={10,10,10,10,10};//类型默认为成人卡
//10–成人卡–10角
//6–学生卡–06角
//5–老人卡–05角
u16 ICsum[5]={0};//充值金额10
void Dis_ICcode(u8
_IC);
void main(void)
{
u8 key=0;
u8 openDoor1=0;
u8 openDoor2=0;
u16 cnt=0;
u8 mode=1;//1-输入密码模式,2-录入密码模式
u8 i=0,j=0;

delay_Init();
LCD1602_Init();
Beep(200);

Start:
St_LCD1602_Clr();
// Wr_LCD1602_Str(0x00,“0123456789abcdef”);
Wr_LCD1602_Str(0x00,"-IC-Bus-System- “);
Wr_LCD1602_Str(0x40,” slot your card ");
while(1)//主循环
{
key=KeyScan(0);
if(key!=0)//处理按键
{
Beep(200);
if(key1)//消费或者充值模式切换
{
if(mode
2){mode=1;goto Start;}//消费模式
else
{
mode =2;//充值模式
// Wr_LCD1602_Str(0x00,“0123456789abcdef”);
Wr_LCD1602_Str(0x00,“IC card recharge”);
}
}

		else if(key==4)//注销用户
		{
			mode=3;//
		//	Wr_LCD1602_Str(0x00,"0123456789abcdef");
			Wr_LCD1602_Str(0x00,"Logout IC card..");//删除卡
		}

	}

	if(mode==1)//刷卡消费模式
	{
		 if(ReadICcode(ICbuf)==0)
		 {
		 	Beep(200);
			Dis_ICcode(ICbuf);
			for(i=0;i<5;i++)//共5张IC卡
			{
				if((ICbuf[0]==ICcode[i][0])
				 &&(ICbuf[1]==ICcode[i][1])
				 &&(ICbuf[2]==ICcode[i][2])
				 &&(ICbuf[3]==ICcode[i][3]))
				 {
					 LEDx_ON(ICtype[i]);
					 if(ICsum[i]>=ICtype[i])//足够消费一次
					 {
						 ICsum[i]-=ICtype[i];//消费一次
						 //显示余额
					//	Wr_LCD1602_Str(0x00,"0123456789abcdef");
						Wr_LCD1602_Str(0x40,"Balance:000.0$  ");//
						Display_yuan(0x4d);
						Wr_LCD1602_Num(0x48,ICsum[i]/1000%10);
						Wr_LCD1602_Num(0x49,ICsum[i]/100%10);
						Wr_LCD1602_Num(0x4a,ICsum[i]/10%10);
						Wr_LCD1602_Num(0x4c,ICsum[i]/1%10);
						Beep(500);
						delay_ms(300);
					 }
					 else//提示余额不足						 {
					 	Wr_LCD1602_Num(0x0c,ICsum[i]/10%10);
						Wr_LCD1602_Byt(0x0d,'.');
						Wr_LCD1602_Num(0x0e,ICsum[i]/1%10);
						//r_LCD1602_Byt(0x0f,'$');
						Display_yuan(0x0f);
						Wr_LCD1602_Str(0x40,"not sufficient..");//
						Beep(200); Beep(200);Beep(200);
						delay_ms(300);
					 }
					 LED_allOFF;
					 goto Start;
				 }
			}
		//	Wr_LCD1602_Str(0x00,"0123456789abcdef");
			Wr_LCD1602_Str(0x40,"This A New Card!");//这个是新卡,无法消费
			Beep(100);Beep(100);Beep(100);					
			delay_ms(1000);
			mode=1;
			goto Start;
		
		 }
	}
	else if(mode==2)//充值模式	
	{
		 if(ReadICcode(ICbuf)==0)
		 {
		 	Beep(200);
			Dis_ICcode(ICbuf);
			
			for(i=0;i<5;i++)//共5张IC卡
			{
				if((ICbuf[0]==ICcode[i][0])
				 &&(ICbuf[1]==ICcode[i][1])
				 &&(ICbuf[2]==ICcode[i][2])
				 &&(ICbuf[3]==ICcode[i][3]))
				 {
				 	LEDx_ON(ICtype[i]);
					key=5;
					while(1)//充值中
					{
						if(key)
						{
							Wr_LCD1602_Str(0x40,"Balance:000.0$  ");//
							Display_yuan(0x4d);
							Wr_LCD1602_Num(0x48,ICsum[i]/1000%10);
							Wr_LCD1602_Num(0x49,ICsum[i]/100%10);
							Wr_LCD1602_Num(0x4a,ICsum[i]/10%10);
							Wr_LCD1602_Num(0x4c,ICsum[i]/1%10);
						}							
						key=KeyScan(0);
						if(key){Beep(200);}								
						if(key==2){if(ICsum[i]<65500)ICsum[i]+=100;} //加10元
						else if(key==3){if(ICsum[i]>=100)ICsum[i]-=100;}//减10元
						else if(key==1){mode=1;LED_allOFF;goto Start;}//退出充值模式
						
					}
				 }
			} 
			//一张新卡充值过程
		 	//找到一个新卡位置
			for(i=0;i<5;i++)
			{
				if((ICcode[i][0]==0)
				&&(ICcode[i][1]==0)
				&&(ICcode[i][2]==0)
				&&(ICcode[i][3]==0))
				{						
					ICcode[i][0]=ICbuf[0];
					ICcode[i][1]=ICbuf[1];
					ICcode[i][2]=ICbuf[2];
					ICcode[i][3]=ICbuf[3];
					Wr_LCD1602_Str(0x40,"K2:+10|K3:-10");
					while(1)//充值中
					{
						LEDx_ON(ICtype[i]);
						key=KeyScan(0);
						if(key){Beep(200);}								
						if(key==2){if(ICsum[i]<65500)ICsum[i]+=100;} //加10元
						else if(key==3){if(ICsum[i]>=100)ICsum[i]-=100;}//减10元
						else if(key==1){mode=1;LED_allOFF;goto Start;}//退出充值模式
						else if(key==4)
						{
							if(ICtype[i]==10)ICtype[i]=6;
							else if(ICtype[i]==6)ICtype[i]=5;
							else if(ICtype[i]==5)ICtype[i]=10;
							else  ICtype[i]=10;
						}
						if(key)
						{
							Wr_LCD1602_Str(0x40,"Balance:000.0$  ");//
							Display_yuan(0x4d);
							Wr_LCD1602_Num(0x48,ICsum[i]/1000%10);
							Wr_LCD1602_Num(0x49,ICsum[i]/100%10);
							Wr_LCD1602_Num(0x4a,ICsum[i]/10%10);
							Wr_LCD1602_Num(0x4c,ICsum[i]/1%10);
						}							
					}
					

				}
				
			}
									
	
		}
	}
	else if(mode==3)//注销用户模式
	{
		if(ReadICcode(ICbuf)==0)
		{
			Beep(200);
			for(i=0;i<5;i++)
			if((ICbuf[0]==ICcode[i][0])
			 &&(ICbuf[1]==ICcode[i][1])
			 &&(ICbuf[2]==ICcode[i][2])
			 &&(ICbuf[3]==ICcode[i][3]))
			 {
			 	Dis_ICcode(ICbuf);	
				//显示余额
		     	Wr_LCD1602_Str(0x0c,"K4->");
				Wr_LCD1602_Str(0x40,"Balance:000.0$  ");//
				Display_yuan(0x4d);
				Wr_LCD1602_Num(0x48,ICsum[i]/1000%10);
				Wr_LCD1602_Num(0x49,ICsum[i]/100%10);
				Wr_LCD1602_Num(0x4a,ICsum[i]/10%10);
				Wr_LCD1602_Num(0x4c,ICsum[i]/1%10);
				while(1)
				{	
					key=KeyScan(0);
					if(4==key){Beep(200);break;}
					else if(key)goto END;//任意键放弃注销
				}
				ICcode[i][0]=0;//清空IC卡号
				ICcode[i][1]=0;
				ICcode[i][2]=0;
				ICcode[i][3]=0;
				ICtype[i]=10;//默认成人卡
				ICsum[i]=0; //清空账户余额

			//	Wr_LCD1602_Str(0x00,"0123456789abcdef");
				Wr_LCD1602_Str(0x40,"Logout IC Succes");
				Beep(800);
				mode = 1;//自动进入刷卡模式
				goto Start;
			 }

END:
// Wr_LCD1602_Str(0x00,“0123456789abcdef”);
Wr_LCD1602_Str(0x40,“This A New Card!”);
Wr_LCD1602_Str(0x40,"Logout IC Error ");
Beep(150);Beep(150);Beep(150);
mode = 1;
goto Start;
}
}

}

}
void Dis_ICcode(u8* _IC)
{
//“0123456789abcdef”
//“IC:78FBA801”
St_LCD1602_Clr();
Wr_LCD1602_Str(0x00,“IC:”);
Dis_Hex(_IC[0]);
Dis_Hex(_IC[1]);
Dis_Hex(_IC[2]);
Dis_Hex(_IC[3]);
}

致 谢

大学的四年的读书时光在这个夏季即将划上一个句号,对于我来说,是我即将面对又一个新的征途的开始。四年的学习生活在老师、父母、朋友的支持下,走的辛苦但是也得到了很多,在论文即将完成之际,感慨万千,心情许久不能平静下来。
首先,我要感谢学校沈阳城市学院对我的培养!这个承载了我人生最青春、最美好、最拼搏的本科年华的学校。在此后的人生道路中我将一直秉承着“我行,我能”的校训,不断奋进拼搏,为母校尽一份微薄之力。
其次,我要感谢我的指导老师孟老师和张老师的无私奉献、悉心指导,他们严谨求实的治学态度、孜孜以求的工作作风和大胆创新的进取精神激励着我,整个毕业设计的过程都是在孟老师和张老师的指导下完成的,从资料的收集、方案的选择、项目的测试调整以及本篇论文的撰写,孟老师和张老师都做了非常仔细的指导。
我还要感谢学院所有给我上过课的老师,是他们教授给我许多的知识,打开了我的知识面,教会了我许多的知识和理论,对我的论文完成有着莫大的帮助。
你们在各方面对我不求回报的支持是我能顺利走完大学读书生活的最大动力。无论以后我遇到什么困难,一想起你们对我无私的爱,我都会勇敢面对困难继续走下去,正是有着你们,我的这一路充满了温暖。
毕业将至,借此再次向所有关心、支持、帮助我的老师和同学表达衷心的感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/437914.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[网络安全] PKI

一、PKI 概述 名称; 公钥基础设施 (Public Key Facility) 作用: 通过加密技术和数字签名保证信息安全 组成: 公钥机密技术、数字证书、CA、RA 二、信息安全三要素 机密性&#xff1a;确保仅信息发收双方 能看懂信息 完整性&#xff1a; 确保信息发收完整&#xff0c;不被破坏 …

MUMU模拟器12连logcat的方法

大家好&#xff0c;我是阿赵。   在开发手机游戏的时候&#xff0c;在真机上会出现各种问题&#xff0c;在查询问题的时候&#xff0c;安卓手机需要用adb连接来连接手机看logcat输出分析问题。但由于连接手机比较麻烦&#xff0c;所以我都习惯在电脑用安卓模拟器来测试。   …

Chrome安装Axure插件

打开原型目录/resources/chrome&#xff0c;重命名axure-chrome-extension.crx&#xff0c;修改后缀为rar&#xff0c;axure-chrome-extension.rar 解压到axure-chrome-extension目录打开Chrome&#xff0c;更多工具->扩展程序&#xff0c;打开开发者模式&#xff0c;选择加…

Java 8

欢迎阅读这篇Java 8 教程。本教程旨在深入探讨Java 8的新特性&#xff0c;包括Lambda表达式、流API、新的日期时间API和更多内容。通过具体的示例和详细的解释&#xff0c;你将能够理解这些特性的用法&#xff0c;并将其应用到你的日常编程中。让我们开始吧。 一、默认方法和静…

KOA优化最近邻分类预测(matlab代码)

KOA-最近邻分类预测matlab代码 开普勒优化算法&#xff08;Kepler Optimization Algorithm&#xff0c;KOA&#xff09;是一种元启发式算法&#xff0c;灵感来源于开普勒的行星运动规律。该算法模拟行星在不同时间的位置和速度&#xff0c;每个行星代表一个候选解&#xff0c;…

【Python】新手入门(9):数值和序列

&#x1f40d;【Python】新手入门&#xff08;9&#xff09;&#xff1a;数值和序列 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

今日份实验,剪了个头发,克隆了无数个自己,还是不断push

这个是今天用editor编辑器跑出来的数据&#xff0c;以下是用git跑出来的数据 下面是通过Xftp建立的会话。 用来跑一下以前的源代码 不过&#xff0c;noonxin.com, yuanjianchufang.com,网站好像不能访问&#xff0c;可能是域名出现问题&#xff0c;登录和注册也是存在问题的…

python爬虫(2)

继上节 查看数组维数 可以使用数组的ndim属性 代码示例如下&#xff1a; import numpy as np c np.random.randint(1,9,5) print(c.ndim) 结果如下&#xff1a; 当然这些也可以结合前面的各种用法来使用 1、选取数组元素 &#xff08;1&#xff09;一维数组的元素…

Ubuntu整系统迁移到另一个硬盘中

以ubuntu20.04为例&#xff0c;之前使用的是1T的移动硬盘&#xff0c;每次进入后性能不太稳定&#xff0c;所以最近买了块1T的固态硬盘给我的笔记本装上了&#xff0c;但是如果重新进行各种软件安装及环境配置就太麻烦了&#xff0c;所以采用了系统迁移 1.首先制作一个Ubuntu系…

基于springboot精品在线试题库系统论文

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的精品在线试题库系…

10、Linux项目部署-WAR包、JAR包

一、WAR包 第一步&#xff0c;把War包解压&#xff0c;再重新打包成Zip。 第二步&#xff0c;在Linux里创建一个项目文件夹&#xff0c;将Zip的内容解压在这个文件夹内。 例如&#xff0c;创建的项目文件夹是/usr/local/software/project1 第三步&#xff0c;修改Tomcat配置…

二百二十六、Linux——shell脚本查看今天日期、昨天日期、30天前日期、1月前日期

一、目的 由于磁盘资源有限&#xff0c;因为对原始数据的保存有事件限制&#xff0c;因为对于超过一定期限的数据文件则需要删除&#xff0c;要实现定期删除则第一步就是查看日期时间 二、在Linux中创建shell脚本 #! /bin/bash source /etc/profile nowdatedate --date0 da…

2024年腾讯云学生服务器活动详细说明、学生机购买流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

vite+vue3使用UEditorPlus ,后端PHP

vitevue3使用UEditorPlus 百度富文本编辑器是目前所有编辑器中功能最丰富的&#xff0c;但长时间不进行维护了。 之前写了一篇使用UEditor的教程&#xff0c;最近发现一个UEditorPlus&#xff0c;总结一下如何使用 什么是UEditorPlus 基于 UEditor 二次开发的富文本编辑器&…

JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)

接上次博客&#xff1a;JavaEE进阶&#xff08;13&#xff09;案例综合练习——博客系统-CSDN博客 目录 程序配置文件修改和打包 构建项目并打包 分平台配置 数据准备 上传jar包到云服务器并运行 开放端口号 验证程序 如何查看日志得到报错信息 常见问题 关于Linux基…

Polar 写shell

Polar 写shell 直接给了源码 还是没啥好说的&#xff0c;考点是die()死亡函数绕过之不同变量 **绕过原理&#xff1a; **通过base64解密或rot13解密使"<?php exit();"变为乱码&#xff0c;而传入的$content为base64编码&#xff0c;解码后为正常shell语句。通过…

Java数据结构-----List的介绍

目录 一、什么是List 二、List的常用方法 三、List的使用 一、什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection&#xff0c;其中&#xff0c;Iterable和Collection都是接口。 站在数据结构的角度来看&#xff0c;List就是一个线性表&#x…

Java定时调度:Timer类和TimerTask类

Java提供了多种方式来执行定时任务&#xff0c;其中使用Timer类和TimerTask类是一种简单而有效的方法。这篇教程将介绍如何使用Java的Timer类和TimerTask类来实现定时调度。 1. Timer类 Timer类用于安排指定的任务按指定的时间执行。它可以执行一次性任务&#xff0c;也可以按…

草稿111

peekmessage&#xff08;用于接受信息&#xff09; exmessage&#xff08;专门用于鼠标操作&#xff09; #include<graphics.h> #include<string> #include<vector> using namespace std; const int WINDOW_WIDTH 1280; const int WINDOW_HEIGHT 720;//封装…

VNC 与 虚拟机 保姆级 快速入门图文指导

Time: 2024年3月5日22:31:49 By[ V ]: MemoryErHero 重要的事情先说三遍: 1 虚拟机内无需安装 VNC-Viewer-7.0.1-Windows 2 虚拟机内无需安装 VNC-Viewer-7.0.1-Windows 3 虚拟机内无需安装 VNC-Viewer-7.0.1-Windows 1 VNC 图文安装 流程 ① VNC-Viewer-7.0.1-Windows.e…
最新文章