摘 要
物资管理筹措计划,原料均衡,库存和进货等活动对大量资料和信息业务的准确性,及时性和质量要求相当高的,任何信息的漏掉,错误或失误会影响到企业,采用了纯人工的方法管理是有一定难度的。随着电子商务的发展,仓储规模不断扩大,货量和信息量成倍增长,大型仓储关系系统功能强大而复杂的操作降低了仓储的工作效率,几十年前的手工操作方式落后于近代企业的发展,因此本项目意在解决仓库管理给手工操作带来的烦恼,具有一定的实用价值。
本设计主要是采用51单片机作为核心处理器,射频识别模块对卡片进行识别信息,识别信息之后通过LCD16824液晶屏显示检测出来货物的信息,并在屏幕下方显示出具体的信息,通过语音提示模块提示出货物刷卡的信息,在C环境下进行程序编写,通过曼彻斯特解码方法构成的软件系统不但移植性强和系统升级简单,而且读卡稳定成功率高,最终完成了仓库管理系统的基础功能,使仓库管理控制系统的研发具有重大的意义。
结果表明,以单片机为基础的仓储管理系统是可行的,整个系统是良好的稳定性的。其特点是节省人力和时间,更加方便,成本低廉。
关键词:仓库管理;射频识别;单片机
1 系统总体方案设计
本节主要是针对系统的总方案进行相应的设计,在控制系统方面进行合理的选择,根据设计的功能和不同方案的优缺点来进行方案论证,确定设计的整体框架。
1.1 主要研究内容
系统开发的主要目的是运用该系统自动规范的管理仓库。实现货品出入统计,停车场进出门,IC卡注册删除,查询出入库时间,12864作为终端显示,上位机远程控制,数据存储等功能。
1.2 设计总方案比较
根据检测物体的要求,系统既能做到精确识别出货物,又能够具有将测得的数据准确显示出来的功能,本文提出两种设计方案。
方案一:采用CPLD控制器。其可进行逻辑编程,具有大型化,高密度,小尺寸,丰富的I/O资源,扩展性强等[2]优点。以并行的输入输出,提高了系统的处理速度,适用于大规模的核心控制。然而,本系统只需要简单的功能,对于速度没有特殊需求。综合众多因素进行考虑,最终放弃了此方案。
方案二:采用单片机+RFID。这种设计是利用单片机控制芯片的寄存器,以达到控制读卡器芯片的目的。单片机发送的命令经过芯片读卡器,其接收到信号后,按照非接触式射频卡协议格式,通过天线和匹配电路发出的调制的信号来寻卡,如果这是一个卡范围,利用谐振电路产生的共振,结合电压泵的作用为卡片电容充电,以得到更多的能量,当达到一定电压值时,能够充当电源的作用,能够提供电压,以确保卡片的其他电路正常工作。可以理解为“阅读器”和“标签”的通讯过程[3],“阅读器”有读卡功能相当于是读卡器,“标签”就是卡。
对上述方案进行比较,方案一逻辑功能太复杂,在实际应用中较为不便,使用成本较高,操作较复杂。方案二性价比较高,传播快且距离远,检测精度更高,有利于检测货物出入库,符合本项目要求。综上所述,本设计采用方案二,采用RFID模块作为识别检测模块最合适。
1.3 系统最终总体设计方案
本设计确定最终的方案,最终选用STC89C51单片机为控制器,单片机通过控制芯片的寄存器,以达到控制读卡器芯片的目的,单片机发送的命令经过芯片读卡器,其接收到信号后,按照非接触式射频卡协议格式,通过天线和匹配电路发出的调制的信号来寻卡,如果这是一个卡范围,利用谐振电路产生的共振,结合电压泵的作用为卡片电容充电,以得到更多的能量,当达到一定电压值时,能够充当电源的作用,能够提供电压,以确保卡片的其他电路正常工作。检测出被测货物出入库具体数值在LCD12864液晶显示屏显示出来,并将识别出的货物进出门的信息在显示屏最下方显示,最终通过蜂鸣器模块播报出来。
此设计的方案框图如图1.1所示。
图1.1系统整体原理图
2 系统硬件设计
此章节主要是对系统详细的硬件设计所需的单片机型号,射频识别模块,蜂鸣器等模块的具体型号进行对比和讨论,根据设计功能要求,运行的工作环境等条件下选出一个最能符合本设计的器件型号。
2.1 系统单片机的选型及设计
2.1.1 单片机的选择方案
本次系统设计的核心是由单片机作为主要控制模块进行控制的,在全部系统当中起着统一全面策划的作用。本设计需要3k的程序存储容量,工作电压选用5V。由于有许多类型的单片机型号,因此选择单片机芯片是本设计中最重要的问题之一,本小节通过对比两种单片机的运行速度,程序存储和功能等性能参数几个方面来选择一个适合本设计的单片机型号。
方案一:采用STC89C51单片机。STC89C51的参数如下,工作电压:4V5.5V。工作温度范围:0℃75℃/-40℃~+85℃。数据存储方面最大可存256字节 RAM的数据信息,程序存储方面可容4KB ROM的应用程序代码。工作频率能够控制高频率电路,可达到80MHz,其单片机含有4K的储存程序,可以经过1000遍的反复擦写,在兼容的问题上以:MCS-51为基础,80C51型的指令系统以及单片机的型号,内部集成MAX810专门使用的复位电路,并且价格比较便宜。
方案二:选用AVR型单片机作为核心处理器,AVR型单片机设备可以满足RISC打包指令的集成功能,其数据处理效率更高,是一款数据处理能力极高的内嵌型flash单片机设备[5],目前已经普遍应用在计算核心控制领域及工业仪表生产领域,但是,该软件和系统的缺陷也较为明显,软件设计难度较高,且单片机价格昂贵,可参照和复制的材料不多,入门难度较大。
为了使系统的控制方法相对简单、可靠性高和价格较低,各部分功能也可以实现,已经可以满足此次设计的需求,也可适用于设计的控制电路。因此本系统选用STC89C51型单片机作为核心芯片。
2.1.2 STC89C51单片机概述
STC89C51单片机体积小,具有功耗低,高性能的优点,单片机内的存储器内存为4kb字节。此型号单片机采用STC公司的密度大、存储久的技术研发而来。它与STC89C51引脚结构相一致。相对来说,其性价比高,在嵌入式应用中能发挥较大的功能。 STC89C51具体描述:字节选择为:256RAM,32位I/O端口线,以及看门狗的定时器,3个16位定时器/计数器,一个6级中断结构载体,串行口采用全双工口,片内晶振及时钟电路[6]。STC89C51型单片机共由40个引脚,其中有32个I/O端口: P0口(39-32引脚),P1口(1-8引脚),P2口(21-28引脚),P3口(10-17引脚),另外,第9引脚为复位,第18和19引脚为外部晶振输入口,第20和40引脚分别为GND和VCC,第29、30和31引脚与外部存储器有着一定的关联。
STC89C51单片机的基本机构框图如图2.2所示。
图2.2 STC89C51单片机基本机构框图
2.1.3 单片机最小系统
单片机最小的应用系统由电源电路、时钟电路、复位电路构成。这三个要素就可以组成一个最小的单片机应用系统,能够处理一些简单的工作。系统构成如图2.3所示。
图2.3单片机最小系统图
2.7 硬件总体结构分析
最终此设计的单片机型号选择了STC89C51单片机,此单片机操作易上手,可适用于本设计的功能需求。主要是以STC89C51单片机最小系统作为主控平台,最终采用以单片机为核心,采用RFID模块为识别模块,将被测物体放在传感器上面,检测出被测货物出入库具体数值在显示屏显示出来,并将识别出的货物进出门的信息在LCD12864显示屏最下方显示出来,最终通过蜂鸣器模块播报出来。硬件总体结构图如图2.12所示。
图 2.12 硬件总体结构图
3系统软件设计
3.1 系统主程序流程设计
在软件设计方面利用Keil4,使用C语言完成程序代码设计。作为国外开发的编程软件,Keil4可以实现单片机 C 语言的有效兼容,使用语言较为广泛,在软件编程时,可按照自身需求确定编程语言,它的功能具有极强的可扩展性,可以进行下载、编译或者编程[17]等操作,系统总流程图如图3.1所示。
图3.1 系统的主流程图
系统电路总图
## 源程序
#include “include.h”
#include “12864LCD.H”
#include “stdio.h”
#include “string.h”
#define uchar unsigned char
#define uint unsigned int
unsigned int Keyfgin=0;
unsigned int Keyfgout =0;
INT8U CardRevBuf[16] = { 0 };
int Carnum=4;
uchar code tab1[]={
" 欢迎使用 "
"物料管理系统 "
" "
" "
};
uchar code tab2[]={
" 欢迎使用 "
"请先操作按键 "
" "
" "
};
uchar code tab4[]={
" 欢迎使用 "
"不能识别此卡 "
" "
" "
};
sbit ALAM = P0^3; // 报警
sbit keyin =P0^5; //工序1
sbit keyout =P0^6; //工序2
void delay_500us(void)
{
unsigned char a,b;
for(b=71;b>0;b–)
for(a=2;a>0;a–);
}
void DelayM(unsigned int a)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}
//=5ms延时==========
void Delay5ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc–);
}
//=一声提示音,表示有效输入==
void OneAlam(void)
{
ALAM=0;
Delay5ms();
Delay5ms();
ALAM=1;
}
//二声提示音,表示操作成功
void TwoAlam(void)
{
ALAM=0;
Delay5ms();
ALAM=1;
Delay5ms();
ALAM=0;
Delay5ms();
ALAM=1;
}
//===刷卡失敗=
void LongAlam(void)
{
ALAM=0;
Delay5ms();
Delay5ms();
Delay5ms();
Delay5ms();
ALAM =1;
}
void init_port( void )
{
}
void init_all(void)
{
EA = 0;
init_port();
init_rc522();
init_uart();
Keyfgin = 0;
Keyfgout = 0;
EA = 1;
}
//=400ms延时============
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA–)
{
TempCycB=7269;
while(TempCycB–);
}
}
void display_id( INT8U * SrcBuf )
{
char DisplayBuf[10];
char sedbuf[16];
char *pDisplayChar;
INT8U Tmp, i ,j;
pDisplayChar = DisplayBuf;
for( i = 0; i < 4; i++ )
{
Tmp = ( ( *SrcBuf ) >> 4 ) & 0x0F;
if( ( Tmp >=0 ) && ( Tmp <= 9 ) )
{
*pDisplayChar ++ = '0' + Tmp;
}
else
{
*pDisplayChar ++ = 'A' + Tmp - 10;
}
Tmp = ( *SrcBuf ) & 0x0F;
if( ( Tmp >=0 ) && ( Tmp <= 9 ) )
{
*pDisplayChar ++ = '0' + Tmp;
}
else
{
*pDisplayChar ++ = 'A' + Tmp - 10;
}
SrcBuf ++;
}
*pDisplayChar ++ = '\0';
if(Keyfgin ==1)
{
Keyfgin=0;
LCM_clr();
memset(sedbuf,0,16);
sprintf(sedbuf,"%s#%s#","1",DisplayBuf);
send_bytes(sedbuf,16);
memset(sedbuf,0,16);
LCM_clr();
LCM_WriteDatOrCom(0,0x80);
LCM_WriteString("卡号:");
LCM_WriteDatOrCom(0,0x90);
LCM_WriteString(DisplayBuf);
LCM_WriteDatOrCom(0,0x88);
LCM_WriteString("工序操作1");
DelayM(1000);
LCM_clr(); //清屏
chn_disp(tab1);
}
else if(Keyfgout ==1)
{ Keyfgout =0;
LCM_clr();
memset(sedbuf,0,16);
sprintf(sedbuf,"%s#%s#","2",DisplayBuf);
send_bytes(sedbuf,16);
memset(sedbuf,0,16);
LCM_clr();
LCM_WriteDatOrCom(0,0x80);
LCM_WriteString("卡号:");
LCM_WriteDatOrCom(0,0x90);
LCM_WriteString(DisplayBuf);
LCM_WriteDatOrCom(0,0x88);
LCM_WriteString("工序操作2");
DelayM(1000);
LCM_clr(); //清屏
chn_disp(tab1);
}
else
{
LCM_clr();
memset(sedbuf,0,16);
sprintf(sedbuf,"%s#%s#","0",DisplayBuf);
send_bytes(sedbuf,16);
memset(sedbuf,0,16);
LCM_clr();
LCM_WriteDatOrCom(0,0x80);
LCM_WriteString("卡号:");
LCM_WriteDatOrCom(0,0x90);
LCM_WriteString(DisplayBuf);
LCM_WriteDatOrCom(0,0x88);
LCM_WriteString("");
DelayM(1000);
LCM_clr(); //清屏
chn_disp(tab1);
}
}
void ctrl( void )
{
if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
{
if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
{
// display_no_id();
return;
}
}
if( PcdAnticoll( &CardRevBuf[2] ) != MI_OK ) //防冲撞,返回卡的序列号 4字节
{
// display_no_id();
return;
}
if( PcdSelect( &CardRevBuf[2] ) != MI_OK )//选卡
{
// display_no_id();
return;
}
OneAlam();
display_id( &CardRevBuf[2] );
}
void KeyScan()
{
if (keyin == 0 )
{
DelayM(20);
if(keyin == 0 )
{
OneAlam();
Keyfgin=1;
LCM_clr();
LCM_WriteDatOrCom(0,0x81);
LCM_WriteString(“工序1”);
}
while(keyin == 0); //等待键松开
}
if (keyout == 0 )
{
DelayM(20);
if(keyout == 0 )
{
OneAlam();
Keyfgout =1;
LCM_clr();
LCM_WriteDatOrCom(0,0x81);
LCM_WriteString(“工序2”);
}
while(keyout == 0); //等待键松开
}
}
void main(void)
{
int k =0;
TMOD=0x20;
EA=1;
init_all();
LCM_init(); //初始化液晶显示器
LCM_clr(); //清屏
chn_disp(tab1); //显示欢迎字
DelayM(3000); //显示等留3秒
while(1)
{
ctrl();
KeyScan();
}
}
## 结 论
仓库管理的便捷化不能离开仓库管理控制系统的使用,因此仓库管理控制系统的研发具有十分重大的意义。本文对单片机为核心利用射频识别被测货物的刷卡卡号信息进行显示与语音提示的实现做了仔细的讨论,现将本文的主要论述内容总结如下:
(1)就本设计需要实现的各种功能需求,对系统进行总方案设计,选择设计的核心控制系统,进行方案论证,确定设计的整体框架
(2)就本设计给单片机,RFID识别模块,显示模块等元器件模块进行方案对比论证,以及对各个模块进行电路设计分析。
(3)对系统的软件方面进行设计。
(4)对系统进行实验调试,验证了论文中功能的完整性和数据准确性。
此设计的单片机型号最终选择了STC89C51单片机,此单片机操作易上手,可适用于本设计的功能需求。主要是以STC89C51单片机最小系统作为主控平台,最终采用以单片机为核心,采用RFID模块为识别模块,将被测物体放在传感器上面,检测出被测货物出入库具体数值在LCD12864液晶显示屏显示出来,并将识别出的货物进出门的信息在显示屏最下方显示,最终通过蜂鸣器模块播报出来,并详细说明了需求分析、概念设计和结构设计。
综上所述,本设计是一款51基于单片机的仓库管理系统,经过适当的改善之后,可以适用于小型仓库的实际管理问题,具有一定的可利用性,此设计大大提高了系统对货物出入库的辨识精度,节约了时间和人力,具有成本低,精度高等特点。可以广泛应用于各种对需要大量货物信息进行测量、分析和识别的行业。在设计完成之后,经过多次的实验发现有很多不足之处,希望在日后学习实践中可以弥补这部分空缺。也知道了动手实践才能理解本设计中的原理,制作完成本设计,了解了单片机以及每个模块的原理,在制作过程中我也遇到了很多解决不了的困难,我自行去查阅相关的资料、书籍来解决,如果实在解决不了的再去虚心请教老师和同学。