基于STM32的智能点菜机的设计 

摘 要

如今的生活中,越来越多的科技伴随着技术的进步在不断地发展,我们日常生活所原本形成的诸多规律被打破,某些本身比较繁琐的事情变得更加的简便,在科学技术领域,只要我们不出门就可以领略到世界各地的风采,科技在改变人类的生活,本次设计的基于STM32的智能点菜机,能够优化餐饮业的点餐系统,使得顾客和商家更加便利与便捷,本次设计的点餐机,能识别客户的IC卡,以及能够通过无线传输技术将数据传输给厨房进行制作,极大提高了用餐效率和便捷性

 

 

关键词:点餐机;餐饮系统;人机交互;RFID射频

 

 

 

 

Abstract

 

 

In today's life, more and more science and technology are constantly developing with the progress of technology. Many laws originally formed in our daily life have been broken. Some of the more complicated things become more simple. In the field of science and technology, as long as we don't go out, we can appreciate the world's style. Science and technology are changing human life. This design is based on stm3 The intelligent ordering machine of 2 can optimize the ordering system of the catering industry, making customers and businesses more convenient and convenient. The ordering machine designed this time can identify customers' IC cards and transmit data to the kitchen for production through wireless transmission technology, greatly improving the efficiency and convenience of dining.

 

Key Words: Ordering machine; Catering system; Human computer interaction; RFID radio frequency

 

 

 

 

 

 

 

 

 

目录

1 绪 论 1

1.1 引言 1

1.2设计主要任务 1

1.3本次设计论文的架构 2

1.4 STM32简介 2

2 点餐系统实现方案 5

2.1系统总设计框图 5

2.2 系统设计的原理 5

2.3 服务台点餐系统 6

2.3.1 数字点餐的功能 6

2.3.2 已点餐的信息显示功能 6

2.3.3 餐桌识别功能 7

2.3.4 与后台接收端通信功能 7

2.4 后台接收端 8

2.4.1 用餐界面切换的功能 8

2.4.2 需要制作餐牌显示功能 8

3.1 服务点餐端 9

3.1.1 红外电路设计 9

3.1.2 RC522电路设计 10

3.1.3 LCD12864电路设计 10

3.1.4 ESP8266电路设计 11

3.2 后台接收端 11

3.2.1 按键电路设计 11

4 点餐系统的软件设计 13

4.1 软件设计和流程图 13

4.2 模块时序分析 14

4.3 餐桌程序分析 17

4.4 点餐数据分析 17

5 系统调试与存在的问题 18

5.1 常见问题 18

5.2 软件调试 18

结论 19

参考文献 21

附录A:部分主要程序 22

 

 

1 绪 论

1.1 引言

当今社会的科技水平在不断地提高和进步,同时也在进一步冲击我们的生活,把我们生活中原本琐碎的事情智能化起来,在当今科技如此发达的社会中,科技所带给人们的不只是能够提高人们的生活质量,而且可以改善社会运行的效率,本文所设计的智能点餐机目的还是能够改善如今人们对于生活质量的追求,在餐厅中排队点餐,又是拥挤,难免还会出错,在一些餐厅中,服务员可以通过把点餐的菜品送到指定餐桌上来完成,若是在一些人多的餐厅,或是一些繁华的地段,这种方法完全是行不通的,所以这就是需要一个全新的点餐系统的出现来解决这一问题,这样的设计把信息集中起来,减少出错,同时能够减少部分劳动力,降低了成本,实现了精准点餐服务。

这种智能点餐机他的特点主要是集中在可以使用某些传感器和特定的控制器来实现对整个系统的控制,该控制系统的特点就是便捷、方便、智能化等特点,针对后台的接收系统中,主要还是利用了小型控制器来进行控制,本次设计主要根据STM32F030C8,该类型的单片机芯片具有点数多的特点,而且集成化程度非常之高,本次设计还涉及到后台厨房的软件和硬件设计,把前台的点餐与后台的响应相结合,就能够完成本次基于STM32的智能点菜机的设计。基于STM32点菜机的特点在于,它能够使用一些特定的传感器或者说是控制器组合成一个完整的系统,该系统具有便捷、操作简单、智能化水平高等优点。针对于前台和后台的厨房的数据终端的点餐系统中,主要是利用了微型的控制器构建的对于32位单片机的数据传送交互的协议。在本次设计中根据STM32F030C8,是一款密脚而且集成度高的芯片,所以在本次设计中,使用该芯片的一款最小系统板作为设计的核心。其对于系统设计中包含了对于前台的点餐的硬件设计和软件设计,和后台厨房的软件设计和硬件设计。最终通过这两部设计的不断磨合,完成了这部分的基本功能。

1.2设计主要任务

本次设计主要是需要设计一款集中消费、点餐、配餐为一体的智能点餐系统设计,除了需要设计通知顾客取餐的功能以外,还需要实现用户的登录,消费计算、结账、等等功能,设计所需要的详细情况如下:

