基于uCOS-II的数据采集系统设计.doc_第1页
基于uCOS-II的数据采集系统设计.doc_第2页
基于uCOS-II的数据采集系统设计.doc_第3页
基于uCOS-II的数据采集系统设计.doc_第4页
基于uCOS-II的数据采集系统设计.doc_第5页
免费预览已结束,剩余22页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式驱动程序设计实验报告基于uC/OS-II的数据采集系统设计 班 级:_计应092_ 姓 名:_朱艾丽_学 号:_0908143229_常州信息职业技术学院27一、实验目的1、掌握图形液晶的绘点函数的使用。2、掌握C/GUI的编程方法。3、掌握基于C/GUI的图片加载、文字显示、菜单显示、按键操作等常用功能的编程实现方法。4、通过串口接收波形数据,并在液晶屏上进行动态波形绘制。二、实验设备1、硬件PC机一台MagicARM2410教学实验开发平台一台2、软件WindowsXP/2000系统,ADS1.2集成开发环境,串口调试助手2.2。三、实验内容系统启动,先显示一个图片,并在图片上方打印一句话“欢迎使用XX系统”,在图片的下方显示一个进度条,进度条逐渐填充满,同时进度条下面一个字符串“Loading”不停闪烁,示意图如下:欢迎使用XX系统Loading等进度条填充满了之后,图片上方的文字、图片、图片下方的进度条、文字都消失,显示以下系统主画面:2010-12-148:20:58XX系统正在运行中压力温度10.265.2曲线帮助选择“曲线”,并回车,则显示以下波形:返回2010-12-148:20:58XX系统正在运行中压力温度波形根据串口接收到的数据进行动态更新。四、设计思路(不少于2000字) 一,界面1 1 图片显示先找寻一张合适的图片,图片不宜过大,且图片要是.bmp格式,不是的要进行转换。安装好Image2Lcd软件,在Image2Lcd界面中打开选择的图片将图片转换为一个数组,选项要为16位真彩色或是单色。得到图片数组放入lcddriver-resource-bliss.c里,在主函数中加入extern声明下。利用GUI_DispPic()函数,让图片显示出来,再依据显示位置,算出其显示坐标。在主程序中添加显示图片的程序,也可以设置图片的高度和宽度,使之能显示合适大小的图片。当程序运行时,在液晶屏上正中央会显示你所选择的图片。 2 文字显示 附件: 字模软件概括uC/ GU I 中字体的显示是通过查找字模的方式实现的 。字体库中的每一个字母都有其对应的字模,所有的字母的字模由 GU I_ FON T 和 GU I_ FON T_ PRO P 这两个结构体来进行统一管理 。GU I_ FON T 结构体中定义了该字母的点阵大小 (比如 1616 或者 8 8) 和GU I_ FON _PROP 结构体的入口地址 。GU I_ FON T_ PRO P 这个结构体建立了字库中字母编码 (比如字母 A 在 ASCII 中的字母编码为 33) 和字模数据存放地址的映像 。在工程中出于节省程序存储空间的需要 , GB231280 (国标字符集也就是常说的国标码) 中的 3755 个一级常用汉字足以满足实际需求 。如果通过单字手工取模的方式 ,工作量是不可想象的 ,所幸有了电脑 ,又有了汉字库 ,可以编程解决 。 汉字在程序中的实现在界面中上方显示“欢迎使用XX系统”,利用字模软件把“欢迎使用XX系统”根据字模选项以32*32、C51格式、顺向、逐行式、阳码的格式生成字模。界面长640,宽480,根据欢迎使用XX系统显示位置,算出坐标,汉字一个一个输出。利用GUI_PutHZ(x, y, *dat, hno, lno)函数,其中x、y表示显示位置,dat表示要输出显示的汉字点阵数据,hno表示要显示此行的点个数,lno表示要显示此列的点个数。同时注意一下前景、背景色的设置,用GUI_SetColor();如:GUI_SetColor(BLUE, YELLOW)。 进度条首先在显示进度条的地方,算出其坐标,利用GUI_Rectangle(x0, y0, x1, y1, color)函数,画出一个矩形,其中x0、y0表示矩形左上角的坐标,x1、y1表示矩形右下角的坐标,color表示矩形边框显示颜色。然后再填充矩形,利用GUI_RectangleFill()函数,让进度条能够动起来。 Loading显示我们利用矩形右下角横坐标的循环程序,使其从矩形的左边到右边的填充,进度条的填充速度的快慢,可以根据时间函数OSTimeDlyHMSM()调整。在进度条的下方需显示“Loading”,根据字模软件,将这些字母的字模,根据8*16的格式生成字模。 把属于“Loading”字符的程序添加到程序中,试着运行,若正确,则会在进度条下面出现“Loading”,并在程序运行过程中不停闪烁 。 二,界面2等进度条填充满了之后,图片上方的文字、图片、图片下方的进度条、文字都消失,显示第二个系统主画面。 黄色外边框第二个界面面首先会出现一个黄色的外边框,首先沿界面边沿画一个大方框,以函数GUI_Rectangle()显示一个大矩形,在界面上方显示以矩形长度为长,宽度为矩形宽的1/4的矩形,填充颜色为黄色,根据GUI_RectangleFill()函数为其填充颜色。在黄色矩形中显示“XX系统 正在运行中”和时间显示。根据字模软件,以32*32、C51格式、顺向、逐行式、阳码的格式生成字模。 黄色边框里的文字“XX系统正在运行中”在黄色边框中的左上方显示“XX系统正在运行中”,利用字模软件把“XX系统正在运行中”根据字模选项以32*32、C51格式、顺向、逐行式、阳码的格式生成字模。界面长640,宽480,根据欢迎使用XX系统显示位置,算出坐标,汉字一个一个输出。利用GUI_PutHZ(x, y, *dat, hno, lno)函数,其中x、y表示显示位置,dat表示要输出显示的汉字点阵数据,hno表示要显示此行的点个数,lno表示要显示此列的点个数。 日期年月日显示这里要专业新新建一个任务,来对时间做处理。本项目中任务为TimeDispla()。要实现时间的准备计时,首先要定义秒、分、时处理的变量。本项目中采用5个变量分别是t、t1、t2、t3、t4,分别表示为秒的个位、十位,分的个位、十位以及时。然后秒的个位在一定时间内不断加1,当个位为9时这里要向秒的十位进位,再对十位进行判断,十位为5时,向分的个位进行进位最后当时为23时全部清0。最后将时间显示出来。在显示时间的时候要定义一个时间字模0-9的二维数组,然后分别对秒个位、十位等进行显示,如GUI_PutHZ(554, 80, timet,12, 24)。在时的显示上也分成两部分,一个是t4/10,t4%10。 温度、压力文字的字体颜色此字体颜色可在主程序中用GUI_SetColor来生成,如白字蓝底: GUI_SetColor(WHITE, BLUE); 温度、压力文字显示先利用字模软件生成温度、压力的程序代码的文档,将此代码添加到程序中,并用GUI_PutHZ在主程序中显示,此理同上。 温度压力下面的方框用GUI_Rectangle()来画两个矩形,如两个白色边框蓝底的矩形GUI_Rectangle(100, 230,210, 290, WHITE);/温度压力下面的方框GUI_Rectangle(330, 230,440, 290, WHITE); 按钮边框这是“曲线“与“帮助“外边的两个边框,利用GUI_Rectangle来作一个外边框线,即用用GUI_Rectangle()来画两个矩形,如两个白色边框的矩形GUI_Rectangle(330, 410,440, 470, WHITE);/按钮方框GUI_Rectangle(440, 410,550, 470, WHITE); 曲线帮助先用字模软件得出曲线帮助两个文字的程序文档,代入程序中,并用GUI_PutHZ()在程序中来显示汉字,文字显示同上。 三,界面3 黄色外边框第二个界面面首先会出现一个黄色的外边框,首先沿界面边沿画一个大方框,以函数GUI_Rectangle()显示一个大矩形,在界面上方显示以矩形长度为长,宽度为矩形宽的1/4的矩形,填充颜色为黄色,根据GUI_RectangleFill()函数为其填充颜色。在黄色矩形中显示“XX系统 正在运行中”和时间显示。根据字模软件,以32*32、C51格式、顺向、逐行式、阳码的格式生成字模。如GUI_Rectangle(10, 19,630, 470, WHITE);/外边框线,并用GUI_RectangleFill来填充边框,如黄色边框则是GUI_RectangleFill(10, 19,630, 130, YELLOW);/黄色 黄色边框里的文字“XX系统正在运行中”在黄色边框中的左上方显示“XX系统正在运行中”,利用字模软件把“XX系统正在运行中”根据字模选项以32*32、C51格式、顺向、逐行式、阳码的格式生成字模。界面长640,宽480,根据欢迎使用XX系统显示位置,算出坐标,汉字一个一个输出。利用GUI_PutHZ(x, y, *dat, hno, lno)函数,其中x、y表示显示位置,dat表示要输出显示的汉字点阵数据,hno表示要显示此行的点个数,lno表示要显示此列的点个数。 日期年月日显示 先利用字模软件生成此文字的程序代码的文档,并利用GUI_PutHZ来作此文字代码,此理同上。 压力温度返回 在液晶屏右下角会出现三个边框,俱属蓝底白色边框,用GUI_Rectangle()来画三个矩形, 三个方框里的文字先用字模软件生成程序代码文档,并用GUI_PutHZ在主程序中显示。 键盘扫描任务这项任务主要是用左右选择、回车键来实现画面、按钮的切换。通过按键来选择各个按钮,得用按键之前要先扫描键盘得到相应键的键值,这里利用ZLG7290_GetKey()和UART_SendStr()函数,再利用超级终端得出各个键值。在得出键值后分别对各个按键赋予一定的意义,然后在些基础上实现按键的判断。再有就是对各个画面、按钮进行编号,便于以后的判断。判断过程:先定义int curpic=2;int curbtn=1;int key;,然后对三个左右选择键、回车键进行判断。在每个键的判断过程中再分别对四个画面进行判断,在每个画面的判断过程中再对每个按钮进行判断,根据相应的情况把curpic、 curbtn的值进行相应的赋值。 画曲线画曲线任务最基本的模型其实是单个生产者单个消费者任务,并采用同步信号量的控制。在最基础的模型基础之上再用固定的数值即产生的固定的正弦波序列来动态画出波形。然后再用两个数组通过两个按键的控制画出不同的波形。最后再在此基础上去采真实的数据。做法:先把单个生产者单个消费者任务移植到工程里,利用超级终端对比是不是AZ的序列。五、程序源码#include config.h#include stdlib.h#include picture.h#define Pic_2 0#define Pic_3 1#define Pic_help 2#define BUTTON_SIN 0#define BUTTON_HELP 1#define BUTTON_PRESS 2#define BUTTON_TEMP 3#define BUTTON_BACK 4#define BUTTON_BACK1 5 #define TASK_INIT_STACK_LENGTH 512 #define TASK_DISPLAY_STACK_LENGTH 512 #define TASK_DISPTIME_STACK_LENGTH 512 #define TASK_DISPSIN_STACK_LENGTH 512 #define TASK_COLLECT_STACK_LENGTH 512OS_STK TaskInitStkTASK_INIT_STACK_LENGTH; OS_STK TaskDisplayStkTASK_DISPLAY_STACK_LENGTH; OS_STKTaskDispTimeStkTASK_DISPLAY_STACK_LENGTH; OS_STKTaskDispSINStkTASK_DISPSIN_STACK_LENGTH; OS_STKTaskCollectStkTASK_COLLECT_STACK_LENGTH; void TaskInit(void *pdata); void TaskDisplay(void *pdata); void TaskDispTime(void *pdata); void TaskDispSIN(void *pdata); void TaskCollect(void *pdata); #define OS_PRIO_TASK_INIT 1 #define OS_PRIO_TASK_DISPLAY 6 #define OS_PRIO_TASK_DISPTIME 7 #define OS_PRIO_TASK_DISPSIN 9 #define OS_PRIO_TASK_Collect 10 #define KEY_LEFT 11 #define KEY_RIGHT 12 #define KEY_OK 13 int Disp = Pic_2;int Button = BUTTON_SIN;int sin = 0;int J=200,x;int hour=12;int minute=34;int second=56;int key;int bFirst = 1;int ebFirst = 1; #defineBUF_SIZE 512 INT8U *errold;INT8U in = 0; INT8U out = 0; unsigned int bBUF_SIZE; int cNext;unsigned int ebBUF_SIZE; int ecNext;INT8U ein = 0; INT8U eout = 0;uint32 adc0,adc1;#define ADC_FREQ(2*1000000)OS_EVENT*Empty; OS_EVENT*Full; OS_EVENT*eEmpty; OS_EVENT*eFull; OS_EVENT*Mutex;typedef struct uint32 x; uint32 y; Point;Point origin = 130, 340; uint32 x_len = 340; uint32 y_len = 240; #define AXES_COLOR RED void firstdisp (void);void seconddisp(void);int main (void)OSInit ();OSTaskCreate(TaskInit, (void *)0, &TaskInitStkTASK_INIT_STACK_LENGTH - 1, OS_PRIO_TASK_INIT);OSStart ();return 0;void TaskInit(void *pdata) TargetInit(); GUI_FillSCR(BLUE);firstdisp();GUI_FillSCR(BLUE); seconddisp(); / GPIO rGPACON = rGPACON & (1 21); rGPHCON = (rGPHCON & (0x03 20) | (0x01 0; dly-) for (i = 0; i 500; i+) ; */void firstdisp()GUI_SetColor(WHITE, BLUE); GUI_PutHZ(220,100,huan,30,30); GUI_PutHZ(250,100,ying,30,30);GUI_PutHZ(280,100,shi,30,30);GUI_PutHZ(310,100,yong,30,30);GUI_PutHZ(340,100,mou,15,30);GUI_PutHZ(355,100,mou1,15,30);GUI_PutHZ(370,100,xi,30,30);GUI_PutHZ(400,100,tong,30,30); GUI_RectangleFill(200,331,450,359,WHITE); GUI_Rectangle(200,330,450,360,YELLOW); GUI_DispPic( 200,170,240,120, (uint16*)Loading); for(J=200;J=440;J=J+10) GUI_RectangleFill(J,331,J+10,359,GREEN);if(x%3=0)GUI_RectangleFill(270,400,355,420,BLUE);elseGUI_PutHZ(270,400,L,8,16);GUI_PutHZ(278,400,o,8,16);GUI_PutHZ(286,400,a,8,16);GUI_PutHZ(294,400,d,8,16);GUI_PutHZ(302,400,i,8,16);GUI_PutHZ(310,400,n,8,16);GUI_PutHZ(318,400,g,8,16);GUI_PutHZ(326,400,deng,8,16);GUI_PutHZ(334,400,dai,8,16);GUI_PutHZ(342,400,zhong,8,16);x+;OSTimeDly(80);void seconddisp()Disp = Pic_2;GUI_Rectangle(9,9,631,470,WHITE);GUI_RectangleFill(10,10,630,150,YELLOW);GUI_DispPic( 200,25,240,110, (uint16*)Loading);GUI_SetColor(BLUE, YELLOW);GUI_PutHZ(50,30,mou,15,30);GUI_PutHZ(65,30,mou1,15,30);GUI_PutHZ(80,30,xi,30,30);GUI_PutHZ(110,30,tong,30,30);GUI_PutHZ(30,90,zheng,30,30);GUI_PutHZ(60,90,zai,30,30);GUI_PutHZ(90,90,yun,30,30);GUI_PutHZ(120,90,xing,30,30);GUI_PutHZ(150,90,zhong1,30,30);GUI_PutHZ(500,30,number2,12,24);GUI_PutHZ(510,30,number0,12,24);GUI_PutHZ(520,30,number1,12,24);GUI_PutHZ(530,30,number1,12,24);GUI_PutHZ(540,30,heng,12,24);GUI_PutHZ(550,30,number0,12,24);GUI_PutHZ(560,30,number4,12,24);GUI_PutHZ(570,30,heng,12,24);GUI_PutHZ(580,30,number0,12,24);GUI_PutHZ(590,30,number7,12,24);GUI_Rectangle(110,250,210,300,YELLOW);GUI_Rectangle(380,250,480,300,YELLOW);GUI_Rectangle(380,420,510,470,YELLOW);GUI_Rectangle(510,420,630,470,YELLOW);GUI_SetColor(WHITE, BLUE);GUI_PutHZ(130,190,wen,30,30);GUI_PutHZ(160,190,du,30,30);GUI_PutHZ(400,190,ya,30,30);GUI_PutHZ(430,190,li,30,30);GUI_PutHZ(400,430,qu,30,30);GUI_PutHZ(430,430,xian,30,30);GUI_PutHZ(530,430,bang,30,30);GUI_PutHZ(560,430,zhu,30,30);void thirddisp()Disp = Pic_3;GUI_SetColor(BLUE, YELLOW);GUI_Rectangle(9,9,631,470,WHITE);GUI_Rectangle(380,420,510,470,YELLOW);GUI_Rectangle(510,420,630,470,YELLOW);GUI_Rectangle(250,420,380,470,YELLOW);GUI_SetColor(BLUE, YELLOW);GUI_RectangleFill(10,10,630,150,YELLOW);GUI_PutHZ(50,30,mou,15,30);GUI_PutHZ(65,30,mou1,15,30);GUI_PutHZ(80,30,xi,30,30);GUI_PutHZ(110,30,tong,30,30);GUI_PutHZ(30,90,zheng,30,30);GUI_PutHZ(60,90,zai,30,30);GUI_PutHZ(90,90,yun,30,30);GUI_PutHZ(120,90,xing,30,30);GUI_PutHZ(150,90,zhong1,30,30);GUI_DispPic( 200,25,240,110, (uint16*)Loading);GUI_PutHZ(500,30,number2,12,24);GUI_PutHZ(510,30,number0,12,24);GUI_PutHZ(520,30,number1,12,24);GUI_PutHZ(530,30,number1,12,24);GUI_PutHZ(540,30,heng,12,24);GUI_PutHZ(550,30,number0,12,24);GUI_PutHZ(560,30,number4,12,24);GUI_PutHZ(570,30,heng,12,24);GUI_PutHZ(580,30,number0,12,24);GUI_PutHZ(590,30,number7,12,24);GUI_SetColor(WHITE, BLUE);GUI_PutHZ(270,430,ya,30,30);GUI_PutHZ(300,430,li,30,30);GUI_PutHZ(400,430,wen,30,30);GUI_PutHZ(430,430,du,30,30);GUI_PutHZ(530,430,fan,30,30);GUI_PutHZ(560,430,hui,30,30);GUI_HLine(100, 340, 440, WHITE);GUI_RLine(130, 190, 430, WHITE);GUI_Line(440,340,435,345,YELLOW);GUI_Line(440,340,435,335,YELLOW);GUI_Line(130,190,135,195,YELLOW);GUI_Line(130,190,125,195,YELLOW);void foutrhdisp()Disp = Pic_help;GUI_SetColor(BLUE, YELLOW);GUI_Rectangle(9,9,631,470,WHITE);GUI_RectangleFill(10,10,630,150,YELLOW);GUI_PutHZ(50,30,mou,15,30);GUI_PutHZ(65,30,mou1,15,30);GUI_PutHZ(80,30,xi,30,30);GUI_PutHZ(110,30,tong,30,30);GUI_PutHZ(30,90,zheng,30,30);GUI_PutHZ(60,90,zai,30,30);GUI_PutHZ(90,90,yun,30,30);GUI_PutHZ(120,90,xing,30,30);GUI_PutHZ(150,90,zhong1,30,30);GUI_DispPic( 200,25,240,110, (uint16*)Loading);GUI_PutHZ(500,30,number2,12,24);GUI_PutHZ(510,30,number0,12,24);GUI_PutHZ(520,30,number1,12,24);GUI_PutHZ(530,30,number1,12,24);GUI_PutHZ(540,30,heng,12,24);GUI_PutHZ(550,30,number0,12,24);GUI_PutHZ(560,30,number4,12,24);GUI_PutHZ(570,30,heng,12,24);GUI_PutHZ(580,30,number0,12,24);GUI_PutHZ(590,30,number7,12,24);GUI_Rectangle(510,420,630,470,YELLOW);GUI_SetColor(WHITE, BLUE);GUI_PutHZ(530,430,fan,30,30);GUI_PutHZ(560,430,hui,30,30);void zb()GUI_RectangleFill(101,151,480,350,BLUE); GUI_HLine(100, 340, 440, WHITE);GUI_RLine(130, 190, 430, WHITE);GUI_Line(440,340,435,345,YELLOW);GUI_Line(440,340,435,335,YELLOW);GUI_Line(130,190,135,195,YELLOW);GUI_Line(130,190,125,195,YELLOW);uint32 ReadAdc(uint32 ch) int i;ch = ch & 0x07;/ PRSCEN=1/ PRSCVL=(PCLK/ADC_FREQ - 1)ADCADC_FREQ/ SEL_MUX=chADC/ STDBM=0/ READ_START=0()ADC/ ENABLE_START=0ADC rADCCON = (114)|(PCLK/ADC_FREQ - 1)6)|(ch3)|(02)|(01)|(00); rADCTSC = rADCTSC & (0x03);for(i=0; i100; i+);rADCCON = rADCCON | (10); while(rADCCON & 0x01); while(!(rADCCON & 0x8000); return (rADCDAT0 & 0x3ff);void Taskkey()while(1) key =(int) ZLG7290_GetKey(); if (Disp = Pic_2)if (int)key = KEY_RIGHT )if (Button = BUTTON_SIN)GUI_Rectangle(380,420,510,470,YELLOW);GUI_Rectangle(511,420,630,469,BLACK);Button = BUTTON_HELP;else if(int)key = KEY_LEFT)if (Button = BUTTON_HELP)GUI_Rectangle(511,420,630,470,YELLOW); GUI_Rectangle(380,420,510,469,BLACK);Button = BUTTON_SIN;else if (int)key = KEY_OK)if(Button = BUTTON_SIN)GUI_FillSCR(BLUE); thirddisp();Button=BUTTON_PRESS;else if(Button = BUTTON_HELP)GUI_FillSCR(BLUE); foutrhdisp();Button=BUTTON_BACK1;else if(Disp = Pic_help)if(key = KEY_OK)GUI_FillSCR(BLUE); seconddisp();Button = BUTTON_SIN;else if (Disp = Pic_3)if (int)key = KEY_LEFT)if (Button = BUTTON_PRESS) GUI_Rectangle(250,420,380,469,YELLOW); GUI_Rectangle(381,420,510,470,YELLOW); GUI_Rectangle(511,420,630,470,BLACK);Button = BUTTON_BACK;else if (Button = BUTTON_BACK) GUI_Rectangle(250,420,380,470,YELLOW);GUI_Rectangle(381,420,510,469,BLACK);GUI_Rectangle(511,420,630,470,YELLOW);Button = BUTTON_TEMP;else if (Button = BUTTON_TEMP)GUI_Rectangle(250,420,380,470,BLACK); GUI_Rectangle(381,420,510,470,YELLOW); GUI_Rectangle(511,420,630,469,YELLOW);Button = BUTTON_PRESS;else if (int)key = KEY_RIGHT)if (Button = BUTTON_PRESS)GUI_Rectangle(250,420,380,469,YELLOW); GUI_Rectangle(381,420,510,470,BLACK); GUI_Rectangle(511,420,630,470,YELLOW);Button = BUTTON_TEMP;else if (Button = BUTTON_TEMP)GUI_Rectangle(250,420,380,470,YELLOW); GUI_Rectangle(381,420,510,469,YELLOW); GUI_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论