《嵌入式系统课程设计报告(共23页).doc》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计报告(共23页).doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上课程设计报告基于ARM的嵌入式电子点菜系统班级:学号:姓名:教师评语:教师签名:2012年10月课程设计题目基于ARM的嵌入式电子点菜系统主要内容综合运用液晶屏、触摸屏、键盘、绘图API、图形控件和消息循环等知识,基于ARM处理器编写一段实用的电子点菜器程序。采用的工具方法运行环境:博创UP-3000实验台编译软件:Metrowerks Code Worrior for ARM Developer Suite v1.2芯片:三星S3C44B0X01芯片编译语言:C/C+进度安排14周:编译代码57周:运行实现8周:测试参考资料基于ARM的嵌入式系统设计实验与实践教程专
2、心-专注-专业1. 题目基于ARM的嵌入式电子点菜系统2. 系统简介在基于ARM的嵌入式环境下,本电子点菜系统可实现的功能有:支持触摸屏图形选菜以及记录菜单等功能。界面美观,功能合理,基本达到了实验要求的内容。3. 系统设计3.1设计背景随着我国的餐饮企业的蓬勃发展,餐饮行业成为国内最早的一个完 全市场化的行业,个体民营占绝对优势和主导的行业,市场竞争非常充分,在广大的餐饮企业的经营者的不懈努力下,餐饮行业取得了非常突出的发展和进步。3.2设计意义传统的点菜方式由人工来传递菜单,不仅浪费时间、效率低下;一旦生意火热,单据多,信息量大时,分单、传菜等环节很容易出现错误,从而直接影响服务质量。导致
3、企业造成不必要的损失。而本文介绍的电子点菜系统,大大降低人力资源成本,加快各环节之间的数据流通,对企业软环境的档次有较大提高。在以特色服务吸引客户的同时,有效提高餐饮机构的服务质量和工作效率,为餐饮业创造更多利润。3.3总体设计图1 实验程序流程图3.4代码编译及注释本实验要求实现部分:(1)、MainTask中按键消息获取,处理(2)、按键处理函数OnKey()函数(3)、创建串口处理任务Serial_Receive_Task(void *Id)(4)、 实现串口消息换取,处理(在LCD或数码管上显示)函数OnReceive(char nRdata)初始化操作:void initOSGUI(
4、)/初始化操作系统的图形界面initOSMessage();initOSList();initOSDC();initOSCtrl();initOSFile();/ Main function. /int main(void)ARMTargetInit(); /开发板初始化OSInit(); /操作系统初始化 uHALr_ResetMMU();/复位MMULCD_Init(); /初始化LCD模块LCD_printf(LCD initialization is OKn);/向液晶屏输出数据LCD_printf(320 x 240 Text Moden);initOSGUI();/初始化图形界面L
5、oadFont();/调Unicode字库LoadConfigSys();/使用config.sys文件配置系统设置LCD_printf(Create task on uCOS-II.n);OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_StackSTACKSIZE*8-1, Main_Task_Prio);/ 创建系统任务3.4.1 触摸功能设计实现设计思想是让LCD 显示屏每页显示六道菜,触摸实现点菜确认,所以在触摸屏上安排了九个区间的触摸功能用以下代码完成触摸区域。 recta.left=0;recta.top=0;recta.right=3
6、20;recta.bottom=30;/定义触摸区域大小 pTouch_Position=&Touch_Position;prect=▭precta=&recta; prectb=&rectb;prectc=&rectc;prectd=&rectd;precte=&recte;prectf=&rectf;如上,定义上下左右四个区间的大小来完成触摸区域,六道菜六个触摸区域区域大小根据图片大小而定。触摸区域完成后,就是实现触摸点菜功能了,在这里,我们用到了消息循环,即InitInterface();Uart_Printf(这是01号桌);在进入点菜界面之前有一个欢迎界面,需要通过按键进入
7、点菜界面,这里使用for循环用来判断。for(;)pMsg=WaitMessage(0); /等待消息switch(pMsg-Message)case OSM_KEY:这里的case OSM_KEY表示按键事件,后面用了一个judge函数来进行判断if(judge=0)num=0; state=0; statea=0; stateb=0; statec=0; stated=0; statee=0; statef=0;if(onKey(pMsg-WParam,pMsg-LParam) judge=1; pdc = CreateDC(); ShowBmp(pdc,bmpnamelogo1, 70,
8、 1); ShowBmp(pdc,bmpnamelogo2, 200, 1); ShowBmp(pdc,bmpnamelogo3, 70, 80); ShowBmp(pdc,bmpnamelogo4, 200, 80); ShowBmp(pdc,bmpnamelogo5, 70, 160); ShowBmp(pdc,bmpnamelogo6, 200, 160); OSTimeDly(100);judge=1表示发生了这个事件,进入点菜界面。进入点菜界面后,可以看见每排2道菜,一共六道菜,这是用到了消息循环,同时用用了一次if judge来进行点菜判断,同时定义IsInRect2(prect1
9、,pTouch_Position)函数来判断prect1指向的区域是否有触摸动作,有则同样跳转到菜单画面,case OSM_TOUCH_SCREEN:表示触摸屏动作后系统需响应的进程。if(judge=1)if(IsInRect2(precta, pTouch_Position) if(statea=0) ShowBmp(pdc,dj_Pict, 20,5);statea=1;Uart_Printf(01号桌点了小鸡炖蘑菇t);sysnumber=sysnumber+price0;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str
10、,TRUE);num=sysnumber;ElseFillRect( pdc, 20,5,40,25, GRAPH_MODE_NORMAL, COLOR_WHITE);DrawRectFrame(pdc, 20, 5, 40, 25);statea=0;Uart_Printf(01号桌取消您点了小鸡炖蘑菇t);sysnumber=sysnumber-price0;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber;else if(IsInRect2(prectb, pTouch_Positi
11、on) DeleteMessage(pMsg);/删除消息,释放资源OSTimeDly(200);DestoryDC(pdc);用消息循环来实现点菜和取消点菜的过程,点一下图片为点菜,再点一下就取消了点菜。3.4.2菜单记录的设计实现在最开始初始化完成之后,创建了文本框在点菜界面右下角用来记录菜单,具体代码如下:pTextCtrl=CreateTextCtrl(101, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);SetTextCtrlText(pTextCtrl, str,TRUE);/设置文本框内容在定义图片之前设置了每道菜的
12、单价:int price6=50,50,80,280,180,80;之后每点一道菜,系统自动判断类别并进行菜单记录,增删菜价。SetTextCtrlText(pTextCtrl, str,TRUE);4. 系统实现(1)在ADS1.2中,新建一个项目menu,把操作系统所需要的头文件(*.h)和库文件(*.alf)加入工程中。(2)在创建的Main.c文件中,在Main_Task任务中添加代码,初始化一些变量包括:创建绘图用的DC(createDC)并在绘图完成后删除它(DestoryDC);启动消息循环,等待键盘扫描任务和触摸屏任务发来的消息,并调用相应的函数进行处理。(3)创建界面函数e.
13、c并添加代码,主要定义InitInterface()函数,进行界面初始化并显示图像,包括创建列表框控件InitCtrl()和显示初始图片。InitPicture()。(4)编译通过后,下载到试验台中运行。(5)附(系统源代码Main.c):#include.ucos-iiincludes.h /* uC/OS interface */#include .ucos-iiaddosaddition.h#include .incdrv.h#include .incdrvzlg7289.h#include #include .inctemplate.h#include.incexperiment.h#
14、include .incOSFile.h#include .incdrvUstring.h#include #include .UCOS-IIuhaluart.h/#include .incexio.hextern int Zlg7289SIOBand;extern int Zlg7289SIOCtrl;int num=0;#pragma import(_use_no_semihosting_swi) / ensure no functions that use semihosting /*任务定义*/OS_STK Main_StackSTACKSIZE*8=0, ; /Main_Test_T
15、ask堆栈void Main_Task(void *Id); /Main_Test_Task#define Main_Task_Prio 13OS_STK Dynamic_Display_Task_StackSTACKSIZE*8=0, ; void Dynamic_Display_Task(void *Id); #define Dynamic_Display_Task_Prio 52/*已经定义的OS任务*tcp监控任务11以太网物理层监控任务8触摸屏任务9键盘任务10lcd刷新任务59系统任务1*/*事件定义*/OS_EVENT *Nand_Rw_Sem; /Nand_Flash读写控制权
16、旗语/and you can use it as folloeing:/ Nand_Rw_Sem=OSSemCreate(1); /创建Nand-Flash读写控制权旗语,初值为1满足互斥条件/ OSSemPend(Nand_Rw_Sem,0,&err);/ OSSemPost(Nand_Rw_Sem);OS_EVENT *Uart_Rw_Sem; /Uart读写控制权旗语/and you can use it as folloeing:/ Uart_Rw_Sem=OSSemCreate(1); /创建Uart读写控制权旗语,初值为1满足互斥条件/ OSSemPend(Uart_Rw_Sem,
17、0,&err);/ OSSemPost(Uart_Rw_Sem);/void initOSGUI()/初始化操作系统的图形界面initOSMessage();initOSList();initOSDC();initOSCtrl();initOSFile();/ Main function. /int main(void)ARMTargetInit(); /开发板初始化OSInit(); /操作系统初始化 uHALr_ResetMMU();/复位MMULCD_Init(); /初始化LCD模块LCD_printf(LCD initialization is OKn);/向液晶屏输出数据LCD_p
18、rintf(320 x 240 Text Moden);initOSGUI();/初始化图形界面LoadFont();/调Unicode字库LoadConfigSys();/使用config.sys文件配置系统设置LCD_printf(Create task on uCOS-II.n);OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_StackSTACKSIZE*8-1, Main_Task_Prio);/ 创建系统任务/ 创建串口任务/OSTaskCreate(Dynamic_Display_Task,(void *)0,(OS_STK
19、*)&Dynamic_Display_Task_StackSTACKSIZE*8-1,Dynamic_Display_Task_Prio); / OSAddTask_Init();/创建系统附加任务LCD_printf(Starting uCOS-II.n);LCD_printf(Entering graph mode.n);LCD_ChangeMode(DspGraMode);/变LCD显示模式为文本模式InitRtc();/初始化系统时钟Nand_Rw_Sem=OSSemCreate(1); /创建Nand-Flash读写控制权旗语,初值为1满足互斥条件/OSStart();/操作系统任务
20、调度开始/不会执行到这里return 0;/*char *KeyTable=NumLock,/,*,-,7,8,9,+,4,5,6,1,2,3,Enter,0,.;void onKey(int nkey, int fnkey)PDC pdc;/创建绘图设备上下文结构U16 ch10;ClearScreen();/清屏pdc=CreateDC();/创建绘图设备上下文Uart_Printf(key=%sn, KeyTablenkey);strChar2Unicode(ch, KeyTablenkey);/将数据转化成Unicode 转化函数参考INCDRVustring.hSetPenColor
21、(pdc,RGB( 255,0,0);LCD_printf(KeyTablenkey);LCD_printf(n);/TextOut(pdc,100,100,ch ,TRUE, FONTSIZE_MIDDLE);/文本模式下显示文字DestoryDC(pdc);/删除绘图设备上下文*/ void Main_Task(void *Id) /Main_Test_TaskPOSMSG pMsg=0; int judge=0;int sysnumber=0;int i=0;int j=0;U16 str20; PDC pdc;int price6=50,50,80,280,180,80;char dj
22、_Pict12=1,2,8,_,3,7, , ,B,M,P,0;char dj_Pict112=1,2,8,_,3,5, , ,B,M,P,0;char dj_Pict212=1,2,8,_,3,6, , ,B,M,P,0;char bmpnamelogo112=0,0,0,_,0,1, , ,B,M,P,0; char bmpnamelogo212=0,0,0,_,0,2, , ,B,M,P,0;char bmpnamelogo312=0,0,0,_,0,3, , ,B,M,P,0; char bmpnamelogo412=0,0,0,_,0,4, , ,B,M,P,0; char bmpn
23、amelogo512=0,0,0,_,0,5, , ,B,M,P,0; char bmpnamelogo612=0,0,0,_,0,6, , ,B,M,P,0; int state,statea,stateb,statec,stated,statee,statef;structPOINT Touch_Position,*pTouch_Position;structRECT rect,recta,rectb,rectc,rectd,recte,rectf;structRECT *prect,*precta,*prectb,*prectc,*prectd,*precte,*prectf;PText
24、Ctrl pTextCtrl;state=0;statea=0;stateb=0;statec=0;stated=0;statee=0;statef=0;recta.left=0;recta.top=0;recta.right=320;recta.bottom=30;rectb.left=0;rectb.top=32;rectb.right=320;rectb.bottom=62;rectc.left=0;rectc.top=64;rectc.right=320;rectc.bottom=94;rectd.left=0;rectd.top=96;rectd.right=320;rectd.bo
25、ttom=126;recte.left=0;recte.top=128;recte.right=320;recte.bottom=158;rectf.left=0;rectf.top=160;rectf.right=320;rectf.bottom=190;rect.left=80;rect.top=200;rect.right=300;rect.bottom=240;pTouch_Position=&Touch_Position;prect=▭precta=&recta; prectb=&rectb;prectc=&rectc;prectd=&rectd;precte=&recte
26、;prectf=&rectf;ClearScreen();InitInterface();Uart_Printf(这是01号桌);/消息循环for(;)pMsg=WaitMessage(0); /等待消息switch(pMsg-Message)case OSM_KEY:/Uart_Printf(%d,pMsg-WParam);if(judge=0)num=0; state=0; statea=0; stateb=0; statec=0; stated=0; statee=0; statef=0;if(onKey(pMsg-WParam,pMsg-LParam) judge=1; pdc = C
27、reateDC(); ShowBmp(pdc,bmpnamelogo1, 70, 1); ShowBmp(pdc,bmpnamelogo2, 200, 1); ShowBmp(pdc,bmpnamelogo3, 70, 80); ShowBmp(pdc,bmpnamelogo4, 200, 80); ShowBmp(pdc,bmpnamelogo5, 70, 160); ShowBmp(pdc,bmpnamelogo6, 200, 160); OSTimeDly(100); SetRect(&rect, 180,205,260,225);/设置PID参数轴1P的文本框 pTextCtrl=Cr
28、eateTextCtrl(101, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);/创建文本框 Int2Unicode(sysnumber,str);/将整形数据转换为Unicode数据 /SetWndCtrlFocus(NULL, ID_MainTextCtrl);/将焦点移到文本框中 SetTextCtrlText(pTextCtrl, str,TRUE);/设置文本框内容 /EXIO_8255A_CTRL=0x80; /EXIO_8255A_PORTC=0xff; OSTaskCreate(Dynamic_Display_Ta
29、sk, (void *)0, (OS_STK *)&Dynamic_Display_Task_StackSTACKSIZE*8-1, Dynamic_Display_Task_Prio);/ 1 else if(judge=1)/Uart_Printf(%d,pMsg-WParam);switch(pMsg-WParam)case 15: if(statea=0) ShowBmp(pdc,dj_Pict, 20,5);statea=1;Uart_Printf(01号桌点了小鸡炖蘑菇t);sysnumber=sysnumber+price0;Int2Unicode(sysnumber,str);
30、SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber;elseFillRect( pdc, 20,5,40,25, GRAPH_MODE_NORMAL, COLOR_WHITE);DrawRectFrame(pdc, 20, 5, 40, 25);statea=0;Uart_Printf(01号桌取消您点了小鸡炖蘑菇t);sysnumber=sysnumber-price0;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber;break;cas
31、e 11: if(stateb=0) ShowBmp(pdc,dj_Pict, 20,37);stateb=1;Uart_Printf(01号桌点了酸菜炖粉条t);sysnumber=sysnumber+price1;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber; elseFillRect( pdc, 20,37,40,57, GRAPH_MODE_NORMAL, COLOR_WHITE);DrawRectFrame(pdc, 20, 37, 40, 57);stateb=0;Uart
32、_Printf(01号桌取消了酸菜炖粉条t);sysnumber=sysnumber-price1;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber;break;case 12: if(statec=0) ShowBmp(pdc,dj_Pict, 20,69);statec=1;Uart_Printf(01号桌点了红烧狮子头t);sysnumber=sysnumber+price2;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl,
33、str,TRUE);num=sysnumber; elseFillRect( pdc, 20,69,40,89, GRAPH_MODE_NORMAL, COLOR_WHITE);DrawRectFrame(pdc, 20, 69, 40, 89);statec=0;Uart_Printf(01号桌取消了红烧狮子头t);sysnumber=sysnumber-price2;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber;break;case 13:if(stated=0) ShowBmp(
34、pdc,dj_Pict, 20,101);stated=1;Uart_Printf(01号桌点了烤乳猪t);sysnumber=sysnumber+price3;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber; elseFillRect( pdc, 20,101,40,121, GRAPH_MODE_NORMAL, COLOR_WHITE);DrawRectFrame(pdc, 20, 101, 40, 121);stated=0;Uart_Printf(01号桌取消了烤乳猪t);sys
35、number=sysnumber-price3;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber;break;case 8: if(statee=0) ShowBmp(pdc,dj_Pict, 20,133);statee=1;Uart_Printf(01号桌点了太子蟹t);sysnumber=sysnumber+price4;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber; els
36、eFillRect( pdc, 20,133,40,153, GRAPH_MODE_NORMAL, COLOR_WHITE);DrawRectFrame(pdc, 20,133, 40, 153);statee=0;Uart_Printf(01号桌取消了太子蟹t);sysnumber=sysnumber-price4;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber;break;case 9: if(statef=0) ShowBmp(pdc,dj_Pict, 20,165);statef=1;Uart_Printf(01号桌点了文昌鸡t);sysnumber=sysnumber+price5;Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl, str,TRUE);num=sysnumber;