系统的原理
这套系统是由各个模块来组成,它们分别是51单片机(这里用集成开发板)、12864液晶显示模块,WiFi模块,FRID RC522模块和M1卡。系统是通过编程来控制各个模块的功能和连接在一起来实现整个系统功能。系统原理是:由RC522模块的天线向M1卡发射电磁波进行通信,M1卡在感应电磁波后产生能量,接收处理RC522模块的信息并向模块响应。模块收到M1卡的信息后通过SPI总线的通信方式向单片机的I/O口传递信息。单片机收到读卡模块的信息后,一方面通过程序处理信息并通过12864显示屏显示出来,另一方面通过WiFi模块的透传模式向预先设置的服务器发送单片机发送过来的信息,服务器接收信息。
51单片机开发板
集成开发板这里用的开发板为常见的STC89C51单片机,由于是刚入手做东西,并且现在还没有学习PCB打板和电路图的设计,现在只能用别人集成的开发板,个人觉得用开发板的不好之处就是不能按自己的想法去设计外观和添加一些副功能。不过也差不多,用到开发的地方无非是使用开发板的一些I/O口而已,,开发板已为我们引出单片机引脚的插口和连接好一些副功能,入蜂鸣器和流水灯,这些副功能也会占据这些I/O口,所以当我们用不上这些功能时,则需要手动把这些功能给予关闭,否则在用到这些I/O口时就会引起冲突。例如一般RC522模块设置的I/O口都是3.7-3.4这几个I/O口,当我们需要使用开发板上的按键功能做选择按钮时,这几个I/O口就会导致按键能够使用,而单片机却不能与RC522模块进行通信,此时我们就需要把按键功能给手动关闭掉,样这几个I/O口只为读卡器模块服务。用开发板好处就是可以很方便的使用3V或5V电源接口。
12864模块
12864液晶时序图作为一个有着中文字库的显示模块是非常有用的,即既能显示数字、字母又能显示中文汉字,不过相对于1602液晶显示模块来说,使用起来还是相对困难一点的,1602液晶显示屏是作为一种入门显示屏,对命令和数据的写入是非常简单的,也很容易上手。12864液晶显示屏主要靠写入命令和写入数据来完成显示的,写入命令就是想液晶说明要如何显示自己写入的信息,如我要在液晶屏的第几行显示我要写入的数据,光标位置等。写入数据就是把你想要的数据信息在液晶屏上显示出来。在学习这个模块时,我们需要在单片机内设计其命和数据I/O口,如 #define Lcd_Bus P0把液晶的数据连接口设置为P0口,当然这得看开发板上所引出的相应的数据口,如果是自己打板设计的那就可以随便使用一个数据口了,其次还有它的命令I/O口,如sbit LCM_EN = P1^0;设置液晶使能端连接的单片机I/O口为单片机的P1口的第一位I/O口,这也得看开发板所引出的I/O口。最后就是看液晶手册所给的读写数据或命令的时序图,这个时序图是非常重要,因为都是高低电平来驱动是写命令还是写数据或者是读数据啥的,还要相应的控制其时间。那么我就来说明一下下面这个时序图怎么看。
在这里只说写入命令或数据的时序图,因为我们不指望能从液晶显示屏中读出什么有用的数据,所以它的方法是一样的。首先我们得定义 RS(命令选择端)的引脚,如sbit RS = P1^2;sbit EN = P1^0;sbit RW = P1^1; 这个只需按开发板的引脚来设置就行,如果是自己打的板,则可以自己设置I/O口。当我们要写入命令时RS=0;RW=0,RS设置为低电平,RW设置为低电平,使能端EN设置为低电平,即图中的2号线,然后给数据口赋值,再者把EN=1拉高,至少延时时序图给的时间,由于液晶处理数据需要时间,所以的延时一下,一般情况下可以用一个函数来判断液晶是否处于空闲状态。最后再把EN=0拉低,就能把命令写入液晶中了。而写入数据也差不多, RS=1;RW=0;EN=0;即RS为图中1号线,写入数据然后拉高EN使能端,延时一下,然后拉低使能端。
WiFi模块
WiFi模块一些指令WiFi模块是单片机和服务器端连接进行数据的重要方式,在这里所使用的位ESP8266WiFi模块。这些模块在开发过程中已设置好内部程序,我们只需通过开发公司给的命令进行配置即可,所以要做的就是配置WiFi模块。WiFi模块会有相应指令,这就要用到WiFi模块的使用手册了,在WiFi模块中可以设置三种模式STA模式、AP模式、STA+AP模式。STA模式就是把WiFi模块作为终端,可以连接到路由器端进行通信。AP模式就是把WiFi模块作为路由端即热点。
连接好WiFi模块这是一些对WiFi模块进行配置的指令。至于怎么用这些指令对模块进行配置,这就得用到串口助手了
配置为STA模式指令我们按电路连接好线之后就会出现如下情况,首先上电后会出现一些乱码情况,这属于正常现象,之后会出现'ready'字样,说明已经和串口助手连接好了。
首先我们在串口发送去输入AT+CWMODE=3按回车键,记住一定得按回车键,不然可能不会设置成功,之后窗口接收区如果收到返回的ok则表明设置成功,然后再发送AT+CWLAP来查询附近的WiFi热点,接收区会返回附近热点的名称,一次下去就能配置你想要的模式。
FRID RC522模块
RC522配置RC522模块主要用于读卡,至于能不能进行写卡,我试了一下好像不行,不过可以写一些数字进去,这就是M1卡可以用作钱包的原因了。先说一下读卡器是怎么读卡的先吧,首先我们把卡密码写在程序里,烧录到单片机中,当读卡器寻到卡后,就会进行如下步骤,防冲突,防冲突就是读卡器里的一种防止当你放多张卡的情况,你放多张卡是选定不了卡片的,再者就是选定卡片了,选定卡片是读卡器去选择读取得卡,之后就是验证卡片密码了,验证卡片密码就得用到密码了,这个密码是由6组十六进制数组成,最后就是读或写数据了,读数据就是指定读卡器去读取卡片的模块区域的数据。接下来就来配置模块,配置RC522模块先对简单一些,我们只需打开天线,选择它可以读取得卡类型,如下配置
对于这些函数怎么去写,一般厂家都会给有开发模块功能的函数,只需做的是简单的传参而已。RC522模块基本上是可以做到插上即用的那种,不过说到插上即用还有一个重要设置就是和单片机的I/O口进行通信的接法,一般情况我们使用3.7-3.4接口的,当然还可以转到其他接口。
M1卡
M1卡M1卡就是Mifare非接触式感应卡,M1卡数据保存期为10年,可改写10万次,读无限次。无电源,自带天线,工作频率为13.56MHZ.M1卡内含加密控制逻辑和通讯逻辑电路。M1卡主要有两种,一种是S50和一种是S70。
M1卡是由16个扇区组成,每个扇区都是独立的,也就是说,每个扇区都可以用来做不同的功能,比如说,我可以用扇区2来做饭卡,就用来吃饭用的,用扇区3来做热水卡,用来喝热水的用的,这就可以做到一卡多用了,扇区1是出厂时就已经固化了,里面存储一下厂商信息和卡序列号,说到卡序列号就是我们要拿来用的一个卡号了,每个卡的序列号都是唯一的,我们的签到系统就得用的上这个卡的序列号了,这个卡的序列号是由4字节的十六进制组成的,如果我们只是单纯的发出来是发不出来的,在串口接收会显示乱码,不过可以通过内部对比发出来。
实现编程
要编程我们就得有开发环境,一般情况下我们都用keil 4作为首选开发环境,不过这里就有一个问题就是这个软件是收费,只能用于编译一些比较小的文件,比如编写实现一个流水灯这些到可以。那么问题就来了,怎么破解这个软件,一般在网上下载破解版都会有注册机的,首先安装好keil4软件,然后打开注册机,把keil4软件的file->license management->CID复制到注册机中就会生成相应的激活码,把这个激活码复制到刚才界面的New License code中,点击Add Lic就会出现一个激活到期年限。
工程文件结构图接下来就是如何编程实现这些功能了,首先我们来看一个程序结构图,这个结构图是分别写各个模块的功能函数。
主函数icmain文件主要是用于放置一些初始化模块函数和界面设计等功能函数、icmenu文件主要是写一些界面显示,菜单设置等功能函数,icrc522文件是读卡器模块的功能函数,像寻卡、防冲撞、验证卡密码等函数,icdisplay文件主要是用于显示屏显示的功能函数,icusart文件当然就是用来写串口通信函数了,包括接收和发送,中断等函数,icdelay文件就用来写一些延时函数等。
再接下来就来介绍一下主函数了
主函数也非常简单,lcm_init()函数是用来初始化12864液晶屏的,至于怎么初始化,入下图
初始化12864液晶函数
无非就是想液晶写入命令,如光标怎么显示,在第几行开始显示等这些。
单片机初始化函数第二个init()函数主要单片机的系统初始化函数,用来初始化单片机的波特率,工作方式,中断等,如下图
接下来的延时函数我就不说了,说说InitializeSystem()函数,这个函数是用来初始化读卡器模块的,就是设置读卡器允许读取卡片的类型和开启关闭天线等。如下图
读卡器模块初始化
界面显示函数 读卡器读卡函数 读卡器读卡函数以下是一些功能函数的截图
思路拓展
从这个项目学习中不仅能够学习如何去使用和编程来控制这些模块功能,很重 要的一点就是网上的博客和论坛给了我很大帮助和启发,其中让我觉得可以继续玩弄下去的一些比较新颖的想法就是可以把单片机做成web服务器、用服务器来与单片机进行数据交互,如显示网络上的天气功能等等、用安卓App对单片机进行控制或者开发一款微信小程序平台来对单片机的一些功能控制等。
网友评论