注意:获取全套设计,请见文末说明…

概述
本文设计了一款以AT89C51单片机为核心的自动售货机系统,并且着重详细地介绍了自动售货机的整体系统设计方案、硬件选择基础、软件使用方法及技巧。以AT89C51作为CPU处理单元连接各个功能模块;以4×4矩阵键盘作为输入控制模块对货物进行种类和数量的选择以及模拟货币的投入功能;以LCD1602液晶作为显示模块来显示当前的购物状态以及货币状态;以LED的显示来表示当前选择货物以及出货的状态。

自动售货机原理
在初始化的界面等待顾客按键选择货物的种类和数量顾客投入货币,按下确定购买键后等待售货机自动计算所购商品的总价,然后提示顾客投入货币。所投的货币经过外部硬件检测传感器检测真假后累加计数。若顾客确认购买系统则跳转到下一步骤,反之取消购买即退出货币返回到主界面,等待顾客下一步操作。自动售货机通过货币的总价与和所购商品的总价的差值来进行出货找零。

自动售货机的控制子系统由以下几个部分组成,分别是预设自动售货系统、金额累加和找零系统、售完检测系统、售出累计及反馈功能系统。(各子系统详细介绍,请见论文)

自动售货机功能概述
系统通过矩阵键盘来选择货物的种类与数量过后自动售货机提示投币。自动售货机的货币识别器对所投货币进行识别,根据金额大小然后将商品选择权通过LCD液晶显示给客户,客户按键选择后,CPU控制芯片发出指令将所选择商品从储备料道中送达取物口。

货物种类一共设有8种,这8种商品通过选择按键进行选择确认,通过数量选择按键确定购买数量,价格规定为1-8元不等;货币识别器能够识别1元硬币、1元纸币、5元纸币、10元纸币、20元纸币50元纸币以及100元纸币。在规定的时间内,投了几次货币后,货币能够实现自动累加功能,这样设计会把投入的所有货币总额数目数据传递到中央控制元器件进行处理;在超过规定时间后投币口自动关闭,数据处理单元按照投币总数和购买的数量和价格乘积来进行加减运算,实现购买和找币功能。当投入的货币总值小于商品总金额时,则不能进行购货,投入的钱将全部退还。

本设计中有一共有16个按键选择,其中有两个是货物选择键,有两个是数量选择键,此外还有6个货币投入键1个确认键和1个取消键。

系统仿真电路图


原理图

仿真结果分析
(1)加载Sale.hex文件到AT89C51单片机,点击运行,自动售货机系统进入初始化等待状态,LCD显示“Welcome Sale”,同时等待按键输入。

(2)通过按键“价格+”和“价格-”来选择货物的种类,然后通过“数量+”和“数量-”来选择所购买货物的数量,同时代表被选择货物的LED指示灯亮。


(3)当选择好货物后,按下“确认OK”键进入到投币系统,此时机器会自动计算出所购货物总金额。

(4)当机器计算出总价等待顾客投入货币并按下“确认OK”键后,当投入货币货币值大于或等于总价时就出货并找零,若投入货币货币值小于总价则不能出货只能按下“取消NO”退出所投货币或继续增加投币。


(5)当完成以上步骤后则完成一次自动购物过程,机器自动复位回到初始化界面,同时在操作过程中的任一环节,都可通过按下“取消NO”键,是售货机系统复位到初始状态。

部分C代码


