摘要
随着物联网技术的快速发展,无人货架系统因其便捷性和智能化特点逐渐受到广泛关注。传统的货架管理需要人工巡检,效率低下且成本高昂,而基于单片机的无人货架系统则能有效解决这些问题。单片机以其体积小、功耗低、集成度高等优点,成为构建无人货架系统的理想选择。因此,研究和设计基于单片机的无人货架系统具有重要的现实意义和应用价值。
本文主要研究了基于单片机的无人货架系统的设计与实现。首先,对无人货架系统的整体架构进行了设计,包括货架结构、传感器模块、单片机控制模块等关键部分。其次,详细阐述了单片机在系统中的应用,包括数据采集、处理以及控制指令的发送等。最后,通过实验仿真了系统的可行性和有效性,结果表明,基于单片机的无人货架系统能够显著提高货架管理的效率和准确性,降低人力成本,具有一定的市场推广前景。
关键词:单片机;自动售卖;无人货架;智慧货架
目录
1 绪论 1
1.1 研究背景和意义 1
1.2 国内外研究现状 1
1.3 本文主要研究内容 2
2 总体方案设计 4
2.1 功能需求分析 4
2.2 外观结构设计 4
2.3 控制器选型 5
2.4 液晶显示模块 6
2.5 继电器模块 7
2.5 系统结构设计 7
3 硬件电路设计 9
3.1 单片机最小系统 9
3.1.1 时钟电路 9
3.1.2 复位电路 10
3.1.3 中断系统 10
3.2 LCD显示电路设计 11
3.2.1 LCD1602的概述 11
3.2.2 LCD1602的硬件结构 11
3.2.3 LCD1602的指令说明 12
3.3 货币识别系统 13
3.3.1对硬币的识别 13
3.3.2对纸币的识别 14
3.4 移动支付系统 14
3.5 按键模块 15
4 系统软件设计 17
4.1 设计软件简介 17
4.2 货物选择程序设计 17
4.3 支付系统设计 18
4.4 找零出货系统设计 19
5 系统仿真测试 20
5.1 Proteus介绍 20
5.2系统仿真测试过程 20
5.3系统仿真测试结果 22
结论 23
参考文献 24
说明书

Proteus仿真

部分单片机程序
#include<reg51.h>
/*******************define*************************/
#define WAIT_SALE 0 //定义1602显示状态
#define NO_WATER 1
#define INPUT_MONEY 2
#define SALING 3
#define CHANGE 4
#define CANCLE 5
#define NO_DATA 0
#define water_change(x, y) ((x) & (~(0x01 << y))) //宏 控制水种类的切换
#define uint unsigned int
#define uchar unsigned char
unsigned char water_total[] = {10, 10, 10, 10, 10, 10, 10, 10};
unsigned char water_price[] = {1, 2, 3, 4, 5, 6, 7, 8};
uchar code wait_sale[]="for sale"; //定义所显示的内容
uchar code no_water[] = "no water!";
uchar code price[] = "price:";
uchar code number[] = "num:";
uchar code sum[] = "SUM:";
uchar code input[] = "INPUT:";
uchar code change[] = "change:";
uchar code put_water[] = "put water...";
uchar code cancle[] = "cancle...";
unsigned char e=0x00;
sbit P2_0=P2^0; //定义接端口
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit lcd_en=P3^4;
sbit rs=P3^2;
sbit rw = P3^3;case(0x03):
if(water_is_choose == 1)
{
water_count--;
if(water_count < 0)
{
water_count = 0;
}
}
break;
case(0x0e): // 返回
goto again;
break;
case(0x0f): // 确认
if(water_is_choose == 1)
{
ok=1;
}
break;
default:
break;
}
lcd_1602_saling(water_type, water_count);
}
}
//choose ok: calculate the money //计算钱的总数
need_money = water_count * water_price[water_type];
lcd_1602_inputing(need_money, money);
ok = 0;
while(!ok) //get money
{
flag=key();
if(flag)
{
switch(e)
{
case(0x04):
money=money+1;
break;
case(0x05):
money=money+5;
break;
case(0x06):
money=money+10;
break;
case(0x07):
money=money+20;
break;
case(0x08):
money=money+50;
break;
case(0x09):
money=money+100;
break;
case(0x0e): //back lcd1602_info_display(CHANGE, money, CANCLE);
P0 = 0xff;
delay1(50000);
goto again;
break;
default:
break;
}
//show money
lcd_1602_inputing(need_money, money); //投币系统
if(money >= need_money)
{
ok=0; //break and show back money
//show back money
lcd1602_info_display(CHANGE, money-need_money, NO_DATA);
out_water();
goto again;
}
}
}
}
文件列表