1、无线传送功能:可以实现前台和后台的数据传送功能。

2、点餐功能:根据商家提供的菜品进行选择点餐

3、用户登录和IC卡:用户可以根据自身所设置的登录账号和密码来进行点菜,同时忘记4、密码可以实现重置,IC卡能实现对顾客身份的确认。

5、短信通知功能:能够把消费的详细账单发送到顾客的手机里。

基于上述的功能设计,针对本次基于STM32的智能点餐机设计,主要需要解决以下技术难题:对于需要使用的STM32单片机需要一定的编程基础,对于不同的的设计需要体现出不同的思维方式,本次设计的点餐系统是体现人机交互的功能的,在本次设计中有着重要而意义,需要在设计过程中采用较好的构想以及思维模式建立界面,传递给消费者顾客最直观的系统,在对与整个系统的设计,需要注重整体的稳定性,保证系统的在人机交互上更加简便,也更加清晰。

1.3本次设计论文的架构

本次设计的论文目的主要是在于设计出智能化的、一体化的系统,在论文的写作过程中,第一张主要是针对于设计的产品在市场应用中的前景,和本次产品设计的定位,第二章主要是对于本次设计的方案选择,和系统性的论证,主要在系统设计的硬件和软件方面对于系统的每一部分进行阐述,同时对于每部分设计所涉及的功能以及预期达到的目标进行叙述;第三部分主要是介绍本次设计所含有的硬件部分的设计,对电路图的设计也是在本章进行说明;第四部分主要是介绍本次设计所设计的软件部分设计,对于整个系统运行过程中的流程图进行说明。

1.4 STM32简介

STM32基本系统主要有下面几个部分:

1、电源

无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空

对于每组对应的VDD和GND都应至少放置一个104的陶瓷电容用于滤波,并接该电容应放置尽量靠近MCU 

用万用表测试供电电压是否正确,调试时最好用数字电源供电,以便过压或过流烧坏板子,电压最好一步一步从进线端测试到芯片供电端

2、复位、启动选择

Boot引脚与JTAG无关。其仅是用于MCU启动后,判断执行代码的起始地址

在电路设计上可能Boot引脚不会使用,但要求一定要外部连接电阻到地或电源,切不可悬空; STM32三种启动模式对应的存储介质均是芯片内置的,它们是:

用户闪存 = 芯片内置的Flash

SRAM = 芯片内置的RAM区,就是内存

系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序,这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区

在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:

BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。

BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。

BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。

用JTAG口或SWD模式烧写 选择从用户闪存启动。

用串口ISP模式烧写程序时时选择从系统存储启动

3、烧写接口

如果要减小插座的数量,就用SWD模式的仿真,在这个模式下,如果用JLINK只要四根线就可以了,这四根线分别是:3.3V、GND、SWDIO、SWCLK

其中STM32的JTMS/SWDIO接JTAG口的TMS,STM32的JTCK/SWCLK接JTAG口的TCK。如果要用ULINK2,则再加多一条“NRST”,即5条。这个接口你可自行定义,在使用时用杜邦线跳接或做块转换接口板联接仿真器与目标板即可。

在烧写时出现了IDCODE如图有序列号,证明烧写接口是好的!也就是硬件调试通了。如没有也许焊接不过关,从新加固焊接芯片。

4、调试烧录失败的常见原因

目标芯片没有正确连接,不能正常工作 —— 解决方法:确保目标板的最小系统正确连接,芯片能正常工作:VDD、VDDA及VSS 、VDDS已全部正确连接,复位电路能够可靠复位,各复位源不互相影响。

芯片已被读/写保护,调试工具不能读写芯片内置的Flash —— 解决方法:先使用调试工具解除芯片的读/写保护。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2 点餐系统实现方案

2.1系统总设计框图

在本次设计过程中,这款点餐系统是基于STM32进行设计的,能够子在设计过程中通过部分传感器的功能实现,实现对以下几个方面实现功能的应用,如图所示就是索要设计的系统框图:

 

 

图2.1 系统总体设计框图

根据上图所示的系统框图所示,对于整个系统的设计可以主要分为两个部分的设计:第一个部分主要是对于前台点餐系统的设计,对所需要的顾客进行点餐服务,这也是本次设计的核心关键所需要实现的功能。点餐功能的实现需要多个按键的配合,与红外接收设备一起使用,另一部分是射频检测模块,可以用于检测标记在餐桌上的专用标记,同样包含wifi模块的设计,可以用来作为数据的交换,显示模块主要是把菜品的信息和点餐的内容实现显示功能。

第二部分主要就是后端操作,对于从前台传送过来的信息进行处理,对于相应的菜品进行显示,同时对于一些制作好的菜品,通过无线模块进行信息反馈,完成这个点餐过程的制作步骤,在点餐系统中,还可以通过对于红外按键实现对点餐的操作。

