第一篇:c语言自动售货机实验报告
课程设计
课程名称
C语言高级程序设计
xxx XXX XXX XXX XXX
学
院
小组成员1
小组成员2
小组成员3
任课教师
2016——2017学年 第1学期
一. 所选题目与要求
自动售货机 问题情景:
分析学校教学楼自动售货机的功能,设计一个自动售货系统。
功能要求:
1.系统能提供所售商品的清单(编号,名称,单价,数量)
2.客户输入商品编号及购买数量,系统显示应付的金额,输入客户实付的钱数,系统计算应找的钱数系统如果没有足够的库存或零钱时,现实应返还客户已付的金额。(不考虑用支付宝付款的情况)
3.可增加商品种类,增加商品库存,查询商品库存,查询商品销售量及销售额。
成果要求:
通过网络教学平台中的“研究型教学”建立分组,每组2-3人,通过小组讨论,确定每人的分工,并确定系统设计方案。
各小组成员在网络教学平台上进行讨论、并完成最终的报告,整个过程作为小组及个人工作评价的重要依据。
各小组成员根据系统设计方案分模块进行编程,在系统各模块编码完成后集成调试,并最终完成整个系统的测试。
根据下面的报告模板完成综合实验总结报告,并打印成纸质报告,作为大作业课程结束时上交。
附:综合实验总结报告应包含的内容: 1.系统功能说明 2.程序结构 程序结构说明 重要数据说明 函数清单
/* 每个函数的书写格式 */ 函数名:所在文件名 函数功能
参数说明
算法描述或程序代码 3.系统运行结果
4.系统设计难点及其解决方法 5.不足之处 6.人员分工说明
二. 问题分析及算法设计
主函数
void main()
//主函数模块 {
do{ system(“pause”);show();//显示屏幕函数,商品清单
loop1:printf(“现在你有%.1f元n你可以选择商品序号开始选购或按 0 退出n”,M);input();//输入函数 if(M-goods[n-1].price>v){t=0;printf(“对不起,售货机没有足够的零钱了n谢谢光临!退还%.1f元n”,M);break;} //判断售货机是否有足够的零钱,0表无
if(n==0){ //确认用户是选择离开还是买东西开始购买
t=1;change(M);} //找零函数
else { loop2:sell(n,M,1,1);//购买函数
if(A==0)//货没有了怎么办 input();//输入函数
………………………………………………………………………..if(n==0)//没货离开
change(M);//找钱函数
else //继续购买其它商品
{ ……………………………………………
goto loop2;返回至购买函数
} //else
}
//if
else if(B==0)//没钱了怎么办
{ …………………………………..if(m1==0)//离开
change(M);返回至找零函数
else
//加钱
{ …………………………………………..goto loop1;返回至再次购买
} //else
} //else if
else//有钱又有货,继续选 goto loop1;返回至购买程序
} //else }while(1);} //main
结构体定义
struct goods
//定义物品清单 { int number;char name[10];
float price;int quantity;}goods[9]={{1,“可口可乐”,3,5},{2,“拿铁咖啡”,4,5},{3,“橙汁”,3,5},{4,“奶茶”,4,5},{5,“雪碧”,2.5,5}, {6,“矿泉水”,2,5},{7,“椰子汁”,2.5,5},{8,“格瓦斯”,3,5}};
struct money
//定义钱的种类,数量用于记录找零的某值张数 { float moneys;int mount;}money[2]={{1,0},{0.5,0}};
被调用的函数
float show()//显示模块--屏幕 { …………………………… }
int input()//输入模块 { …………………………..} }
int sell(intn,floatm,inta,int b)//出售模块n为序号,m钱,{ ……………………………
if(goods[i].quantity>0)//表示有货
{ ………………………………..}
else
}
} else A=0;//表示没货了
B=0;//表示没钱了
if(M==0)B=0;//判断出钱已用光 return(a);return(b);void change(float m)//找钱模块 {
…………………………… switch(a){ case 1花光…………………………………….case 2:找零………………………………………
} …………………………………… }
三. 程序源代码
#include
int A=1,B=1,t;
//A为数量标记,B为金钱标记,1表示有,0表示没有,t用于标记售货机是否能完成退款
inti,n,v=100;
//i用于循环显示商品列表,n用于记录输入的货号,v用于保存售货机内可以找零的钱数,初设为v=100
//结构体定义
struct goods
//定义物品清单 { int number;
char name[10];float price;int quantity;}goods[9]={{1,“可口可乐”,3,5},{2,“拿铁咖啡”,4,5},{3,“橙汁”,3,5},{4,“奶茶”,4,5},{5,“雪碧”,2.5,5}, {6,“矿泉水”,2,5},{7,“椰子汁”,2.5,5},{8,“格瓦斯”,3,5}};
struct money
//定义钱的种类,数量用于记录找零的某值张数 { float moneys;int mount;}money[2]={{1,0},{0.5,0}};
float show()//显示模块--屏幕 { system(“pause”);putch('n');for(i=0;i<8;i++){
printf(“
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|n”);
printf(“
|%d%8s%7.1f元...剩余%7d|n”,goods[i].number,goods[i].name,goods[i].price,goods[i].quantity);} printf(“
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“购买东西前,请投入money!(支持1元,5元,10元和20元)n《温馨提示,投入money过多可能无法完成退币》n”);scanf(“%f”,&M);return M;}
int input()//输入模块 { for(;;){ scanf(“%d”,&n);if(n<0||n>8)
printf(“输入错误,请重新输入商品序号开始选购或按 0 退出n”);else {return n;break;} } } int sell(intn,floatm,inta,int b)//出售模块
n为序号,m钱,{
inti=0;while(n!=goods[i].number)i++;if(m>=goods[i].price){if(goods[i].quantity>0)
{goods[i].quantity--;
M=m-goods[i].price;
for(i=0;i<8;i++){
printf(“
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|n”);
printf(“
|%d%8s%7.1f元...剩余%7d|n”,goods[i].number,goods[i].name,goods[i].price,goods[i].quantity);}
printf(“
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n”);
printf(“你的商品 %d %s 已经出货了n”,goods[n-1].number,goods[n-1].name);
}
else
A=0;//表示没货了
} else
B=0;//表示钱了
if(M==0)B=0;//判断出钱已用光
return(a);return(b);}
void change(float m)/钱模块 { inti,a;//用于辅助输出
if(m==0)a=1;if(m!=0.0&&t!=1)a=2;switch(a){
case 1:printf(“钱用光了哦n谢谢光临!”);break;case 2:{for(i=0;i<2;i++)
if(money[i].moneys<=m)
{m=m-money[i].moneys;
money[i].mount++;
i--;}//继续检索当前的面额是否符合条件,才会有相同面值出现
printf(“
谢谢光临!n找零n”);
for(i=0;i<2;i++)
if(money[i].mount>0)
printf(“%d张%.1f元tn”,money[i].mount,money[i].moneys);m=0;M=0;};
money[0].mount=0;break;
} }
void main()
//主函数模块 { do{ int t=1;
//用于标记售货机是否能完成退款,1表能
float m1;
//m1用于记录用户再次加的钱
show();//显示--屏幕
loop1:printf(“现在你有%.1f元n你可以选择商品序号开始选购或按 0 退出n”,M);
input();//输入函数
if(M-goods[n-1].price>v){t=0;printf(“对不起,售货机没有足够的零钱了n谢谢光临!退还%.1f元n”,M);break;} //判断售货机是否有足够的零钱,0表无
if(n==0){ //确认用户是选择离开还是买东西开始购买
t=1;
change(M);} /零函数
else { loop2:sell(n,M,1,1);
if(A==0)//货没有了怎么办
{printf(“可惜了,商品 %d 已卖完了n你还有 %.1f元n你可以买其它商品(直接输入商品序号)或按 0 离开n”,n,M);
input();//输入函数
if(n==0)
change(M);/钱函数
else
{A=1;
B=1;//要将标记归位
goto loop2;} //else
}
//if
else if(B==0)//没钱了怎么办
{printf(“噢,,没钱了,你可以继续投入money购买,或按 0 离开n”);scanf(“%f”,&m1);if(m1==0)
change(M);else
{M=M+m1;
A=1;
B=1;//标记要归位
goto loop1;} //else } //else if
else//有钱又有货,继续选
goto loop1;} //else }while(1);} //main 四. 系统功能及运行效果图
一,系统提供商品清单,并提示购买前投入money
二,如果用户投入的money过多,售货机无足够硬币完成退币,10
自
动退还用户已付金额
三,用户投入money购买,确定购买商品后,系统显示如下
四,如果不想继续购买,则按0退出,系统自动完成找零
五,想继续购买,则直接输入商品序号,当商品已售完时,系统自
动提示如下
六,若不想退出,则可以继续购买其它商品,直到剩余钱不足时
七,想继续购买,则直接加钱后购买,钱全部花完时,系统提示如
五. 研究总结
1.研究过程
接到研究型学习任务后,我们三个同学组成了小组进行探究。首先我们先详细分析讨论了整个系统需要完成的功能细节,并考虑了实现的方法。一开始我们的方法不够优化,我们通过查阅一些资料,得到了新的方法,拓宽了思路,并且再次进行了讨论。讨论完毕后进行了组员的分工,大家在一周内进行了代码的编写和模块化调试,最后所有模块合在一起进行了总的调试。调试过程中又发现了不少问题,我们又一一加以修改,最后形成了现在这个较为完善的程序。
2.小组分工
王宗德—组长,编写主程序,排版,划分模块,负责调试合成整个代码等。何硕—负责收集资料,负责部分子模块程序的编写,撰写实验报告。刘泳—检查程序错误及部分程序设计,完善实验报告。
3.收获
经过本次研究型学习任务,我们小组深刻意识到了分工合作的重要性。大家在探究过程中各司其职,相互帮助。除此以外,我们也加深了对课上所学知识的理解,比如字符串、数组与指针、结构体使用等。我们意识到实践是提高知识水平和专业技能的重要途径。
第二篇:软件工程_自动售货机
自动售货机
信息1101 施敏宇 18号
下面是自动售货机系统的需求陈述,试建立它的对象模型、动态模型和功能模型: 自动售货机系统是一种无人售货系统。售货时,顾客把硬币投入机器的投币口中,机器检查硬币的大小、重量、厚度及边缘类型。有效的硬币是一元币、五角币、五分币、二分币、一分币。其他货币被认为是假币。机器拒绝接受假币,并将其从退币孔退出。当机器接受了有效的硬币之后,就把硬币送入硬币储藏器中。顾客支付的货币根据硬币的面值进行累加。自动售货机装有货物分配器。每个货物分配器中包含零个或多个价格相同的货物。顾客通过选择货物分配器来选择货物。如果货物分配器中有货物,而且顾客支付的货币值不小于该货物的价格,货物将被分配到货物传送孔送给顾客,并将适当的零钱返还到退币孔。如果分配器是空的,则和顾客支付的货币值相等的硬币将被送回到退币孔。如果顾客支付的货币值少于所选择的分配器中货物的价格,机器将等待顾客投进更多的货币。如果顾客决定不买所选择的货物,他投放进的货币将从退币孔中退出。
面向对象的分析
面向对象分析方法的核心思想是利用面向对象概念和方法为软件需求构造一组相关模型(对象模型,动态模型和功能模型),来获得关于问题域的全面认识。
这三个模型从不同的角度对系统进行描述,其中:对象模型描述了系统静态的、结构化的数据性质;动态模型描述了系统顺势的、行为化的控制性质;功能模型描述了变化的系统的功能性质。这三个模型都涉及到数据。控制和操作等共同的概念,但每种模型描述的侧重有所不同。它们各自以不同侧面反应系统的实质内容,综合起来则全面反映了目标系统的需求。
对象模型是三个模型中最关键的。它的作用是描述系统的静态结构,包括构成系统的类和对象、它们的属性和操作以及它们之间的联系。UML中类图适用于建立对象模型,状态图适用于建立动态模型。每个类的动态行为用一张状态图来表示,各个类的状态图通过事件合并起来,构成系统的动态模型。也就是说,动态模型是基于事件共享而相互关联的一组状态图的集合。建立对象模型大体上按照下列顺序进行:寻找问题域内的对象,识别出对象间的关系、定义属性和服务。事实上,分析工作不可能严格按照预定顺序进行,系统的模型往往需要反复构造多遍才能建成。
注:对象硬币计算器和对象硬币检测器可以作为对象自动售货器的一部分,它们的属性作为自动售货器的属性。
建立动态模型
对于仅存数静态数据的系统来说,动态模型并没有什么实际意义。然而在开发交互式系统时,动态模型却起着很重要的作用。如果收集输入信息是目标系统的一项主要工作,则在开发这类应用系统时建立正确的动态模型是至关重要的。
建立动态模型的步骤:
(1)编写典型的对话脚本;
(2)从脚本中提取出事件,联系该事件与其目标对象;
(3)组织事件的顺序和状态(采用状态图描绘);
(4)比较各个不同对象的状态图,检查对象之间的一致性,确保事件之间的匹配。
提示投币投币购买提示是假币,退币假币检查硬币否真币存储硬币,计算货币总值确认投完硬币是请求选择货物选择货物检测货物存量无货提示无货计算比较货币总值和货物价格确认确认顾客购买小于提示货物不足,确认顾客购买不购买送出货物,请求取货不购买退币请求取退币提示显示交易完毕
功能模型
功能模型描述了系统的所有计算。功能模型指出发生了什么,动态模型确定什么时候发生,而对象模型确定发生的客体。功能模型表明一个计算如何从输入值得到输出值,它不考虑计算的次序。功能模型由多张数据流图组成。数据流图用来表示从源对象到目标对象的数据值的流向,它不包含控制信息,控制信息在动态模型中表示,同时数据流图也不表示对象中值的组织,值的组织在对象模型中表示。
数据流图中包含有处理、数据流、动作对象和数据存储对象。
1.处理
数据流图中的处理用来改变数据值。最低层处理是纯粹的函数,一张完整的数据流图是一个高层处理。
2.数据流
数据流图中的数据流将对象的输出与处理、处理与对象的输入、处理与处理联系起来。在一个计算机中,用数据流来表示一中间数据值,数据流不能改变数据值。
3.动作对象
动作对象是一种主动对象,它通过生成或者使用数据值来驱动数据流图。
4.数据存储对象
数据流图中的数据存储是被动对象,它用来存储数据。它与动作对象不一样,数据存储本身不产生任何操作,它只响应存储和访问的要求。
有效币特征假币退假币假币检查硬币有效币硬币送入硬币储藏器计算面值货物价格有货货币总值硬币顾客投币顾客不足等待顾客投币顾客取消购买,退币顾客判断货币是否足够足够选择货物判断分配器货物存量无货分配货物,找零货物,硬币硬币退币
第三篇:软件工程课程设计(自动售货机)
《软件工程》课程设计报告
一、问题描述
(一)关于自动售货机
自动售货机像磁卡电话、银行柜员机一样,以方便、新颖、文明、昼夜服务等特点,成为发达国家不可缺少的便民配套设施。如今的自动售货机可以为顾客提供多种服务。顾客可以根据自己的需要选择商品并投入钱币,售货机接收钱币,售出商品。
(二)自动售货机的设计
自动售货机系统是一种无人售货系统。售货时,顾客把硬币投入机器的投币口中,机器检查硬币的大小、重量、厚度及边缘类型。有效的硬币是一元币、五角币、一角币、五分币和一分币。其它货币都被认为是假币。机器拒收假币,并将其从退币孔退出。当机器接收了有效的硬币之后,将之送入硬币储藏器。顾客支付的货币根据硬币的面值进行累加。
自动售货机装有货物分配器,每个分配器中包含0 个或多个价格相同的货物。顾客通过选择货物分配器来选择货物。如果有货,且顾客支付的货币值不小于该货物的价格,货物将被分配到货物传送孔送给顾客,并将找零返回到退币孔。如果无货,则和顾客支付的货币值相等的硬币将被送到退币孔。如果顾客支付的货币值小于所选货物的价格,机器将等待顾客投进更多的货币。如果顾客决定不买所选择的货物,他投放进的硬币将从退币孔中退出。
二、需求分析
(一)UML自动售货机系统功能需求:
自动售货机系统是一种无一元等3个硬币投币口。顾客确认购货后,售货机可根据硬币的面值进行累加。
自动售货机装有货物分配器。每个货物分配器中包含零个或多个价格相同的货物。顾客通过 1 选择货物分配器来选择货物。如果货物分配器中有货物,而且顾客支付的货币值不小于该货物的价格,货物将被分配到货物传送孔送给顾客,并将适当的零钱返回到退币孔。如果分配器是空的,则和顾客支付的货币值相等的硬币将被送加到退币孔。如果顾客支付的货币值少于所选择的分配器中的货物的价格,机器将等待顾客投进更多的货币。如果顾客决定不买所选择的货物,将所投硬币从退币孔退出。
(二)UML自动售货机系统控制要求:
根据售货机自动控制系统的流程可以知道自动售货机的主要系统包括:计币系统、比较系统、选择系统、饮料供应系统、退币系统和报警系统。
1.计币系统:
当有顾额色买饮料时,投入的钱币经过感应器,感应器记忆投币的个数关且传送到检测系统(即电子天平)和计币系统。只有当电子天平测量的重量少于误差值时,允许计币系统进行叠加钱币,叠加的钱币数据存放在数据寄存器中。如果不正确时,认为是假币。既定出投币,既定出系统,等待新顾客。
2.比较系统:
投入完毕后,系统会把钱币数据和可以购买饮料的价格进行区间比较,当投入的钱币小于2元时,指示灯亮,显示投入的钱币不足。此时可以再投币或选择退币。当投稿的钱币在2~3元之间时,汔水选择指示灯长亮。当大于3元时,汔水和咖啡的指示灯同时长亮。此时可以选择饮料或选择退币。
3.选择系统:
比较电路完成后选择电路指示灯是长亮的,当按下汽水或咖啡选择时,相应的选择指示灯由长亮转为以1秒为周期闪烁。当饮料供应完毕时,闪烁同时停止。
4.饮料供应系统:
当按下选择按钮时,相应的电磁阀(Y4或Y6)和电机(Y3或Y5)同时启动。在饮料输出的同时,减去相应的购买钱币数。当饮料输出达到8秒时,电磁阀首先关断,小电机继续工作0.5秒后停机。此小电机的作用是:在输出饮料时,加快输出。在电磁阀关断时,给电磁阀加压作用,加速电磁阀的关断。(注:由于该售货机是长期使用,电磁阀使用过多时,返回弹力减少,不能完全关断会出现漏饮料的现象。此时电机Y3和Y5延长工作0.5秒起到电磁阀加压的作用,使电磁阀可以完好的关断。)
5.退币系统:
当顾客购完饮料后,多余的钱币只要按下退币按钮。系统就会把数据寄存器D2内的钱币数首先除以10得到整数部分,是1元钱需要退回的数量,存放在D10里。余数存放在D11里。再用D11除以5得到的整数部分是5角钱需要退回的数量,存放在D12里。余数存放在D13里。最后D13里面的数值,就是1角钱需要退回的数量。在选择退币的同时启动3个退币电机。3个感应器开始计数,当感应器记录的个数等于数据寄存器退回的币数时,退币电机停止运转。
6.报警系统:
报警系统如果是非故障报警,只要通过网络通知送液车或者送币车即可。但是如果是故障报警则需要通知维修人员到现声进行维修。同时停止服务,避免造成顾客的损失。
(三)业务流程图
钱币记录仪对钱币前端接受顾客投的进行识别币判断退出钱币发送信息到分配器判断没有货物时发送信息到前端发送货物4
(四)数据流程图
钱币钱币记录仪对分配器反钱币钱币进行计算与货物价格进货物发放行比较取走零钱与购买的货物
三、各种UML图型及其分析
(一)用例图
1.顾客的用例图
inputCoinchooseSodaCustomer
2.自动售货机的用例图
RegisterDispenserFrontSodaMachine
(二)类图
(三)序列图
理想状态(不找零钱)的序列图
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnSodaFree()6: displayPrompt()7: chooseSoda()8: sendChooseToDis()9: checkAvailability()10: releaseSoda()11: releaseSoda()8 1.没有货物的序列图
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnSodaFree()6: displayPrompt()7: chooseSoda()8: sendChooseToDis()9: checkAvailability()10: releaseSoda()11: displayPrompt()12: sendReturnCoin()13: returnCoinToFront()14: returnCoin()9 2.3.需找零钱的序列图
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnSodaFree()6: displayPrompt()7: chooseSoda()8: sendChooseToDis()9: checkAvailability()10: releaseSoda()11: sendSodaPrice()12: checkForChange()13: releaseChange()14: receiveSoda()15: receiveChange()10
没有零钱找给顾客
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnSodaFree()6: displayPrompt()7: chooseSoda()8: sendChooseToDis()9: checkAvailability()10: releaseSoda()11: sendSodaPrice()12: checkForCharge()13: returnNoCharge()14: returnCoinToFront()15: displayPrompt()16: returnSodaToDispenser()17: returnCoin()11 4.5.完整的序列图
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnNoCharge()6: returnCoinToFront()7: displayPrompt()8: returnCoin()9: End()10: returnSodaFree()11: displayPrompt()12: chooseSoda()13: sendChooseToDispenser()14: checkAvailability()15: returnUnavailability()16: displayPrompt()17: sendReturnCoin()18: returnCoinToFront()19: returnCoin()20: End()21: releaseSoda()22: sendSodaFrice()23: checkForCharge()24: returnNoCharge()25: returnCoinToFront()26: displayPrompt()27: returnSodaToDispenser()28: returnCoin()29: End()30: releaseCharge()31: receiveSoda()32: receiveCharge()33: End()34: receiveSoda()35: End()12
(四)协作图
1.理想状态的协作图
3: getCustomerInput()9: checkAvailability()4: checkForSoda():Registe:Dispensrer8: sendChooseToDis()2: accept()5: returnSodaFree()1: inputCoin()10: releaseSoda()7: chooseSoda():Front : Customer6: displayPrompt()11: releaseSoda()2.没有货物的协作图
1: inputCoin()7: chooseSoda():Front : Customer6: displayPrompt()11: displayPrompt()14: returnCoin()13: returnCoinToFront()8: sendChooseToDis()2: accept()5: returnSodaFree()12: sendReturnCoin()10: releaseSoda()3: getCustomerInput()9: checkAvailability()4: checkForSoda():Registe:Dispensrer 3.需找零钱的协作图
1: inputCoin()7: chooseSoda():Front : Customer6: displayPrompt()14: receiveSoda()15: receiveChange()13: releaseChange()8: sendChooseToDis()2: accept()5: returnSodaFree()10: releaseSoda()3: getCustomerInput()12: checkForChange()9: checkAvailability()4: checkForSoda():Registe:Dispensrer11: sendSodaPrice()4.没有零钱找给顾客的协作图
1: inputCoin()7: chooseSoda():Front : Customer6: displayPrompt()15: displayPrompt()17: returnCoin()13: returnNoCharge()14: returnCoinToFront()8: sendChooseToDis()16: returnSodaToDispenser()2: accept()5: returnSodaFree()3: getCustomerInput()10: releaseSoda()12: checkForCharge()9: checkAvailability()4: checkForSoda():Registe:Dispensrer11: sendSodaPrice()
完整的协作图
29: End()33: End()35: End()1: inputCoin()12: chooseSoda():Front : Customer7: displayPrompt()8: returnCoin()11: displayPrompt()16: displayPrompt()19: returnCoin()26: displayPrompt()28: returnCoin()31: receiveSoda()13: sendChooseToDispenser()32: receiveCharge()27: returnSodaToDispenser()34: receiveSoda()10: returnSodaFree()5: returnNoCharge()15: returnUnavailability()6: returnCoinToFront()21: releaseSoda()18: returnCoinToFront()24: returnNoCharge()14: checkAvailability()25: returnCoinToFront()30: releaseCharge()2: accept()17: sendReturnCoin():Dispenser4: checkForSoda()3: getCustomerInput()22: sendSodaFrice()23: checkForCharge():Register15 5.(五)状态图
提示投币do/ 请求投币do/ 提示是假币假币do/ 检查硬币真币否购买do/ 存储硬币,计算货币总值do/ 确认投完硬币有do/ 请求选择商品选择货品do/ 提示无货无货do/ 检测货品存量有货计算小于do/ 比较货币总值和货物价值do/ 提示货币不足不小于确认do/ 确认顾客购买do/ 送出货品,请求取货有零钱退币无零钱do/ 请求退币不购买显示do/ 提示交易完成17
(六)活动图
1.投币的活动图
投币确认投币完成2.选择货物的活动图
请求选择输入货物确认选择货物ID 3.前端的活动图
接受货币显示可购显示面值货物过小显示没有该货物接受饮料显示没有零钱找零钱退货币 19
货币记录仪的活动图
接受从前端来的钱币判断钱币发送信息给分配仪发送货物金额给前端返回钱币计算零钱20 4.5.分配器的活动图
接受货币启示录仪的信息发送货物提示没有该货物 21
(七)组件图
CustomerSodaMachineFrontRegisterDispenserDB_0
(八)配置图
Clint数据库
(九)数据模型图
第四篇:毕业论文-自动售货机汇总
毕业设计说明书
自动售货机控制系统的设计与仿真
自动售货机控制系统的设计与仿真
摘 要
随着社会的进步,科学的发展,生活水平的提高,单一传统的生活方式已经不能满足现代居民对高品质生活的追求,在这种现象下,许多自动化设备应时代应潮流而生。自动售货机作为自动化设备中的最常见的设备之一,由于其众多的优点,已经在世界各地得到了普遍的发展并且还在不断地发展。自动售货机掀起了继百货商店和超市之后的又一零售狂潮,这种智能售货系统在车站、教学楼、办公楼等公共场所有着广阔的发展前景。
本文在对自动售货机的背景历史和发展趋势进行了研究介绍之后,对课题中的自动售货机系统进行了整体的设计及规划。该自动售货机控制系统是基于EDA技术来实现的,同时,利用Altera公司的QuartusⅡ14.0作为其软件开发平台,利用VHDL编程语言输入的方式完成了软件设计。本设计方案对整个控制系统进行了层次化的编写。把整个系统划分为6个子模块,分别是找零计算模块、确认取消控制模块、找零控制模块、总钱数加和模块、显示模块、锁定模块,并且对每一个子模块进行了详细的软件设计。在顶层文件中通过调用各个子模块来完成vhdl程序的设计。
最后在对每一个子模块完成了功能仿真测试验证,同时也对整个系统进行顶层设计和仿真测试,测试结果表明了整个控制系统的合理性以及正确性。整个控制系统设计简单合理,操作简单,满足售货机的基本要求,具有一定的实用意义。关键词:自动售货机、VHDL、EDA、QuartusⅡ
自动售货机控制系统的设计与仿真
Abstract
Abstract: With the progress of the society, the development of the scientific, and the improvement of living standards, single traditional way of life has not meet modern residents' pursuit of high quality life, under this kind of phenomenon, a number of automation equipment should come into being.Vending machine as one of the most common equipment in the automation equipment, has been develop all over the world and develop constantly because it has many advantages.Vending machines set off after department stores and supermarkets in another retail frenzy, this intelligent vending system has broad prospects for development in the station, school buildings, office buildings and other public places.Based on the background of the vending machine, the article designs and plans the project of vending machine system after introducing the history and development trend.The vending machine control system is based on the EDA technology to realize, at the same time, it used Quarter Ⅱ 14.0 of the Altera corporation as the software development platform, taking advantage of VHDL programming language input completed the software design.The design scheme is hierarchical write for the whole hierarchical control system.The whole system is divided into six sub modules, change calculation module, confirming cancellation control module, the change control module, total amount module, display module, locking module, and each child module software design is design in detail.On the top floor file by calling each module to complete the VHDL program design.Finally, The design scheme completed the function simulation test to verify for each child modules, and conducts Top-level design and simulation test for the whole system, the test results show the rationality and validity of the whole control system.The design of the whole control system is simple and reasonable, the operation is simple, it meets the basic requirement of the vending machine and has certain practical significance.keywords :The vending machine、EDA、VHDL、QuqrtusⅡ
自动售货机控制系统的设计与仿真 绪论
1.1课题研究背景
早在20世纪30年代,出售香烟的自动售货机就在美国被研制出来了,此后,各类自动售货机也相继被研究出来。到了20世纪的70年代,自动售货机在欧美地区和日本的发展已经相当的普遍。早在1998的数据统计中,日本就已经有了550万台各式各样各种功能的自动售货机,而美国所拥有的自动售货机的数量更是高达700万台,也就是说在上个世纪末在日本平均23个人就拥有一台自动售货机,而美国则是平均35个人就拥有一台。
自动售货机的优点之一就是无需人工看守,这点在当今世界人工劳动力成本普遍急剧上升的年代成为了各商家最看重的一点,它可以24小时不断的进行自动售货操作,在为商家降低成本的同时大大的增加了收益。同时,其操作方便简单、占地面积小、全自动化等优点使其迅速在全世界各地普及开来。日本作为使用自动售货机最普遍的国家,其国内的罐装饮料有大约70%是通过自动售货机来出售的,销售额为世界第一;在西班牙,全国零售业的销售额一半以上是由自动售货机来完成的,并且每年的速度都在不断增长。从这些数据可以看出自动售货机所涉及的行业在零售行业中占据着不可替代的重要作用。
1.2课题研究的目的与意义
随着社会的不断发展与进步,城镇居民的收入日渐增多,生活条件也越来越好,城镇居民的消费方式和消费心理也正慢慢发生改变。快捷自动化的生活方式正是快节奏生活下人们所追求的一种高品质的生活方式。而自动售货机作为商业自动化的一种常见设备,无论是在国内还是国外,都深受消费者的喜爱,时代的发展为自动售货机提供了良好的发展条件。然而,我国的自动售货机行业的发展却远远及不上欧美和日本等国家,究其原因一个方面是因为我国的自动售货机行业发展比较晚,另外一方面是因为我国要普遍发展自动售货机也有着技术的瓶颈。自动售货机是一种内部集成度高、技术复杂的高科技设备,而现在我国多数企业都缺乏自主研发自主创新的精神,使得自动售货机的很多关键零件都要从国外进口,因此想要在国内发展这一行业,解决相关技术问题自主开发自动售货机是最重要的。
我国引进自动售货机已有差不多二十年的时间,然而至今在国内运营和自主研发制造自动售货机的企业少之又少,国外的自动售货机还毫无疑问的占据着我国绝大部分的的市场。这种现象严重阻碍了我国发展自动售货机行业。因此,加快脚步和加大力度去自主研制自动售货机是很有必要的,同时,更要时时关注最先进的科学技术,尽可能的把这些高科运用到自动售货机行业中去,只有这样才能让该行业在我国得到更好更快的的发展。
自动售货机控制系统的设计与仿真
1.3 国内外研究现状及趋势
目前,自动售货机已经在发达国家得到了广泛的运用,而我国由于行业起步较晚的原因使得各方面技术还不够成熟,还需要加大力度去积极发展这一行业。在2012六月份,我国各式各类的自动售货机的总量只有三万台,而在2013六月份,该数量已经上升至五万台,增长幅度高达差不多50%,当然由自动售货机带来的营业额也是非常庞大的。随着科技的不断发展,如今的自动售货机也越来越先进,其中设备的科技含量也日渐增高。自动售货机的发展历程如图所示:
目前我国生产自动售货机主要有以下几家比较知名的厂家:上海艾丝明自动售货机有限公司,主要生产咖啡机;天津歌德公司,主要生产咖啡机;大连富士冰山公司,主要生产饮料机。除此之外还有青岛澳柯玛自动商用设备有限公司、天津奥莱特自动售货机有限公司等公司生产的自动售货机也是比较常见的。
自动售货机的发展趋势是由于社会的产业结构发生变化的产物。由于社会的消费方式、销售环境等的变化,自动售货机的售货方式作为一种新的流通渠道,自然而然自动售货机也就应时代发展而生了。自动售货机从一开始的功能单一结构单一发展到现在的功能多元化个性化,该行业也成为信息化的一种表现。而且自动售货机的发展为了适应社会的发展也将会更加合理化人性化,它已不仅仅是一台用来销售商品的机器,随着科技的发展,通信的发展,互联网的发展,它也必将向着相互连通的信息生态圈的方向发展,必将发展成为一种集商品销售、信息流通等于一体的高科技的终端设备。
1.4 课题研究的主要内容
本文主要研究利用自动售货机来完成商品处理、货币找零、出货操作、led显示等功能。完成的工作主要包括以下几个方面:
1.对自动售货机的历史及发展前景做了简单的陈述。
2.对课题中用的比较多的EDA技术以及VHDL语言、QuarterⅡ软件开发平台的相关知识做了简单的介绍。
3.在对自动售货机的整个控制系统进行了一定的研究和分析之后,提出了整体设计方案。
4.对各个子模块功能的利用vhdl语言程序的输入的方式进行了详细的分析设计,并且对每一个子模块进行了仿真测试,对其相对应的功能进行了验证。最后对整个系统进行顶层设计,同时也对整个系统进行了仿真,对整个自动售货机的功能进行了验证。
自动售货机控制系统的设计与仿真 相关技术简介
2.1 EDA技术
电子设计自动化技术就是常见的EDA技术的简称,这种技术在现代电子设计中有着非常重要的作用。EDA技术以强大的计算机为依赖,在相应的软件开发平台上,利用硬件描述语言(HDL)来完成系统的各项功能的逻辑描述。
EDA技术有着丰富的内容,与电子技术很多领域有着密不可分的联系,所以其发展同计算机辅助工程、电子设计技术以及集成电路的大规模设计技术等都是同步发展的。就近30多年来其发展可分为以下阶段:
上世纪70年代可编程逻辑器件开始问世,集成电路得到广泛应用,CAD技术也开始发展,EDA技术也就是在这个时候开始出现。
上世纪80年代进入商用的复杂可编程逻辑器件、FPGA器件的出现、CAD技术广泛的应用、各类硬件描述语言的相继出现,这些解决EDA技术要广泛运用过程中所遇到的各种问题,为其规范应用奠定了基础。
上世纪90年代,CAD、CAE等技术已经被广泛应用在电子领域方面。同时,通信技术的发展、计算机技术的发展使得EDA技术有了更大的发展空间。
发展至现在的EDA技术,CPLD和FPGA等可编程逻辑器件是被应用得最多的,这些器件是利用硬件编程语言来进行软件设计以完成功能设计,这样的设计方式简单方便,有着非常大的灵活性。可编程逻辑器件和可编程语言的发展改变了传统的电子设计的设计方法和设计理念,同时也让EDA技术有了更快的发展。EDA技术在现代社会的发展及应用范围是非常广泛的,不仅在农业、医学、军事等领域被应用,在通信、化学、交通、航天等领域更是有着不可替代的重要作用。(EDA技术与VHDL P1)
2.2 VHDL VHDL的全称是Very High Speed Circuit Language,与另一种VerilogHDL语言是现在电子设计自动化中用的最多的两种硬件描述语言,现在用的比较多的EDA工具基本都支持这两种语言,在电子领域中已经成为了通用的硬件描述语言。
VHDL是一种无关设计平台、无关具体的硬件电路的语言。跟一般的高级语言类似,不过却有着一般高级语言没有的具有硬件特性的语句,能很好的描述数字电路的功能和结构。VHDL的结构特点是设计一项工程或实体,一个元件、一个系统或者一个电路模块都可以设计成为一个实体,被设计好的实体可以很方便的被调用,这是VHDL很大的一个特点。
与其他的硬件描述语言相比,VHDL有以下特点:
设计好的模块可以任意无数次的被调用,很好的做到了资源共享和重复利用这一点,大大减少了设计人员的工作量和工作时间。
自动售货机控制系统的设计与仿真
语言的设计描述与器件无关,设计人员在进行电路的设计的时候,可以把精力放在优化电路上而不用先去考虑器件的选择,VHDL可以采用不同的器件来实现已经描述好的电路设计。
语言功能强大,设计方法灵活,支持各式各样的设计方法,无论是自顶向下还是自底向上的设计方式在VHDL中都可以灵活的被运用。同时,模块化设计,层次化设计等设计方法也是被支持的。
具有很强的移植能力,对于同一个VHDL程序,它可以在不同的工作平台、综合器、模拟器之间相互移植。
一个完整的VHDL程序代码结构包括4个模块,库和程序包的模块、实体模块、结构体模块、配置结构模块。其结构图如图所示:
2.3 QuartusⅡ软件
QuartusⅡ是由Altera公司开发的一种EDA工具,是经过A+plus、然后到MAX+plus,再到MAX+plusⅡ发展而来的。QuartusⅡ支持多种输入方式,例如原理图输入,硬件编程语言输入等,在使用QuartusⅡ软件时,它会将设计人员设计好的硬件编程语言或者原理图等自动转换目标文件,最后将目标文件下载到器件中。通过DSP Builder工具,QuartusⅡ能很好的跟Matlab、Simulink等结合起来,从而能够方便快捷的实现不同的DSP系统的设计。因为有着简单直接的入口和很强的设计能力,以及使用灵活、方便快捷的优点,所以很受广大设计者的青睐。
QuartusⅡ软件有以下特点:
自动售货机控制系统的设计与仿真
支持多平台的设计输入,结合其处理和验证功能使其成为一个全集化的开发平台,让开发周期变短。
是一个与结构无关的开发工具,QuartusⅡ通过把Cyclone、APEX、Mercury等设计环境转化为所需要的格式,真真正正的成为唯一一个与结构无关的开发工具。
具有很具有全面的可设计开发资源,是一个集系统设计、软件开发、逻辑设计于一体的综合性开发平台。QuartusⅡ的编程设计流程图所示:
2.4 Modelsim仿真工具
Modelsim提供了可以与其他EDA工具(如QuartusⅡ)的接口工具。Modelsim支持Verilog、vhdl或者二者相结合的混合。针对不同的使用环境,Modeislm分为不同的版本,常见的版本有:Modelsim AE、Modelsim ASE、Modelsim SE等。在本文的设计的版本是Modelsim ASE10.1版本。VHDL的仿真流程如图所示,首先在VHDl仿真器中对已设计好的VHDL源代码进行编译,等到代码被编译正确后就会被转换为中间格式,中间数据的结果将会保存在仿真数据库中,一般来说,VHDL源代码在编译好的仿真库就是WORK库。设计者通过编写TestBeach文件来干预仿真的过程,在本文的设计中,计时通过编写不同的TestBeach文件来对不同的模块代码进行仿真测试。
自动售货机控制系统的设计与仿真 系统总体方案
3.1 设计要求
本文设计的售货机系统中只有一种,价格为13元;
可以投入三种不同的货币来购买商品,分别是1元、5元、10元;
每次只允许购买一个商品,若想要购买多个商品,则需要重复执行购买操作; 售货机的显示器会实时更新显示总共投入的货币的总额;
当投入货币后,如果不想购买商品了则可以通过按取消键来退还投入的货币,否则就按确定键来获取商品;
设置两个指示灯,分别是购买指示灯和取消指示灯,当顾客按下确定键后购买指示灯亮起;若顾客按下取消键,则取消指示灯亮起;
3.2 总体设计
通过分析系统的设计要求以及考虑到系统本身,本文对整个总动售货机系统采用自顶向下的设计方法,自顶向下的设计方法如图所示,采用自顶向下的设计方法的优点是很明显的。由于系统设计从顶层开始,所以在进行设计时就清楚实现整个系统的性能状况。随着设计向下一级进行,系统的性能就能进一步得到细化和表达,并且可以根据个人需要随时修改和调整,缩短了设计周期。
对整个系统的顶层文件进行如下端口设计:
输入端口:clk,输入时钟信号;rst,复位信号;C1,投入一张1元货币;C5,投入一张5元货币;C10,投入一张10元货币;ok_in,确认信号;cancel_in,取消信号。
输出端口:led_buy,确认购买指示灯;led_cancel,取消购买指示灯;en_deliver,出货信号;led1,投入货币总数的个位数(单位是元);led10,投入货币总数的十位数(单位是元)。
内部可读输出端口:RC1,1元退币控制信号;RC5,5元退币控制信号;RC10,10元退币控制信号。
自动售货机控制系统的设计与仿真
端口原理图如图所示:
在确定了整个系统的输入输出端口后,给出自动售货机的系统内部的工作原理: 当系统接收到复位信号后,其他所有的控制信号和标识信号都清空为零,系统处于等待指令的状态。
当系统接收到相关信号输入时,系统开始工作。顾客确定购买商品时,开始投入货币,当投入货币为1元、5元、10元时,将分别产生一个时钟宽度的信号C1、C5、C10。所投入的货币总额会实时计算并通过显示器显示出来。
当顾客确定购买商品并按下确认键的时候,自动售货机会产生一个时钟信号ok_in,而且由led_buy控制的代表确认购买的指示灯会闪烁。如果投入货币的总额大于商品价格时,则送出商品并计算出余额操作退出余额,此时出货指示灯闪烁。如果投入的货币不足以支付商品价格,自动售货机会退还所有货币。
当顾客投入货币又不想购买商品时,就可以通过按下取消键来取消购买,这时系统会产生一个时钟信号cancel_in,同时通过找零控制模块来执行相应操作退还货币。如果确认键或者取消键被按下后,自动售货机会产生一个lock_out_entry内部信号,当发出信号后,所有的操作都是无效的。
当完成所有的操作后,将产生一个clear清除信号,此时所有的信号都会被清除,自动售货机开始等待下一次操作。
整个系统的投币购物流程如图所示:
自动售货机控制系统的设计与仿真
将整个系统划分成六个模块,分别是购买余额计算模块、找零控制模块、确认取消模块、总额加和模块、锁定模块和显示模块。各模块的功能:
余额计算模块:当顾客确认购买商品并按下了售货机的确认键后,找零模块就开始计算出应该退还的余额。
找零控制模块:在顾客确定购买商品后执行找零操作,或者是在顾客取消购买后执行退还原款操作。
确认取消模块:顾客在选择购买商品或者取消购买商品后,将输入的确认信号或者取消信号分别转换成单时钟周期的控制信号,并且控制相对应的信号灯的亮和不亮。
总额加和模块:不断的更新并计算售货机收到的总货币数量。
锁定模块:可以按下确认键或者取消键,当其中任意一个键被按下后,整个自动售货机系统的按键的输入都是无效的。
显示模块:通过控制两个显示器(led1和led10)来显示所投入货币的总额。整个自动售货机的内部工作过程的总体框图如图所示:
对每一个子模块进行VHDL设计,然后对其进行编译,再编译没有错误后,通过编写TestBeach文件来对其进行仿真测试来验证每一个模块的功能是否正确。在顶层文件的
自动售货机控制系统的设计与仿真
vhdl程序设计中,通过特定的例化语句将已经设计好的6个子模块进行例化,然后直接对各个模块进行调用,整个顶层程序的设计就是通过调用底层的6个模块来实现的,完成顶层设计后再对整个系统进行仿真测试。
自动售货机控制系统的设计与仿真 软件设计及仿真测试
4.1确认取消模块(ok_cancel模块)
4.1.1设计思想及工作原理
在确认取消模块中,顾客可以在投币之后选择继续购买商品或者取消购买商品,若确定购买则会产生一个确认信号,而该模块可以把该信号转换成单时钟的控制信号,同时确定购买led_buy显示灯会亮;同样,若顾客按下取消健,则该模块会将输入的取消信号转换单时钟周期的控制信号,同时确定购买cancel_buy显示灯会变亮。
确认取消模块有以下输入端口:
输入端口:clk,输入时钟信号;rst,复位信号;clear,清除信号;lock_out_entry,锁定信号;ok_in,确认信号;cancel_in,取消信号。 输出端口:ok,内部时钟确认控制信号;cancel,内部时钟取消控制信号;led_buy,确认购买指示灯控制信号;led_cancel,取消购买指示灯控制信号。电路原理图如图所示:
该模块的工作过程如下:首先系统复位,等待确认购买信号或者取消购买信号的输入,当收到信号后,系统会根据接收到的信号立即生成一个相对应的内部控制信号ok信号或者cancel信号。同时,指示灯会根据接收到的控制信号led_buy或者led_cancel来显示灯的亮和灭。此过程中,当系统第一次接收到确认购买信号或者取消信号后,将会岸上产生一个锁定信号lock_out_entry,当接收到此信号后,整个系统的所有操作都会无效,直到系统执行完毕,模块接收到清零信号后,所有信号都会被清空归零。
由QuqrtusⅡ软件内部生成的RTL电路图如图所示:
自动售货机控制系统的设计与仿真
4.1.2仿真测试
对确认取消模块进行仿真测试后,得到如图所示的仿真波形图:
对所得到的仿真波形图进行分析:在15ns前,系统复位;在30ns的时候,系统接收到一个确认购买的信号,此时会生成ok信号,即一个时钟的内部控制信号,同一时间,会发出一个控制信号led_buy,以此来控制购买指示灯亮。在时间为31ns时,可以看到系统发出了一个锁定信号lock_out_entry,当系统接收到该信号后,其他所有的按键操作都将被视为无效,所以在40ns时输入的cancel信号不会被响应;在60ns时操作执行完毕,系统接收到一个clear的控制信号,此时锁定信号归零,同时led_buy控制信号归零。
4.2找零控制模块(refund模块)
自动售货机控制系统的设计与仿真
4.2.1设计思想及工作原理
找零控制模块有以下输入端口:
输入端口:clk,输入时钟信号;rst,复位信号;clear,清除信号;ok,接收到确认信号;cancel,接收到取消信号;sum1,表示接收到的投入1元货币的信号;sum_5,接收到的投入5元货币的信号;sum10,表示接收到的投入10元货币的信号;sum,投入货币总和信号;Rsum1,退出1元货币的数量;Rsum5,退出5元货币的数量;Rsum10,退出10元货币的数量;
输出端口:en_deliver,给货控制信号;RC1,退币1元的信号;RC5,退币5元的信号;RC10,退币10元的信号。电路原理图如图所示:
当系统接收到确认取消模块发来的确认购买信号时,则该模块开始执行找零过程,同时发出给货控制信号en_deliver,当找零操作完成后系统发出清零信号;当系统接收到其他模块发出的取消购买信号后,则该模块开始执行退币操作,模块会根据投入的货币发出不同的退币控制信号,从而完成所有货币的退还,操作完成后系统发出清零信号。
由QuqrtusⅡ软件内部生成的RTL电路图如图所示:
自动售货机控制系统的设计与仿真
4.2.2仿真测试
对找零控制模块的仿真有2种情况:
1、确认购买操作;
系统执行取消购买操作,得到如图所示的仿真波形图:
分析上图中的波形图可以看出:在5ns前,系统复位;在10ns时,系统接收到确认购买信号ok,同时接收到信号sum,表示系统收到投入货币为15元,在同一时刻发出给货信号en_deliver;在11ns的时候,就收到了其他模块发来的退币信号Rsum_10,可以看出当投入货币依次是15、14、13元时,退币金额分别为2、1、0元;当给货信号完毕后,该模块立即产生退币信号,系统开始执行找零操作,操作
自动售货机控制系统的设计与仿真
完成后系统清零。
2、取消购买操作;
对系统执行取消购买操作,得到如图所示的仿真波形图:
对该波形图进行分析可以看出:在5ns前,系统处于复位状态;在10ns的时候,系统接收到其他模块发出的投币信号,分别投入了一张5元货币和一张10元货币,同时,接收到别的模块发出的信号sum;在30ns时,系统接收到确认取消模块发出的取消信号,则该模块开始执行退币过程,退币控制信号RC50、RC100分别发出一个高电平信号,每个退币控制信号代表退出行对应的一种货币;在操作完成后系统发出清零信号。
4.3总额加和模块(sum_cash模块)
4.3.1设计思想及工作原理
总额加和模块有以下输入端口:
输入端口:clk,输入时钟信号;rst,复位信号;clear,清除信号;C1,投入一元货币信号;C5,投入五元货币信号;C10,投入十元货币信号;RC1,退币1元的信号;RC5,退币5元的信号;RC10,退币10元的信号;lock_out_entry,锁定信号。
输出端口:sum_1,表示发出1元货币的信号;sum_5,发出5元货币的信号;sum_10,发出10元货币的信号;sum,投入货币总和信号; 电路原理图如图所示:
自动售货机控制系统的设计与仿真
当系统输入不同的投币信号时,则sum1,sum5,sum10就会记录相对应的货币的数量,而sum则记录了投入货币的总额。当货币投入完毕后,顾客会选择确认购买商品或者取消购买,系统会根据接收到的不同的信号来执行相应的操作,当找零模块执行完找零操作或者退币操作后总数加和模块就会收到系统的清零信号,所有的内部信号和表示都会被清除。
由QuqrtusⅡ软件内部生成的RTL电路图如图所示:
自动售货机控制系统的设计与仿真
4.3.2仿真测试
对总额加和模块进行仿真测试得到如图所示的波形图:
对图中波形进行分析可以发现,在5ns之前,系统在复位状态;在时间为20ns的时候,系统接收到C1、C5、C10发出的3个投币信号,30ns时又收到1个1元投币信号,对应的sum1、sum5、sum10记录了相对应不货币的数量,sum则记录了投入货币的总额;在时间为40ns时,lock_out_entry信号变为高电平,此时其他按键都会无效;当系统开始接收到退币信号后,相应的sum1、sum5、sum10也会发生变化,找零结束后系统发出清零信号,系统内的表示和内部信号都被清除。
4.4余额计算模块(calculator模块)
4.4.1设计思想及工作原理
余额计算模块有以下输入端口:
输入端口:rst,复位信号;clear,清除信号;ok,确认购买信号;输出端口:sum1,投入1元货币的信号;sum5,投入5元货币的信号;sum10,投入10元货币的信号;sum,投入货币总和信号。
双向端口R:sum1,退还1元货币的信号;Rsum5,退还5元货币的信号;Rsum10,退还10元货币的信号。电路原理图如图所示:
自动售货机控制系统的设计与仿真
余额计算模块在收到其他模块发出的确认购买信号后,就会开始执行操作。根据所投入的货币总额,可以分为3种情况:投入货币小于商品价格,该情况下售货机会退还所有货币;投入货币刚好等于商品价格,该情况下退还余额为零;投入货币大于商品价格,该情况则根据商品的价格和顾客投入总额的差额来计算应找余额。由QuqrtusⅡ软件内部生成的RTL电路图如图所示:
4.4.2仿真测试
对余额计算模块的仿真有3种情况:
1、投入货币小于商品价格;
2、投入货币等于商品价格;
自动售货机控制系统的设计与仿真
3、投入货币大于商品价格;
对于第1种情况,得到如图所示的仿真波形:
对于上面的波形图,可以看出在时间为5ns前,系统复位;在10ns的时候,系统接收到投入一张10元货币的信号和一张1元货币,接着在20ns的时候,系统接收到控制确认购买的信号ok,经过计算最后得到投入的货币总额11元小于商品的设定价格13元,所以系统将发出退款信号,Rsum10和Rsum1均被赋值为1,表示要退还10元货币和一元货币,当系统的找零控制模块接收到此信号后会执行相应操作;在时间40ns时,发出清零信号。
对于第2种情况,得到如图所示的仿真波形:
对于上面的波形图,可以看出在时间为5ns前,系统复位;在10ns的时候,系统接收到投入一张10元货币和3张一元货币的信号,接着在20ns的时候,系统接收到控制确认购买的信号ok,经过计算最后得到投入的货币总额13元刚好等于商品的设定价格13元,所以系统将发出退款信号,Rsum10、Rsum5、Rsum1均被赋值为0,表示要退还货币均为0,当系统的找零控制模块接收到此信号后会执行相应操作;在时间40ns时,发出清零信号,清除系统内部信号。
对于第3种情况,得到如图所示的仿真波形:
自动售货机控制系统的设计与仿真
对于上面的波形图,可以看出在时间为5ns前,系统复位;在10ns的时候,系统接收到投入2张货币的信号,接着在20ns的时候,系统接收到控制确认购买的信号ok,经过计算最后得到投入的货币总额20元大于价格13元,所以系统将发出退款信号,Rsum10、Rsum5、Rsum1分别被赋值为2、1、0,表示要退还货币均为2张1元,1张5元,当系统的找零控制模块接收到此信号后会执行相应操作;在时间40ns时,发出清零信号,清除系统内部信号。
4.5锁定模块(lock模块)
4.5.1设计思想及工作原理
锁定模块有以下输入输出端口:
输入端口:rst,复位信号;clear,清除信号;ok,确认购买信号;cancel,取消购买信号。
输出端口:lock_out_entry,锁定信号。
端口原理图如图所示:
当该模块接收到确认取消模块发出的无论是确认信号还是取消信号,都会发出一个锁定信号,从而锁定整个系统的其他任何操作。由QuqrtusⅡ软件内部生成的RTL电路图如图所示:
自动售货机控制系统的设计与仿真
4.5.2仿真测试
对锁定模块进行仿真测试,得到如图所示波形:
对该波形图进行分析:在5ns前,系统复位;在20ns时,系统接收到确认取消模块发出的cancel控制信号,此时该模块会立即产生lock_out_entry信号,即按键锁定信号;在40ns时,系统操作结束,发出清零信号。
4.6显示模块
4.6.1设计思想及工作原理
输入端口:din,表示收到货币总额信号。
输出端口:led1,显示货币的个位数;led10,显示货币的十位数。
显示模块会实时显示售货机收到的货币总额,并且通过led1来显示投入货币的个位数,led2来显示投入货币的十位数。在该模块中,调用了一个数码管显示的元件disp7。
Lock模块的端口原理图如图所示:
自动售货机控制系统的设计与仿真
由QuqrtusⅡ软件内部生成的TRL电路图如图所示:
4.6.2七段数码管显示器设计
在元件disp7程序设计中,有一个输入端口din,一个输出端口led。disp7程序的端口原理图如图所示:
该元件设计的主要目的是具体定义了从0~9中每一个数值所对应的字符串赋值。由QuqrtusⅡ软件内部生成的RTL电路图如图所示:
自动售货机控制系统的设计与仿真
4.6.3仿真测试
显示模块仿真波形图如图所示:
对该波形图进行分析:当显示模块接收到用来控制货币总额的信号din时,两个led显示器会马上将货币总额显示出来。图中可以看出,投入货币总额为15元,则led1应显示为5,led2应显示为1,根据vhdl程序的设计,led信号用字符串“"1111001”来显示1,用字符串“0010010”来显示数字5,图中的波形图说明了显示器显示是正确的。
4.7顶层设计与分析
顶层的设计就是对整个自动售货机系统进行设计,为了在整个系统中达到连接底层元件从而形成更高层次的电路设计,在顶层文件的vhdl程序设计中使用了例化语句。在程序中利用component语句对准备调用的元件做了声明,并利用net1~net11十一个信号作为系统的内部连线。
显然,元件例化的实质就是引用一种连接关系,将之前已经设计好的设计实体定义为一个元件,然后把元件与当前的设计实体的端口通过特定的语句连接起来,从而为当前的设计实体引进新的低一级的设计层次。元件例化是vhdl设计实体完成自上而下层次化设计的一种途径。
4.7.1设计思想及工作原理
由QuqrtusⅡ软件内部生成的RTL电路图如图所示:
自动售货机控制系统的设计与仿真
4.7.2仿真测试
对整个系统进行功能仿真测试,对仿真的结果的其中一部分进行分析,对以下两种仿真情况进行分析:
1、确认购买但余额不足
2、确认购买且需要找零
对第1种情况进行仿真得到如图的仿真图:
在该波形图中可以看出,在5ns的时候,系统复位;在时间为30ns的时候,系统收到一个1元货币投入信号和一个5元货币投入信号,紧接着在50ns的时候又收到一个一元货币投入信号;两个显示器显示了投入货币的总额;在时间为80ns的时
自动售货机控制系统的设计与仿真
候,系统收到确认信号ok_in,投币结束,开始执行找零或者退币操作;系统内部通过判断发现所投入货币总额小于商品价格,所以开始进行全额退币过程;在90ns的时候系统发出同时退出一元货币和五元货币的信号RC1和RC5。系统操作完成,等待下一次的操作。
对第2种情况进行仿真得到如图的仿真图:
在该波形图中,在时间为30ns的时候,系统接收到一个投入一元货币的信号,在70ns的时候,同时收到一个五元货币和一个十元货币的投入信号,显示器实时显示所投入货币的总额;在80ns的时候收到确认购买信号ok_in,由于所投货币总额大于商品价格,则系统开始执行找零过程,并且产生一个出货信号en_deliver和一个确认购买信号led_buy;,在时间为90ns至120ns,连续3个产生退币信号退币信号RC1;退币完成后,本次操作完成,等待下一次的操作。
自动售货机控制系统的设计与仿真 总结
随着计算机技术和通信技术的发展,自动售货机的发展方向也必将向着更加智能化和人性化的础上,从顾客的实际需要出发,本文在分析了自动售货机的特点后,完成了自动售货机控制系统的设计,在设计的过程中,主要完成了以下几个方面的工作;(1)对自动售货机的发展技术进行了总结和归纳,经过总结可以发现节能环保是现在起发展的一个重要方向,同时,移动商务也是其发展的一个目标方向。(2)完成了整个系统方案的设计,并且对整个系统进行了模块的划分,将整个系统划分成6个子模块,对每个模块都单独进行了功能设计。
(3)利用vhdl语言输入的方式,对子模块进行了详细的软件的设计,并且对其完成了相应的功能仿真测试,并且对每次的仿真结果进行分析。最后在顶层文件中将各个子模块进行例化并对子模块进行了调用,并且对整个控制系统的仿真,经过仿真测试的结果可以看出,整个控制系统的设计达到了最初的所有设计要求,完成了各项功能。
通过对整个系统的功能测试发现该自动售货机的工作是比较稳定和可靠的,而且操作简单明了,具有很大的实用性。由于经验不足和时间原因,本文中对该自动售货机系统的设计也存在了一些不足之处。在本系统中,只设定了一种商品,商品选择功能不完善;购买商品后的结算方式比较单一,只能现金支付,缺少例如IC卡支付等智能支付方式。所有这些问题会对在相关知识进行更深入的学习后逐一解决,努力对该控制系统进行改进,使其更加完善。
自动售货机控制系统的设计与仿真
致谢
回首大学四年,虽有遗憾却也无悔。在四年的求学期间,虽然也曾迷茫彷徨,却因为身边一群诲人不倦的老师的引导以及真诚、热心助人的同学的帮助,重新找到了前进的方向以及努力的目标。
在此,要首先感谢在本次毕业设计过程中从选题开始到论文的完成一直给我很大帮助的段老师,正是因为段老师耐心的帮助,我才能更好的完成课题中的设计及论文的编写。同时,也要感谢本次在毕业设计过程中给与我帮助的其他老师和同学。最后,祝愿所有老师身体健康,桃李天下;祝愿所有同学前程似锦,工作顺利。
大学生活即将结束,我也即将步入社会这个人生大舞台,要学习的东西还有很多。在以后的日子里,我将会更加的努力去面对生活中所遇到的各种挑战。
自动售货机控制系统的设计与仿真
参考文献
第五篇:自动售货机系统程序
Coin类:
#include
using namespace std;
class Coin { public: /** Constructs a coin with a given name and value @param n the coin name @param v the coin value */ Coin(string n, double v);/** Gets the coin name.@return the name */ string get_name()const;/** Gets the coin value @return the value */ double get_value()const;private: string name;double value;};
Coin::Coin(string n, double v){ name = n;value = v;}
string Coin::get_name()const { return name;}
double Coin::get_value()const { return value;}
Product类: #include
using namespace std;
class Product { public: /** Constructs a product with a given name, price and quantity @param n the product name @param p the price @param q the quantity */ Product(string n, double p, int q);/** Gets the product name @return the name */ string get_name()const;/** Gets the product price @return the price */ double get_price()const;/** Gets the product quantity @return the quantity */ int get_quantity()const;/** Adds to the product quantity @param amount the amount to add */ void add_quantity(int amount);private: string name;double price;int quantity;};
Product::Product(string n, double p, int q){ name = n;price = p;quantity = q;}
string Product::get_name()const { return name;}
double Product::get_price()const { return price;}
int Product::get_quantity()const { return quantity;}
void Product::add_quantity(int amount){ quantity = quantity + amount;}
VendingMachine类:
class VendingMachine { public: /** Constructs a vending machine with no current product selection.*/ VendingMachine();/** Adds product to the machine.@param p the product to add */ void add_product(Product p);/** Sets the currently selected product @param name the product name @return true if the machine has a product with the given name */ bool select_product(string name);void chaxun_product();//查询当前售货机内的商品
/** Adds a coin to pay for the currently selected product.@param c the coin to add @return true if sufficient coins have been added to pay for the selected product.*/ bool add_coin(vector
double return_yiyoucoins();//统计售货机中已有的货款 void setcurrent_product();//把当前选择的商品代号置为-1 int getcurrent_product();//得到当前选择的商品代号 private: vector
products;int current_product;vector
VendingMachine::VendingMachine(){ current_product =-1;}
void VendingMachine::add_product(Product p)//添加商品 { for(int i = 0;i < products.size();i++){ if(products[i].get_name()== p.get_name()&& products[i].get_price()== p.get_price()){ products[i].add_quantity(p.get_quantity());cout<<“添加成功!”< { cout<<“已存在该商品,与您输入的价格不同!”< return; } } products.push_back(p);cout<<“添加成功!”< bool VendingMachine::select_product(string name)//选择商品 { int i;for(i = 0;i < products.size();i++){ if(products[i].get_name()== name && products[i].get_quantity()> 0){ current_product = i;return true;} else { if(products[i].get_name()== name && products[i].get_quantity()== 0){ cout << “对不起,该商品已售完!n”;return false;} } } if(i==products.size()){ cout<<“对不起,不存在该商品!”< double VendingMachine::return_yiyoucoins()//统计售货机当前的金钱总额 { double total = 0;for(int i = coins.size()1;i >= 0;i--){ coins.push_back(current_payment[i]);current_payment.pop_back();} products[current_product].add_quantity(-1);current_product =-1;cout<<“交易成功!”< { return false;} } double VendingMachine::add_coinbijiao(vector } double m=products[current_product].get_price()-total;if(m>0)return m;else return-1;} double VendingMachine::return_coins()//统计当前投入的金钱总额 { double total = 0;for(int i = current_payment.size()1;i >= 0;i--){ total = total + coins[i].get_value();coins.pop_back();} return total;} void VendingMachine::chaxun_product(){ if(products.size()==0){ cout<<“暂时没有添加商品!”< int VendingMachine::getcurrent_product(){ return current_product;} Main函数: #include void main(){ vector VendingMachine machine;bool more = true;machine.chaxun_product();while(more){ cout << “a)添加商品 x)查询商品 s)选择商品 p)投币 c)取消 e)查询当前金额 r)取款 q)退出: ”;string command;cin>>command;if(command == “a”){ cout << “商品名: ”;string name;cin>>name; cout << “价格: ”;double price;cin >> price;cout << “数量: ”;int quantity;cin >> quantity;machine.add_product(Product(name, price, quantity));} else if(command == “s”){ double total1; total1=machine.return_yiyoucoins(); if(total1>=5000)//当售货机中的货款大于等于5000时,暂停售货 { cout<<“对不起,现在暂停售货!”< } else { machine.setcurrent_product();cout << “商品名: ”;string name;cin>>name;machine.select_product(name); } } else if(command == “p”){ if(machine.getcurrent_product()!=-1)//如果当前已选择商品,才可以投币 { bool panduan=false;while(!panduan)//多次投币的实现 { cout << “所投钱币名称(以 # 结束投币过程):”;string name;cin>>name;while(name!=“#”){ bool found = false;for(int i = 0;!found && i < coins.size();i++){ if(coins[i].get_name()== name){ current_pay.push_back(coins[i]);found=true;} } if(!found){ cout << “不存在该货币,请重新投入:n”;} cin>>name; } double k=machine.add_coinbijiao(current_pay);if(k==-1) { machine.add_coin(current_pay);for(int i = current_pay.size()1;i >= 0;i--){ total = total + current_pay[i].get_value();current_pay.pop_back();} cout << “Returned(退还)” < else cout<<“您还没有选择商品!”< { machine.setcurrent_product(); double total=0; for(int i = current_pay.size()1;i >= 0;i--){ total = total + coins[i].get_value();coins.pop_back();} return total;} void VendingMachine::chaxun_product(){ if(products.size()==0){ cout<<“暂时没有添加商品!”< int VendingMachine::getcurrent_product(){ return current_product;} } JAVA import Input.touqian;import java.*;class shangpin { } class fenpeiqi { } class xianshichanpin { fenpeiqi fpq[]=new fenpeiqi[3];public xianshichanpin(){ fpq[0]=new fenpeiqi(3.0);fpq[0].sp[0]=new shangpin(“玉米烤肠 ”,10);fpq[0].sp[1]=new shangpin(“可口可乐 ”,15);fpq[0].sp[2]=new shangpin(“百事可乐 ”,10);fpq[1]=new fenpeiqi(5.0);fpq[1].sp[0]=new shangpin(“哈德门香烟”,10);fpq[1].sp[1]=new shangpin(“将军香烟 ”,15);fpq[1].sp[2]=new shangpin(“红梅香烟 ”,10);fpq[2]=new fenpeiqi(10.0);fpq[2].sp[0]=new shangpin(“一支笔香烟”,10);fpq[2].sp[1]=new shangpin(“红塔山香烟”,10);fpq[2].sp[2]=new shangpin(“泰山香烟 ”,15);double price;shangpin sp[]=new shangpin[3];public fenpeiqi(double price){ } this.price=price;String name;int num;public shangpin(String name,int num){ } this.name=name;this.num=num; #“);#”);#“);#”);#“); } } void show(){ System.out.println(”=============== System.out.println(“# System.out.println(”# System.out.println(“# 欢迎使用自动售货机 System.out.println(”# System.out.println(“# =================”);System.out.println(“=============== System.out.println();System.out.println(”编号tt“+”名称ttt“+”价格tt“+”数量t“);for(int i=0;i } if(fpq[i]!=null){ } for(int j=0;j } } if(fpq[i].sp[j]!=null){ =================”);System.out.println((i+1)*10+j+1+“tt”+fpq[i].sp[j].name+“tt”+fpq[i].price+“tt”+fpq[i].sp[j].num);System.out.println(“=============== } =================”);class panduan { boolean ying() } { } boolean zhi(){ } int z=touqian.in(); if(z==5||z==10){ } else { } return false;return true;double y=touqian.dou();if(y==1||y==0.5){ } else { } return false;return true;class jiabi { switch(touqian.in())void ceshi(){ System.out.println(“请选择投放钱的类型 ”);System.out.println(“1 表示投放 硬币”);System.out.println(“2 表示投放 纸币”);System.out.println(“请输入您选择的钱的类型 :”); panduan pd=new panduan(); { case 1: System.out.println(“请您投入有效的面值”); if(pd.ying()) { System.out.println(“您投入的是有效地硬币”); System.out.println(); // System.out.println(“^_^ 请选择您所需要的物品^_^”); } else } class chanpin { { System.out.println(“您投入的不是有效地硬币,请您重新投入”); } break; case 2 : System.out.println(“请您投入有效的面值”); if(pd.zhi()) { // } else { } break; default : System.out.println(“请您重新投入有效地货币”); } } System.out.println(“您投入的不是有效的纸币,请您重新投入”);System.out.println(“您投入的是有效的纸币”);System.out.println();System.out.println(“^_^ 请选择您所需要的物品^_^”); } } public static void main(String args[]){ System.out.println(“请输入您想要产品的编码:”);int bianma;bianma=touqian.in();System.out.println(“请输入您想要产品的数量:”);int shuliang;shuliang=touqian.in();System.out.println(“您一共要付:”);double sumjine;sumjine= xianshichanpin xscp=new xianshichanpin();xscp.show();