你的位置:首页 > 测试测量 > 正文

极客DIY:射频卡流量管理系统,竟然这么玩?!

发布时间:2013-12-20 责任编辑:mikeliu

【导读】相信许多上学的小朋友们都知道学校澡堂的按时间收费的不公平性,洗澡又不是打电话,好不合理!而按流量收费就基本是公平了好多,于是乎,有极客的DIY大神在饮水机上做了实验,真的是奇思妙想无极限!快来看看吧!

先来个全家福!!!

极客DIY:射频卡流量管理系统,竟然这么玩?!

IC卡的特点:

a、存储容量大。磁卡的存储容量大约在200个字符;IC卡的存储容量根据型号不同,小的几百个字符,大的上百万个字符。

b、安全保密性好,不容易被复制,IC卡上的信息能够随意读取、修改、擦除,但都需要密码。

c、CPU卡具有数据处理能力。在与读卡器进行数据交换时,可对数据进行加密、解密,以确保交换数据的准确可靠;而磁卡则无此功能。

d、使用寿命长,可以重复充值。

e、IC卡具有防磁、防静电、防机械损坏和防化学破坏等能力,信息保存年限长,读写次数在数万次以上。

思路:

首先读取IC卡,将IC卡存储的信息显示出来,如果显示成功,则打开电磁阀,开启外部中断计数脉冲,根据脉冲个数进行相应的扣款操作。比如每10个脉冲扣相应的金额,完成扣款后同时返回余额,并显示出来。写一个上位机对姓名,钱包,学号等进行更改。
[page]

材料:

2个EHY射频卡读写模块     串口协议    用于读写射频卡

2个STC12C5A60S2单片机    选他是因为是双串口,并且速度还不

继电器                      控制电磁阀
若干三极管 8050 8550          

若干驱动蜂鸣器,继电器   LED          

2个7805稳压           

2个12864液晶          

2个流量计               一热一冷(热的是铜材质的)

2个电磁阀               一热一冷(热的是铜材质的)

原理图以及PCB图

首先设计电路图,IO口其实没几个

以及PCB图

极客DIY:射频卡流量管理系统,竟然这么玩?!

图里面的错误:

1、驱动继电器的三极管大家用8050,

2、PCB上,液晶倒数第二脚没接VCC,导致液晶有数据不显示,后来发现,原理图里面没有接,可以重画。

驱动12864

没有用户,等待模式。

极客DIY:射频卡流量管理系统,竟然这么玩?!
[page]

读到卡了,显示姓名,学号,钱包。

极客DIY:射频卡流量管理系统,竟然这么玩?!

随着流量计脉冲个数增长,单片机进行计费,同时进行扣款操作,操作完毕显示当前余额。


用户移走卡,蜂鸣器长鸣一声,提示卡已移走。

极客DIY:射频卡流量管理系统,竟然这么玩?!

上位机(改变姓名,充值,初始化等操作,依赖于模块) 用C#写语言编写。
[page]

没选择串口前所有的都是灰色,表示不可操作。

极客DIY:射频卡流量管理系统,竟然这么玩?!

选择串口后,按钮可操作,更改框可以进行改写。

极客DIY:射频卡流量管理系统,竟然这么玩?!

单击读卡按钮后的显示。

极客DIY:射频卡流量管理系统,竟然这么玩?!
[page]

程序部分

//        search card and get card serial number
uchar xdata ComSearchCard[5]  = {0xAA,0xBB,0x02,0x20};//寻卡,返回AA BB 06 20 92 BF 72 59 20
//        read block No.x
uchar xdata ComReadBlock[13]  = {0xAA, 0xBB, 0x0a, 0x21, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};//读哪一块第六位就是0x0几。
//        read block No.8
//uchar ComReadBlock6[13]  = {0xAA, 0xBB, 0x0a, 0x21, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
//        write block No.8 with 0x01 to 0x0f
uchar xdata ComWriteBlock[29] = {0xAA, 0xBB, 0x1a, 0x22, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//0xff是密码
                                                   0x02, 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x01,//
                                                   0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00};//要写的数据
//         initialize block No.8 as a purse with value: 0x12345678
uchar xdata ComIntiPurse[17]  = {0xAA, 0xBB, 0x0e, 0x23, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//初始化钱包。分区5为钱包                            
                                                   0xff, 0xff, 0x00, 0x00};
