点菜系统.docx
- 文档编号:30399941
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:43
- 大小:448.81KB
点菜系统.docx
《点菜系统.docx》由会员分享,可在线阅读,更多相关《点菜系统.docx(43页珍藏版)》请在冰豆网上搜索。
点菜系统
湖南工程学院
专业设计
课程名称嵌入式系统
课题名称简易酒店终端设计
专业电子信息工程
班级0703班
学号200701030312
姓名刘其海
指导教师陈军根
2011年1月3日
湖南工程学院
课程设计任务书
课程名称嵌入式系统
题目简易酒店点菜终端设计
专业班级电子信息0703
学生姓名刘其海
指导老师陈军根
审批
任务书下达日期2011年1月3日
设计完成日期20011年1月15日
设计内容与设计要求
一.设计内容
利用单片机、液晶、键盘设计一个简易酒店点菜终端软件系统,要求:
1.采用PROTEUS软件实现;
2.液晶采用AMPIRF12864;
3.键盘输入选择菜名、确认、查询等功能;
4.点菜系统的显示模式自行定义;
5. 要求保持桌号和相应的菜单,并有查询功能。
二.设计要求
1.设计思路清晰,给出整体设计框图;
2.给出具体设计思路和电路图,画出程序流程图;
3.给出设计源程序;
4.进行实验调试,验证设计结果;
5.编写设计说明书。
主要设计条件
1.提供PROTEUS设计软件;
说明书格式
1.课程设计封面;
2.任务书;
3.说明书目录;
4.设计总体思路,基本原理和框图;
5.单元函数设计;
6.程序调试与结果;
7.总结与体会;
8.附录;
9.参考文献;
10.试验源程序。
进度安排
第一周星期一:
下达设计任务书,介绍课题内容与要求;查找资料,确定总体设计方案。
第一周星期二:
阅读相关资料。
第一周星期三~周五:
设计原理框图;
第二周星期一~周五:
编写软件
第三周星期一~周三:
软件调试
第三周周四、周五:
书写设计报告,画整机原理图;答辩。
参考文献
1、谭浩强编C语言程序设计清华大学出版社
2、王迎旭编单片机原理与应用机械工业出版社
3、点阵字符液晶显示模块使用手册(HD44780)
4、LCD汉字取模软件使用手册
5、AMPIRE128X64资料
6、Proteus软件、keil软件使用说明
7、
目录
一、设计总体思路和系统框图1
1.1设计思路1
1.2系统框图1
1.3系统显示框图2
二、单元模块设计3
2.1AT89C52单片机模块3
2.1.1AT89C52介绍3
2.1.2AT89C52管脚图3
2.1.3头文件注解4
2.2键盘控制模块5
2.2.1键盘功能5
2.2.2按键判断程序6
2.3LCD模块7
2.3.1AMPIRE128x64简介7
2.3.2AMPIRE128x64指令说明7
2.3.3LCD驱动程序8
三、系统仿真与结果10
3.1开机显示10
3.2主菜单显示11
3.3子菜单显示11
3.4点菜成功显示12
四、总结与体会13
五、附录14
5.1仿真电路图14
5.2程序清单15
六、参考文献25
一、设计总体思路和系统框图
1.1设计思路
根据设计要求利用单片机、液晶、键盘设计一个简易酒店点菜终端软件系统,选取AT89C52单片机、AMPIRE12864LCD和KEYPAD数字键盘构成主要模块,加以设计简单辅助电路和C语言程序构成简易酒店点菜终端软件系统,并利用Proteus软件进行仿真。
1.2系统框图
按照设计思路,系统框图如下:
A
T
8
9
C
5
2
AMPIRE128X64
键盘控制模块
图一系统框图
1.3系统显示框图
将各模块在Proteus仿真软件中连接好后,点击“运行”,结合键盘上的“2”、“5”、“8”键(分别实现向下选择、确认和向上选择功能)可以在LCD上看到开机画面、各系菜单以及其子菜单。
显示框图如图二。
开始
闪烁WELCOME!
字样
返回
湘菜
粤菜
苏菜
浙菜
闽菜
川菜
鲁菜
各菜系子菜单
显示点菜成功!
图二显示框图
二、单元模块设计
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管脚图
2AT89C52管脚图如下:
图三AT89C52管脚图
2.1.3头文件注解
在用c语言编程是往往第一行就是reg51.h或者其他的自定义头文件,系统编程将要使用到两个头文件,分别是reg52.h和code.h。
下面就reg52.h头文件作简单解释,code.h头文件的编写主要是为了存放菜单中所要使用的汉字的字模,以便主程序调用,程序清单将在附录中给出。
程序的第一行是一个“文件包含”处理,所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来。
程序中包含REG51.h头文件的目的是为了要使用P1(还有其他更多的符号)这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量。
不难看出,程序里都是一些符号的定义,即规定符号名与地址的对应关系。
注意其中有sfrP1=0x90;这样的一行,即定义P1与地址0x90对应,P1口的地址就是0x90(0x90是C语言中十六进制数的写法,相当于汇编语言中写90H)。
从这里还可以看到一个频繁出现的词:
sfr,sfr并非标准C语言的关键字,而是Keil编译软件为能直接访问80C51中的SFR而提供了一个新的关键词,其用法是:
sfrt变量名=地址值。
2.2键盘控制模块
2.2.1键盘功能
本系统采用的键盘是小型数字键盘,其图如下:
图四键盘图
由于点菜系统所需要的按键不多,因此在这里只选用3个键实现向下选择、确认和向上选择功能的按键,分别是2、5、8数字键。
2.2.2按键判断程序
程序中#definekeydataP1定义了单片机P1借口为键盘输入控制串口。
在仿真电路,中键盘的A、B、C、D管脚分别与P1.0~P1.3相连,同时各接一个阻值为10K的上拉电阻。
1、2、3、4管脚分别与P1.4~P1.7相连。
按键判断程序如下:
chargetkey()//按键判断
{chari;
keydata=0x0f;
while(keydata==0x0f);//判断有无按键按下,无则等待
delay10ms();//去抖动
keydata=0xef;
if(keydata==0xee)i=12;
elseif(keydata==0xed)i=8;
elseif(keydata==0xeb)i=4;
elseif(keydata==0xe7)i=0;
keydata=0xdf;
if(keydata==0xde)i=13;
elseif(keydata==0xdd)i=9;
elseif(keydata==0xdb)i=5;
elseif(keydata==0xd7)i=1;
keydata=0xbf;
if(keydata==0xbe)i=14;
elseif(keydata==0xbd)i=10;
elseif(keydata==0xbb)i=6;
elseif(keydata==0xb7)i=2;
keydata=0x7f;
if(keydata==0x7e)i=15;
elseif(keydata==0x7d)i=11;
elseif(keydata==0x7b)i=7;
elseif(keydata==0x77)i=3;
delay10ms();//去抖动
keydata=0x0f;
return(i);}
2.3LCD模块
2.3.1AMPIRE128x64简介
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.2AMPIRE128x64指令说明
AMPIRE128x64共有7个指令,下面分别加以说明:
显示开关:
0x3e关;0x3f开(R/W=0,RS=0)。
显示起始行:
0xc0+i,i取值0至63(R/W=0,RS=0)。
设置DDRAM页地址(X地址):
0xb8+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。
指令表如表一所示。
表一AMPIRE128x64指令表
DDRAM地址表如表二所示:
表二DDRAM地址表
2.3.3LCD驱动程序
驱动程序如下:
displayon()//开显示
{
cs1=1;
cs2=0;
checkbusy();
rw=0;
rs=0;
lcd=0x3f;
e=1;
e=0;
cs1=0;
cs2=1;
checkbusy();
rw=0;
rs=0;
lcd=0x3f;
e=1;
e=0;
}
displayoff()//关显示
{
cs1=1;
cs2=0;
checkbusy();
rw=0;
rs=0;
lcd=0x3e;
e=1;
e=0;
cs1=0;
cs2=1;
checkbusy();
rw=0;
rs=0;
lcd=0x3e;
e=1;
e=0;
}
rwcmd(uncharcmd)//写指令
{
checkbusy();
rw=0;
rs=0;
lcd=cmd;
e=1;
e=0;
}
rwdata(unchardisplaydata)//写数据
{
checkbusy();
rw=0;
rs=1;
lcd=displaydata;
e=1;
e=0;
}
voidaddresswrite(uncharx,unchary)//写地址函数
{
uncharunit;
rwcmd(0x0c);//写z地址,一般z地址默认为0
unit=x+0xb8;
rwcmd(unit);//写x地址;
unit=y+0x40;
rwcmd(unit);//写y地址
}
三、系统仿真与结果
3.1开机显示
利用Proteus软件仿真,系统运行后,会显示如下的开机画面。
图五开机画面
图中“作者简介”字样为反白显示,按“2”键可向下选择,同时也是反白显示。
3.2主菜单显示
在开机画面中,选中菜单选项,并按键“5”可以进入主菜单:
图六主菜单画面
上图中显示的是七大菜系构成的主菜单,选中各菜系可进入其子菜单进行点菜,选中“返回”,则返回主菜单。
3.3子菜单显示
各大菜系中分别各有几道名菜可供顾客享用,下面以点鲁菜系下的糖醋鲤鱼为例说明点菜方法,其他菜系点菜方法类似。
选中鲁菜后,可以看到如下的菜单及其价格:
图七鲁系子菜单
此时选中的是糖醋鲤鱼,按键“5”可以确认点中鲁菜中的一道糖醋鲤鱼。
若要点其他的菜,可以上下移动反白显示光标,选中“返回”则进入主菜单。
3.4点菜成功显示
点菜成功后会显示“点菜成功!
”的画面,如下图:
图八点菜成功画面
四、总结与体会
五、附录
5.1仿真电路图
5.2程序清单
Main.c
#include"reg52.h"
#include"code.h"
#definersP20
#definerwP21
#defineeP22
#definecs1P23
#definecs2P24
#definelcdP0
#definekeydataP1
sbitP20=P2^0;
sbitP21=P2^1;
sbitP22=P2^2;
sbitP23=P2^3;
sbitP24=P2^4;
bitbusy_bit=1;
#defineuncharunsignedchar
unchari,j,k;
voiddelay10ms(void)
{
for(j=3;j>0;j--)
for(k=214;k>0;k--);
}
chargetkey()
{chari;
keydata=0x0f;
while(keydata==0x0f);
delay10ms();
keydata=0xef;
if(keydata==0xee)i=12;
elseif(keydata==0xed)i=8;
elseif(keydata==0xeb)i=4;
elseif(keydata==0xe7)i=0;
keydata=0xdf;
if(keydata==0xde)i=13;
elseif(keydata==0xdd)i=9;
elseif(keydata==0xdb)i=5;
elseif(keydata==0xd7)i=1;
keydata=0xbf;
if(keydata==0xbe)i=14;
elseif(keydata==0xbd)i=10;
elseif(keydata==0xbb)i=6;
elseif(keydata==0xb7)i=2;
keydata=0x7f;
if(keydata==0x7e)i=15;
elseif(keydata==0x7d)i=11;
elseif(keydata==0x7b)i=7;
elseif(keydata==0x77)i=3;
delay10ms();//去抖动
keydata=0x0f;
return(i);
}
voidcheckbusy(void)
{
uncharstate=0;
while(busy_bit)
{lcd=0xFF;//空读操作
rw=1;
rs=0;
e=1;
e=1;
e=0;
lcd=0xFF;//再读才有效
rw=1;
rs=0;
e=1;
state=lcd;
e=0;
busy_bit=(bit)(state>>7);
}
}
displayon()
{cs1=1;
cs2=0;
checkbusy();
rw=0;
rs=0;
lcd=0x3f;
e=1;
e=0;
cs1=0;
cs2=1;
checkbusy();
rw=0;
rs=0;
lcd=0x3f;
e=1;
e=0;
}
displayoff()
{
cs1=1;
cs2=0;
checkbusy();
rw=0;
rs=0;
lcd=0x3e;
e=1;
e=0;
cs1=0;
cs2=1;
checkbusy();
rw=0;
rs=0;
lcd=0x3e;
e=1;
e=0;
}
rwcmd(uncharcmd)
{
checkbusy();
rw=0;
rs=0;
lcd=cmd;
e=1;
e=0;
}
rwdata(unchardisplaydata)
{
checkbusy();
rw=0;
rs=1;
lcd=displaydata;
e=1;
e=0;
}
voidaddresswrite(uncharx,unchary)
{
uncharunit;
rwcmd(0x0c);
unit=x+0xb8;
rwcmd(unit);
unit=y+0x40;
rwcmd(unit);
}
voiddisplay(uncharbeginx,uncharendx,uncharbeginy,uncharendy,uncharblock,uncharp,uncharcolour)
{
if(block==1){cs1=0;cs2=1;}
if(block==2){cs1=1;cs2=0;}
for(i=beginx;i { addresswrite(i,beginy); for(j=beginy;j {if(colour==1) switch(p) { case1: rwdata(~character1[i][j]);break; case2: rwdata(~character2[i][j]);break; case3: rwdata(~character3[i][j]);break; case4: rwdata(~character4[i][j]);break; case5: rwdata(~character5[i][j]);break; case6: rwdata(~character6[i][j]);break; case7: rwdata(~character7[i][j]);break; case8: rwdata(~character8[i][j]);break; case9: rwdata(~character9[i][j]);break; case10: rwdata(~character10[i][j]);break; case11: rwdata(~character11[i][j]);break; case12: rwdata(~character12[i][j]);break; case13: rwdata(~character13[i][j]);break; case14: rwdata(~character14[i][j]);break; case15: rwdata(~character15[i][j]);break; case16: rwdata(~character16[i][j]);break; case17: rwdata(~character17[i][j]);break; case18: rwdata(~character18[i][j]);break; case19: rwdata(~character19[i][j]);break; case20: rwdata(~character20[i][j]);break; case21: rwdata(~character21[i][j]);break; case22: rwdata(~character22[i][j]);break; case23: rwdata(~character23[i][j]);break; case24: rwdata(~character24[i][j]);break; case25: rwdata(~character25[i][j]);break; case26: rwdata(~character26[i][j]);break; case27: rwdata(~character27[i][j]);break; case28: rwdata(~character28[i][j]);break; default: break; } elseif(colour==0) switch(p) {case1: rwdata(character1[i][j]);break; case2: rwdata(character2[i][j]);break; case3: rwdata(character3[i][j]);break; case4: rwdata(character4[i][j]);break; case5: rwdata(character5[i][j]);break; case6: rwdata(character6[i][j]);break; case7: rwdata(character7[i][j]);break; case8: rwdata(character8[i][j]);break; case9: rwdata(character9[i][j]);break; case10: rwdata(character10[i][j]);break; case11: rwdata(character11[i][j]);break; case12: rwdata(character12[i][j]);break; case13: rwdata(character13[i][j]);break; case14: rwdata(character14[i][j]);break; case15: rwdata(character15[i][j]);break; case16: rwdata(character16[i][j]);break; case17: rwdata(character17[i][j]);break; case18: rwdata(character18[i][j]);break; case19: rwdata(character19[i][j]);break; case20: rwdata(character20[i][j]);break; case21: rwdata(character21[i][j]);break; case22: rwdata(character22[i][j]);break; case23: rwdata(character23[i][j]);break; case24: rwdata(character24[i][j]);break; case25: rwdata(character25[i][j]);break; case26: rwdata(character26[i][j]);break; }}}} /*****menufunction******/ voidmenufunction(unc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 点菜 系统