理科毕业论文(设计)排版模式教务处编制33分类号 密级 U D C 编号 本科毕业论文(设计) 题 目 电子点菜系统 院 (系) 专 业 年 级 学生姓名 学 号 指导教师 二○一○ 年 五 月 华中师范大学学位论文原创性声明本人郑重声明:所呈交的学位论文是本人在导师指导下独立进行研究工作所取得的研究成果除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品本人完全意识到本声明的法律后果由本人承担学位论文作者签名: 日期: 年 月 日.学位论文版权使用授权书本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文本学位论文属于1、保密 □ ,在_____年解密后适用本授权书2、不保密 □请在以上相应方框内打“√”)学位论文作者签名: 日期: 年 月 日导师签名: 日期: 年 月 日目 录内容摘要………………………………………………………………………1 关 键 词………………………………………………………………………1 Abstract………………………………………………………………………1 Key Words ……………………………………………………………………1 1.系统概述与设计原理……………………………………………………2 1.1该系统概述 ………………………………………………………2 1.2系统框图 …………………………………………………………2 1.3系统设计原理 ……………………………………………………3 2.硬件电路设计与计算……………………………………………………4 2.1 AT89C51部分………………………………………………………4 2.2 24C1024总线部分…………………………………………………7 2.3液晶显和键盘矩阵部示部分………………………………………8 3.系统设计流程……………………………………………………………11 3.1硬件部分……………………………………………………………113.2软件部分……………………………………………………………124. 小结………………………………………………………………………31 参考文献………………………………………………………………………32致 谢 …………………………………………………………………………33内容摘要:本电子点菜系统采用AT89C51单片机控制,处理数据并驱动液晶屏来实现对数据的现实。
主要过程如下:利用键盘输入对菜号的选择,然后将选择菜号,传送给单片机进行数据处理,从24C1024存储芯片中提取菜名数据信息,并通过液晶屏将提取菜名数据信息显示出来,最后通过串口传输到电脑上面关 键 词:AT89C51单片机 24C1024存储芯片 12864液晶屏 键盘矩阵Abstract:Electronic ordering device, the key is 24 C1024 and AT89C51 two chips, which 24C1024 used to store all the food's information, through the AT89C51, the information will be transmitted to the LCD menu. However, they need customers to choose good dishes, the menu will be automatically stored in the AT89C51, and then can be directly connected to the computer through the serial port will be transferred to the database menu, store, and display and print it out. The AT89S52 is mainly used to control 24 C1024 and data transfer between the liquid crystal, liquid crystal display part and the serial communication part. Is the core of block board. He was fired through the C language program into the.Key words:AT89C51 Microcontroller 24C1024 memory chips 12864 LCD Keyboard matrix1系统概述与设计原理1.1该系统概述随着人们的生活水平提高,餐饮业的发展也越来越迅猛。
对于人满为患的酒店来说,确保快速、准确的点单是十分必要的,这就需要科学技术做坚强的后盾在这种情况下,电子点菜系统便应运而生,该系统是一款应用于中大型餐厅,方便顾客和服务员点菜的系统它打破了传统点菜的方式,顾客只需通过手中小巧的电子点菜器就可以随意点到自己需要的菜肴,并且方便酒店随时刷新菜谱,为消费者提供最新的美食信息电子点菜系统不仅满足了现代人对快节奏的需要,而且时尚、新颖相信使用电子点菜系统的酒店肯定备受消费者的青睐电子点菜系统应用于中大型酒店,无需传统菜单及服务生,顾客只需使用桌上提供的电子点菜器就可以随意挑选自己想吃的菜品,精致小巧的点菜器配上适合眼睛感官视觉的四行中文液晶显示器,免去了您频繁翻阅传统菜单的烦恼用单片机技术设计、制造的点菜器控制系统,具有集成度高、功能强、体积小、速度快、存储量大、指令丰富,抗干扰性强,性能价格比高,通用性好,推广范围大,工作可靠,指示准确,易于匹配,使用寿命长,标准化系数高等一系列优势和特点1.2 系统框图串口包括:账目管理,编号表,菜谱,信息配置烧录存储窗体控制显示调用菜单串口1.3系统设计原理十二个按键式键盘矩阵,是让顾客可以方便选择菜名,同时可以输入桌号。
一个上翻和下翻键方便顾客浏览更多的菜系,一个确定键确认顾客点的菜肴,还有一个按键是选择在电子点菜器上,主要是24 C1024和AT89C51两块芯片,其中24C1024用来存储所有菜名信息,通过AT89C51,将菜谱信息传输给液晶显示但顾客选择好自己需要的菜品后,菜单将自动存储到AT89C51中,再可以通过串口与电脑直接相连,将菜单传输到数据库中进行存储,并显示、打印出来而AT89C51主要是用来控制24 C1024与液晶之间数据传输,液晶显示部分以及串口通讯部分是整块板的核心部分他是通过C语言程序烧制进去的在顾客点菜过程中,顾客可以通过字母按键对菜单进行分类,找出符合自己口味的菜品类若顾客还想点到固定的菜肴,可以直接通过输入菜名拼音首字母,即可获取菜肴名全部点完按完成键,上方的中文液晶屏将清晰显示谢谢惠顾和请输入桌号等信息,顾客只需控制按键就可以点到自己所需的菜肴,既方便,又省事点菜完成后,服务生可以通过电子点菜器上的串口传输点菜信息到总服务台上的电脑中,电脑再对信息加以分类存储、打印,这样避免了传统点菜的手写误差,也方便顾客结账和餐厅管理2 硬件电路设计与计算2.1 AT89C51单片机2.1.1 描述AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4Kbytes的快速可擦写的只读程序存储器(PEROM)和128 bytes 的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51产品指令系统,片内置通用8位中央处理器(CPU)和flish存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
AT89C51提供以下标准功能:4K 字节flish闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路同时,AT89C51可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位2.1.2电路图引脚功能说明:Vcc:电源电压GND:地P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复位口作为输出口用时,每位能吸收电流的方式驱动8个逻辑门电路,对端口写“1”可 作为高阻抗输入端用P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可做熟出口做输出口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(Iil)P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部地山拉电阻把端口拉到高电平,此时可作为输出口,作输出口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(Iil)P3口:P3口是一组带有内部上拉电阻的8位双向I/O口P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路对P3口写入“1”时,他们被内部上拉电阻拉高并可作为输出口做输出端时,被外部拉低的P3口将用上拉电阻输出电流(Iil)P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下表:端口引脚第二功能P3.0rxd (串行输入口)P3.1txd (串行输出口)P3.2^int0 (外中断0)P3.3^int1 (外中断1)P3.4t0 (定时/计数器0)P3.5t1 (定时/计数器1)P3.6 ^WR (外部数据存储器写选通)P3.7^RD (外部数据存储器读选通)RST:复位输入当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址所存允许)输出脉冲用于所存地址的低8位字节即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲PSEN:程序存储允许(^PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两个^PSEN有效,即输出两个脉冲在此期间,当访问外部数据存储器,这两次有效的^PSEN信号不出现EA/VPP:外部访问允许欲使CPU仅访问外部程序存储器(地址为0000H---FFFFH),EA端必须保持低电平(接地)需注意的是; 如果加密位LB1被编程,复位时内部会锁存EA端状态XTAL1: 振荡器反相放大器的及内部时钟发生器的输出端XTAL2: 振荡器反相放大器的输出端P89C51 特殊功能寄存器2.2 24C1024 部分(I2C总线技术)2.2.1 I2C总线工作原理 总线的构成及信号类型: I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps各种被控制电路均并联在这条总线上,但就像机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关 I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断若未收到应答信号,由判断为受控单元出现故障 这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要 目前有很多半导体集成电路上都集成了I2C接口带有I2C接口的单片机有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等很多外围器件如存储器、监控芯片等也提供I2C接口。
2.2.2 I2C总线操作 I2C规程运用主/从双向通讯器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器主器件和从器件都可以工作于接收和发送状态 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件 控制字节: 在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作 写操作: 写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同 读操作: 读操作有三种基本操作:当前地址读、随机读和顺序读图4给出的是顺序读的时序图应当注意的是:最后一个读操作的第9个时钟周期不是“不关心”为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件2.2.3 主要功能在我这个作品中,由于单片机本身存储控件很小,所以24C1024芯片的主要作为一块存储芯片使用的。
作用就是存储菜谱信息,用户操作按键选择在液晶屏上显示的菜名信息全部是通过读取24C1024芯片中的菜谱数据同时24C1024芯片还要实时接收Csharp软件对菜谱的更新2.3 12864液晶屏和键盘矩阵2.3.1 12864液晶屏简介带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为12864, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面可以显示84行1616点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块基本特性: 1.低电源电压(VDD:+3.0--+5.5V 2.显示分辨率:128×64点 3.内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) 4.内置 128个16×8点阵字符 5.2MHZ时钟频率 6.显示方式:STN、半透、正显 7.驱动方式:1/32DUTY,1/5BIAS 7.视角方向:6点 8.背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 9.通讯方式:串行、并口可选 10.内置DC-DC转换电路,无需外加负压 11.无需片选信号,简化软件设计 12.工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃● 忙标志:BF BF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据.利用STATUS RD 指令,可以将BF读到DB7总线,从而检验模块之工作状态.● 字型产生ROM(CGROM) 字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。
DFF=1为开显示(DISPLAY ON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)DFF 的状态是指令DISPLAY ON/OFF和RST信号控制的 ● 显示数据RAM(DDRAM)模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH) ● 字型产生RAM(CGRAM) 字型产生RAM提供图象定义(造字)功能,可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。
● 地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中 ● 光标/闪烁控制电路此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置2.3.2 液晶部分主要功能液晶部分主要就是显示功能将按键对菜谱的操作显示出来,同时为了方便客人点菜,还要将客人点菜信息和消费情况显示出来供客人预览,等客人确定后在传送到Csharp软件中去2.3.3 键盘部分主要功能十二个按键式键盘矩阵,是让顾客可以方便选择菜名,同时可以输入桌号一个上翻和一个下翻键方便顾客浏览更多的菜系,一个确定键确认顾客点的菜肴,还有一个按键是选择顾客可以通过字母按键对菜单进行分类,找出符合自己口味的菜品类若顾客还想点到固定的菜肴,可以直接通过输入菜名拼音首字母,即可获取菜肴名12864液晶屏主要是显示作用,把在键盘上的种种操作都通过液晶屏显示出来,方便顾客使用3.系统设计流程3.1 硬件部分3.1.1 硬件部分功能简介 单片机硬件部分包括:键盘矩阵,12863液晶屏,24C1024存储芯片,AT89C51芯片。
硬件功能:硬件部分包括电子点菜电路板和一个4*4的键盘矩阵,通过控制电路板上的按键通过单片机使液晶显示自己需要的信息,并保存在单片机中,还有MAX232串口驱动芯片用来驱动串口,然后就可以通过串口输入或输出信息,并保存到C#数据库中去硬件部分还包含包括电子点菜器电路板的设计及焊接,24C1024芯片,AT89C51芯片,液晶,串口等部分其中液晶显示上我选择的是分部显示的原则,就是将我想显示的信息预先存储在我选好的位置上,不同按键按下触发不同内容显示在液晶上,还有个难点就是要将使用者所选择的菜记录下来,我原本的设想是想把所选择的菜名和菜价用一个数组了,可8052的存储空间太小如果点的太多就根本无法存储于是我想到了另一种办法,就是记录菜名号的方法,我在C#发送菜谱时给每一道菜加上一个唯一固定编号一起放送到24C1024中去,当客人点菜时我就用一个数组来存储被点菜的编号,这样就大大降低了对存储空间的使用也提高了数据传输的安全性在一个就是对菜的搜索问题,客人有时想点自己喜欢的菜,在点菜器中翻找太麻烦,他可以自己输入菜的索引从而寻找自己想要点的菜,做搜索在C#上很好做但在单片机上时很难做到的,因为单片机空间小,没有现成的控件使用,也不能针对数据库进行操作。
我用的办法是将顾客所按按键记录下来当顾客点击查询时将得到按键索引和24C1024固定位置的到的菜名索引进行对比,如果相同就从24C1024的相应位置取出菜名和菜价显示在液晶上,这就要求数据存放要做严格要求.再就是每次点完都要记录菜价,这就要求再点菜我确定是必须同时记录所选菜在24C1024中存储的位置,再在这个基础上查询菜价进行记录保存,以便传输到C#进行保存和查询3.1.2 硬件电路图ED1D1D2D2D3D3D4D4D5D5D6D6D7D7D8D8RSRWD8D7D6D5D4D3D2D1ERWRST1IN11R1OUT12T2IN10R2OUT9T1OUT14R1IN13T2OUT7R2IN8C2+4C2-5C1+1C1-3VS+2VS-6U2MAX232XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115U180C51C41uFC31uFC11uFC21uFERRORTXD3RXD2CTS8RTS7DSR6DTR4DCD1RI9P1COMPIMP_PORT=COM4V_BAUDRATE=9600V_DATABITS=8V_PARITY=NONEINPUT_BUFFER_SIZE=1024OUTPUT_BUFFER_SIZE=1024D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3LCD1LM016L234567891RP1RESPACK-8SCL6SDA5WP7A12U3AT24C1024 通过串口与电脑相连相互传送数据。
单片机通过P0口控制液晶显示,通过PI口控制24C1024芯片存储数据,通过串口将菜谱数据写入到24C1024芯片中去,同时调用24C1024芯片数据显示到液晶屏中按键部分图略按键选择菜名,客人最后确认后通过串口回传到PC中3.2 软件部分3.2.1 软件功能简介C sharp软件程序后台软件部分:C#用于后台程序,酒店内部添加删除菜名及菜名索引,并将顾客所点菜显示在C#上;数据库应用与保存菜谱表,桌号消费统计(桌号,总消费,时间),查询视图软件功能:包括C,C#,数据库三大部分其中C用于收集菜谱和存储,用于顾客查找,浏览菜谱并对菜谱进行选择,查看和统计消费总价,并且回传顾客消费信息;C#用于后台程序,酒店内部添加删除菜名及菜名索引,并将顾客所点菜显示在C#上;数据库应用与保存菜谱表,桌号消费统计(桌号,总消费,时间),查询视图在就是串口的数据收发,由于我在显示和搜索时对数据的格式有很高要求,所以在用串口传输数据时在传输前必须要对数据进行严格的格式转换在接受数据时,因为接受的数据有很多种,所以在接受时要对数据进行判断然后再进行分类存储3.2.2 软件流程3.2.3 软件主要代码Csharp后台控制部分:菜谱管理:namespace 点菜{ public partial class 菜谱管理_当前时间 : Form { public 菜谱管理_当前时间() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Refresh_Phone_List(""); } void Refresh_Phone_List(string WhereConditon) { listView1.Items.Clear(); dbClass1 db1 = new dbClass1(); string scond = "select * from 所有菜名信息视图"; if (WhereConditon != "") scond += " where " + WhereConditon + ""; DataTable dt = db1.GetRecords(scond); //向列表视图中添加所有的相关号码记录 for (int i = 0; i < dt.Rows.Count; i++) { string[] subitem = { dt.Rows[i]["菜名"].ToString(), dt.Rows[i]["类型"].ToString(), dt.Rows[i]["时价"].ToString(), }; listView1.Items.Add(new ListViewItem(subitem)); } } string str = "provider=microsoft.jet.oledb.4.0;data source=菜谱管理.mdb"; private void button1_添加_Click(object sender, EventArgs e) { dbClass1 db1 = new dbClass1(); 菜谱修改 newform = new 菜谱修改(); if (newform.ShowDialog() == DialogResult.OK) { OleDbConnection con = new OleDbConnection(str); OleDbCommand cmd = con.CreateCommand(); cmd.CommandText = "insert into 菜谱 (分类号,菜名,时价,菜名缩写) values ('" + newform.cmh + "','" + newform.caiming + "','" + newform.shijia + "','" + newform.caimingsuoxie + "')"; con.Open(); cmd.ExecuteNonQuery(); con.Close(); Form1_Load(sender, e); } } private void button_删除_Click(object sender, EventArgs e) { for (int i = listView1.SelectedItems.Count - 1; i >= 0; i--) { OleDbConnection con = new OleDbConnection(str); OleDbCommand cmd = con.CreateCommand(); cmd.CommandText = "delete from 菜谱 where 菜名='" + listView1.SelectedItems[i].Text + "'"; con.Open(); cmd.ExecuteNonQuery(); con.Close(); } listView1.Items.Clear(); Form1_Load(sender, e); } private void button1_Click(object sender, EventArgs e) { if (listView1.SelectedItems.Count == 1) { 菜谱修改 cform = new 菜谱修改(); cform.caiming = listView1.SelectedItems[0].SubItems[0].Text; cform.shijia = Convert.ToInt16(listView1.SelectedItems[0].SubItems[2].Text); if (cform.ShowDialog() == DialogResult.OK) { OleDbConnection con = new OleDbConnection(str); OleDbCommand cmd = con.CreateCommand(); cmd.CommandText = "update 菜谱 set 时价='" + cform.shijia + "' where 菜名='" + listView1.SelectedItems[0].SubItems[0].Text + "'"; con.Open(); cmd.ExecuteNonQuery(); con.Close(); listView1.Items.Clear(); Form1_Load(sender, e); } } } private void textBox1_TextChanged(object sender, EventArgs e) { Refresh_Phone_List("菜名缩写 like '%" + textBox1.Text.Trim() + "%'"); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("你真的要退出?", "确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Cancel) { e.Cancel = true; } } private void button_向点菜器写入菜谱_Click(object sender, EventArgs e) { serialPort1.Open(); //启用发送数据表记录到串口的函数............. Write_Menu_TO_IIC_24C1024(); //----------------------------------------- serialPort1.Close(); } bool SP_Ready = false; public int j=0; int count = 0; void Write_Menu_TO_IIC_24C1024() { 菜谱传输 pass = new 菜谱传输(); pass.Show(); int j; //1---------- OleDbConnection conn = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=菜谱管理.mdb"); conn.Open(); OleDbDataAdapter odapr = new OleDbDataAdapter("select * from 菜谱 order by 编号", conn); //3------------ DataTable dt = new DataTable(); odapr.Fill(dt); //4--访问所有表行,并发送串口. byte[] Buffer = new byte[24]; for (int i = 0; i < dt.Rows.Count; i++) { j = 0; //序号,分类号,名称,价格,简记 4-2-10-4-5 byte[] f1 = Encoding.Default.GetBytes(dt.Rows[i]["编号"].ToString()); byte[] f3 = Encoding.Default.GetBytes(dt.Rows[i]["菜名"].ToString()); byte[] f4 = Encoding.Default.GetBytes(dt.Rows[i]["时价"].ToString()); byte[] f5 = Encoding.Default.GetBytes(dt.Rows[i]["菜名缩写"].ToString()); pass .cm = dt.Rows[i]["菜名"].ToString(); //将字节缓冲全部清为空格. for (j = 0; j < 24; j++) Buffer[j] = 0x20; for (j = 0; j < f1.Length; j++) Buffer[j] = f1[j]; for (j = 0; j < f3.Length; j++) Buffer[j + 4] = f3[j]; for (j = 0; j < f4.Length; j++) Buffer[j + 14] = f4[j]; for (j = 0; j < f5.Length; j++) Buffer[j + 18] = f5[j]; Buffer[23] = (byte)('\r'); //将所有字段内容分解到字节缓冲后,发送Buffer缓冲. serialPort1.Write(Buffer, 0, Buffer.Length); SP_Ready = false; count += 1; //如串口未就绪则等待............... Application.DoEvents(); while (!SP_Ready) ; } if (count == dt.Rows.Count) { = count; serialPort1.WriteLine("-"); pass.fm = "完成发送"; count = 0; } } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { 接受顾客消费信息 guest = new 接受顾客消费信息(); 已点菜 diancai = new 已点菜(); string rs = serialPort1.ReadLine(); string accept = rs; string[] Recv_MCU_Menu_Info = accept.Split(new char[] { '|' }); if (rs == "Ready!") { SP_Ready = true; } if(Recv_MCU_Menu_Info[0]=="a") { guest.gu_infor = rs; serialPort1.Close(); guest.ShowDialog(); } if (Recv_MCU_Menu_Info[0] == "b") { diancai.C_NO_SET = rs; serialPort1.Close(); diancai.ShowDialog(); } } private void 添加ToolStripMenuItem_Click(object sender, EventArgs e) { button1_添加_Click(sender, e); } private void 更新ToolStripMenuItem_Click(object sender, EventArgs e) { button1_Click(sender, e); } private void 删除ToolStripMenuItem_Click(object sender, EventArgs e) { button_删除_Click(sender, e); } private void 向点菜器写入菜谱ToolStripMenuItem_Click(object sender, EventArgs e) { button_向点菜器写入菜谱_Click(sender, e); } private void 数据备份ToolStripMenuItem_Click(object sender, EventArgs e) { 备份 compress = new 备份(); compress.ShowDialog(); } private void 从点菜器接受菜单ToolStripMenuItem_Click(object sender, EventArgs e) { if (!serialPort1.IsOpen) serialPort1.Open(); serialPort1.WriteLine("+"); } private void button_向从点菜器接受菜单_Click(object sender, EventArgs e) { 向从点菜器接受菜单ToolStripMenuItem_Click(sender, e); } private void 接受点菜菜谱ToolStripMenuItem_Click(object sender, EventArgs e) {。