2.2 系统设计的原理

本次设计中所运用的原理就是单片机的控制技术,利用单片机的输入输出接口,实现对模块和模块之间的通信操作、以及信息交互,以及模块和模块之间的数据分析处理。

本次设计需要用到红外遥控的控制原理技术,所以本次设计需要掌握对红外遥控技术的工作原理,同时在本次设计中涉及到无线传输的通信的原理,LCD12864以及按键模块的实现需要了解与输入输出接口的原理;对于设计中的IC卡的使用,需要掌握射频检测模块的原理,运用的是RC522射频检测模块,该检测模块在设计中主要是需要掌握SPI原理。

2.3 服务台点餐系统

本次设计中的前台点餐模块,是本次设计的智能点餐机的其中的一个模块,在这个部分中主要还是实现点餐功能,包含无线通信和显示器点菜的功能实现。

2.3.1 数字点餐的功能

本设计中,点餐功能的实现十分重要,点餐功能可以在两个部分中都可以进行操作实现点餐,一种是无线点餐,这种点餐方法主要是利用了红外功能的实现,通过具体的按键,把所需要的信息传递给后台系统,满足点餐的需要,另一种就是在电脑上点餐,这种情况是依靠电脑的数据发送,实现把点餐信息的传输。

 

 

图2—2 红外模块接收头设计电路

2.3.2 已点餐的信息显示功能

因为点餐后,需要把顾客的需要的菜品显示出来,所以设计中需要点餐的显示模块,如图所示就是点餐系统屏幕显示的器件:

 

图2—3 LCD12864

这个显示屏幕可以把顾客的餐桌信息,包括餐桌号,餐桌点餐菜品等信息在屏幕上进行显示,同时也可以在显示屏幕上告知顾客如何进行点餐。

2.3.3 餐桌识别功能

本次设计中对于餐桌要有一定的划分,所以需要具有能够识别的物品来进行划分,在这个方面,可以采用RC522模块[7]作为控制识别系统的核心器件,IC卡本身具有一定的特殊的标记,在本次设计的点餐系统中,需要使用IC卡作为餐桌号码进行识别,利用RC522对IC卡进行识别,获取餐桌号,如下图所示就是RC522元件:

 

图2—4 RC522

2.3.4 与后台接收端通信功能

本次的设计中,可以利用无线数据传输的功能,对从前台传送过来的数据进行处理,所以在后端需要设置无线模块,用于前台信息的接收,使用简单的数据交换的原理和结构,实现对于点餐信息的传递,如图所示就是用于接收信息的模块:

 

 

图2—5 ESP_8266实物图

2.4 后台接收端

2.4.1 用餐界面切换的功能

在本次设计中,考虑到点餐菜品较多的原因,可能在屏幕上不能够一页能够显示完全,所以需要按键对菜单页进行翻页处理,对多页数据信息进行切换翻页处理,如图就是需要的翻页按键:

 

 

图2—6 独立按键实物图

2.4.2 需要制作餐牌显示功能

这一模块主要是应用于能够从前台传送来的菜品信息进行直观的排序,需要添加显示装置,对于已经完成点餐的以及还在排队等待处理的餐牌进行显示,结合上一小节所列出的按键模块,可以对信息实现较全面的显示,同样该显示模块同样使用LCD12864。

 

 

3 点餐系统硬件设计

在本次设计中,因为点餐系统设计前后端的设计,所以硬件部分也需要对前后端都进行设计,前台硬件部分的设计和后端硬件的设计。

前台的硬件部分主要使用在对前台红外电路、射频检测电路、显示电路以及ESP8266电路进行设计,这些电路的设计主要是通过STM32单片机对这些电路进行控制,射频电路的实现主要是依靠SPI管脚通信实现,LCD显示模块需要与输入输出接口相连接,达到数据显示的效果。

另外一部分,后端的硬件设计,有许多的硬件用法和前台的用法相同或者类似,不同的是按键模块的对翻页功能的实现,按键模块共有三部分,一个适用于切换上一页的数据,一个适用于切换下一页的数据,最后一个是用来去除当前的首菜单。

3.1 服务点餐端

本次设计所用到的红外装置,能够和单片机的一个管脚相连接,本次设计中把单片机的PA1管脚作为红外装置的输入管脚,IC卡检测模块的RC522,需要五个管脚与单片机相连接,相应的连接对于SPI的MOSI、MISO、SCK、对应这的PB13、PB15和PB15另外还需要对应的PA8和PB12作为CS和CSN使用,设计中的ESP模块运用串口连接实现对其的控制。

3.1.1 红外电路设计

如图所示就是对于红外电路的设计:

 

图3-1 红外电路设计原理图