//        read purse value of block No.5
uchar xdata ComReadPurse[13]  = {0xAA,0xBB,0x0a, 0x24, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};//读取分区5的钱包  返回四字节的数据
//        purse in block No.5 increase with value "2"
uchar xdata ComIncrPurse[17]  = {0xAA,0xBB,0x0e, 0x25, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //增加钱包的余额
                                                   0x01, 0x00, 0x00, 0x00};//要增加的值
//        purse in block No.5 decrease with value "1"
uchar xdata ComDecrPurse[17]  = {0xAA,0xBB,0x0e, 0x26, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//扣费
                                                   0x01, 0x00, 0x00, 0x00};//要减少的值
//  halt the card selected
uchar xdata ComHaltCard[5]    = {0xAA,0xBB,0x02,0x28};//
//  the purse final value after INC & DEC
/********************************************************************
*
*   接收从IC卡返回的数据 。用数组存储

***********************************************************************/
uchar xdata ICSearchCard[9]={0};//5-7位是卡的序列号
uchar xdata ICReadBlock[21]={0};
uchar xdata ICWriteBlock[5]={0};
uchar xdata ICIntiPurse[5]={0};
uchar xdata ICReadPurse[9]={0};
uchar xdata ICIncrPurse[5]={0};
uchar xdata ICDecrPurse[5]={0};
uchar xdata ICHaltCard[5]={0};
/*****************************提取数据的数组*********************/
uchar xdata user_block8[12]={0}; //学号
uchar xdata user_card[4]={0};  //卡号
uchar xdata user_cash[4]={0}; //现金
uchar xdata user_name[6]={0}; //姓名

以上是要用到命令数组,处理数组,显示数组等.。

极客DIY:射频卡流量管理系统,竟然这么玩?!

这个是命令选择入口函数,注释写得很详细,大家自己去看哈。然后就是12864显示的函数,还有串口什么的初始化。

扣费的时候需要注意下。
***************************************************
EX0 = 0;
countflag = 0;//脉冲标志清零
feetemp = 0x01;//这里是扣的金额
feecount = feecount + feetemp;//计算使用总额,需要显示也可以显示的
ComDecrPurse[12] = feetemp;//写入扣钱金额
j = Command_choic(7);//100个脉冲减少一分钱
*******************************************************************************
然后个数的问题,在外部中断里面去修改下就好,建议大家使用宏定义直接可以在顶部修改即可
**************************************************************************
   count++;
   if (count == 1) //                更改脉冲个数
   {                                        
      countflag = 1;
          count = 0;
   }
*********************************************************************
[page]

为什么使用双串口单片机?

因为一边要和模块通信,一边要打印数据出来观察是否正确,所以要使用两个串口.

为什么用12C5A60S2的原因:

用串口2和模块去通信.

搭建管道系统,对饮水机进行改装模拟,(实际上淋浴系统应该比饮水机好改)

热水管道系统,前面是流量计,后面是电磁阀。

极客DIY:射频卡流量管理系统,竟然这么玩?!

极客DIY:射频卡流量管理系统,竟然这么玩?!
[page]

热水冷水搭建即将结束。

极客DIY:射频卡流量管理系统,竟然这么玩?!

极客DIY:射频卡流量管理系统,竟然这么玩?!

冷水管道也好了,拐了几道弯。
极客DIY:射频卡流量管理系统,竟然这么玩?!

极客DIY:射频卡流量管理系统,竟然这么玩?!

极客DIY:射频卡流量管理系统,竟然这么玩?!
[page]

接上控制系统,那个小的是射频卡读写模块。

最后就是这个样子。

极客DIY:射频卡流量管理系统,竟然这么玩?!

不足与缺陷:

1.流量计选用的四分,建议改成2分,但是电磁阀一定要4分的。

2.如您所见,丑陋之极,表示找不到地方安装。

3.程序写得有些乱。

建议:
          
a、建议大家写程序注意部分

b、写程序多用枚举和结构体,方便,高效

c、饮水机压强和电磁阀里面的软垫子需要一定的压力才可以开启,需要考虑周全。

相关阅读:

DIY:自制车用超级电容器【附原理图】
告别黑暗,牛人自制“摇一摇”手电筒
实用DIY:将USB鼠标集成到PCI接口里


特别推荐
技术文章更多>>
技术白皮书下载更多>>
热门搜索
 

关闭

 

关闭