ARM9嵌入式课程设计报告
基于UCOSSII系统的移动检票器
1. 设计内容 ...................................................................................................................................... 1
1.1设计目的 ............................................................................................................................ 1
1.2设计意义 ............................................................................................................................ 1
2. 设计方案 ...................................................................................................................................... 2
2.1设计要求 ............................................................................................................................. 2
2.2设计方案的可行性分析 ..................................................................................................... 2
3. 需求分析 ...................................................................................................................................... 3
3.1功能需求 ............................................................................................................................. 3
3.2性能需求 ............................................................................................................................. 3
3.3环境需求 ............................................................................................................................. 3
4. 概要设计 ...................................................................................................................................... 3
4.1GUI图形界面设计 .............................................................................................................. 3
4.3串口的输出 ......................................................................................................................... 4
4.4VIVI模式 ............................................................................................................................ 4
5详细设计........................................................................................................................................ 4
5.1GUI图形的界面的实现 ...................................................................................................... 5
5.2主要函数的调用关系 ......................................................................................................... 6
5.3主要负责车票信息核对模块 ............................................................................................. 7
5.4车票信息的添加 ................................................................................................................. 7
本部分内容由组员曾德亮具体负责,这里不一一叙述。 ................................................... 8
6设计心得与体会 ............................................................................................................................ 8
7附录 ............................................................................................................................................... 8
1.设计内容
1.1设计目的
1、注重培养综合运用所学知识、独立分析和解决实际问题的能力,培养创
新意识和创新能力,并获得科学研究的基础训练。
2、了解所选择的ARM芯片各个引脚,工作方式,计数/定时,I/O口,中断
等的相关原理,并巩固学习嵌入式的相关内容知识。
3、通过软硬件设计实现利用ARM芯片对信号的采集及显示。
1.2设计意义
嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁剪,
适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算
机系统。它一般由以下几部分组成:嵌入式微处理器、外围硬件设备、嵌
入式操作系统。嵌入式系统是面向用户、面向产品、面向应用的,它必须
与具体应用相结合才会具有生命力、才更具有优势。因此嵌入式系统是与
应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理
的裁减利用。嵌入式系统是将先进的计算机技术、半导体技术和电子技术
和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技
术密集、资金密集、高度分散、不断创新的知识集成系统。嵌入式系统必
须根据应用需求对软硬件进行裁剪,满足应用系统的功能、可靠性、成本、
体积等要求。所以,如果能建立相对通用的软硬件基础,然后在其上开发
出适应各种需要的系统,是一个比较好的发展模式。目前的嵌入式系统的
核心往往是一个只有几K到几十K微内核,需要根据实际的使用进行功能
扩展或者裁减,但是由于微内核的存在,使得这种扩展能够非常顺利的进
行。
2.设计方案
2.1设计要求
(1)键消息输入票务信息
(2)和票务数据库核对
(3)显示检票结果
(4)输入票务数据库(可以用文本文件表示)
2.2设计方案的可行性分析
自动检票器是根据检票计划,实现自动检票判读票务信息功能,能够实现合
法旅客通过,阻挡非法旅客进。在车站、旅游景点、企事业单位中有巨大的作用,
对减少作业量,提高工作效率,实现现代化管理等方面都具有非常重要的意义。
移动检票器,是根据自动检票器的基础演变而来的便携式检票设备。该设备
通过嵌入式系统,运用自动识别、参数对比、数据写入等技术,实现了灵活的检
票。是一种重要的检票设备。
3.需求分析
3.1功能需求
1.有接口按钮来实现信息的输入工作
2.有以文本文件形式的简单数据库
3.数据库可以写入、输出数据,实现增、删、改、查功能
4.能够在LCD显示屏上显示检票结果
5.可以将票务信息输入数据库
6.良好的界面
3.2性能需求
软件能够运行,具有良好的稳定性,没有语法、逻辑错误。调试成功后,具
有友好的界面,能够满足移动检票器的主要功能。
3.3环境需求
1.Windows XP操作系统
2.ADS1.2集成开发环境,仿真调试驱动程序
3.EL-ARM-860嵌入式教学试验箱
4.仿真调试电缆,串口直连电缆
4.概要设计
4.1GUI图形界面设计
这里就是根据实验五,模仿的。
4.2按键的实现
部分按键的串口输出函数,在开头宏定义里面实现。在Tasks_Strart任务
中实现。部分代码实现如下:
for(;;)
{
Key_P = OSMboxPend(Key_Mbox, 0, &err); //等
待任务间的通信邮箱内的键值指针
Key_Val = *Key_P;
switch(Key_Val)
{
case 0x01 :
GUI_StoreKey(GUI_KEY_1);
break;
case 0x02 :
GUI_StoreKey(GUI_KEY_2);
break;
case 0x0C :
GUI_StoreKey(GUI_KEY_ESCAPE);
break;
case 0x03 :
GUI_StoreKey(GUI_KEY_START);
break;
default:
break;
}
}
4.3串口的输出
打开ADS1.2开发环境,从里面打开\试验程序\UCOSII\ADS\实验五
\Task_USOSII目录下的Tasks_USOSII.mcp项目文件并进行编译。
编译通过后,进入ADS1.2调试界面,加载\实验程序\USOSSII\ADS\实
验五\Tasks_UCOSSIIm目录下\Tasks_data\debug中的映像文件程序映像
Tasks.axf。按两下“3”键,观察LCD屏幕上和CPU版面上的显示。之后,
选择“上”,“中”,“下”,“左”,“右”键
4.4VIVI模式
打开超级终端,配置串口属性为COM2,配置波特率为115200,校验位
无,数据位为8,停止位为1,数据控制流无;检查连接时否可靠,可靠后,
接入电源,系统上电,同时按住“空格”建,进入VIVI状态,按下LCD电
源开关。
5详细设计
本次试验由两人共同完成,经过我们二人两个礼拜的合作与交流,现在分工
如下:
本人主要负责需求分,在功能实现方面,主要负责图形界面的初步设计及车
票信息核对模块。曾德亮同学负责的是图形界面的代码实现以及车票信息插入功
能模块。
5.1GUI图形的界面的实现
图形界面设计主要是一些基本的图形的坐标定位,矩形、文字在LCD显
示屏的坐标。
当用户通过首界面进入后,部分代码以及注释如下:
Set_Color(GUI_YELLOW);
//显示界面
Set_BkColor(GUI_RED);
Set_Font (&CHINESE_FONT16);
Disp_String (CN_start"移动检票器"CN_end,320,80);
Disp_String (CN_start"功能选择"CN_end,360,120);
Disp_String (CN_start"一、票务信息核对"CN_end,320,160);
Disp_String (CN_start"二、票务信息录入"CN_end,320,200);
Disp_String (CN_start"退出"CN_end,320,280);
Loop = FALSE;
number = 0;
break;
//通过选项2进入数据的插入,
case GUI_KEY_2: //功能二,按键“2”
Set_Color(GUI_RED);
Fill_Rect(40,40,600,440);
Set_Color(GUI_YELLOW); //信息录入模块
Set_BkColor(GUI_RED);
Set_Font (&CHINESE_FONT16);
Disp_String (CN_start"票务信息录入"CN_end,320,120);
Set_Font(&CHINESE_FONT16);
Disp_String (CN_start"请输入车票号码:"CN_end,100,240);
Uart_GetString(no);
Uart_Printf("%s\n",no);
Set_Font(&GUI_Font8x16);
Disp_String(no,230,240);
Set_Font(&CHINESE_FONT16);
Disp_String (CN_start"请输入发车时间:"CN_end,100,280);
Uart_GetString(time);
Uart_Printf("%s\n",time);
Set_Font(&GUI_Font8x16);
Disp_String(time,230,280);
Set_Font(&CHINESE_FONT16);
Disp_String (CN_start"请输入车票价格:"CN_end,100,320);
Uart_GetString(price);
Uart_Printf("%s\n",price);
Set_Font(&GUI_Font8x16);
Disp_String(price,230,320);
insert(no,time,price); //插入函数
Set_Font(&GUI_Font8x16);
Disp_String (TicketList[i].num,100,380);
Disp_String (TicketList[i].time,200,380);
Disp_String (TicketList[i].price,300,380);
Loop = TRUE;
number = 0;
break;
//用户进入插入界面后,通过键盘的操作对数据库进行信息的插入,将信息
录入保存,
case GUI_KEY_ESCAPE:
Loop = FALSE;
break;
当程序运行完成之后,设置escape键退出循环,在start运行程序
5.2主要函数的调用关系
5.3主要负责车票信息核对模块
信息核对何工,其实就实现函数的查询功能,所以这里,我也是用的
search函数来实现的。核心代码如下:
for(i=0;i
if(strcmp(TicketList[i].num,no)==0)
{
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"车票号码
"CN_end,100,200);
Set_Font(&GUI_Font8x16);
Disp_String(TicketList[i].num,100,240);
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"时间"CN_end,200,200);
Set_Font(&GUI_Font8x16);
Disp_String(TicketList[i].time,200,240);
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"价格"CN_end,300,200);
Set_Font(&GUI_Font8x16);
Disp_String(TicketList[i].price,300,240);
i=MaxSize+1;
}
else{
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"没有此车票信息!
"CN_end,300,300);
}
}
5.4车票信息的添加
本部分内容由组员曾德亮具体负责,这里不一一叙述。
6设计心得与体会
在这次ARM嵌入式系统课程设计中,我们小组的设计课题是《移动检票器》。
通过这次课程设计,我对ARM嵌入式系统尤其是GUI图形界面集系统有了更进
一步的了解,同时知识面也进一步得到了扩展和加深。
7附录
//程序源代码
/*
;********************************************************************
****************************************
;* 北京精仪达盛科技有限公司
;* 研 发 部
;*
;* http://www.techshine.com
;*
;*--------------------------------------------- 文件信息
----------------------------------------------------
;*
;* 文件名称 : MAIN.c
;* 文件功能 : 应用程序
;* 补充说明 :
;*-------------------------------------------- 最新版本信息
-------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/00/00
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息
-------------------------------------------------
;* 文件作者 : ARM开发小组
;* 创建日期 : 2004/06/25
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------
------
;*-----------------------------------------------------------------------------------------------------
------
;********************************************************************
****************************************
;*/
#include "..\inc\config.h"
#define STACKSIZE 256
#define MaxSize 10
//声明结构体(车票信息)
struct Ticket_info{
char *check;
char num[10]; //车票号码
char time[10]; //开车时间
char price[10]; //价格
}TicketList[MaxSize];
OS_STK_DATA stk;
extern GUI_FONT CHINESE_FONT12;
extern GUI_FONT CHINESE_FONT16;
extern GUI_FONT GUI_Font8x16;
OS_EVENT *Key_Mbox;
/*
*********************************************************************
****************************************
** 分配各任务的堆栈容量 **
*********************************************************************
****************************************
*/
OS_STK Stack_Task_1[STACKSIZE];
OS_STK Stack_Task_2[STACKSIZE];
OS_STK Stack_Task_3[STACKSIZE];
OS_STK Stack_Task_4[STACKSIZE*3];
/*
*********************************************************************
****************************************
** 信息插入操作函数 **
*********************************************************************
****************************************
*/
Void insert(char *num,char *time,char *price){
int i=0;
for(;i
if(TicketList[i].check == NULL){
strcpy(TicketList[i].num,num);
strcpy(TicketList[i].time,time);
strcpy(TicketList[i].price,price);
Set_BkColor(GUI_RED);
Set_Font(&GUI_Font8x16);
Disp_String (TicketList[i].num,200,380);
i= MaxSize+1;
}
}
}
/*
*********************************************************************
****************************************
- 函数名称 : Task_4(void *pdata)
- 函数说明 : GUI任务,优先级为56
- 输入参数 : pdata
- 输出参数 : 无
*********************************************************************
****************************************
*/
void Task_4(void *pdata)
{
I32 number;
char time[10];
char num[10];
char price[10];
I32 flag=1;
char no[10];
INT8U Loop;
I32 i;
for(;;)
{
number = GUI_WaitKey();
Loop = TRUE;
do
{
switch (number)
{
case GUI_KEY_START: // 得到开始命令
Set_Color(GUI_BLUE);
Fill_Rect(0,0,639,479);
Set_Color(GUI_WHITE);
Set_BkColor (GUI_BLUE);
Fill_Rect(0,0,639,2);
Fill_Rect(0,0,2,479);
Fill_Rect(0,477,639,479);
Fill_Rect(6377,0,639,479);
Set_Color(GUI_RED); //画矩形
Fill_Rect(40,40,600,440);
Set_Color(GUI_YELLOW); //显示界面
Set_BkColor(GUI_RED);
Set_Font (&CHINESE_FONT16);
Disp_String (CN_start"移动检票器"CN_end,320,80); Disp_String (CN_start"功能选择"CN_end,360,120);
Disp_String (CN_start"一、票务信息核对"CN_end,320,160); Disp_String (CN_start"二、票务信息录入"CN_end,320,200); Disp_String (CN_start"退出"CN_end,320,280);
Loop = FALSE;
number = 0;
break;
命令
default: // 等待主任务发送的键值 number = GUI_WaitKey(); Loop = TRUE; break; } }while(Loop==TRUE); do { number = GUI_WaitKey(); switch (number) { case GUI_KEY_1: //功能一,按键“1” Set_Color(GUI_RED); Fill_Rect(40,40,600,440); Set_Color(GUI_YELLOW); //信息核对模块 Set_BkColor(GUI_RED); Set_Font(&CHINESE_FONT16); Disp_String (CN_start"信息核对"CN_end,320,120); Disp_String (CN_start"请输入车票号码:"CN_end,100,150); Uart_GetString(no); Uart_Printf("%s\n",no); Set_Font(&GUI_Font8x16); Disp_String(no,300,200); for(i=0;i
Disp_String(CN_start"价格"CN_end,300,200);
Set_Font(&GUI_Font8x16);
Disp_String(TicketList[i].price,300,240);
i=MaxSize+1;
}
else{
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"没有此车票信息"CN_end,300,300);
}
}
Loop = TRUE;
number = 0;
break;
case GUI_KEY_2: //功能二,按键“2”
Set_Color(GUI_RED);
Fill_Rect(40,40,600,440);
Set_Color(GUI_YELLOW); //信息录入模块
Set_BkColor(GUI_RED);
Set_Font (&CHINESE_FONT16);
Disp_String (CN_start"票务信息录入"CN_end,320,120);
Set_Font(&CHINESE_FONT16);
Disp_String (CN_start"请输入车票号码:"CN_end,100,240); Uart_GetString(no);
Uart_Printf("%s\n",no);
Set_Font(&GUI_Font8x16);
Disp_String(no,230,240);
Set_Font(&CHINESE_FONT16);
Disp_String (CN_start"请输入发车时间:"CN_end,100,280); Uart_GetString(time);
Uart_Printf("%s\n",time);
Set_Font(&GUI_Font8x16);
Disp_String(time,230,280);
Set_Font(&CHINESE_FONT16); !
Disp_String (CN_start"请输入车票价格:"CN_end,100,320); Uart_GetString(price);
Uart_Printf("%s\n",price);
Set_Font(&GUI_Font8x16);
Disp_String(price,230,320);
insert(no,time,price); //插入函数
Set_Font(&GUI_Font8x16);
Disp_String (TicketList[i].num,100,380);
Disp_String (TicketList[i].time,200,380);
Disp_String (TicketList[i].price,300,380);
Loop = TRUE;
number = 0;
break;
case GUI_KEY_ESCAPE:
Loop = FALSE;
break;
default: // 等待主任务发送的键值命令
number = GUI_WaitKey();
Loop = TRUE;
break;
}
}while(Loop == TRUE);
}
}
/*
*************************************************************************************************************
- 函数名称 : Task_3
- 函数说明 : 任务3,向串口发送数据
- 输入参数 : pdata
- 输出参数 : 无
*************************************************************************************************************
*/
void Task_3(void *pdata)
{
for(;;)
{
if(key_number!=0xff)
{
Uart_Printf("key_number=%x\n",key_number); //任务的干得活儿就是向超级终端发送内容
key_number=0xff;
OSTimeDly(30); //延时100个节拍
}
}
}
/*
*************************************************************************************************************
- 函数名称 : Task_2
- 函数说明 : 系统启动后运行的第2个任务,,点亮LED1熄灭LED2,优先级为5 - 输入参数 : pdata
- 输出参数 : 无
*************************************************************************************************************
*/
void Task_2(void *pdata)
{
INT32U i,flag=0;
for(;;)
{
OSTimeDly(30);
if(flag==0)
{
for(i=0;i
rGPGDAT = rGPGDAT&~(0x3
for(i=0;i
flag = 1;
}
else
{
for(i=0;i
rGPGDAT = rGPGDAT&~(0x3
for(i=0;i
flag = 0;
}
OSTimeDly(30); //延时30个节拍
}
}
/*
*************************************************************************************************************
- 函数名称 : Task_START
- 函数说明 : 系统启动后运行的第一个任务
- 输入参数 : pdata
- 输出参数 : 无
*************************************************************************************************************
*/
void Task_1(void *pdata)
{
INT8U err;
INT8U *Key_P;
INT8U Key_Val;
Timer1_Init(); //打开时钟节拍,让操作系统跑起来
//STaskCreate(Task_2, (void *)0, (OS_STK *)&Stack_Task_2[(STACKSIZE) - 1],
9); //在任务里创建另一个任务
//STaskCreate(Task_3, (void *)0, (OS_STK *)&Stack_Task_3[(STACKSIZE) - 1],
10); //在任务里创建另一个任务
OSTaskCreate(Task_4, (void *)0, (OS_STK *)&Stack_Task_4[(STACKSIZE*3)
- 1], 56); //在任务里创建另一个任务
for(;;)
{
Key_P = OSMboxPend(Key_Mbox, 0, &err); //等待任务间的通信邮箱内的键值指针
Key_Val = *Key_P;
switch(Key_Val)
{
case 0x01 :
GUI_StoreKey(GUI_KEY_1);
break;
case 0x02 :
GUI_StoreKey(GUI_KEY_2);
break;
case 0x0C :
GUI_StoreKey(GUI_KEY_ESCAPE);
break;
case 0x03 :
GUI_StoreKey(GUI_KEY_START);
break;
default:
break;
}
}
}
/*
*************************************************************************************************************
- 函数名称 : Main(void)
- 函数说明 : 系统的主程序入口
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Main(void)
{
Target_Init();
GUI_Init(); //ARMII实验系统的初始化,包括CPU板
OSInit(); // 操作系统的初始化
Key_Mbox = OSMboxCreate((void *)0);
OSTaskCreate(Task_1, (void *)0, (OS_STK *)&Stack_Task_1[STACKSIZE - 1],
5); //创建任务一
OSStart();
}