如图所示,在上面的电路图中,DA红外数据的传送依靠的是单片机的PA1模块功能,与单片机相连接的其他两个管脚是电源的管脚。

3.1.2 RC522电路设计

如图所示就是射频检测电路的电路图:

 

图3-2 RC522设计原理图

  在上面的电路图中,涉及到RCS522模块,该模块能够获取IC卡的详细信息,获得IC卡的卡号,然后根据卡号实现相关的操作,这一模块的数据传输书要是依靠SPI。

3.1.3 LCD12864电路设计

如图所示,就是点餐机的显示模块:LCD12864的电路设计

 

图3-3 lcd12864设计原理图

上图是LCD12864与单片机的接线图,通过三条导线与LCD12864相连接,对于该模块的电源与5v电压源相连接,逻辑口的电压只需要3.3V,另外对于 PSB管脚,在设计中与低电平相连接,主要是发挥串行数据的传送设计,RST与高电平相连接,是为了防止硬件复位电路。

 

3.1.4 ESP8266电路设计

如图所示,ESP8266电路设计图:

 

图3-4 ESP_8266设计原理图

  在本次设计中,ESP8266的设计主要是针对串行接口以此来实现对该模块的控制设计,设计中的串行接口1的管脚PA9和PA10在设计中,PA9与无线模块ESP8266模块的RXD相连接,PA10与无线模块ESP8266模块的TXD相连接[3]。

 

3.2 后台接收端

在本次设计过程中,为了响应前台服务的点餐系统,所以特地设计了一个后台数据接收端,硬件设计中,包含了数据无线传输模块的数据交换,以及屏幕显示功能提醒厨房制作顾客需要的菜品,和对显示页面的翻页操作功能,部分电路与前台所使用的电路相同,在这里不再过多赘述。

3.2.1 按键电路设计

如图所示,对于独立按键的设计电路图:

 

图3-5 独立按键设计原理图

键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的键盘称为非编码键盘,在单片机组成的各种系统中,用的较多的是非编码键盘。非编码键盘又分为独立键盘和行列式键盘;单片机的IO口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,我们把按键的一端接地,另一端与单片机的某个I/O口相连,开始时先给该IO口赋一高电平,然后让单片机不断地检测该I/O口是杏变为低电平,当按键闭合时,即相当于该I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令。

在上面的系统设计中,主要是通过PA4、PA5和PA6与设计中的弹簧按键相连接,与K1、K2、K3相连接,在硬件设计中,单片机STM32的输入输出接口原本是高电平有效,若是在外界环境下,触发对输入输出接口的控制,再次切换输入输出接口的电平,实现软件的控制。

 

 

 

4 点餐系统的软件设计

4.1 软件设计和流程图

对于整个控制系统而言,整个系统可以划分为两个部分来进行功能的实现,第一部分四前天的点餐功能的实现,第二部分就是实现前台的点餐信息的传递,如图所示就是整个点餐的流程图,另一张图就是针对后台接收系统的流程图:

 

图4-1 点餐端流程图

 

图4-2 后台数据接收端流程图

  如图4-1所示,开始通过系统的初始化进入点餐界面,然后通过射频信号检测设备对IC卡进行检测,读取具体的餐桌号,若是能够获取到点餐桌号的信息,就可以开始点单,然后把点餐的数据进行发送,在屏幕上进行更新,通过无线模块将数据发送,后端就可以接收到相关的点餐信息。

  如图4-2所示,对后端的系统先进行初始化的处理,通过无线模块的接收设备,接收从前台传送的点餐信息,通过独立的按键装置[4],对页面进行切换处理,页面也会更新前台的点餐信息。

 

4.2 模块时序分析

用户管理员主界面如图4-2所示。

用户管理员主界面如图4-2所示。

4.2.1 ESP8266设计

如图所示就是对于ESP8266的时序结构图:

 

图4-3 ESP_8266结构架构图

  对于上面图所示的,上图芯片包含了芯片中的很多部分,比说是对设计晶振的管理,电源的控制,和一些外界可以定义的接口设置,本次设计中仅仅是涉及八个所需要的管脚,其他并没有涉及。如图所示就是电脑上串行接口调试的界面:

 

图4-4 USB转串口界面图

对于在设计中点餐服务端和后台数据接收端,在设计中使用分别对其WIFI的ESP_8266电脑串口控制,因为在ESP_8266内部有数据缓存所以设置一次即可,不用重复设置。

首先对于设计中服务点餐端,要先使用的是串口模式然后对于设置为AP兼容模式:指令为AT+CWMODE=2;然后设置为对应的热点的帐号和密码,详细的指令为AT+CWSAP="ESP8266","965874123",11,3,,然后就是设置UDP的通道详细的指令为AT+CIPSTART="UDP","192.168.4.2",8080,8080,0 设置要连接UDP sta的ip和端口,这个设计使用IP主要是AP模式分配给STA的设计的IP,这个IP对于后台数据接受十分重要。然后设置透传模式详细的AT指令为AT+CIPMODE=1就可以实现通信[1]。

