基于485总线的食堂刷卡系统.docx
《基于485总线的食堂刷卡系统.docx》由会员分享,可在线阅读,更多相关《基于485总线的食堂刷卡系统.docx(16页珍藏版)》请在冰豆网上搜索。
![基于485总线的食堂刷卡系统.docx](https://file1.bdocx.com/fileroot1/2023-4/20/9e8c5e60-30eb-4044-ba7b-249b5b413a23/9e8c5e60-30eb-4044-ba7b-249b5b413a231.gif)
基于485总线的食堂刷卡系统
传感器与检测应用
设计报告
目录
摘要……………………………………………………………1
一设计名称…………………………………………………2
二设计目的及思路…………………………………………2
三主要功能…………………………………………………3
四设计原理………………………………………………3
4.1485总线介绍
4.1.1485总线概述
4.1.2485总线特点
4.2食堂刷卡功能模块
4.2.1设计原理
五设计步骤…………………………………………………6
5.1485总线核心代码
5.2食堂刷卡模块核心代码
5.3设计结果截图
六心得体会…………………………………………………10
七参考文献…………………………………………………12
摘要
像现在学校,大型企业都有食堂,食堂基本上都是打卡消费,这样确实很方便,省时间;但也存在一些问题,比如:
要是丢失的卡被他人拾到,卡里的钱有可能短时间内被他人刷光,还有就是有时候食堂工作人员没注意把5块钱刷成50块钱,等刷完显示余额的时候学生才发现刷错了,虽然现在这种情况在学生卡管理系统中能查到,但很不方便,如果食堂的刷卡机能显示所有的刷卡记录就可以很方便地发现这种情况了。
所以设计一个更先进的食堂消费系统是很必要的(这里以学校食堂消费系统为例)。
食堂是一个集体单位、企业等不可缺少的一部分,尤其是学校,学校一直以来都是人群集中比较密集的地方,再随着高校的扩招,学生的密集程度更是急剧增长,故高校食堂的增多是不可避免的。
再加上学生没有经济来源,去餐馆消费是几乎消费不起的,所以食堂的存在给广大的学生们带来了很多的方便及好处,同时也给提供餐饮方带来了极大的方便。
一、设计名称
基于485总线的食堂刷卡系统
二、设计目的及思路
传统的食堂刷卡管理现在已经很难应对当今社会对食堂的管理要求,它与现在的基于计算机技术发展起来的食堂信息管理系统对比,有以下几大不同:
便捷性方面:
传统的人工对食堂信息进行管理,如:
顾客信息管理,消费信息管理和记账信息管理,都是很繁琐的过程,其中的任何一部过程都要浪费大量的时间,而随着计算机技术的发展,这些原本繁琐的问题就会变得轻而易举。
安全性方面:
传统的纸质记录方式查询起来很麻烦,而且保密性很差,并且容易磨损丢失,对于金钱的管理是十分不利的。
但是如果采用的是电子文档的方式进行数据得保存,这一切都变得非常便捷。
你可以方便的对数据信息进行备份查询,并且数据的安全性可以得到最大程度的保证。
准确性方面:
传统的人工记账容易出错,如果采用这种方式来处理现在的还有打折信息得消费结算会使得工作量很大,如果计算出错,将严重影响自己的声誉。
而如果使用软件系统,这些问题都将不会出现,计算机的错误率几乎为零。
鉴于以上传统的人工管理方式的种种缺陷,我们设计了方便工厂食堂,学校食堂使用的应用程序,通过它,管理者可以基本解决以上所遇到的种种问题,而且对于金钱的计算有很大的方便。
实验思路:
三、主要功能
刷卡显示卡号及余额,有充值模式和消费模式。
四、设计内容
4.1485总线介绍
4.1.1485总线概述
485(一般称作RS485/EIA-485)是隶属于OSI模型物理层的电气特性规定为2线,半双工,多点通信的标准。
它的电气特性和RS-232大不一样。
用缆线两端的电压差值来表示传递信号。
RS485仅仅规定了接受端和发送端的电气特性。
它没有规定或推荐任何数据协议。
硬件设计在这里使用的串口通讯芯片是常规芯片MXA485,RS485串口通讯电路是一个很成熟的电路,电路大家都熟悉了(参考原理图纸)。
从图中可以看出芯片1#管脚是数据接收端,4#管脚是数据发送端;2#、3#管脚是发送/接收状态转换控制端。
如图
4.1.2RS485的特点包括:
1、接口电平低,不易损坏芯片。
RS485的电气特性:
逻辑“1”以两线间的电压差为+(2~6)V
表示;逻辑“0”以两线间的电压差为-(2~6)V表示。
接口信号电平比RS232降低了,
不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。
2、传输速率高。
10米时,RS485的数据最高传输速率可达35Mbps,在1200m时,传输速度可达100Kbps。
3、抗干扰能力强。
RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
4、传输距离远,支持节点多。
RS485总线最长可以传输1200m以上(速率≤100Kbps)
一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。
4.2食堂刷卡功能模块
4.2.1工作原理
每个食堂有很多台刷卡机,于是食堂需要一台计算机来和这些刷卡机通信,当食堂的工作人员通过数字按键(例如一碗粉5块,当他按下5.00,并按确定后),该扣钱信息便向机房的计算机发送命令。
当你把饭卡放到刷卡机上后(注意:
饭卡离刷卡机3cm内,刷卡机才能感应到),首先读卡器读取卡上的信息(学号、卡号、金额等),再将信息转发到计算机上确定卡的合法性.如果不合法(卡到期、卡挂失、卡禁用)时,会发出嘀嘀嘀滴的报警声;如果卡可以用,则计算机根据这个帐号调出数据库(里面存储着你的使用信息和余额信息等),然后判断你的卡上余额是否足够扣除,如果足够扣除,则再根据刚刚接到的工作人员所发出扣除信号,迅速扣除相应金额(同时发出一声滴的响声),并迅速将你的卡上余额返回刷卡机的显示窗口,同时更新数据库的金额信息,最后退出系统;如果不够扣除,便会发出嘀嘀嘀的连续响声,以警告卡上余额不足。
如果你的卡在刷卡机没有放好,刷卡及没能读出你的卡上信息,便没有相应的扣除你的金额,这时,当你收回卡时,刷卡机也会发出连续的嘀嘀嘀声,警告饭卡没有刷上。
当工作人员没有输入扣钱金额,即刷卡机便没有给计算机发送扣钱的指令信息,这时当学生把卡放在刷卡机上时,刷卡机读取卡号信息并立即传给计算机,然后计算机将该卡的卡上余额信息返送给刷卡机并显示余额
五、实验步骤
5.1485总线核心代码
intmain(void)
{uint8_tRcvCh;
uint8_tTxBuffer[]="神州系列开发板RS485总线收发实验\r\n";
SZ_STM32_LEDInit(LED1);
SZ_STM32_LEDInit(LED2);
SZ_STM32_LEDInit(LED3);
SZ_STM32_LEDInit(LED4);
SZ_STM32_RS485();
RS485_SET_RX_Mode();
SZ_STM32_SysTickInit(1000);
SZ_STM32_COMInit(COM2,9600);
xPxprintf("\n\r---------------------------------------------\n");
xprintf("\n\rSTM32神州系列开发板RS485总线收发实验\n");
xprintf("\n\r—按KEY1按键设置神州开发板设置为RS485发送端\n");
xprintf("\n\r—按KEY2按键设置神州开发板设置为RS485接收端\n");
xprintf("\n\r---------------------------------------------\n");
xprintf("\n\n\r提示:
当前显示的窗口为串口1/COM1/USART1。
\r\n");
xprintf("\n\n\r串口2/COM2/USART2作为RS485,请将J14和J12跳到1<->2侧。
\r\n");
SZ_STM32_KEYInit(KEY1,BUTTON_MODE_GPIO);
SZ_STM32_KEYInit(KEY2,BUTTON_MODE_GPIO);
SZ_STM32_KEYInit(KEY3,BUTTON_MODE_GPIO);
SZ_STM32_KEYInit(KEY4,BUTTON_MODE_GPIO);
while(RS485_Mode==IDLE)
{
RS485_MODE_SET();
}
while
(1)
{
if(RS485_Mode==RX_MODE)//RXģʽ
{
while(USART_GetFlagStatus(SZ_STM32_COM2,USART_FLAG_RXNE)==RESET)
{
}
RcvCh=(int)SZ_STM32_COM2->DR&0xFF;
xprintf("%c",RcvCh);
}
elseif(RS485_Mode==TX_MODE)
{
xprintf("\n\r正在发送数据:
%s",TxBuffer);
printf("%s",TxBuffer);
delay(60000000);
}
else
{
RS485_MODE_SET();
}
}
}voidRS485_SET_RX_Mode(void)
{
RS485OBB=0;
}
voidRS485_SET_TX_Mode(void)
{
RS485OBB=1;
}
voidRS485_MODE_SET(void)
{
uint32_tKeyNum=0;
while(!
(KeyNum=SZ_STM32_KEYScan()))
if(1==KeyNum)
{
RS485_Mode=TX_MODE;
xprintf("\n\rRS485发送模式设置成功");
RS485_SET_TX_Mode();
SZ_STM32_LEDOn(LED1);
SZ_STM32_LEDOff(LED2);
}
elseif(2==KeyNum)
{
RS485_Mode=RX_MODE;
xprintf("\n\rRS485接收模式设置成功");
xprintf("\n\r等待接收数据\n\r");
SZ_STM32_LEDOff(LED1);
SZ_STM32_LEDOn(LED2);
RS485_SET_RX_Mode();
}
else
{
RS485_Mode=IDLE;
SZ_STM32_LEDOff(LED1);
SZ_STM32_LEDOff(LED2);
xprintf("\n\r推出发送接收请重新设置工作模式");
xprintf("\n\rUSER1按键:
设置RS485为接收模式");
xprintf("\n\rUSER2按键:
设置RS485为发送模式");
}
}
*本工程为从机,先给从机上电
intmain(void)
{
uiUSART2_Config();
USART1_Config();nt8_ttemp;
printf("\r\n485实验从机\r\n");
while
(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//进入接收模式
while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!
=SET);
temp=USART_ReceiveData(USART2);
printf("\r\n接收到的数据为%d\r\n",temp);
temp++;//把temp的值加1后再发送给主机
GPIO_SetBits(GPIOB,GPIO_Pin_5);//进入发送模式
USART_SendData(USART2,temp);//发送数据
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!
=SET);printf("\r\n发送数据成功!
\r\n");
}
}
*本工程为主机,实验时先给从机上电
intmain(void)
{
uint8_ttemp=0;
/*USART2config*/
USART2_Config();//串口2用于收发485的数据
USART1_Config();//串口1用于输出调试信息
printf("\r\n485实验主机\r\n");
while
(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);//进入发送模式
USART_SendData(USART2,temp);//发送数据
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!
=SET);
printf("\r\n发送数据成功!
\r\n");//使用串口1打印调试信息到终端
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//进入接收模式
while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!
=SET);
temp=USART_ReceiveData(USART2);
printf("接收到的数据为%d\r\n",temp);
}
}
5.2食堂刷卡模块核心代码
intmain(void)
{
InitRc522();
USART1_Config();
LED_GPIO_Config();
NVIC_Configuration();
LED1(ON);
LED2(ON);
printf("\r\ntheuseris:
ICCard\r\n");
USART_Send8(0x15);
while
(1)
{
find_card();
Card_Write
(2);
}
}
u8ReadData(u8addr,u8*pKey,u8*pSnr,u8*dataout)
{
u8status,k;
status=0x02;//
k=5;
do
{
status=PcdAuthState(PICC_AUTHENT1A,addr,pKey,pSnr);
k--;
//printf("AuthStateiswrong\n");
}while(status!
=MI_OK&&k>0);
status=0x02;//
k=5;
do
{
status=PcdRead(addr,dataout);
k--;
}while(status!
=MI_OK&&k>0);
returnstatus;
}
u8WriteData(u8addr,u8*pKey,u8*pSnr,u8*datain)
{
u8status,k;
status=0x02;//
k=5;
do
{
status=PcdAuthState(PICC_AUTHENT1A,addr,pKey,pSnr);
k--;
}while(status!
=MI_OK&&k>0);
status=0x02;//
k=5;
do
{
status=PcdWrite(addr,datain);
k--;
//printf("ReadDataiswrong\n");
}while(status!
=MI_OK&&k>0);
returnstatus;
voidCard_Write(unsignedcharsum)
{
unsignedcharstatus;
data1[0]=sum;data1[4]=~sum;data1[8]=sum;
status=PcdWrite(1,data1);
if(status==MI_OK)
{
LED1(OFF);
LED2(OFF);
InforStore[6]=CardRead();
printf("余额:
");
printf("%d\r\n",InforStore[6]);
}
}
u8CardRead()
{
unsignedcharstatus;
unsignedcharsum;
status=PcdRead(1,SN);
if(status==MI_OK)
{
sum=SN[0];
}
returnsum;
}
u8find_card()
{
unsignedcharstatus;
u8j;
u8c;
status=PcdRequest(PICC_REQALL,CT);
status=PcdAnticoll(SN);
if(status==MI_OK)
{
LED1(ON);
LED2(OFF);
printf("\r\nTheCardIDis:
\r\n");
for(j=0;j<4;j++)
{
c=SN[j];
printf("%d\t",c);
}
}
}
5.3设计结果截图
六、心得体会
通过此次课程设计,使我更加扎实的掌握了有关485总线方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。
同时,设计让我感触很深。
使我对抽象的理论有了具体的认识。
通过这次课程设计,我掌握了刷卡系统的识别和测试,通过查询资料,也了解了刷卡原理。
我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在实验课上,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
这对于我们的将来也有很大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。
实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。
果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
七、参考文献
《STM32F103开发手册》