您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 基于单片机的简易酒店点菜系统
1第1章.设计总体思路与系统框图1.1设计总体思路根据设计要求我们可知酒店点菜终端系统由控制模块,液晶显示模块,键盘模块组成。控制模块有80C51和80C52可供选择,但考虑到程序占用的空间比较大,所以我选择了80C52单片机。对于液晶显示模块我们这里采用的是LCD12864(64行128列组成)。对于键盘模块由于只要用到三个键,故我们可以用三个按键分别来实现上移,确定,下移功能。再加以简单的辅助电路和C语言程序就可以构成简单的酒店点菜终端系统,在此,我们采用proteus软件进行仿真。1.2系统框图按照设计思路,系统框图如下:图一系统框图AT89C52AMPIRE128X64键盘控制模块21.3系统显示框图将各模块在Proteus仿真软件中连接好后,点击“运行”,结合键盘上的“上移”、“确定”、“下移”键可以在LCD上看到开机画面、各系菜单以及其子菜单。显示框图如图二。图二显示框图鲁菜开始显示作者名称字样川菜闽菜浙菜苏菜粤菜湘菜返回显示点菜成功!各菜系子菜单3第2章.单元函数模块设计2.1AT89C52单片机控制模块2.1.1AT89C52介绍AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。2.1.2AT89C52管脚图AT89C52管脚图如下:图三AT89C52管脚图2.1.3头文件注解在用c语言编程是往往第一行就是reg52.h或者其他的自定义头文件,系统编程将要使用到两个头文件,分别是reg52.h和code.h。下面就reg52.h头文件作简单解释,code.h头文件的编写主要是为了存放菜单中所要使用的汉字的字模,以便主程序调用,程序清单将在附录中给出。程序的第一行是一个“文件包含”处理,4所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来。程序中包含REG51.h头文件的目的是为了要使用P1(还有其他更多的符号)这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量。2.2键盘控制模块2.2.1键盘功能本系统采用的是三个BUTTON分别实现“上移”,“确定”,“下移”三个功能,有了这三个键我们就能实现菜单,子菜单,功能的进入和返回。图四键盘控制模块2.2.2键盘控制程序程序中我定义了P3.0,P3.4,P3.7分别为“上移”,“确定”,“下移”三个功能按键。按键引脚的一端接单片机,一端接低电平,当单片机接收到某个端口的低电平是就表示拿个按键已经按下。否则表示按键没按下,为了更好的实现按键的准确性我加入了消抖程序与松手检测程序。按键判断程序如下:voidkeyscan()//按键判断{if(qd==0){delay(5);if(qd==0){while(!qd);n=1;}}5if(sy==0){delay(5);if(sy==0){while(!sy);m++;if(m7)m=0;}}if(xy==0){delay(5);if(xy==0){while(!xy);m--;if(m==255)m=7;}}}2.3LCD显示模块2.3.1LCD12864功能介绍AMPIRE128x64管脚一共18个(见图五),CS1左半屏片选端,CS2右半屏片选端;VCC、GND就是电源、接地引脚,V0液晶显示驱动电压,RS数据指令选择信号,H为数据,L为指令,也叫D/I,即DATA和INSTRUCTIONS这两个单词的缩写。R/W读写选择信号。E为LCD使能端,R/W为L时,E信号下降沿锁存DB7-DB0;R/W为H时,E为H,DDRAM数据读到DB7-DB0,如果只写不读的话可以接地处理。DB0-DB7数据传输端口。RST为复位信号,-VOUT为液晶显示驱动电压。2.3.2LCD12864指令说明AMPIRE128x64共有7个指令,下面分别加以说明:显示开关:0x3e关;0x3f开(R/W=0,RS=0)。显示起始行:0xc0+i,i取值0至63(R/W=0,RS=0)。设置DDRAM页地址(X地址):60xb8+i,i取值0至7(R/W=0,RS=0),设置Y地址:0x40+i,i取值0至63(R/W=0,RS=0)。写数据:将数据线上的数据DB7-DB0写到DDRAM。Y地址指针自动加1(R/W=0,RS=1)。读数据:将DDRAM中的数据读入1数据线DB7-DB0。Y地址指针自动加1(R/W=1,RS=1)。指令表如表一所示表一LCD12864指令表2.3.3LCD驱动程序驱动程序如下:voidCheckState(){uchardat;//状态信息(判断是否忙)RS=0;//数据\指令选择,D/I(RS)=“L”,表示DB7∽DB0为显示指令数据RW=1;//R/W=“H”,E=“H”数据被读到DB7∽DB0do{DATA=0x00;EN=1;//EN下降沿dat=DATA;EN=0;dat=0x80&dat;仅当第7位为0时才可操作(判别busy信号)}while(!(dat==0x00));}/*写命令到LCD中*/SendCommandToLCD(ucharcom)7{CheckState();//状态检查,LCD是否忙RS=0;//向LCD发送命令。RS=0写指令,RS=1写数据RW=0;//R/W=“L”,E=“H→L”数据被写到IR或DRDATA=com;//com:命令EN=1;//EN下降沿EN=0;}/*设置页0xb8是页的首地址*/voidSetpage(ucharpage){page=0xb8|page;//10111xxx0=page=7设定页地址--X0-7,8行为一页64/8=8,共8页SendCommandToLCD(page);}/*设定显示开始行,0xc0是行的首地址*/voidSetStartLine(ucharstartline){startline=0xc0|startline;//11000000SendCommandToLCD(startline);//设置从哪行开始:0--63,一般从0行开始显示}/*设定列地址--Y0-63,0x40是列的首地址*/voidSetColumn(ucharcolumn){column=column&0x3f;//column最大值为64,越出0=column=63column=0x40|column;//01xxxxxxSendCommandToLCD(column);}/*开关显示,0x3f是开显示,0x3e是关显示*/voidSetOnOff(ucharonoff){onoff=0x3e|onoff;//0011111x,onoff只能为0或者1SendCommandToLCD(onoff);}/*写显示数据*/voidWriteByte(uchardat){CheckState();//状态检查,LCD是否忙RS=1;//RS=0写指令,RS=1写数据RW=0;////R/W=“L”,E=“H→L”数据被写到IR或DRDATA=dat;//dat:显示数据EN=1;//EN下降源8EN=0;}/*选择屏幕screen:0-全屏,1-左屏,2-右屏*/voidSelectScreen(ucharscreen){switch(screen){case0:cs1=1;//全屏cs2=1;break;case1:cs1=1;//左屏cs2=0;break;case2:cs1=0;//右屏cs2=1;break;}}/*清屏screen:0-全屏,1-左屏,2-右屏*/voidClearScreen(ucharscreen){uchari,j;SelectScreen(screen);for(i=0;i8;i++)//控制页数0-7,共8页{Setpage(i);for(j=0;j64;j++)//控制列数0-63,共64列{SetColumn(j);WriteByte(0x00);}//写点内容,列地址自动加1}}voidInitLCD()//初始化LCD{CheckState();SelectScreen(0);SetOnOff(0);//关显示SelectScreen(0);SetOnOff(1);//开显示SelectScreen(0);ClearScreen(0);//清屏SetStartLine(0);//开始行:0}9第3章.系统仿真与结果3.1开机显示利用proteus软件仿真,点击运行之后会显示如下的开机画面。图五开机显示画面图中菜单为反白颜色,按下“确定”键后即可进入菜单。3.2主菜单显示系统开机后,按下“确定”键即可进入主菜单。主菜单显示如下:图六主菜单显示3.3子菜单显示在子菜单中分别有几道菜供顾客享用,当顾客按下“上移”或“下移”键选中想要的菜系再按下“确定”键就可以进入该菜系,再选择自己想要的菜系按下“确定”键即可点菜成功。子菜10单显示如下:图七子菜单显示3.4点菜成功显示当顾客选择到自己想要吃的菜并按下“确定”键后就表示顾客点菜成功。点菜成功显示如下:图八点菜成功显示当顾客再次按下“确定”键后返回菜系菜单,并且已经点过的菜会以一个钩表示。如下图:图九显示已点菜11第4章.总结与体会短短两周的专业设计结束了,回顾这两周我的努力,我觉得我还是收获蛮大的,通过这两周的专业设计,我对单片机有了更深的认识,对LCD12864有了更深入的了解,单片机其实说简单点就是用软件控制单片机各个脚的电平变化,但是实践中还是挺有难度的,这次专业设计我接到的任务是做一个简易的酒店点菜终端系统,刚开始觉得挺有难度的,主要是我对LCD12864一无所知,但是经过上网查找资料及通过看LCD12864的指导手册终于弄懂了这个液晶显示屏,其实一个看似简单的电路,要把他设计出来就比较困难了,这次设计我用的编程语言是C语言,其实单片机的C语言我通过看网上的视频还是有所了解。所以这次编程还算比较顺利,刚开始我只做了两大的菜系,我想这其中的难点就是怎样进入各个子菜单及其返回以及光标的上下移动,我的方法其实也挺简单,就是将选中的菜系字体取反白显示出来。另一个难点就是键盘扫描了,刚开始我出了点小状况,就是按下确定键后不会进入各个菜单,后来认识思考之后才发现用!n代替就行了。每次按键按下n自动取反,最后一个就是各个菜单的显示比较难了,因为你移动一下就是一个状态,最后我经过仔细的思考觉得用个switch…case语句一下子就出来了,虽然这样会显得程序比较复杂,但是我还没有想到其他更好的简单办法所以就用了这个。通过这两周的学习,我学到了很多,毕竟自己也做出了一点东西,蛮有成就感的,其实我也知道这只是冰山一角,要想真正的弄通单片机,今后的学习道路还很漫长,我想我也会深深的记住这次课设给我的经验与教训,在今后的学习中一定要多思考,多实践,那样我才会真正有所成就。最后衷心感谢陈老师在这两周对我的细心指导。12附录5.1仿真电路图135.2程序清单#includereg52.h#includeintrins.h#includecode.h#defineuintunsignedint#defineucharunsignedchar#defineDATAP0//LCD12864数据线sbitsy=P3^0;sbitqd=P3^4;sbitxy=P3^7;sbitRS=P2^0;//数据\指令选择sb
本文标题:基于单片机的简易酒店点菜系统
链接地址:https://www.777doc.com/doc-359715 .html