物理与电子工程学院《嵌入式系统与应用》课程设计报告题目QT界面下的硬件控制实现系别物理与电子工程学院年级08专业电子科学与技术班级081班学号Y05108129学生姓名XXXX指导教师XxX职称XXXXX设计时间2011年5月18日—2011年5月26日常熟理工学院课程设计报告1目录第一章绪论………………………………………………………………………………21.1课题目的和重点问题………………………………………………………………..21.1.1目的和意义…………………………………………………………………………..21.1.2实验原理及有关技术…………………………………………………………………..21.1.3重点解决的问题……………………………………………………………………..3第二章QT实验……….…………………………................................……………………42.1QT简介…………………………………………………………………………………..42.2QT界面的建立………………………………………………………………………….42.3QT配置文件的编写…………………………………………………………………….52.4建立与开发板的连接..…………………………………………………………………..52.5实验截图与说明.………………………………………………………………………...6第三章实验程序.……………….…………………………………...……………………..8第四章实验心得…………………………………………………………………………15参考文献………………………………………………………………………………….16常熟理工学院课程设计报告2第一章绪论1.1课题目的和重点问题1.1.1目的和意义只要学习一种处理器就有许多ARM内核的处理器可供使用,有许多公司提供基于该内核的芯片,比如Intel,TI,MOTOROLA等公司都提供各种ARM芯片。在嵌入式领域,8位处理器已经不再胜任一些复杂的应用,比如GUI,TCP/IP,FILESYSTEM等,而ARM芯片凭借强大的处理能力和极低的功耗,非常适合这些场合。所以现在越来越多的公司在产品选型的时候考虑到使用ARM处理器,从这个角度来说,对于在校大学生来说,如果你掌握了ARM开发技术,对于寻找一份好的工作也十分有利。本次实训,我选做的课题是“QT界面下的硬件控制实验”,因为在先前的实验中没有做这个方面的东西,所以我选择了关于QT的实验。虽然开始的时候对QT可以说是一窍不通,不过,我还是很快找到了问题的解决方案。设计要求:利用ARM9的开发平台在Linux操作系统中移植QT,实现在Qt设计的界面上通过触摸屏点击按钮实现对开发板上三个LED灯的点亮/关闭控制。1.1.2实验原理及有关技术1.触摸屏原理在实验中,外面要用到三剑客开发板的触摸屏。触摸屏按其工作原理的不同分为表面声波屏、电容屏、电阻屏和红外屏几种。最常见、价格也最低廉的是电阻触摸屏。我这里要使用的就是电阻屏。2.电阻触摸屏的有关技术电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的导电层,上面再盖有一层外表面硬化处理、光滑防刮的塑料层,它的内表面也涂有一层导电层。电阻触摸屏的两个导电层工作面必须是完整的,在每个工作面的两条边线上各涂一条银胶,一端加5V电压,一端加0V,就能在工作面的一个方向上形成均匀连续的平行电压分布。在侦测到有触摸后,立刻A/D转换测量接触点的模拟量电压值,根据5V电压下的等比例公式就能计算出触摸点在这个方向上的位置。这样,触摸屏就可以把我的按键点这个模拟量转换成触摸位置的坐标。常熟理工学院课程设计报告31.1.3重点解决的问题“QT界面下的硬件控制实验”本次课题的主要难题有二:一是,我之前没有接触过QT,对QT的了解不多,相对于其他同学是在较熟悉的系统上实验,有点白手起家的意思。二是,我的编程需要用C++语言,而我只学习过标准C语言,对C++所知不多。所以,在实验的开始几天,我熟悉了一下QT的操作,基本明白了如何用QT创建一个简单的操作的界面。面对第二个问题,我只好硬着头皮仔细研究QT的实例程序,从.CPP文件的代码中学习C++程序的编写,在实验的后一阶段,主要的精力都是花在这个方面的。通过摸爬滚打,我写的.CPP文件功能逐渐完善,但是对LED驱动程序的操作仍然无法实现。后来,老师提示我在myqt.cpp的定义中添加externC来让C++可以调用我单独编写的C语言程序。我单独编写的C语言程序基本沿用了以前LED实验时的框架,做了一些改动,使得程序不再自动循环,只是执行具体的LED灯的亮与灭的操作。这样只需要通过给这个C语言程序传送不同的控制变量就可以控制LED灯的亮与灭。在我做的程序基本可以完成基本的LED控制功能后,我重新编写了myqt.cpp文件,这次共设计了四个按键:可以通过两个按钮分别实现三盏灯从左向右轮流循环点亮和从右向左轮流循环点亮的功能,一个清除键将所有LED熄灭,以及一个退出程序的按钮。常熟理工学院课程设计报告4第二章QT实验2.1QT简介Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。1996年早些时候,Qt进入商业领域,现在它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE的基础。基本上,Qt同XWindow上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西,但Qt具有优良的跨平台特性、面向对象、丰富的API、大量的开发文档等优点。2.2QT界面的建立Qt提供了非常强大的GUI编辑工具—QtDesigner,它的操作界面类似于Windows下的VisualStudio,而且它还提供了相当多的部件资源。Qt允许程序员不通过任何设计工具,以纯粹的C++代码来设计一个程序。但是更多的程序员更加习惯于在一个可视化的环境中来设计程序,尤其是在界面设计的时候。Qt也提供了这样一个可视化的界面设计工具:Qt设计器(QtDesigner)。其开始界面如上图所示。Qt设计器可以用来开发一个应用程序全部或者部分的界面组件。以Qt设计器生成的界面组件最终被变成C++代码,因此Qt设计器可以被用在一个传统的工具链中,并且它是编译器无关的。默认情况下,QtDesigner的用户界面是由几个顶级的窗口共同组成的。如果你更习惯于一个MDI-style的界面(由一个顶级窗口和几个子窗口组成的界面),可以在菜单Edit-UserInterfaceMode中选择DockedWindow来切换界面。上图显示的就是MDI-style的界面风格。不管我们是使用QtDesigner还是编码来实现一个对话框,都包括以下相同的步骤:1)、创建并初始化子窗口部件。2)、将子窗口部件放置到布局当中。3)、对Tab的顺序进行设置。4)、放置信号和槽的连接。5)、完成对话框的通用槽的功能。常熟理工学院课程设计报告52.3QT配置文件的编写这里所说的QT配置文件主要指myqt.cpp这个C++文件,因为我要实现的功能都需要在这里事先用C++代码表示出来。当然,与之配套的头文件myqt.h文件也必须按照我的需要编写好才行。值得注意的是,因为不会使用C++语言,我不能直接使用C++编写的程序实现开发板对LED灯的控制,这样我就需要在myqt.cpp文件的定义里添加externC来使得我的myqt.cpp程序可以调用C语言编写的程序,来实现预定的功能。我先后要写的C语言和C++主要文件有:Myqt.hMyqt.cppMain.cppLed.hLed.c编写完主要的程序,下面就是编译了。打开虚拟机上的终端,进入我在虚拟机上创建的文件夹,执行下面的代码:#/home/sprife/for_arm/qt-x11-opensource-src-4.4.0/bin/qmake-project这样就获得了.pro文件。接着我要运行:#/home/sprife/for_arm/qt-x11-opensource-src-4.4.0/bin/qmake来获得Makefile文件。最后,编译成可执行文件:#make2.4建立与开发板的连接首先,调整好主机的IP地址,打开XShell,建立主机与开发板的连接,在用户输入root。Mount-tnfs-onolock192.168.1.201:/home/mnt/nfs然后,通过XShell共享Linux虚拟机的/home目录到开发板的/mnt/nfs目录下。cd/root/leds接着,连接完成后,打开root下的leds目录,我们需要的驱动就在这里。insmodmini2410-leds.ko用insmod命令加载LED的驱动程序,这一步必不可少,否则无法执行我们的LED控制功能。最后,把我在虚拟机上生成的可执行程序复制到开发板上的QT目录下,运行程序。常熟理工学院课程设计报告62.5实验截图与说明图2.5.1简单的LED控制程序界面图2.5.1的说明:这张图是我做的第一个LED程序的截图,功能比较简单:L-1点亮1号灯L-2点亮2号灯L-3点亮3号灯Exit退出程序没有复位键是因为修改的过程中为了方便而去掉了。图2.5.2改进后的LED控制程序及开发板常熟理工学院课程设计报告7图2.5.2的说明:这是我完成的第二个LED控制程序,左边是三剑客开发板的主板,右边是液晶触摸屏,因为距离较远,不是很清楚,触摸屏显示的内容在图2.5.3有特写。图2.5.3改进后的LED控制程序图2.5.3的说明:这是我做的第二个LED程序的界面,有4个按键:Right每按一次从左到右循环点亮1、2、3号灯,其他两盏灯熄灭Left每按一次从右到左循环点亮1、2、3号灯,其他两盏灯熄灭Clean所有灯复位,即熄灭点亮的LED灯Exit退出程序常熟理工学院课程设计报告8第三章实验程序Myqt.cpp代码:#includemyqt.h//加载自己的头文件externC//让我的C++程序可以调用C语言写的子程序#includeled.h//加载要调用的C语言程序的头文件MyDlg::MyDlg(){ui.setupUi(this);QObject::connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(L1()));//当pushButton按下时,执行L1动作QObject::connect(ui.pushButton_2,SIGNAL(clicked()),this,SLOT(L2()));QObject::connect(ui.pushButton_4,SIGNAL(clicked()),this,SLOT(close()));//当pushButton_4按下时,执行close动作,关闭程序QObject::connect(ui.pushButton_5,SIGNAL(clicked()),this,SLOT(CL()));//当pushButton_5按下时,执行CL操作,熄灭所有LED灯}voidMyDlg::L1(){if(i==1)//此时点亮第一盏灯{ledctl(1,0);//调用c语言程序执行LED灯的操作ledctl(0,1);ledctl(0,2);}if(i==2)//此时点亮第二盏灯{ledctl(0,0);ledctl(1,1);ledctl(0,2);}常熟理工学院课程设计报告9if(i==3)//此时点亮第三盏灯{ledctl(0,0);ledctl(0,1);ledctl(1,2);i=0;//对判断点亮第几盏灯的i变量复位}i++;}voidMyDlg::L2(){if(i==1)//此时点亮第一盏灯{ledctl