基于单片机自动售货机设计毕业设计论文.docx_第1页
基于单片机自动售货机设计毕业设计论文.docx_第2页
基于单片机自动售货机设计毕业设计论文.docx_第3页
基于单片机自动售货机设计毕业设计论文.docx_第4页
基于单片机自动售货机设计毕业设计论文.docx_第5页
免费预览已结束,剩余51页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计(论文)报告题 目 基于单片机自动售货机设计2013年 4 月基于单片机的自动售货机设计摘要:本文详细介绍了自动售货机系统的方案设计、硬件选择、软件规划和编写,并重点描述了自动售货机系统的工作原理、系统设计、软件编程的原则和技巧。该系统以单片机at89s52芯片为核心,采用集中控制方式实现了对自动售货机全过程的自动控制。本系统选择独立式键盘按键作为货物选择端,实现了投币总数的显示功能。此外,系统程序采用keil软件进行程序的编写和编译,该软件具有编程简单、查错方便、阅读容易等特点。汇编语言是程序的基本语言,具有容易理解,便于记忆和使用等特点。关键词:自动售货机,at89s52,lcd显示the vending machine design based on mcuabstrct:this paper describes a vending machine system design, hardware selection, software planning and preparation, and describes the focus of the work vending machine system theory, system design, software programming principles and techniques. at89s52 in the system as the core chip, the realization of a centralized control of the vending machines automatic control the entire process. choice of the system as a stand-alone keyboard keys to choose the goods side, the realization of the coin shows the total number of features. in addition, the system program using keil software to prepare and compile procedures, the software programming is simple, convenient error checking, easy to read and so on. assembly language is the basic language program with easy to understand, easy to remember and use and so on.key words:vending machines,at89s52,lcd display前言自动售货机(vending machine,vem)是能根据投入的钱币自动付货的机器。自动售货机是商业自动化的常用设备,它不受时间、地点的限制,能节省人力、方便交易。是一种全新的商业零售形式,又被称为24小时营业的微型超市。能分为三种:饮料自动售货机、食品自动售货机、综合自动售货机。第一章 自动售货机的系统结构1.1自动售货机的总体系统结构 自动售货机是集光、机、电一体化的独立机构,它只需要顾客投币和按购物键选择即可自动售货及退找零钱,其工作程序如下图1-1 图1-1自动售货机工作时序图售货机的工作原理是: 从投币口送入货币,然后通过传感器采集数据、识别器判断货币的真伪并判别面值。(2)识别器把信息数据传给通信模块。(3)通信模块与售货机的主控系统通信,主控系统显示面值,启动售货机的面板键,显示出哪个货道有货,哪个货道已经售完,并等待顾客按键选择商品。(4)顾客选择商品后,售货机自动把商品送出,等待顾客取走。(5)显示余额,如果金额足够多,顾客可以选择找币或者继续买商品;如果款额不够,售货机经过延时予以退币。退币分为两种情况:一种是由货币识别器完成退纸币,另一种是由硬币的通信模块完成退硬币。(6)系统复零,完成售货。自动售货机的硬件原理构成如下图1-2所示图1-2硬件原理图综合所述,售货机系统可以分为三部分组成,即自动售货机的控制子系统、通讯子系统、硬币器子系统以及纸币器子系统。其中控制子系统是本设计研究重点。1.2 自动售货过程的控制子系统简述 控制子系统由以下四个部分组成,分别是预设自动售货机系统、金额累计、可售指示和退币系统、售完检测系统、售出累计及自测功能系统。 1、预设自动售货机系统。自动售货机售出的同类商品可分为若干品种,其售前设定价格须预先寄存在控制系统内。售货机的价格设置由按键和存储器组成。通过按键选择被设价商品的种类及价格,并将价格写入存储器中,该存储器本身具有掉电保护功能,属于软件设置方式。此外,在简易售货机中,由于出售商品的种类少,价格变化下,使用币种单一,也可以用硬件设置价格,才用拨码开关对应方式,结构简单,操作方便。 2、金额累计、可售指示和退币系统。控制系统的核心cpu对识币、退币、无货检验及购货信号进行循环检查,当有识币信号后,将金额数值送入金额累计存储器中进行累计,并通过串行接口使可售指示灯亮,提示购货。此时可以按下购货按钮,由于cpu检测到有购货信号后,如金额累计器中的数值与预设价格相等,则通过并行扩展接口驱动电磁阀或者微电机驱动出商品,并将金额累计存储器清零,完成一次售货过程,如累计金额大于预设价格时,驱动商品后,相减差额由信号驱动退币,实现退币和找钱功能。 3、售完检测系统。在自动售货机商品存储存道下方按照有接触行程开关,当存储存道有商品时,压下行程开关,自动售货机正常工作;当商品出售完毕时,行程开关被释放,向cpu发出无货信号,经过检测通过串行扩展接口向相应的售完指示灯发出信号,使机身“售完”指示灯亮,此种商品自动停售,即使投币金额达到该道商品预设价格数值,可售按钮仍然无法启动信号,金额累计存储器也不清零。 4、自动售货机售出累计及自测功能系统。该机cpu在每次售出商品后,向售出累计存储器中累计售出数据,通过自动售货机内部的按键可在金额显示窗口中读到累计结果。此外,在按下自测功能键后,出现自测功能信号,由外部按键操作,可检测各商品存储道的驱动商品功能。第二章 自动售货机的功能介绍2.1 此次设计的自动售货机的功能简介基本原理:货币识别器对所投货币进行识别,根据金额将商品选择权提供用户,用户选择后,控制芯片发出指令将所选择商品从储备料道中送达取物口。其功能描述:货物种类一共设有3种,这3种物品分别对应着3个不同的按键选择,其中2元,3元,4元价格不等的物品各1种;自动售货机能够投币总数lcd显示功能。如果累计投入的货币数目超过物品的预设价格,机器能够实现找钱功能;如果投入的货币没有达到所选择物品的预设价格时,投入的钱将全部退还;在投入一次累加货币后选择物品,如果投入的累加货币数目大大超过所选择物品的预设单个价格时,那么能够实现选择同一个物品购买多个,在本设计中设为可以同时购买2个或3个物品。本设计中有一共有7个按键选择,其中3个是货物选择键,有2个是多选键(一次购买2个或3个货物),还有1个确定键和1个取消键。如果没有按照预先设计的流程顺序进行按键选择,自动售货机将会自动返回操作前的状态,等待再次正确的按键选择。自动售货机的原理框图如图2-1所示图2-1自动售货机原理框图 2.2 实现自动售货机的功能的设计思路采用单片机89s52作为中央控制元件;用p3.4(xo)口作为识别货币输入端;p1口作为货物选择选择端(采用独立式键盘做为选择货物端);采用p0口实现掉出货物功能、找零功能;第三章 硬件接口电路图3-1 硬件接口电路如图3-1所示,本次设计的自动售货机系统包括以下几个部分: 中央控制元件89s52、投币及投币总数lcd显示系统、货物选择系统、出货系统、找钱系统。3.1中央控制元件简介在本次设计中,中央控制元件采用mcs-51系列单片机中的89s52。如图3-2所示. 图3-2 89s52引脚图按键功能表1主要特性:与mcs-51 兼容;8k字节flash,256字节ram, 32 位i/o 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,at89s52 可降至0hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,cpu 停止工作,允许ram、定时器/计数器、串口、中断继续工 作。掉电保护方式下,ram内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。2管脚说明: vcc:供电电压。 gnd:接地。 p0 口:p0口是一个8位漏极开路的双向i/o口。作为输出口,每位能驱动8个ttl逻 辑电平。对p0端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时,p0口也被作为低8位地址/数据复用。在这种模式下, p0不具有内部上拉电阻。 在flash编程时,p0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验 时,需要外部上拉电阻。p1 口:p1 口是一个具有内部上拉电阻的8 位双向i/o 口,p1 输出缓冲器能驱动4 个 ttl 逻辑电平。对p1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。此外,p1.0和p1.1分别作定时器/计数器2的外部计数输入(p1.0/t2)和定时器/计数器2 的触发输入(p1.1/t2ex)。 在flash编程和校验时,p1口接收低8位地址字节。引脚号第二功能:p1.0 t2(定时器/计数器t2的外部计数输入),时钟输出p1.1 t2ex(定时器/计数器t2的捕捉/重载触发信号和方向控制)p1.5 mosi(在系统编程用)p1.6 miso(在系统编程用)p1.7 sck(在系统编程用)p2 口:p2 口是一个具有内部上拉电阻的8 位双向i/o 口,p2 输出缓冲器能驱动4 个 ttl 逻辑电平。对p2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。 在访问外部程序存储器或用16位地址读取外部数据hyperlink /view/87697.htm存储器(例如执行movx dptr) 时,p2 口送出高八位地址。在这种应用中,p2 口使用很强的内部上拉发送1。在使用 8位地址(如movx ri)访问外部数据存储器时,p2口输出p2锁存器的内容。 在flash编程和校验时,p2口也接收高8位地址字节和一些控制信号。p3 口:p3 口是一个具有内部上拉电阻的8 位双向i/o 口,p3 输出缓冲器能驱动4 个 逻辑电平。对p3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。 p3口亦作为at89s52特殊功能(第二功能)使用,如下表所示。 在flash编程和校验时,p3口也接收一些控制信号。端口引脚第二功能:p3.0 rxd(串行输入口)p3.1 txd(串行输出口)p3.2 into(外中断0)p3.3 int1(外中断1)p3.4 to(定时/计数器0)p3.5 t1(定时/计数器1)p3.6 wr(外部数据hyperlink /view/87697.htm存储器写选通)p3.7 rd(外部数据hyperlink /view/87697.htm存储器读选通)此外,p3口还接收一些用于flash闪存hyperlink /view/3281.htm编程和程序校验的控制信号。rst:复位输入。当振荡器工作时,rst引脚出现两个机器周期以上高电平将是单片机复位。ale/prog:当访问外部程序存储器或数据存储器时,ale(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ale仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ale脉冲。对flash存储器hyperlink /view/3281.htm编程期间,该引脚还用于输入编程脉冲(prog)。如有必要,可通过对特殊功能寄存器(sfr)区中的8eh单元的d0位置位,可禁止ale操作。该位置位后,只有一条movx和movc指令才能将ale激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ale禁止位无效。psen:程序储存允许(psen)输出是外部程序存储器的读选通信号,当at89s52由外部程序存储器取指令(或数据)时,每个机器周期两次psen有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次psen信号。ea/vpp:外部访问允许,欲使cpu仅访问外部程序存储器(地址为0000h-ffffh),ea端必须保持低电平(接地)。需注意的是:如果加密位lb1被编程,复位时内部会锁存ea端状态。如ea端为高电平(接vcc端),cpu则执行内部程序存储器的指令。flash存储器hyperlink /view/3281.htm编程时,该引脚加上+12v的编程允许电源vpp,当然这必须是该器件是使用12v编程电压vpp。xtal1:振荡器反相放大器和内部时钟发生电路的输入端。xtal2:振荡器反相放大器的输出端。3.2 投币及投币总数lcd显示系统3.2.1 投币系统投币系统是自动售货设计当中比较重要的一块,涉及到货币识别系统,对于识别货币器是如何设计、如何工作的,在这里将不做进一步的研究。本课题设计主要是要实现自动售货机的投币总数显示、货物选择、出货以及找零功能。在本次设计中用p3.4上的一个按键来代替投币系统的电平输出。在投币系统中可以通过89s52内部的定时器来控制投币时间,在规定的时间范围内完成投币动作,否则投入的货币全部退出。由于本次设计主要是要体现从投币到操作最后到出货的过程,在设计中没有用到定时设置。3.2.2货币累加的实现本次设计的货币累加是对判断p3.4上的按键上所按下的次数进行累加来实现的,并将累加的次数送到寄存器b,然后系统根据投币的总数和相应的操作来实现输出。3.2.3 lcd显示本次设计选用tc1602液晶显示屏,可以直接跟51系列单片接口相连。液晶模块tc1602采用标准的16脚接口,其引脚功能如下:第1脚:vss为电源地,接gnd。第2脚:vdd接5v正电源。第3脚:vl为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10k的电位器调整对比度。第4脚:rs为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:rw为读写信号线,高电平时进行读操作,低电平时进行写操作。当rs和rw共同为低电平时可以写入指令或者显示地址,当rs为低电平rw为高电平时可以读忙信号,当rs为高电平rw为低电平时可以写入数据。第6脚:e端为使能端,当e端由高电平跳变成低电平时,液晶模块执行命令。第714脚:d0d7为8位双向数据线。第15脚:bla背光电源正极(+5v)输入引脚。第16脚:blk背光电源负极,接gnd。 tc1602液晶模块内带标准字库,内部的字符发生存储器(cgrom)已经存储了192个57点阵字符,32个510点阵字符。另外还有字符生成ram(cgram)512字节,供用户自定义字符。如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“a”的代码是01000001b(41h),显示时模块把地址41h中的点阵字符图形显示出来,我们就能看到字母“a”。1602液晶模块内部的控制器共有11条控制指令 指令1:清显示,指令码01h,光标复位到地址00h位置 指令2:光标复位,光标返回到地址00h 指令3:光标和显示模式设置 i/d:光标移动方向,高电平右移,低电平左移s:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效指令4:显示开关控制。 d:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 c:控制光标的开与关,高电平表示有光标,低电平表示无光标 b:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 s/c:高电平时移动显示的文字,低电平时移动光标指令6:功能设置命令 dl:高电平时为4位总线,低电平时为8位总线 n:低电平时为单行显示,高电平时双行显示 f: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符指令7:字符发生器ram地址设置指令8:ddram地址设置指令9:读忙信号和光标地址 bf:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据指令11:读数据 1602液晶的读写时序如图3-3,3-4所示:读操作时序:图3-3 读操作时序图写操作时序:图3-4 写操作时序图投币总数lcd显示相关程序程序如下:money equ 0040h ;定义投币显示存储单元 rs equ p3.0 rw equ p3.1 e equ p3.2 main: mov money,#01h ;赋予money单元初值为1 start: acall delay ;调用延时程序 mov p2,#01h ;写指令01h,清屏 lcall enable mov p2,#38h ;写指令38h,设定lcd为16*2显示,5*7点阵,8位数据接口 lcall enable mov p2,#0fh ;写指令0fh,显示on,光标on,闪烁on lcall enable mov p2,#06h ;写指令06h,光标输入方式增量移位 lcall enable mov p2,#80h ;第一行起始字符地址 lcall enable mov dptr,#table ;显示字符表头地址 lcall disp ;显示第一行数据 ret ;返回 enable: clr rs ;写指令子程序 clr rw clr e lcall delay setb e retdisp: mov r4,#6 ;准备显示一行6个字符loop1: mov a,00h ;投币数送a mov r1,money l1: add a,#06h ;设置偏移量为6 djnz r1,l1 movc a,a+dptr ;查表取得要显示的数据 lcall dispf ;写入一个数据 inc dptr ;数据表指针加1,准备取下一个数据 djnz r4,loop1 ;一行没有显示完就继续 jmp insertdispf: mov p2,a ;写1字节数据到显示端口 setb rs ;写数据时序(请参照1602lcd使用说明书) clr rw clr e lcall delay setb e rettable: db 0 yuan db 0 yuan db 1 yuan db 2 yuan db 3 yuan db 4 yuan db 5 yuan db 6 yuan db 7 yuan db 8 yuan db 9 yuan db 10yuan db 11yuan db 12yuan db 13yuan db 14yuan db 15yuan3.3 货物选择系统按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。由于本次设计只需要七个按键即可满足设计要求,所以采用独立式键盘,这样对键盘识别的编程也比较简单。3.3.1 独立式键盘按键的识别独立式按键的识别很简单,如图3.0所示,当某个键按下时,相应的接口会出现低电平,无键按下时则为高电平,由此就可以判断出哪个键有按下。3.3.2 键盘编码将p1.0p1.6上的按键编码为00h、01h、02h、03h、04h、05h、06h,按键所对应的功能见表3-6表3-6按键功能表按键号对应的功能00h选择2元钱货物a01h选择3元钱货物b02h选择4元钱货物c03h对选择的货物买2个04h对选择的货物买3个05h对选择的货物再次确定06h对选择的货物取消3.3.3 货物选择系统的程序流程图:图3-7-1 2元钱货物处理子程序流程图图3-7-2 3元钱货物处理子程序系统流程图图3-7-3 4元钱货物处理子程序系统流程图3.4 出货系统3.4.1 出货功能的描叙本设计中,设置了价格分别为2元、3元、4元不等的货物,一共3种。在通过按键选择物品后,将会把产生的信号输入给89的p1的引脚上,89接收信号后,经过处理后,将会在货物输出端产生与其相对应的信号输出,控制所选货物的掉出。本次设计用p1.0p1.2作为货物的输出端,在货物的输出端采用光电隔离技术,对于光电隔离技术这里不做介绍,在这里用一个led指示灯代替货物的掉出情况,若有货物掉出则对应输出口为高电平,则指示灯亮,反之指示灯不亮。由于这里p0口作通用的i/o口输出,所以必须接上拉电阻,如图3-1所示。3.4.2出货程序流程图 图3-8 出货程序流程图3.5 找钱系统3.5.1找钱系统的描述本次设计中采用p1.3p1.6口作为找零输出口, p1.3p1.6分别对应1元找零口、2元找零口、2元找零口、5元找零口。这样设计的目的是方便实现不同数额的找零输出。同出货系统一样,找钱系统也用led指示灯来表示找零,对应的端口上若指示灯亮则表示有零钱掉出。3.5.2程序流程图图3-9 找钱程序流程图第四章 设计仿真4.1 proteus及keil简介 proteus软件已有近20年的历史,在全球拥有庞大的企业用户群,是目前唯一能够对各种处理器进行实时仿真、调试与测试的eda工具,真正实现了在没有目标原型时就可对系统进行设计、测试与验证。由于proteus软件包括逼真的协同仿真功能,得到了包括剑桥大学在内的众多大学用户作为电子学或嵌入式系统的课程教学、实验和水平考试平台。目前,proteus在国内单片机开发者及单片机爱好者之中已开始普及,有很多开发者已经开始用此开发环境进行仿真。keil 是美国keil software公司出品的51系列兼容单片机c语言软件开发系统,与汇编相比,c语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。keil提供了包括c编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环(uvision)将这些部分组合在一起。运行keil软件需要win98、nt、win2000、winxp等操作系统。如果你使用c语言编程,那么keil几乎就是你的不二之选,即使不使用c语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。4.2 仿真电路用keil 4软件仿真的结果如图4-1所示:图4-1 keil仿真假如投入6元钱货币,操作依次为按3元货物选择键、确定键,则在proteus里的仿真结果如图所示:图4-2 初始化 图4-3 投入6元图4-4 找回3元 图4-5 掉出一个3元货物图4-6 返回初始化界面 致谢本次设计是在龚运新老师的悉心指导下完成的,通过这次毕业设计我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼,同时在设计过程当中我加强了对单片机的基本原理、单片机应用系统开发过程的了解,以及加强了对keil软件和proteus软件的应用能力,为今后的学习和研究打下了基础。同时,我也要感谢同学的帮助,从他们身上我学到了很多理论知识,自己的实践能力也得到了很大的提高。参考文献1 朱军 王海东.自动售货机中的纸钞及硬币识别原理.传感器世界j,1996年2期,37-39 2 叶银兰.自动售货机的设计与实现.微计算机信息j,2008年23期,53-55 3 张毅刚 彭喜源 谭晓昀.mcs-51单片机应用设计m.哈尔滨工业大学出版社,1997年12月4 笨笨.tc1602液晶模块与单片接口字符实验.,2009年3月25日5 朱清慧 张凤蕊 翟天嵩.proteus教程m.清华大学出版社,2008年9月 附录附录1:本次设计的完整程序 money equ 0040h ;定义投币显示存储单元 rs equ p3.0 rw equ p3.1 e equ p3.2 投币总数lcd显示程序 main: mov money,#01h ;赋予money单元初值为1 start: acall delay ;调用延时程序 mov p2,#01h ;写指令01h,清屏 lcall enable mov p2,#38h ;写指令38h,设定lcd为16*2显示,5*7点阵,8位数据接口 lcall enable mov p2,#0fh ;写指令0fh,显示on,光标on,闪烁on lcall enable mov p2,#06h ;写指令06h,光标输入方式增量移位 lcall enable mov p2,#80h ;第一行起始字符地址 lcall enable mov dptr,#table ;显示字符表头地址 lcall disp ;显示第一行数据 ret ;返回 enable: clr rs ;写指令子程序 clr rw clr e lcall delay setb e retdisp: mov r4,#6 ;准备显示一行6个字符loop1: mov a,00h ;投币数送a mov r1,money l1: add a,#06h ;设置偏移量为6 djnz r1,l1 movc a,a+dptr ;查表取得要显示的数据 lcall dispf ;写入一个数据 inc dptr ;数据表指针加1,准备取下一个数据 djnz r4,loop1 ;一行没有显示完就继续 jmp insertdispf: mov p2,a ;写1字节数据到显示端口 setb rs ;写数据时序(请参照1602lcd使用说明书) clr rw clr e lcall delay setb e rettable: db 0 yuan db 0 yuan db 1 yuan db 2 yuan db 3 yuan db 4 yuan db 5 yuan db 6 yuan db 7 yuan db 8 yuan db 9 yuan db 10yuan db 11yuan db 12yuan db 13yuan db 14yuan db 15yuan 投币口程序 insert:mov a,p3 ;投币口检测 cpl a jbc acc.4,s1 ;p3口有键按下转s1 lcall key mov a,r5 cjne a,#0ffh,check ;货物选择键盘有键按下转check程序 ajmp insert s1: lcall d10ms ;延时消抖 mov a,p3 cpl a jbc acc.4,s2 s2: mov r1,money inc r1 mov money,r1wait1: mov a,p3 cpl a jbc acc.4,wait1 ; 投币开关未松开继续等待,否则返回start ajmp start ;返回 键盘程序 key: mov a,p1 ;读p1口 cpl a jnz key2 ;a不等零说明有键按下转key2 mov r5,#0ffh retkey2: lcall d10ms ;延时消抖 mov a,p1 cpl a jnz key3 mov r5,#0ffh retkey3: jnb acc.0,k1 mov r5,#00h lcall wait retk1: jnb acc.1,k2 mov r5,#01h lcall wait ret k2: jnb acc.2,k3 mov r5,#02h lcall wait ret k3: jnb acc.3,k4 mov r5,#03h lcall wait ret k4: jnb acc.4,k5 mov r5,#04h lcall wait ret k5: jnb acc.5,k6 mov r5,#05h lcall wait ret k6: mov r5,#06h lcall wait retwait: mov a,p1 cpl a jnz wait ret 货物选择程序 check: mov a,r5 mov r6,a mov a,money dec a ;因为之前给money的初值是1,所以计算投币总数时应该减去1 mov b,a ;将投币总数送入b mov a,r6 cjne a,#00h,nextb;判断是否按下键0 ljmp twoyuannextb: cjnea,#01h,nextc;判断是否按下键1 ljmpthreeyuannextc: cjnea,#02h,nextd1;判断是否按下键2 ljmpfouryuannextd1: mov a,b ;按其他键时退币 lcall outmoney jmp maintwoyuan: mova,b;将投入的货币累加数存入寄存器b cjnea,#02h,nexte1;判断投入的货币数是否为2元钱 movr0,#01h;选择的货物数为1个loope1: lcallkey;等待是否有键按下 mova,r5 cjne a,#0ffh,press2 sjmp loope1press2: cjnea,#05h,nexte2;按下确定键,所选货物掉出 lcalloutgoods jmp main ; 返回,等待下一次投币nexte2: cjnea,#06h,backe1;按下取消键 mova,b;退还全部的钱 lcalloutmoney jmp main ; 返回,等待下一次投币backe1: jmp loope1 ;选择其他键时返回,等到有键按下nexte1: jncnexte3;投入的货币数小于所选择商品的预设价格 lcalloutmoney ;钱全部退还 jmp main ; 返回,等待下一次投币nexte3: lcallkey;等待是否有键按下 mova,r5 cjne a,#0ffh,press3 sjmp nexte3 press3: cjnea,#03h,nexte4;选择一次性购买2个货物 mova,b cjnea,#04h,nexte5;判断投入的货币数是否为4元 movr0,#02h;将选择的货物数量值存入r0loope2: lcallkey;等待是否有键按下 mova,r5 cjne a,#0ffh,press4 sjmp loope2 press4: cjnea,#05h,nexte6;按下确定键,所选货物掉出 lcall outgoods jmp main ; 返回,等待下一次投币nexte6: cjnea,#06h,backe2 mova,b;退还全部的钱 lcall outmoney jmp main ; 返回,等待下一次投币backe2: jmploope2 ;选择其他键时返回,等到有键按下nexte5: jncnexte7;投入的货币数小于所选货物的预设价格 lcall outmoney ;钱全部退还 jmp main ; 返回,等待下一次投币nexte7: lcallkey;等待是否有键按下 mova,r5 cjne a,#0ffh,press5 sjmp nexte7 press5: cjnea,#05h,nexte8;按下确定键,所选货物掉出 mova,b subba,#04h movr0,#02h;将选择的货物数量值存入r0 lcalloutmoney;找钱 lcalloutgoods ;所选货物掉出 jmp main ; 返回,等待下一次投币nexte8: cjnea,#06h,backe3 mova,b;退还全部的钱 lcall outmoney jmp main ; 返回,等待下一次投币backe3: jmpnexte7 ;选择其他键时返回,等到有键按nexte4: cjnea,#04h,nexte9;选择一次性购买3个货物 mova,b cjnea,#06h,nexte10;判断投入的货币数是否为6元 movr0,#03h;将选择的货物数量值存入r0loope3: lcallkey;等待是否有键按下 mova,r5 cjne a,#0ffh,press6 sjmp loope3press6: cjnea,#05h,nexte11;按下确定键,所选货物掉出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论