嵌入式系统课程设计报告.docx
- 文档编号:10897775
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:20
- 大小:26.01KB
嵌入式系统课程设计报告.docx
《嵌入式系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计报告.docx(20页珍藏版)》请在冰点文库上搜索。
嵌入式系统课程设计报告
课程设计报告
电子点菜器设计报告
班级:
20120614
学号:
2012061411
姓名:
刘群峰
教师评语:
教师签名:
2015年9月
课程设计题目
电子点菜器
主要内容
本次实验的主要内容是进行电子点菜器的设计,具体实现的功能包括:
(1)实现正常显示欢迎界面、菜品选择界面以及菜品编辑界面。
(2)在选择菜品界面实现用单击进行菜品信息查看和系统操作,用双击进行菜品选择。
(3)在编辑界面实现查看被选择过的菜品信息,可通过删除选择过的菜品达到让用户实现对菜品重新编辑的目的,并且此界面可以和选择菜品界面相互跳转达到让用户重新选择菜品的目的。
(4)实现将用户选择菜品的信息通过串口传送到显示器。
(5)数码数码管显示已点菜的总价。
(6)键盘按键点菜、翻页、查看所有已点菜品的信息等。
采用的工具方法
硬件:
PC机、博创UP-NETARM3000实验台
软件:
超级终端通讯工具、JTAG仿真器、ADS1.2集成开发环境、仿真器驱动器
进度安排
1-2学时:
分析需求
3-28学时:
编码实现
29-32学时:
系统测试并进行完善
33-36学时:
系统验收及答辩
参考资料
1、ARM3000实验指导书
2、《基于ARM的嵌入式系统设计实验与实践教程》,清华大学出版社,2011.
3、《嵌入式系统开发原理与实践》,清华大学出版社,2005.
4、Ucos-II电子版书
1.题目
电子点菜器
2.系统简介
本次课程设计的系统是电子点菜器,它运行的环境是博创UP-NETARM3000实验台,主要使用的是该实验台上的LCD模块和触摸屏模块。
该系统实现功能如下:
(1)实现正常显示欢迎界面、菜品选择界面以及菜品编辑界面;
(2)在选择菜品界面实现用单击进行菜品信息查看和系统操作,用双击进行菜品选择;
(3)在编辑界面实现查看被选择过的菜品信息,可通过删除选择过的菜品达到让用户实现对菜品重新编辑的目的,并且此界面可以和选择菜品界面相互跳转达到让用户重新选择菜品的目的。
(4)实现将用户选择菜品的信息通过串口传送到显示器,及时反馈信息给后台。
(5)数码数码管显示已点菜的总价。
(6)键盘按键点菜、翻页、查看所有已点菜品的信息等。
3.系统设计
3.1系统目标
按照本次所选的课程设计的题目,我们小组要实现的是一个电子点菜器,我们首先分析了该电子点菜器的功能。
按照其将要实现电子点菜的功能,我们首先确定了我们将要用到的是ARM试验台的LCD模块和触摸屏模块,再根据我们在系统中要实现菜品信息和订单的显示,我们确定了要使用文本框控件及按钮控件,这涉及到ucos-II系统的使用。
按照之前的分析,我们首先选取了Exp22电子画板的工程,以此为基础进行了接下来的系统设计。
我们对于该电子点菜器设计了三个界面,第一个是欢迎界面,主要显示的是一张背景图片,顾客点击这个界面就会进入到点菜界面。
在点菜界面中,主要有三个部分,它们分别是六张菜品图片、五个控制按键和一个信息显示的文本框控件。
六张菜品图片是对应六道菜,顾客通过单击图片可以在文件框中显示菜品的信息,双击图片表示选择了对应的菜品,并在文本框给出提示信息。
五个控制控制按键分别为查看上一页菜品、提交订单、查看订单、返回初始界面和查看下一页菜品。
第三个界面是订单信息界面,其左侧是菜品的列表,点击相应的菜品在右侧就会显示该菜品的数量、价格及总价。
3.2系统的体系结构设计
针对以上的总体目标,综合考虑硬件环境和实现方法,我们将系统的体系结构分为4个不同的层次:
硬件层、功能层、软件层、中间层。
整个设计需要完成在不同的层次上完成不同的设计要求。
硬件层:
选择博创UP-NETARM3000实验平台。
功能层:
在这一层上要实现电子点菜的应用代码、算法实现等,我们组选择了博创UP-NETARM3000的硬件实验平台,那么主要工作就主要集中在这一层次上,因为其他的层次已经由硬件平台的提供商基本实现了。
软件层:
提供用户图形几口、实现多任务调度管理,本设计是基于uC/OS这一嵌入式实时操作系统实现的。
中间层:
硬件抽象层和板级支持包,这一般由硬件平台提供商实现。
如果选择从头设计一个俄罗斯方块游戏,自己去实现硬件体系结构,还是需要考虑这一部分的,但我们组的设计不需要这一部分。
3.3系统的工作流程
明确了功能层是我们这次课程设计的主要完成对象后,我们对系统的工作流程进行了讨论,在综合考虑使用情况后,我们将系统的流程分为:
系统初始化、绘制系统图形界面、判断消息类型、消息处理和最后的返回结束界面。
实验程序设计流程图如图1所示
图1实验程序设计流程图
由于这个结构图比较成熟,我们只需按照自己的功能在进行需求的添加和删除即可,当系统初始化完成之后,通过判断用户给出的消息类型,即可进行不同的处理程序,当完成处理后在显示界面显示处理结果即可。
3.4各模块设计
3.4.1触摸屏查看菜品信息及点菜
设计思想是让LCD显示屏每页显示六道菜,并包含上下页翻页键和点菜完毕确认键,所以在触摸屏上安排了九个区间的触摸功能
Recta.left=0;rectb.left=0;
Recta.top=0;rectb.top=32;
Recta.right=320;rectb.right=320;
Recta.bottom=30;rectb.bottom=62;
依次类推,对于触摸屏区间的划分,只要确定两点左上方的坐标和右下方的坐标就可确定该区间在触摸屏上的范围。
对于该九个区间的控制既可触摸控制也可采用数字小键盘进行操作,这两者其中任何一个动作都会对点菜产生影响,这通过switch(pMsg->Message)语句来选择判断。
点击查看菜品信息;双击则“点”此菜品.
定义菜品及价格
voidMain_Task(void*Id)//Main_Test_Task
{
POSMSGpMsg=0;
intjudge=0;
intsysnumber=0;
inti=0;
intj=0;
U16str[20];
PDCpdc;
intprice[6]={50,50,80,280,180,80};
chardj_Pict[12]={'1','2','8','_','3','7','','','B','M','P',0};
chardj_Pict1[12]={'1','2','8','_','3','5','','','B','M','P',0};
chardj_Pict2[12]={'1','2','8','_','3','6','','','B','M','P',0};
charbmpnamelogo1[12]={'0','0','0','_','0','1','','','B','M','P',0};
charbmpnamelogo2[12]={'0','0','0','_','0','2','','','B','M','P',0};
charbmpnamelogo3[12]={'0','0','0','_','0','3','','','B','M','P',0};
charbmpnamelogo4[12]={'0','0','0','_','0','4','','','B','M','P',0};
charbmpnamelogo5[12]={'0','0','0','_','0','5','','','B','M','P',0};
charbmpnamelogo6[12]={'0','0','0','_','0','6','','','B','M','P',0};
以上是图片的命名格式为bmp格式,并且命名6道菜
定义屏幕图片触摸屏坐标
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;
...........(省略)
3.4.1.1触屏单击查看此菜品信息
caseOSM_TOUCH_SCREEN:
Uart_Printf("OSM_TOUCH_SCREEN\n");
mode=TchScr_GetOSXY2(&x,&y);
if(mode==TCHSCR_ACTION_CLICK){
Touch_Position.x=x;
Touch_Position.y=y;
Uart_Printf("TCHSCR_ACTION_CLICK\n");
Uart_Printf("Touch_Position.x=%d\n",Touch_Position.x);
Uart_Printf("Touch_Position.y=%d\n",Touch_Position.y);
if(IsInRect2(precta,pTouch_Position)){
Uart_Printf("a\n");
if(pagenum==1){
CreateText(1,recttext);
break;}
elseif(pagenum==2){
CreateText(7,recttext);
break;
}
3.4.1.2触屏双击选择此菜品
if(mode==TCHSCR_ACTION_DBCLICK){
Touch_Position.x=x;
Touch_Position.y=y;
Uart_Printf("TCHSCR_ACTION_DBCLICK\n");
Uart_Printf("Touch_Position.x=%d\n",Touch_Position.x);
Uart_Printf("Touch_Position.y=%d\n",Touch_Position.y);
//对recta到rectf的每个矩形进行检测
//进行CreateText2,也就是显示Youorderddish1之类的。
//并且进行数量的相加,输出每种菜品的已点的数量
if(IsInRect2(precta,pTouch_Position)){
Uart_Printf("aaaaaaaaaaa\n");
if(pagenum==1){
CreateText2(1,recttext);
total=0;numcount[0]++;
Uart_Printf("num1=%d\n",numcount[0]);
for(k=0;k<10;k++){
total=total+numcount[k]*unit_price[k];
showLED(total);}
break;
}
3.4.2.键盘输入数字点菜
caseOSM_KEY:
表示有键盘操作时系统应作出的反应,系统通过myKey=GetKey2()得到键盘输入的值(与定义的数组KeyBoard_Map[]相对应),再根据不同的键值进行相对应的操作。
if(myKey==1){
Uart_Printf("Dish1forhowmanypieces?
\n");//显示菜品价格
Uart_Printf("Price:
%d\n",unit_price[myKey-1]);
iPieces=GetKey2();//输入点的份数
CreateText2(1,recttext);
total=0;
numcount[0]=iPieces;
Uart_Printf("num1=%d\n",numcount[0]);//输出点的份数
for(k=0;k<10;k++){
total=total+numcount[k]*unit_price[k];
showLED(total);
}//LED显示总价格
break;
}
3.4.3.数码管显示总金额showLED(total)
voidshowLED(inttotal){
U32key,t;
Zlg7289_Reset();//zlg7289复位
t=total;
Delay
(1);
ZLG7289_ENABLE();//使zlg7289占有同步串口
Delay(5);//延时
WriteSDIO(ZLG7289_CMD_DATA0|0);//数码管以方式0译码,第一个数码管亮
WriteSDIO(t%10);//显示个位
Delay
(1);//延时
if(t>9){//键值大于9显示十位
WriteSDIO(ZLG7289_CMD_DATA0|1);//发送十位数据
WriteSDIO((unsignedchar)(t/10%10));
Delay
(1);
if(t>99){
WriteSDIO(ZLG7289_CMD_DATA0|2);//发送十位数据
WriteSDIO((unsignedchar)(t/100%10));
Delay
(1);
if(t>999){
........(省略)
4.系统实现
在本次系统实现的过程中,所要做到的就是实现触摸屏点菜和键盘点菜功能,并且实现计算所点菜的总价格,在LED灯上显示所点菜的总价格。
4.1初始化界面
///*****************事件定义*****************///
OS_EVENT*Nand_Rw_Sem;//Nand_Flash读写控制权旗语
//andyoucanuseitasfolloeing:
//Nand_Rw_Sem=OSSemCreate
(1);//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件
//OSSemPend(Nand_Rw_Sem,0,&err);
//OSSemPost(Nand_Rw_Sem);
OS_EVENT*Uart_Rw_Sem;//Uart读写控制权旗语
//andyoucanuseitasfolloeing:
//Uart_Rw_Sem=OSSemCreate
(1);//创建Uart读写控制权旗语,初值为1满足互斥条件//
//OSSemPend(Uart_Rw_Sem,0,&err);
//OSSemPost(Uart_Rw_Sem);
//////////////////////////////////////////////////////////
intmain(void)
{
ARMTargetInit();//开发板初始化
Zlg7289_Reset();//zlg7289复位
OSInit();//操作系统初始化
uHALr_ResetMMU();//复位MMU
LCD_Init();//初始化LCD模块
LCD_printf("LCDinitializationisOK\n");//向液晶屏输出数据
LCD_printf("320x240TextMode\n");
initOSGUI();//初始化图形界面
LoadFont();//调Unicode字库
LoadConfigSys();//使用config.sys文件配置系统设置
LCD_printf("CreatetaskonuCOS-II...\n");
OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],Main_Task_Prio);//创建系统任务
OSAddTask_Init();//创建系统附加任务
LCD_printf("StartinguCOS-II...\n");
LCD_printf("Enteringgraphmode...\n");
LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式
InitRtc();//初始化系统时钟
Nand_Rw_Sem=OSSemCreate
(1);//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
OSStart();//操作系统任务调度开始
//不会执行到这里
return0;
}
U32GetKey2()
{
//****************************
/*
0-111-23-18
4-15-96-17
7-08-89-16
num-4/-12*-20
--21+-24enter-26
del-19
*/
/*
从*顺时针到del计数,12开始,
规定0为17
*/
charKeyBoard_Map[]={
7,4,1,0,10,
0,0,0,8,5,
2,17,0,0,0,
0,9,6,3,16,
12,13,0,0,14,
0,15,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0
};//64,键值映射表*/
U16key;
while
(1)
{
Delay(2000);
while((rPDATG&(0x10)));//有键按下
key=Zlg7289_ReadKey();//得到按键扫描码
if(key<=64)
{//按键值有效
key=KeyBoard_Map[key];//通过键盘映射表得到按键值
Uart_Printf("\n%d",key);
break;
}
Delay(2000);
}
returnkey;
}
4.2获得触摸点坐标及触摸动作
U32TchScr_GetOSXY2(int*x,int*y)
{//获得触摸点坐标并返回触摸动作
staticU32mode=0;
staticintoldx,oldy;
inti,j;
for(;;){
if((mode!
=TCHSCR_ACTION_DOWN)&&(mode!
=TCHSCR_ACTION_MOVE)){
if(!
TCHSCR_IsPenNotDown){//有触摸动作
TchScr_GetScrXY(x,y);//得到触摸点坐标
for(i=0;i<40;i++){
if(TCHSCR_IsPenNotDown)//抬起
break;
Delay(100);
}
if(i<40){//在规定的双击时间之内抬起,检测是不是及时按下
for(i=0;i<60;i++){
if(!
TCHSCR_IsPenNotDown){
if(i<10){i=60;break;}//如果单击后很短时间内按下,不视为双击
mode=TCHSCR_ACTION_DBCLICK;
for(j=0;j<40;j++)Delay(100);//检测到双击后延时,防止拖尾
break;
}
Delay(100);
}
if(i==60)//没有在规定的时间内按下
mode=TCHSCR_ACTION_CLICK;
}
else{//没有在规定的时间内抬起
mode=TCHSCR_ACTION_DOWN;
}
break;
}
}
else{
if(TCHSCR_IsPenNotDown){//抬起
mode=TCHSCR_ACTION_UP;
*x=oldx;
*y=oldy;
returnmode;
}
else{
TchScr_GetScrXY(x,y);
if(abs(oldx-*x)>4||abs(oldy-*y)>4){//有移动动作
mode=TCHSCR_ACTION_MOVE;
break;
}
}
}
Delay(50);
}
oldx=*x;
oldy=*y;
returnmode;
}
4.3主任务函数Main_Task
Uart_Printf("这是01号桌");
//消息循环
for(;;){
pMsg=WaitMessage(0);//等待消息
switch(pMsg->Message){
caseOSM_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=CreateDC();
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=CreateTextCtrl(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_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 课程设计 报告