```c
#include<reg51.h>
#define WAIT_SALE        0
#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 charunsigned 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[]=" Welcome 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[] = "Get 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;void lcd_1602_delay(uint z)          //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_1602_write_com(uchar com)   //写命令
{
rs=0;
rw=0;
P2=com;
lcd_1602_delay(5);
lcd_en=1;
lcd_1602_delay(5);
lcd_en=0;
}void lcd_1602_write_data(uchar date) //写数据
{
rs=1;
rw=0;
P2=date;
lcd_1602_delay(5);
lcd_en=1;
lcd_1602_delay(5);
lcd_en=0;
}void lcd_1602_init()               //LCD1602初始化函数
{
lcd_en=0;
lcd_1602_write_com(0x38);
lcd_1602_write_com(0x06);
lcd_1602_write_com(0x01);
}void lcd_1602_wait_sure()         //显示'OK'&'NO'界面
{
lcd_1602_write_com(0x80+0x40);
lcd_1602_write_data('O');
lcd_1602_write_data('K');lcd_1602_write_com(0x80+0x4e);
lcd_1602_write_data('N');
lcd_1602_write_data('O');
}void lcd_1602_show_num(uint num)       // 1602显示数字的函数
{
IF(num <= 9) {lcd_1602_write_data('0'+num);lcd_1602_write_data(' ');}else if(num >= 10 ) {lcd_1602_write_data('0'+num/10);lcd_1602_write_data('0'+num%10);}
}void lcd1602_info_display(uint choose, uint num_type, uint num_count)
{
int num;
lcd_1602_write_com(0x01);
switch(choose) {
case WAIT_SALE:
lcd_1602_write_com(0x80+0x01);       //
for(num = 0; num < 13; num++)
{
lcd_1602_write_data(wait_sale[num]);
}
break;
case NO_WATER:
lcd_1602_write_com(0x80+0x03);
for(num = 0; num < 9; num++){lcd_1602_write_data(no_water[num]);        }
break;
case SALING:
lcd_1602_write_com(0x80+0x00);
for(num = 0; num < 6; num++) {lcd_1602_write_data(price[num]);}
lcd_1602_write_data('0'+(num_type+1));
lcd_1602_write_data(' ');
lcd_1602_write_data(' ');
for(num = 0; num < 4; num++) {lcd_1602_write_data(number[num]);}
lcd_1602_show_num(num_count);
break;
case INPUT_MONEY:
lcd_1602_write_com(0x80+0x00);
for(num = 0; num < 4; num++) {lcd_1602_write_data(sum[num]);}
lcd_1602_show_num(num_type);
lcd_1602_write_data(' ');
lcd_1602_write_data(' ');
for(num = 0; num < 6; num++) {lcd_1602_write_data(input[num]);}
lcd_1602_show_num(num_count);
break;
case CHANGE:
if(!num_count) {//put waterlcd_1602_write_com(0x80+0x02);for(num = 0; num < 13; num++){
lcd_1602_write_data(put_water[num]);}}
else
{
lcd_1602_write_com(0x80+0x02);              //取消选择时写命令退币
for(num = 0; num < 9; num++) {lcd_1602_write_data(cancle[num]);}
}
for(num = 0; num < 7; num++){lcd_1602_write_data(change[num]);}
lcd_1602_show_num(num_type);
break;
default:
break;
}
lcd_1602_write_com(0x0c);
}
void lcd_1602_saling(uint type, uint num)
{lcd1602_info_display(SALING, type, num);lcd_1602_wait_sure();
}void lcd_1602_inputing(uint need, uint input)
{lcd1602_info_display(INPUT_MONEY, need, input);lcd_1602_wait_sure();
}

资源分享内容有:
(1)【完整终版毕业论文】基于AT89C51单片机的自动售货机系统设计.doc
(2)Proteus仿真;
(3)Keil C程序;
(4)参考资料;
(5)Visio流程图文件;
(6)原理图文件;

资源截图:




资源获取方法
资源获取方法
资源获取方法
重要的事情说三遍!!!!!!!!!!!
由于本设计为作者原创设计,
获取以上所有资源内容,请微信搜索关注公众号:交院小智

基于AT89C51单片机的自动售货机系统设计(附仿真+C程序+原理图+论文等)相关推荐

  1. 基于51单片机的自动售货机系统设计

    目录 一.自动售货机的控制子系统概述 二.自动售货机的功能简介 1 自动售货机的功能概述 2 自动售货机的设计思路 三.自动售货机的硬件设计 1. 80C51的简介 (1) 80C51的基本概述 (2 ...

  2. 自动售货机 顺序图_基于UML的饮料自动售货机系统设计

    基于 UML 的饮料自动售货机系统设计 1 . 问题描述 1.1 关于自动售货机 自动售货机像磁卡电话.银行柜员机一样,以方便.新颖.文明.昼夜服务等特点, 成为发达国 家不可缺少的便民配套设施.如今 ...

  3. 基于51单片机的自动售货机Proteus仿真(源码+仿真+设计报告)

    资料编号:137 视频讲解: 137-基于51单片机的自动售货机Proteus仿真(源码+仿真+设计报告) 功能介绍: 基本原理:通过矩阵键盘来选择货物的种类与数量过后自动售货机提示投币.自动售货机的 ...

  4. 基于51单片机的自动售货机Proteus仿真

    资料编号:137   下面是相关功能视频演示: 137-基于51单片机的自动售货机Proteus仿真(源码+仿真+设计报告) 功能介绍: 基本原理:通过矩阵键盘来选择货物的种类与数量过后自动售货机提示 ...

  5. verilog 自动售货机状态机实现_Verilog HDL自动售货机系统设计与仿真实验报告

    前言 随着电子技术和计算机技术的飞速发展,电子线路的设计工作也日益显得重要.经过人工设计.制作实验板.调试再修改的多次循环才定型的传统产品设计方法必然被计算机辅助设计所取代,因为这种费时费力又费资源的 ...

  6. 基于51单片机的自动售货机proteus仿真程序原理图设计数码管液晶LCD1602显示

    硬件设计 (末尾附文件) 方案1: 仿真图 方案2 仿真图: #include<reg51.h>/*******************define******************** ...

  7. 单片机毕设 自动售货机设计与实现(源码+硬件+论文)

    文章目录 0 前言 1 主要功能 2 硬件设计(原理图) 3 核心软件设计 4 实现效果 5 最后 0 前言

  8. 毕业设计 单片机的自动售货机设计与实现(源码+硬件+论文)

    文章目录 0 前言 1 主要功能 2 硬件设计(原理图) 3 核心软件设计 4 实现效果 5 最后 0 前言

  9. 自动售货机 顺序图_UML饮料自动售货机系统设计.doc

    UML饮料自动售货机系统设计 基于UML的饮料自动售货机系统设计 问题描述 1.1 关于自动售货机 自动售货机像磁卡电话.银行柜员机一样,以方便.新颖.文明.昼夜服务等特点,成为发达国家不可缺少的便民 ...

最新文章

  1. JS Array.reduce 对象属性累加
  2. Squid代理服务器(二)
  3. CentOS 7 学习(一) 配置LAMP和Nginx
  4. 《Fabric 云存储的电子健康病历系统》(2)病历结构体 Records
  5. intellij idea 部署项目的时候 图中application context 写不写有什么关系?有什么作用?...
  6. 设置SSH通过密钥登录
  7. 300字简单区分线程问题
  8. 【HDU5008】Boring String Problem(后缀数组+二分查找+st表)
  9. DSP2812之定时器0
  10. python离线安装selenium_python34怎么离线安装selenium
  11. ROS使用yocs_smoother_velocity做速度平滑处理
  12. PHP开发微信小程序的经验总结
  13. 网易严选如何打造数仓规范和评价体系
  14. 滴滴单通道语音分离与目标说话人提取和抑制技术进展
  15. jquery中的循环技巧
  16. 五款手机APP黑科技,好用到爆炸
  17. mac启动terminal终端快捷键
  18. 密码学-计算机与网络空间安全概论
  19. 《那些年啊,那些事——一个程序员的奋斗史》——103
  20. 搜狗浏览器自动保存密码的技巧

热门文章

  1. 移动开发技术新趋向(二)
  2. 如何把自己写的网页挂在Github上面(完整教程)
  3. 大数据 -- java基础8 接口特点和用法
  4. 【深度学习:21 天实战 Caffe】课后习题参考答案
  5. 计算机主板按cpu接口类型分为哪些?,怎么知道主板支持什么CPU?主板和cpu兼容搭配知识介绍...
  6. 4.GitHub译文之社区
  7. ABP官方文档(三)【模块系统】
  8. 靠钓鱼7天涨粉200万,他说他只做了一件事 | 新抖专访
  9. 基于 GoogleMap 离线 API 源码在内网中加载卫星地图的方法
  10. HTML、JS的压缩