对于设计中后台数据接收端,首先使用串口设置为STA模式,详细的指令为

AT+CWMODE=1;然后就连入上上述中对于对于点餐端的wifi,其详细的指令为以下的格式 AT+CWJAP=" ESP8266","965874123",然后设置UDP的格式,在设计中通过了指令AT+CIPSTART="UDP","192.168.4.1",8080,8080,0 连入对应的IP就,接下来开启透传模式,就可以实现对于数据的传送。

4.2.2 红外接收软件设计

红外通信主要由发射和接收两部分组成。发射端将待发送的二进制信号编码成一系列脉冲串信号,通过红外发射管发送。接收端接收信号的同时,对红外信号进行放大、检波、整形后得到TTL电平编码,送入单片机处理。红外发射二极管发送的信号是频率为38 kHz的间断脉冲串,相当于用二进制信号的编码乘以频率为38 kHz的脉冲信号得到的间断脉冲串。A是二进制信号的编码波形,B是频率为38 kHz周期为26 μs的连续脉冲串,C是经调制后的间断脉冲串(相当于C=A×B),用于红外发射二极管发送的波形,待发送的二进制数据为101。

在上述的时序途中,能够查看到应用于按键的红外传送信号,拥有地址代码、引导代码、地址代码反码、数据代码以及反码,之后还有关于重复码的操作,不同的码有不同的特点,对于高低电平的操作都是像下面介绍的一样,红外装置的数据的传送,逻辑电平1即使依靠0.56ms的高电平和1.79ms的低电平实现的,而逻辑电平0就是依靠0.56ms的高低电平的交互进行表示的。

 

图4-6 红外逻辑波形图

4.3 餐桌程序分析

在设计过程中,一切都是基于开始对桌号的判断所进行的,所以IC卡的识别程序很关键,对于餐桌信息的是被,如果检测到卡片信息,根据所设计的餐桌信息进行显示。

4.4 点餐数据分析

设计过程中,对于数据的传输通过数据帧的传送可以实现信息的传递,在设计的无线模块中,共有N+5个字节数据,如图所示:

 

图4-7数据传送的数据帧

  SYNC的设计比较固定,LEN是存放本次点餐所点餐的数量的存储单元,紧接着的CMD是餐桌的编号OX-,之后是PARAM,是点餐涉及带的餐桌标号,根据其大小,可以支持255道菜品,两个字节代表一个菜品,CHECKSUM为本次的校验位,为固定值为0X44。本次设计中有许多菜品,例如下表:

表4-1菜谱和对应编号

0x01

番茄炒蛋

 

0x02

青椒肉丝

 

0x03

上汤水中怪

 

0x04

剁椒鱼头

 

0x05

酸菜鱼

 

 

5 系统调试与存在的问题

5.1 常见问题

1、逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路等。

2、元器件失效:有两方面的原因:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、集成电路安装方向错误等。

3、可靠性差:因其可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。

4、电源故障:若样机由电源故障,则加电后很容易造成器件损坏。电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。

调试方法:包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,直至检查出原因并排除。

本次硬件调试过程中,对所出现的问题进行了认真的分析和改正,最后能够很好的达到设计要求的效果。

 

5.2 软件调试

软件调试一般分为以下四个阶段:1、 编写程序并查错;2、在C语言的编译系统中编译源程序3、对程序进行编译连接,并及时发现程序中存在的错误;4、改正错误。

在本次调试中出现的问题有:

1、在程序中有的函数名未定义;

