来源:优游网责编:网络时间:2024-06-05 01:59:59
注意:获取全套设计,请见文末说明…
概述
本文设计了一款以单片机为核心的自动售货机系统,并且着重详细地介绍了自动售货机的整体系统设计方案、硬件选择基础、软件使用方法及技巧。以作为CPU处理单元连接各个功能模块;以4×4矩阵键盘作为输入控制模块对货物进行种类和数量的选择以及模拟货币的投入功能;以液晶作为显示模块来显示当前的购物状态以及货币状态;以LED的显示来表示当前选择货物以及出货的状态。
自动售货机原理
在初始化的界面等待顾客按键选择货物的种类和数量顾客投入货币,按下确定购买键后等待售货机自动计算所购商品的总价,然后提示顾客投入货币。所投的货币经过外部硬件检测传感器检测真假后累加计数。若顾客确认购买系统则跳转到下一步骤,反之取消购买即退出货币返回到主界面,等待顾客下一步操作。自动售货机通过货币的总价与和所购商品的总价的差值来进行出货找零。
自动售货机的控制子系统由以下几个部分组成,分别是预设自动售货系统、金额累加和找零系统、售完检测系统、售出累计及反馈功能系统。(各子系统详细介绍,请见论文)
自动售货机功能概述
系统通过矩阵键盘来选择货物的种类与数量过后自动售货机提示投币。自动售货机的货币识别器对所投货币进行识别,根据金额大小然后将商品选择权通过LCD液晶显示给客户,客户按键选择后,CPU控制芯片发出指令将所选择商品从储备料道中送达取物口。
货物种类一共设有8种,这8种商品通过选择按键进行选择确认,通过数量选择按键确定购买数量,价格规定为1-8元不等;货币识别器能够识别1元硬币、1元纸币、5元纸币、10元纸币、20元纸币50元纸币以及100元纸币。在规定的时间内,投了几次货币后,货币能够实现自动累加功能,这样设计会把投入的所有货币总额数目数据传递到中央控制元器件进行处理;在超过规定时间后投币口自动关闭,数据处理单元按照投币总数和购买的数量和价格乘积来进行加减运算,实现购买和找币功能。当投入的货币总值小于商品总金额时,则不能进行购货,投入的钱将全部退还。
本设计中有一共有16个按键选择,其中有两个是货物选择键,有两个是数量选择键,此外还有6个货币投入键1个确认键和1个取消键。
系统仿真电路图
原理图
仿真结果分析
(1)加载Sale.hex文件到单片机,点击运行,自动售货机系统进入初始化等待状态,LCD显示“ Sale”,同时等待按键输入。
(2)通过按键“价格+”和“价格-”来选择货物的种类,然后通过“数量+”和“数量-”来选择所购买货物的数量,同时代表被选择货物的LED指示灯亮。
(3)当选择好货物后蓝色自动售货机,按下“确认OK”键进入到投币系统,此时机器会自动计算出所购货物总金额。
(4)当机器计算出总价等待顾客投入货币并按下“确认OK”键后,当投入货币货币值大于或等于总价时就出货并找零,若投入货币货币值小于总价则不能出货只能按下“取消NO”退出所投货币或继续增加投币。
(5)当完成以上步骤后则完成一次自动购物过程,机器自动复位回到初始化界面,同时在操作过程中的任一环节,都可通过按下“取消NO”键,是售货机系统复位到初始状态。
部分C代码
```c
#include
#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 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[]=" 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);
}
}
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 water
lcd_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();
}
拳击游戏还是有很多的玩家都是非常的喜欢尝试的,很是刺激,并且也是能够发泄心中的不快吧,现在市面上是有很多的类型的拳击的游戏,这些游戏一般都是一些格斗的游戏,其实是非常的有趣,也是相当的刺激的,游戏中是有一些不同的场景都是能够去进行体验的,我们也是能够去刺激的进行对战的,小编现在就是收集了一些有意思的拳击游戏,相信你们一定会喜欢的。
趣味烧脑游戏一般比较适合人们在无聊的时候打发时间,同时其操作以及游戏规则上都比较简单,让大家不会有上手很难的感受,可以轻轻松松就体验这个游戏的独特乐趣,并且随时下线都不用担心坑队友,同时也可以和好友一起来玩法,有多种挑战模式,可以根据自己的真实水平以及喜好来选择不同的挑战模式参与,收获到不一样的游戏趣味体验!
太空冒险类游戏顾名思义就是以外太空为背景打造的一类游戏,玩家在这种类型的游戏当中可以体验到非常独特有意思的太空冒险旅程,玩法内容的设计上充满了想象力,所有的场景都是人们在日常生活中从来没有见过的,而你可以驾驶各种各样的战舰展开无比激烈的星际对决,同时可以邀请身边的朋友一起参与到冒险当中,竞技对决的过程中十分注重
这里面为大家收集了一系列比较好玩的女生游戏,并且将会不断的更新,每个玩家都可以根据自己的喜好来选择适合自己的游戏打发时间,每款游戏都设置了新手教程,这样方便大家更加轻松的上手,不同类型的游戏可以让你领略到不一样的游戏乐趣,并且在这里随时都可以尝试其他的玩法,让你一次性就可以玩个够,同时还可以将这里的游戏乐趣分享
星界财团声望攻略:提升声望,获取专业图纸和史诗装备
基于 AT89C51 单片机的自动售货机系统设计与实现
战神斯巴达幽灵攻略:通关秘籍、BUG 解决及漩涡船通关技巧
倚天外挂 灭绝师太:一个人气颇高的变态老女人,她的故事你知道多少?
冒险岛:弓箭手职业分析与推荐,你真的了解吗?
金庸武侠小说中的张无忌:武功高强却被指渣男,他是如何炼成的?
鹏博士大麦盒子 2.0:引领家庭娱乐互联新潮流
歪歪漫画登录界面入口在哪?官方网站首页及 APP 均可找到
战神斯巴达幽灵:PSP 神作,热血格斗,全新体验等你来战
本月最好笑的美剧桥段:孕妇羊水破了,丈夫却在熟睡或死亡?