课程设计(论文)任务书
信息工程
学 院 物 联网
专
业 2014-2 班
一、课程设计(论文)题目 基于 Ucos 的多通道数据采集系统
二、课程设计(论文)工作自 2017 年 06 月 26 日起至 2017 年 06 月 30 日止。三、课程设计(论文) 地点: 嵌入式系统实验室 四、课程设计(论文)内容要求:
1. 本课程设计的目的
(1) 使学生掌握嵌入式开发板(实验箱)各功能模块的基本工作原理; (2) 培养嵌入式系统的应用能力及嵌入式软件的开发能力;
(3) 使学生较熟练地应用嵌入式操作系统及其 API 开发嵌入式应用软件; (4) 培养学生分析、解决问题的能力;
(5) 提高学生的科技论文写作能力。 2. 课程设计的任务及要求 1) 基本要求:
(1) 分析所设计嵌入式软件系统中各功能模块的实现机制; (2) 选用合适嵌入式操作系统及其 API;
(3) 编码实现最终的嵌入式软件系统; (4) 在实验箱上调试、测试并获得最终结果。
2) 创新要求:
在基本要求达到后,可进行创新设计,如改善嵌入式软件实时性能;扩展嵌入式软件功能及改善其图形用户界面。
3) 课程设计论文编写要求
(1) 要按照书稿的规格打印誊写课程设计论文。
(2) 论文包括目录、正文、小结、参考文献、谢辞、附录等(以上可作微调)。
(3) 课程设计论文装订按学校的统一要求完成。
4) 课程设计评分标准: (1) 学习态度:20 分;
(2) 回答问题及系统演示:30 分
(3) 课程设计报告书论文质量:50 分。
成绩评定实行优秀、良好、中等、及格和不及格五个等级。不及格者需重做。
5) 参考文献:
(1) 罗蕾.《嵌入式实时操作系统及应用开发》北京航空航天大学出版社 (2) Jean J.Labrosse. 《嵌入式实时操作系统 uC/OS-II》北京航空航天大学出版社
(3) 王田苗.《嵌入式设计与开发实例》.北京航空航天大学出版社 (4) 北京博创科技公司. 《嵌入式系统实验指导书》
6) 课程设计进度安排
(1) 准备阶段(4 学时):选择设计题目、了解设计目的要求、查阅相关资料。 (2) 嵌入式软件设计分析阶段(4 学时):程序总体设计、详细设计。
(3) 嵌入式软件代码编写调试阶段(8 学时):程序模块代码编写、调试、测试。 (4) 撰写论文阶段(4 学时):总结课程设计任务和设计内容,撰写课程设计论文。
7) 课程设计题目具体要求:
本题的具体任务是设计多任务的嵌入式软件—— ,通过分析、设计、编程、调试、测试等步骤,形成一个基于 ucos 可稳定运行的嵌入式多任务软件系统。
学生签名:
2017 年 6 月 26 日
课程设计(论文)评审意见
(1)考勤(10 分): 优( )、良( )、中( )、一般( )、差( );
(2)系统设计(20 分):优( )、良( )、中( )、一般( )、差( ); (3)编程调试(10 分):优( )、良( )、中( )、一般( )、差( ); (4)回答问题(15 分):优( )、良( )、中( )、一般( )、差( );
(5)论文撰写(35 分):优( )、良( )、中( )、一般( )、差( ); (6)创新思想(10 分):优( )、良( )、中( )、一般( )、差( ); 综合评定等级:
评阅人: 职称:副教授
2017 年 6 月 30 日
目录
一、课设目的及内容.................................................................................................... 1
1.1 课设目的.......................................................................................................... 1 1.2 课设内容.......................................................................................................... 1 二、设计的原理............................................................................................................ 2
2.1 总体设计原理.................................................................................................. 2 2.2A/D 转换器原理................................................................................................ 2 2.3 基于 uc/os2II 的系统程序流程.................................................................... 3 三、环境搭建及开发环境............................................................................................ 5 四、主要程序代码设计................................................................................................ 7 五、运行测试结果...................................................................................................... 20 六、心得体会.............................................................................................................. 22 七、参考文献.............................................................................................................. 23
一、课设目的及内容
1.1 课设目的
在二十一世纪的今日,人们生活在一个信息的的时代,各种各样不同的信息给予我们很多不同的选择。 对于信息的需求,各类人有着不同的需求,但是肯定的是,对于信息的重要性大家已经有了认识。数据采集 已经成为一种专业的技术,在各个领域得到了广泛的应用。数据采集系统起源于 20 世纪 50 年代,并当 即就获得了初步的认可,在很多的地方得到了运用。在 60 年代前后,国外就有了用于专业数据采集的系 统。20 世纪 70 年代后期,随着微型机的发展,诞生了采集器、仪表同计算机溶为一体的数据采集系 统。由于这种数据采集系统的性能优良,超过了传统的自动检测仪表和专用数据采集系统,因而获得了 惊人的发展。到了现在,经过更长久的发展,嵌入式系统已经走进千家万户,嵌入式的数据采集系统不仅功 耗低,而且操作简单,正适合应用于在家中,路上或者生活中的各处。
1.2 课设内容
一、 基本要求(必做)
(1) 求出四路通道的平均值,并绘制在显示屏上(平均值应该象其他通道
的值一样,可以根据实时采集值的变化而变化)。
(2) 报警,在超出阈值时报警一次,如果此后此通道的值不变则不再报警,
若此通道的值被调小为小于阈值而后又被调为大于阈值,则再次报警一次。
(3) 设置时间和日期初值,并实时显示在 LCD 上(同各通道的值同屏显
示)。并能够在整点的时候发声提示。
二、 提高要求(选做)
在一的基础上利用四路通道平均值的大小控制电机的转动速度,使电机实时转动。
0
二、设计的原理 2.1 总体设计原理
本系统由硬件和软件两部分组成。硬件以AT89C51 和 12 位ADC芯片AD574A为核心, 具有键盘控制和液晶显示功能,并有一路数模转换输出。该系统还具有实时时间显示和看门狗功能,可以通过RS232 和GPIB接口以便与外部(微机)通信。系统的软件以实时嵌入式操作系统uc/os2 为基础,采用多任务机制,通过任务调度和任务监视,系统具有较好的实时性和安全性。uc/os2II是源码公开的实时嵌入式操作系统,采用优先级调度算法完成任务间的调度,并支持抢占式调度。uc/os2II具有可裁减的体系结构,并具有内存管理、中断管理和任务控制块(TCB)扩展的功能。uc/os2II还提供很多系统服务,例如邮箱、消息队列、信号量等等。
2.2 A/D 转换器原理
主要介绍以下三种方法:逐次逼近法、双积分法、电压频率转换法
1) 逐次逼近法
逐次逼近式A/D是比较常见的一种A/D转换电路,转换的时间为微秒级。 采用逐次逼近法的A/D转换器是由一个比较器、D/A转换器、缓冲寄存器及控制逻辑电路组成,如图所示。
基本原理是从高位到低位逐位试探比较,好像用天平称物体,从重到轻逐级增减
砝码进行试探。
逐次逼近法的转换过程是:初始化时将逐次逼近寄存器各位清零;转换开始时, 先将逐次逼近寄存器最高位置 1,送入D/A转换器,经D/A转换后生成的模拟量送入比较器,称为 Vo,与送入比较器的待转换的模拟量Vi进行比较,若Vo 1 2) 双积分法 采用双积分法的A/D转换器由电子开关、积分器、比较器和控制逻辑等部件组成。如图所示。基本原理是将输入电压变换成与其平均值成正比的时间间隔,再把此时间间隔转换成数字量,属于间接转换。 双积分法 积分法A/D转换的过程是:先将开关接通待转换的模拟量Vi,Vi采样输入到积分器,积分器从零开始进行固定时间T的正向积分,时间T到后,开关再接通与Vi极性相反的基准电压VREF,将VREF输入到积分器,进行反向积分,直到输出为 0V 时停止积分。Vi越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数值,就是输入模拟电压Vi所对应的数字量,实现了A/D转换。 3) 电压频率转换法 采用电压频率转换法的A/D转换器,由计数器、控制门及一个具有恒定时间的时钟门控制信号组成,它的工作原理是V/F转换电路把输入的模拟电压转换成与模拟电压成正比的脉冲信号。电压频率转换法的工作过程是:当模拟电压Vi加到V/F 的输入端,便产生频率F与Vi成正比的脉冲,在一定的时间内对该脉冲信号计数, 时间到,统计到计数器的计数值正比于输入电压Vi,从而完成A/D转换。 2.3 基于 uc/os2II 的系统程序流程 基于uc/os2II的程序流程如图 1 所示。程序中,每个模块对应一个任务,彼此之间是并行的,但每个模块都对应着一个不同的优先级,由操作系统进行调度运行。系统可以通过监控模块对其他模块的工作进行监控,从而减少看门狗的复位次数。而且通过uc/os2II内核的任务调度,系统的实时性会提高很多。 2 图 1 基于uc/os2II的程序流程 图 2 传统程序流程图 3 三、环境搭建及开发环境 系统的硬件组成框图如图 3 所示。信号经前向处理后,通过多路模拟开关和采样保持器,输入到A/D转换芯片进行数据采集。经A/D转换后的数字量被单片机读入, 经处理后由通信接口读入微机进行进一步的处理和分析,同时也可由D/A芯片进 行数/模转换得到一路模拟信号。液晶有系统提示和实时时间显示,可以通过键盘进行选择和控制。 图 3 系统组成框图 系统信号前向处理电路包括自动增益控制和滤波电路,8 路模拟开关CD4051。A/D 转换采用AD公司的 12 位逐次逼近式ADC,适合高精度数据采集,转换时间可达25us;D/A转换采用美国国民半导体公司的DAC0832 芯片。系统外部扩展 32kROM和RAM,供缓存数据和存贮程序。液晶采用日本DMC系列产品中的DMC24138,可以在一行上显示 24 个 5×11 点阵字符。时间芯片采用的是M48T86,具有实时时间和日历显示功能。整个系统采用全地址译码法,外部设备和存储器统一编址。CPU访问外部存贮器的一切指令均可用于对I/O端口的访问,大大增强了CPU对外设端口信息的处理能力。 1、A/D转换器 在本设计所选用的LPC2138 硬件系统中带有A/D转换器. 特性: (1)、10 位逐次逼近式模数转换器 (2) 、8 个管脚复用为输入脚 (3) 、掉电模式 (4) 、测量范围:0~3V (5) 、10 位转换时间>=2.44US 4 (6) 、一个或多个输入的 Burst 转换模式 (7) 、可选择由输入跳变或定时器匹配信号触发转换 (8)、2 个转换器的全局启动命令 描述: A/D 转换器的基本时钟由 VPB 时钟提供。每个转换器包含一个可编程分频器,可将时钟调整至逐步逼近 转换所需的 4.5MHZ。完全满足精度要求的转换需要 11 个这样的时钟。 2、4X4 键盘 键盘按与微控制器的连接方式,其结构可分为线性键盘和矩阵键盘两种形式。线性键盘由若干个独立的案件组成,每个按键的一端与微控制器的一个 I/O 口相连。有多少个键就要有 多少根线与微控制器的 I/O 口相连,适用于按键少的场合。矩阵键盘的按键按 N 行 M 列排列。根据矩阵 键盘的识键和译键的不同,矩阵键盘又可以分为非编码键盘和编码键盘两种。非编码键盘主要用软件的 方法识键和译键。根据扫描方法的不同,可以分为行扫描法,列扫描法和反转法三种。在本设计中,使用了节省口线的行扫描法来检测键盘,与 4X4 的矩阵键盘接口只需要 8 根口线,设 置 KEY1~KEY 为输出扫描码的端口,KEYA~KEYB 为键值读入口。 3、LCD 显示模块 在这里应用了 LCD 显示模块来进行数据的输出。GUI 即图形用户接口,是操作系统和用户的人机接 口。 GUI 是一种嵌入式应用中的图形支持系统。它设计用于为任何使用 LCD 图形显示的应用提供高效的独立 于处理器和 LCD 控制器的图形用户接口,它适用单任务或是多任务系统环境,并适用于任意 LCD 控制器 和 CPU 下任何尺寸的真实显示或是虚拟显示。它的设计结构是模块化的,由不同模块中的不同层组成, 由一个 LCD 驱动层来包含所有对 LCD 的具体图形操作。使用 GUI 来控制 LCD 的显示,不仅代码容易,简单,而且在任何的 CPU 上都能运行。所以本人在这里选 择了这样的方式。 5 四、主要程序代码设计 完成要求 1:求出四路通道的平均值,并绘制在显示屏上(平均值应该象其他通道的值一样,可以根据实时采集值的变化而变化)。 #include\"..\ii\\includes.h\" #include \"..\ii\\add\\osaddition.h\" #include \"..\\inc\\drv.h\" #include #include\"..\\inc\\drv\\ad.h\" #include \"..\\inc\\drv\\IIS-S3C44B0.h\" #include \"..\\inc\\drv\\OSFile.h\" /* uC/OS interface */ #define ID_ChannelTextCtrl 101 #define ID_ValueTextCtrl 102 #define Draw_Wnd_ID 104 PTextCtrl pChannelTextCtrl,pValueTextCtrl; float result_AD0,result_AD1,result_AD2,result_AD3,average; int WarnningData[5]={33,33,33,33,33}; int edit[2]={0,0}; int buffer[AUDIO_IN_BUFFERSIZE*20]; ///******************任务定义***************/// OS_STK Main_Stack[STACKSIZE*8]={0, }; //Main_Test_Task 堆栈void Main_Task(void *Id); //Main_Test_Task #define Main_Task_Prio 12 OS_STK Display_Task_Stack[STACKSIZE*8]={0, }; //Main_Test_Task 堆栈 void Display_Task(void *Id); //Main_Test_Task #define Display_Task_Prio 20 OS_STK AD0_Task_Stack[STACKSIZE*8]={0, }; //Main_Test_Task 堆栈 void AD0_Task(void *Id); //Main_Test_Task #define AD0_Task_Prio 21 OS_STK AD1_Task_Stack[STACKSIZE*8]={0, }; //Main_Test_Task 堆栈 void AD1_Task(void *Id); //Main_Test_Task #define AD1_Task_Prio 22 OS_STK AD2_Task_Stack[STACKSIZE*8]={0, }; //Main_Test_Task 堆栈 void AD2_Task(void *Id); //Main_Test_Task #define AD2_Task_Prio 23 6 OS_STK AD3_Task_Stack[STACKSIZE*8]={0, }; //Main_Test_Task 堆栈 void AD3_Task(void *Id); //Main_Test_Task #define AD3_Task_Prio 24 /**************已经定义的 OS 任务************* tcp 监控任务 11 以太网物理层监控任务 9 触摸屏任务 10 键盘任务 59 lcd 刷新任务 系统任务 1 8 *****************************************************/ ///*****************事件定义*****************/// OS_EVENT *Nand_Rw_Sem; //Nand_Flash 读写控制权旗语 //and you can use it as folloeing: // Nand_Rw_Sem=OSSemCreate(1); 满足互斥条件// // OSSemPend(Nand_Rw_Sem,0,&err); // OSSemPost(Nand_Rw_Sem); //创建 Nand-Flash 读写控制权旗语,初值为 1 OS_EVENT *Uart_Rw_Sem; //and you can use it as folloeing: //Uart 读写控制权旗语 // Uart_Rw_Sem=OSSemCreate(1); //创建 Uart 读写控制权旗语,初值为 1 满足互斥条件// // OSSemPend(Uart_Rw_Sem,0,&err); // OSSemPost(Uart_Rw_Sem); ////////////////////////////////////////////////////////// void initOSGUI() //初始化操作系统的图形界面 { initOSMessage(); initOSList(); initOSDC(); initOSCtrl(); initOSFile(); } ///////////////////////////////////////////////////// // Main function. //////////////////////////////////////////////////// // int Main(int argc, char **argv) { ARMTargetInit(); //开发板初始化 7 OSInit(); //操作系统初始化 uHALr_ResetMMU();//复位 MMU LCD_Init(); //初始化 LCD 模块 LCD_printf(\"LCD initialization is OK\\n\");//向液晶屏输出数据LCD_printf(\"320 x 240 Text Mode\\n\"); initOSGUI();//初始化图形界面LoadFont();//调 Unicode 字库 LoadConfigSys();//使用 config.sys 文件配置系统设置 LCD_printf(\"Create task on uCOS-II...\\n\"); OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[STACKSIZE*8-1], Main_Task_Prio);// 创建系统任务 OSTaskCreate(Display_Task,(void *)0, Display_Task_Prio);// 20 OSTaskCreate(AD0_Task,(void *)0, AD0_Task_Prio); OSTaskCreate(AD1_Task,(void *)0, AD1_Task_Prio); OSTaskCreate(AD2_Task,(void *)0, AD2_Task_Prio); OSTaskCreate(AD3_Task,(void *)0, AD3_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();//操作系统任务调度开始 //不会执行到这里return 0; } (OS_STK *)&Display_Task_Stack[STACKSIZE-1], (OS_STK (OS_STK (OS_STK (OS_STK *)&AD0_Task_Stack[STACKSIZE-1], *)&AD1_Task_Stack[STACKSIZE-1], *)&AD2_Task_Stack[STACKSIZE-1], *)&AD3_Task_Stack[STACKSIZE-1], ////////////////////////////////////////////////////////////////////////////////////////////////////// //////////// void Wave(); //void init_ADdevice() //{ //rADCPSR=20; //rADCCON=ADCCON_SLEEP; //} U8 onKey(int nkey, int fnkey) { 8 static BOOLEAN input=FALSE; static int EditNumber=1; if(EditNumber==1) { switch(nkey) { case 14://OK if(!input) { SetWndCtrlFocus(NULL, ID_ChannelTextCtrl); pChannelTextCtrl->text[0]=0; //清空文本框SetTextCtrlEdit(pChannelTextCtrl, TRUE); DrawTextCtrl(pChannelTextCtrl); input=TRUE; edit[0]=1; } else { SetTextCtrlEdit(pChannelTextCtrl, FALSE); DrawTextCtrl(pChannelTextCtrl); input=FALSE; edit[0]=0; EditNumber=2; } return TRUE; case 16://Cancel SetTextCtrlEdit(pChannelTextCtrl, FALSE); input=FALSE; edit[0]=0; EditNumber=2; return TRUE; } } else if(EditNumber==2) { switch(nkey) { case 14://OK if(!input) { SetWndCtrlFocus(NULL, ID_ValueTextCtrl); pValueTextCtrl->text[0]=0; //清空文本框SetTextCtrlEdit(pValueTextCtrl, TRUE); 9 DrawTextCtrl(pValueTextCtrl); input=TRUE; edit[1]=1; } else { SetTextCtrlEdit(pValueTextCtrl, FALSE); DrawTextCtrl(pValueTextCtrl); input=FALSE; edit[1]=0; EditNumber=1; WarnningData[ >text)]=Unicode2Int(pValueTextCtrl->text); } return TRUE; case 17://Cancel SetTextCtrlEdit(pValueTextCtrl, FALSE); DrawTextCtrl(pValueTextCtrl); input=FALSE; edit[1]=0; EditNumber=1; return TRUE; } } return FALSE; } void Main_Task(void *Id) //Main_Test_Task { POSMSG pMsg; init_ADdevice(20,ADCCON_SLEEP); for(;;) { POS_Ctrl pCtrl; pMsg=WaitMessage(0); if(pMsg->pOSCtrl) { if(pMsg->pOSCtrl->CtrlMsgCallBk) (*pMsg->pOSCtrl->CtrlMsgCallBk)(pMsg); } else { switch(pMsg->Message) { 10 Unicode2Int(pChannelTextCtrl- case OSM_KEY: pCtrl=GetCtrlfromID(NULL, GetWndCtrlFocus(NULL)); if(pCtrl->CtrlType==CTRLTYPE_WINDOW) { if((((PWnd)pCtrl)->style&WND_STYLE_MODE)==WND_STYLE_MODE) { //焦点是有模式窗口,消息直接传递过去OSOnSysMessage(pMsg); break; } } if(onKey(pMsg->WParam,pMsg->LParam) ) break; default: OSOnSysMessage(pMsg); break; } } DeleteMessage(pMsg); OSTimeDly(200); } } void Display_Task(void * Id) //Main_Test_Task { PDC pdc; int a0,a1,a2,a3,a4; structRECT ChannelTextCtrl_Rect,ValueTextCtrl_Rect,Draw_Wnd_Rect; char Channel_Caption_8[10]=\"Channel:\"; char Value_Caption_8[10]=\"Value:\"; char Draw_Wnd_Caption_8[]=\"Draw Window\"; char vol_8[]=\"Vol\"; char chn_8[]=\"Chn\"; char chn0_8[]=\"0\"; char chn1_8[]=\"1\"; char chn2_8[]=\"2\"; char chn3_8[]=\"3\"; char chn4_8[]=\"ave\"; char vol_10_8[]=\"10\"; char vol_20_8[]=\"20\"; char vol_30_8[]=\"30\"; u16 Channel_Caption_16[10]; u16 Value_Caption_16[10]; U16 Draw_Wnd_Caption_16[20]; 11 u16 vol_16[5]; u16 chn_16[5]; u16 chn0_16[2]; u16 chn1_16[2]; u16 chn2_16[2]; u16 chn3_16[2]; u16 chn4_16[5]; u16 vol_10_16[3]; u16 vol_20_16[3]; u16 vol_30_16[3]; Wnd Draw_Wnd; PWnd pDraw_Wnd; int warnning[5]={1,1,1,1,1}; BOOLEAN IsEdit=0; pdc=CreateDC(); pDraw_Wnd=&Draw_Wnd; strChar2Unicode(Draw_Wnd_Caption_16, Draw_Wnd_Caption_8); strChar2Unicode(Channel_Caption_16, Channel_Caption_8); strChar2Unicode(Value_Caption_16, Value_Caption_8); strChar2Unicode(chn_16, chn_8); strChar2Unicode(vol_16, vol_8); strChar2Unicode(chn0_16, chn0_8); strChar2Unicode(chn1_16, chn1_8); strChar2Unicode(chn2_16, chn2_8); strChar2Unicode(chn3_16, chn3_8); strChar2Unicode(chn4_16, chn4_8); strChar2Unicode(vol_10_16,vol_10_8); strChar2Unicode(vol_20_16,vol_20_8); strChar2Unicode(vol_30_16,vol_30_8); SetRect(&ChannelTextCtrl_Rect, 10,50,55,75); SetRect(&ValueTextCtrl_Rect, 10,125,55,150); SetRect(&Draw_Wnd_Rect, 74, 9, 301, 216); pChannelTextCtrl=CreateTextCtrl(ID_ChannelTextCtrl, &ChannelTextCtrl_Rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL,NULL); pValueTextCtrl=CreateTextCtrl(ID_ValueTextCtrl, &ValueTextCtrl_Rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL,NULL); pDraw_Wnd=CreateWindow(Draw_Wnd_ID, &Draw_Wnd_Rect, FONTSIZE_SMALL,WND_STYLE_MODELESS, Draw_Wnd_Caption_16, NULL); ClearScreen(); TextOut(pdc, 55, 10, vol_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 290, 215, chn_16, TRUE, FONTSIZE_SMALL); 12 TextOut(pdc, 110, 215, chn0_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 150, 215, chn1_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 190, 215, chn2_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 230, 215, chn3_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 270, 215, chn4_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 60, (int)(205-1*200/3.3), vol_10_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 60, (int)(205-2*200/3.3), vol_20_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 60, (int)(205-3*200/3.3), vol_30_16, TRUE, FONTSIZE_SMALL); DrawTextCtrl(pChannelTextCtrl); DrawTextCtrl(pValueTextCtrl); a0=0;a1=0;a2=0;a3=0;a4=0; { for(;;) average= (result_AD0+ result_AD1+ result_AD2+ result_AD3)/4; TextOut(pdc, 10, 35, Channel_Caption_16, TRUE, FONTSIZE_SMALL); TextOut(pdc, 10, 110, Value_Caption_16, TRUE, FONTSIZE_SMALL); if(edit[0]==1) { if(IsEdit==1) { FillRect(pdc, 10, 35, 60, 45, GRAPH_MODE_NORMAL, COLOR_WHITE); IsEdit=0; } else { IsEdit=1; } } if(edit[1]==1) { if(IsEdit==1) { FillRect(pdc, 10, 110, 60, 120, GRAPH_MODE_NORMAL, COLOR_WHITE); IsEdit=0; } else { IsEdit=1; } } DrawWindow(pDraw_Wnd); MoveTo(pdc, 75, 15); LineTo(pdc, 80,10); 13 LineTo(pdc, 85, 15); MoveTo(pdc,80 , 10); LineTo(pdc, 80, 210); LineTo(pdc, 300, 210); MoveTo(pdc, 295, 205); LineTo(pdc, 300, 210); LineTo(pdc, 295, 215); MoveTo(pdc, 80, (int)(210-1*200/3.3)); LineTo(pdc, 300, (int)(210-1*200/3.3)); MoveTo(pdc, 80, (int)(210-2*200/3.3)); LineTo(pdc, 300, (int)(210-2*200/3.3)); MoveTo(pdc, 80, (int)(210-3*200/3.3)); LineTo(pdc, 300, (int)(210-3*200/3.3)); if(result_AD1>WarnningData[1]) if(a0==0){Wave();a0=1;} if(result_AD2>WarnningData[2]) if(a1==0){Wave();a1=1;} if(result_AD0<=WarnningData[0]) { FillRect(pdc, 105, (int)(210-result_AD0*20/3.3), 210,GRAPH_MODE_NORMAL, COLOR_BLACK); } else { if(warnning[0]==1) { FillRect(pdc, 105, (int)(210-result_AD0*20/3.3), 120, GRAPH_MODE_NORMAL,COLOR_BLACK); warnning[0]=0; } else { warnning[0]=1; FillRect(pdc, 105, (int)(210-WarnningData[0]*20/3.3), 120, GRAPH_MODE_NORMAL,COLOR_BLACK); } } if(result_AD1<=WarnningData[1]) { FillRect(pdc, 145, (int)(210-result_AD1*20/3.3), 160, GRAPH_MODE_NORMAL,COLOR_BLACK); } else { 14 120,210, 210, 210, if(warnning[1]==1) { FillRect(pdc, 145, (int)(210-result_AD1*20/3.3), 160, GRAPH_MODE_NORMAL,COLOR_BLACK); warnning[1]=0; } else { warnning[1]=1; FillRect(pdc, 145, (int)(210-WarnningData[1]*20/3.3), 160, GRAPH_MODE_NORMAL,COLOR_BLACK); } } if(result_AD2<=WarnningData[2]) { FillRect(pdc, 185, (int)(210-result_AD2*20/3.3), 210,GRAPH_MODE_NORMAL, COLOR_BLACK); } else { if(warnning[2]==1) { FillRect(pdc, 185, (int)(210-result_AD2*20/3.3), 200, GRAPH_MODE_NORMAL,COLOR_BLACK); warnning[2]=0; } else { warnning[2]=1; FillRect(pdc, 185, (int)(210-WarnningData[2]*20/3.3), 200, GRAPH_MODE_NORMAL,COLOR_BLACK); } } if(result_AD3<=WarnningData[3]) { FillRect(pdc, 225, (int)(210-result_AD3*20/3.3), 210,GRAPH_MODE_NORMAL, COLOR_BLACK); } else { if(warnning[3]==1) { FillRect(pdc, 225, (int)(210-result_AD3*20/3.3), 240, 15 210, 210, 200, 210, 210, 240, 210, GRAPH_MODE_NORMAL,COLOR_BLACK); warnning[3]=0; } else { warnning[3]=1; FillRect(pdc, 225, (int)(210-WarnningData[3]*20/3.3), 240, 210, GRAPH_MODE_NORMAL,COLOR_BLACK); } } if(average<=WarnningData[4]) { FillRect(pdc, 265, (int)(210-average*20/3.3), 280, 210,GRAPH_MODE_NORMAL, COLOR_BLACK); } else { if(warnning[5]==1) { FillRect(pdc, 265, (int)(210-average*20/3.3), 280, 210, GRAPH_MODE_NORMAL,COLOR_BLACK); warnning[5]=0; } else { warnning[5]=1; FillRect(pdc, 265, (int)(210-WarnningData[4]*20/3.3), 280, 210, GRAPH_MODE_NORMAL,COLOR_BLACK); } } OSTimeDly(500); } } void AD0_Task(void * Id) //Main_Test_Task { for(;;) { result_AD0=GetADresult(0)*33/1024; //Uart_Printf(\"result_AD0=%d\\n\OSTimeDly(100); } } 16 void AD1_Task(void * Id) //Main_Test_Task { for(;;) { result_AD1=GetADresult(1)*33/1024; //Uart_Printf(\"result_AD1=%d\\n\OSTimeDly(100); } } void AD2_Task(void * Id) //Main_Test_Task { for(;;) { result_AD2=GetADresult(2)*33/1024; //Uart_Printf(\"result_AD2=%d\\n\OSTimeDly(100); } } void AD3_Task(void * Id) //Main_Test_Task { for(;;) { result_AD3=GetADresult(3)*33/1024; //Uart_Printf(\"result_AD3=%d\\n\OSTimeDly(100); } } void Wave() { INT8U err; U32 nbyte; FILE *pfile; char filename[]=\"1.wav\"; rIISCON=0; //disable; rIISMOD=IISMOD_TX|IISMOD_16BIT|IISMOD_32FS|IISMOD_MCLK_384FS; rIISFCON=IISFCON_TXDMA|IISFCON_TXFIFO; 17 rIISPSR=0x11; rIISCON=IISCON_PRESCALE|IISCON_ENABLE; Init_UDA1341(); pfile=OpenOSFile(filename, FILEMODE_READ); if(!pfile) return ; ReadOSFile(pfile, (U8*) buffer, 0x16*2);//读取头文件信息 nbyte=ReadOSFile(pfile, (U8*) buffer, sizeof(buffer));//读取波形数据 //for(;;) {//死循环 /****** BDMA0 Initialize ******/ //for Source rBDISRC0=(1<<30)+(1<<28)+(int)buffer; //Half word,inc,Buf //for des rBDIDES0=(1<<30)+(3<<28)+((int)0x1d18010); //M2IO,fix,IISFIF //Size //iis,reserve,done_int,not auto-reload/start,DMA enable,COUNT rBDICNT0=(1<<30)+(1<<26)+(3<<22)+(0<<21)+(0<<20)+(sizeof(buffer)&(~0x3)); rBDICNT0 |= (1<<20);//enable //Enable DMA rBDCON0 = 0x0<<2; //Tx DMA rIISCON|=IISCON_TXDMA; } } 18 五、运行测试结果 19 20 六、心得体会 通过此次课程设计,使我更加扎实的掌握了有关嵌入式方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。 过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正, 不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! 21 七、参考文献 [1](美)W.Richard Stevens 著,尤晋元等译,《UNIX 环境高级编程》,机械工 业出版社,2004.11 [2] 周巍松等,《Linux 系统分析与高级编程技术》,北京:机械工业出版社, 1999[9](美)鲁比尼〔Rubini,A.)等 著,魏永明等译,(Linux 设备驱动程序(第二版),北京:中国电力出版社,2002.10 [3] 马忠梅、马广云等,《ARM 嵌入式处理器结构与应用基础》,北京航空航天 大学出版社,2002.1 [4] 刘峥嵘、张智超、许振山等编著,《嵌入式 Linux 应用开发详解》, 机械 工业出版社,2004.6 [5] 孙天泽编著,《嵌入式设计及 Linux 驱动开发指南—— 基于 ARM9 处理器》, 电子工业出版社,2005.2 [6] 王田苗.《嵌入式系统设计与实例开发》.清华大学出版社 2003.10 22 因篇幅问题不能全部显示,请点此查看更多更全内容