2、在抄录程序时,少录入一些字符,如:“;”、“{”、“-”等符号,而出现错误;

3、有一些函数名录入时少写一个字母或顺序颠倒;

4、没有注意函数名的调用及定义;

5、芯片引脚定义出错而导致没有实验现象。

在软件调试过程中,对出现的错误进行了认真的分析和修改,多次调试成功后,能够很好的达到既定的设计效果。

 

 

 

结论

本次所设计的基于STM32的智能点菜机设计,特点主要在于本次设计中,运用一些传感器和控制器构成整个系统,由前台和后端所组成,操作方便,顾客凭借IC卡就可以点餐,IC卡记录着顾客的餐桌号码,前台将点餐信息通过无线模块传送给后端,后端也会运用无线模块对信息进行接收,点餐信息的传递与交互,省去了很多繁杂的过程,运用无线模块、射频检测模块、红外模块实现点餐的便捷化操作,后端依靠显示模块,根据显示的菜品进行制作,且本次设计了单独的按键模块,对屏幕上的菜品进行翻页处理,可以展示更多的点餐信息。

所设计的点餐系统以人为本,主要还是简化点餐的流程,改善或者说是改进,目前许许多多的餐厅,人流量巨大,对于庞大的用餐人群,设计合适的点餐系统,对于餐饮店而言,能够更快的为顾客送上实物,对于顾客而言,可以节省很多不必要的时间花费,通过点餐机,可以实现信息的存储以及传递,点餐系统还可以进行计算价格的功能,最终目的还是为了减少劳动力的小号,能够省去不少的消耗,当然在本次设计中还是有许多的缺陷和不足之处,在设计最开始,还想在后端系统中增加语音播报的功能,但是设计之中由于技术问题和时间问题暂时没有添加设计该功能,但是我相信凭借自己的实力能够慢慢提升自己的水平的。

 

 

 

 

致谢

本次做的毕业设计基于单片机做的毕业设计,虽然对于工业控制自动化方面的知识还是不够了解,但是通过本次设计,能够对单片机控制有更加深入的了解,学习到了不少不曾了解的知识。

在指导老师的细心检查和耐心指导下,包括从论文的撰写和之前的准备工作,老师给予很大的帮助,老师在分析问题的角度和解决问题的方法上给了我很大的启发,让我在设计中能够较快上手。在学校学习期间,在生活上,老师给了我无微不至的帮助和关怀,在学习上,老师对我要求严格,尽可能地为我创造学习条件,帮助我顺利完成学业。老师学识深厚、师德高尚、待人和蔼,严谨的治学态度以及忘我的奉献精神是我终生学习的榜样和目标,老师是本次设计中指引我、帮助我的人,同时老师的治学态度和学术观点让我对未来更加明确,相信在老师的指引下,未来能够走上一条不断进取的成长道路,向他表示感谢!

同时在这几年的学习生活中,不仅是身边的同学,而且学校的老师也在学习生活上帮助我很多,让我明白这一切都来之不易,非常感谢!在老师和同学的影响下,更多的是学会做人做事踏踏实实、勤勤恳恳,做好每一个事,不论是小事还是大事。

感谢我的父母,感谢父母对我的养育之恩,在人生旅途中给予我莫大的帮助,帮助我、使我变得更加坚强。最后对各位参加本人毕业设计评审工作的老师们表示感谢,向你们表示最诚挚的谢意!

 

 

 

 

参考文献

1余锡存,曹国华著.单片机原理及接口技术(第二版) [M].西安:西安电子科技大学出版社,2006。

2朱善军等.单片机接口技术与应用.北京.清华大学出版社,2005。

3胡学海.单片机原理及应用系统设计.北京.京电子工业出版社,2005。

4杨路明著. C语言程序设计教程(第2版) [M]. 北京: 北京邮电大学出版社,2005。

5余家春,Prote199SE 电路设计使用教程[M].北京:中国铁道出版社,2001。

6江宏,李良玉,Protel99SE 电路设计与应用[M].北京:机械工业出版社,2002。

7王金明.数字系统设计[M].北京:电子工业出版社,2009。

8刘斌. SPCE061A单片机在两次采样AD转换中的应用研究[J]. 电子世界,2016,(02):15-16.

9汤传国. 基于超声波测距的倒车雷达系统研究[D].长安大学,2015.

10袁晓溪. 基于单片机的LED显示系统[D].吉林大学,2015.

11江贤志,刘华章,张教育,等. 基于C8051F020单片机的RS485串行通信设计[J]. 电子测量技术,2016,(03):121-124.

12钟武军,鲍培波,刘辉. 近海船舶石油勘探安全警示系统研究与应用[J]. 信息系统工程,2014,(10):70-71.

13陈兴付,张琦. 基于单片机的汽车倒车测距系统硬件电路的设计[J]. 湖南农机,2015,(11):65-66.

14 László Szilágyi,Szidónia Lefkovits,Zsolt Levente Kucsván. A Self-tuning Possibilistic c -Means Clustering Algorithm[M].Springer International Publishing:2018-09-16.

15 Muhammad Rizal,I Dewa Made Subrata,Radite Praeko Agus Setiawan. Desain dan Pengujian Prototipe Sistem Kontrol Mesin Sprayer Dosis Variabel untuk Aplikasi Penyemprotan Pertanian Presisi[J]. Journal Keteknikan Pertanian,2016,04(2).

 

 

附录A:部分主要程序

/*

v1.1 触屏校准出现bug,重启系统后触屏校准页面会延时几秒钟消失,必须按下KEY0才能正常使用

v1.2 修改触屏校准bug,增加提示信息

v1.3 增加S级延时函数,增加WIFI的AT代码指令配置

*/

#include "sys.h"

#include "delay.h"

#include "led.h"

#include "lcd.h"

#include "key.h"

#include "wifi.h"

#include "touch.h"

#include "sram.h"   

#include "malloc.h" 

#include "usart.h"  

#include "sdio_sdcard.h"    

#include "malloc.h" 

#include "w25qxx.h"    

#include "ff.h"  

#include "exfuns.h"    

#include "fontupd.h"

#include "text.h" 

#include "piclib.h" 

#include "string.h" 

#include "math.h" 

#define dishes_num 50

char CIPSEND1[50]= "AT+CIPSEND=0,5\r\n";//发送数据 (id在多连接时使用,连接哪个或给哪个发送数据则需要指定ID)

u8 res;

DIR picdir; //图片目录

FILINFO picfileinfo; //文件信息

u8 *fn; //长文件名

u8 dishes[100]=NULL;

//u8 dishes[100];

u8 *fn_dishes=dishes; //菜名

u8 *pname; //带路径的文件名

u16 totpicnum; //图片文件总数

u16 curindex; //图片当前索引

u8 key; //键值

u8 pause=0; //暂停标记

u8 t;

u16 temp;

u16 *picindextbl; //图片索引表  

 

u8 choice = 0,view = 0,sure = 0;

u8 choice_table[dishes_num] = 0;

//u8 choice_table[dishes_num];

u8 view_table[dishes_num][100];//名字

u8 price_table[dishes_num][10];//价格

u8 total_price[100];

 

//电容触摸屏专有部分

//画水平线

//x0,y0:坐标

//len:线长度

//color:颜色

void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)

{

 if(len==0)return;

 LCD_Fill(x0,y0,x0+len-1,y0,color); 

}

//画实心圆

//x0,y0:坐标

//r:半径

//color:颜色

void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)

{             

 u32 i;

 u32 imax = ((u32)r*707)/1000+1;

 u32 sqmax = (u32)r*(u32)r+(u32)r/2;

 u32 x=r;

 gui_draw_hline(x0-r,y0,2*r,color);

 for (i=1;i<=imax;i++) 

 {

  if ((i*i+x*x)>sqmax)// draw lines from outside  

  {

    if (x>imax) 

   {

    gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);

    gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);

   }

   x--;

  }

  // draw lines from inside (center)  

  gui_draw_hline(x0-x,y0+i,2*x,color);

  gui_draw_hline(x0-x,y0-i,2*x,color);

 }

}  

//两个数之差的绝对值 

//x1,x2:需取差值的两个数

//返回值:|x1-x2|

u16 my_abs(u16 x1,u16 x2)

{    

 if(x1>x2)return x1-x2;

 else return x2-x1;

}  

//画一条粗线

//(x1,y1),(x2,y2):线条的起始坐标

//size:线条的粗细程度

//color:线条的颜色

 

   Show_Str(30,90,200,16,"Welcome",16,0);     

         

 if(tp_dev.touchtype!=0XFF)LCD_ShowString(25,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示

 delay_ms(500);

 

  while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹

  {     

  Show_Str(30,170,240,16,"PICTURE ERROR!",16,0);

  delay_ms(200);      

  LCD_Fill(30,170,240,186,WHITE);//清除显示      

  delay_ms(200);      

 }  

 totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数

  while(totpicnum==NULL)//图片文件为0  

  {     

  Show_Str(30,170,240,16,"NO PICTURE!",16,0);

  delay_ms(200);      

  LCD_Fill(30,170,240,186,WHITE);//清除显示      

  delay_ms(200);      

 }

  picfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度

 picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize); //为长文件缓存区分配内存

  pname=mymalloc(SRAMIN,picfileinfo.lfsize); //为带路径的文件名分配内存

  picindextbl=mymalloc(SRAMIN,2*totpicnum); //申请2*totpicnum个字节的内存,用于存放图片索引

  

 

  while(1) 

  {

   key=KEY_Scan(0);

   tp_dev.scan(0);//触屏输入    

   if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下

   { 

    if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)

    {

     if(tp_dev.x[0]>(lcddev.width-96)&&tp_dev.y[0]<(lcddev.height-64)&&tp_dev.y[0]>64) //下一张

     {

      curindex++;      

      if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始

      break;

     }

     else if(tp_dev.x[0]<(96)&&tp_dev.y[0]<(lcddev.height-64)&&tp_dev.y[0]>64) //上一张

     {

      if(curindex)curindex--;//图片当前索引  

      else curindex=totpicnum-1;

      break;

     }

     else if(tp_dev.x[0]>(lcddev.width-2-8*strlen("OK"))&&tp_dev.x[0]<lcddev.width&&tp_dev.y[0]>(lcddev.height-48)) //确定

     {     

      /*主界面显示页面功能栏*/

      //点击提交菜单变色提示

      lcd_draw_bline((lcddev.width-2-8*strlen("OK")),(lcddev.height-30),(lcddev.width-2),(lcddev.height-30),11,RED);//画一条粗线

      delay_ms(200);

      Load_Drow_Dialog(); //显示 选择、预览、确定 图标

      Show_Str((lcddev.width/2-8*strlen((const char*)fn_dishes)/2),2,240,16,fn_dishes,16,1); //显示图片(菜名)名字

      Show_Str((lcddev.width/2-8*strlen((const char*)price_table[curindex])/2-8*strlen((const char*)"yuan")/2),22,240,16,price_table[curindex],16,1); //显示单价

      Show_Str((lcddev.width/2+8*strlen((const char*)price_table[curindex])/2-8*strlen((const char*)"yuan")/2),22,240,16,"yuan",16,1); //显示单价单位

      ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片

      for(s1=0;s1<totpicnum;s1++)//图片文件总数

      {

       if(choice_table[s1] != 0)

       {

//s2++;

//printf("%d %s \r\n",s2,view_table[s1]);

        wifi_set(CIPSEND); //发送数据

        delay_s(5);

        //if(strstr(buf,"SEND OK"))

        //{

         //Show_Str(30,122,300,16,"send OK",16,0);

        //}

        wifi_set((char *)view_table[s1]);

        //printf("choice_table = %s\r\n",choice_table);

        printf("%s",view_table[s1]);//下单列表正确

        //USART_SendData(USART3,view_table[s1]);

//USART_SendData(USART1, choice_table[s1]); //向串口1发送数据

        while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

       }

      }

      s2 = 0;

     }

     else if(tp_dev.x[0]>(lcddev.width/2-8*strlen("Look"))&&tp_dev.x[0]<(lcddev.width-2-8*strlen("OK"))&&tp_dev.y[0]>(lcddev.height-48)) //预览

     {

      LCD_Clear(WHITE);//清屏   

      for(i = 0;i<=totpicnum;i++)//预览菜品内显示

      {

       if(choice_table[i] != 0)

       {

        sscanf(price_table[i],"%d",&s2);

        price = price + s2;

        Show_Str(20,(2+20*j),240,16,view_table[i],16,1); //显示图片(菜名)名字

        Show_Str(120,(2+20*j),240,16,price_table[i],16,1); //显示图片(菜名)名字

        Show_Str(120+8*strlen((const char*)price_table[curindex]),(2+20*j),240,16,"yuan",16,1);

        j++;

       }

       if(j != 0 && i == totpicnum)

       {

        sprintf(total_price,"%d",price);

        LCD_DrawLine(0,0,240,0);

        LCD_DrawLine(0,(2+20*j),240,(2+20*j));

        j++;

        Show_Str(20,(2+18*j),240,16,"all",16,1); 

        Show_Str(120,(2+18*j),240,16,total_price,16,1); 

        Show_Str(120+8*strlen((const char*)total_price),(2+18*j),240,16,"yuan",16,1);

        Show_Str(100,(100+15*j),240,16,"^_^",16,1);

        j++;

        price = 0;

       }

      }

      if(j == 0)//没有菜品

      {

       Show_Str(40,130,200,16,"no select",16,1);

       Show_Str(40,150,200,16,"left/right to return",16,1);

      }

      else//进入预览菜单页面

       Show_Str(40,(20+20*j),200,16,"left/right to return",16,1); 

      j=0;

     }

       lcd_draw_bline(10,(lcddev.height-35),30,(lcddev.height-19),3,RED);//画一条粗线

       lcd_draw_bline(30,(lcddev.height-19),50,(lcddev.height-45),3,RED);

      }

      else //菜品取消触屏,否则不能取消

      {

       choice_table[curindex] = 0;

       memset(view_table[curindex], '\0', sizeof(view_table[curindex]));;

       Load_Drow_Dialog(); //显示 选择、预览、确定 图标

       Show_Str((lcddev.width/2-8*strlen((const char*)fn_dishes)/2),2,240,16,fn_dishes,16,1); //显示图片(菜名)名字

       Show_Str((lcddev.width/2-8*strlen((const char*)price_table[curindex])/2-8*strlen((const char*)"yuan")/2),22,240,16,price_table[curindex],16,1); //显示单价

       Show_Str((lcddev.width/2+8*strlen((const char*)price_table[curindex])/2-8*strlen((const char*)"yuan")/2),22,240,16,"yuan",16,1); //显示单价单位

       ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片   

      }

      choice ++;

      choice %= 2;

     }

    }

    while(tp_dev.sta&TP_PRES_DOWN)//触屏被按下

    {

     tp_dev.scan(0);//0是屏幕扫描

    }

   }

   else if((t%20)==0)

   { 

    LED0=0;//LED0闪烁,提示程序正在运行.

    LED1=1;

    delay_ms(100);

    LED0=1;//LED0闪烁,提示程序正在运行.

    LED1=0;

   }

   

   

   //wifi_set(CIPSEND1);

   //wifi_set("111111111");

   // delay_ms(100);

  }          

 }              

 myfree(SRAMIN,picfileinfo.lfname); //释放内存       

 myfree(SRAMIN,pname); //释放内存       

 myfree(SRAMIN,picindextbl); //释放内存  

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值