QT环境下的LED控制设计.doc_第1页
QT环境下的LED控制设计.doc_第2页
QT环境下的LED控制设计.doc_第3页
QT环境下的LED控制设计.doc_第4页
QT环境下的LED控制设计.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

常熟理工学院课程设计报告 物理与电子工程学院 嵌入式系统与应用课程设计报告题 目 QT界面下的硬件控制实现 系 别 物理与电子工程学院 年 级 08 专 业 电子科学与技术 班 级 081班 学 号 Y05108129 学生姓名 XXXX 指导教师 X x X 职 称 XXXXX 设计时间 2011年5月18日2011年5月26日 目 录第一章 绪 论21.1 课题目的和重点问题.21.1.1 目的和意义.21.1.2实验原理及有关技术.21.1.3 重点解决的问题.3第二章 QT实验.42.1 QT 简介.42.2 QT界面的建立 .42.3 QT配置文件的编写 .52.4 建立与开发板的连接.52.5 实验截图与说明.6第三章 实验程序.8第四章 实验心得 15参考文献.16第一章 绪 论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,就能在工作面的一个方向上形成均匀连续的平行电压分布。在侦测到有触摸后,立刻AD 转换测量接触点的模拟量电压值,根据5V 电压下的等比例公式就能计算出触摸点在这个方向上的位置。这样,触摸屏就可以把我的按键点这个模拟量转换成触摸位置的坐标。1.1.3 重点解决的问题“QT界面下的硬件控制实验”本次课题的主要难题有二:一是,我之前没有接触过QT,对 QT的了解不多,相对于其他同学是在较熟悉的系统上实验,有点白手起家的意思。二是,我的编程需要用 C+语言,而我只学习过标准 C语言,对 C+所知不多。所以,在实验的开始几天,我熟悉了一下 QT的操作,基本明白了如何用 QT创建一个简单的操作的界面。面对第二个问题,我只好硬着头皮仔细研究QT的实例程序,从 .CPP文件的代码中学习 C+程序的编写,在实验的后一阶段,主要的精力都是花在这个方面的。通过摸爬滚打,我写的 .CPP文件功能逐渐完善,但是对 LED驱动程序的操作仍然无法实现。后来,老师提示我在 myqt.cpp的定义中添加extern C 来让C+可以调用我单独编写的C语言程序。我单独编写的C语言程序基本沿用了以前 LED实验时的框架,做了一些改动,使得程序不再自动循环,只是执行具体的 LED灯的亮与灭的操作。这样只需要通过给这个 C语言程序传送不同的控制变量就可以控制 LED灯的亮与灭。在我做的程序基本可以完成基本的LED控制功能后,我重新编写了myqt.cpp文件,这次共设计了四个按键:可以通过两个按钮分别实现三盏灯从左向右轮流循环点亮和从右向左轮流循环点亮的功能,一个清除键将所有 LED熄灭,以及一个退出程序的按钮。第二章 QT实验2.1 QT 简介Qt是诺基亚开发的一个跨平台的C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。1996年早些时候,Qt进入商业领域,现在它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础。 基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。2.2 QT界面的建立Qt 提供了非常强大的GUI 编辑工具 Qt Designer,它的操作界面类似于Windows 下的Visual Studio,而且它还提供了相当多的部件资源。Qt 允许程序员不通过任何设计工具,以纯粹的C+代码来设计一个程序。但是更多的程序员更加习惯于在一个可视化的环境中来设计程序,尤其是在界面设计的时候。Qt 也提供了这样一个可视化的界面设计工具:Qt设计器(Qt Designer)。其开始界面如上图所示。Qt 设计器可以用来开发一个应用程序全部或者部分的界面组件。以Qt 设计器生成的界面组件最终被变成C+代码,因此Qt 设计器可以被用在一个传统的工具链中,并且它是编译器无关的。默认情况下,Qt Designer 的用户界面是由几个顶级的窗口共同组成的。如果你更习惯于一个MDI-style 的界面(由一个顶级窗口和几个子窗口组成的界面),可以在菜单Edit-User Interface Mode 中选择Docked Window 来切换界面。上图显示的就是MDI-style 的界面风格。不管我们是使用Qt Designer 还是编码来实现一个对话框,都包括以下相同的步骤:1)、创建并初始化子窗口部件。2)、将子窗口部件放置到布局当中。3)、对Tab 的顺序进行设置。4)、放置信号和槽的连接。5)、完成对话框的通用槽的功能。2.3 QT 配置文件的编写这里所说的QT配置文件主要指 myqt.cpp这个C+文件,因为我要实现的功能都需要在这里事先用C+代码表示出来。当然,与之配套的头文件myqt.h文件也必须按照我的需要编写好才行。值得注意的是,因为不会使用C+语言,我不能直接使用C+编写的程序实现开发板对LED灯的控制,这样我就需要在 myqt.cpp文件的定义里添加 extern C来使得我的 myqt.cpp程序可以调用 C语言编写的程序,来实现预定的功能。我先后要写的 C语言和 C+主要文件有:Myqt.h Myqt.cpp Main.cpp Led.h Led.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 -t nfs -o nolock 01:/home /mnt/nfs然后,通过XShell共享Linux虚拟机的 /home目录到开发板的 /mnt/nfs目录下。 cd /root/leds接着,连接完成后,打开 root下的 leds目录,我们需要的驱动就在这里。insmod mini2410-leds.ko 用 insmod命令加载LED的驱动程序,这一步必不可少,否则无法执行我们的LED控制功能。最后,把我在虚拟机上生成的可执行程序复制到开发板上的 QT目录下,运行程序。 2.5 实验截图与说明图2.5.1 简单的LED控制程序界面图2.5.1的说明:这张图是我做的第一个LED程序的截图,功能比较简单:L-1 点亮 1号灯L-2 点亮 2号灯L-3 点亮 3号灯Exit 退出程序没有复位键是因为修改的过程中为了方便而去掉了。图2.5.2 改进后的LED控制程序及开发板图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 退出程序第三章 实验程序Myqt.cpp代码:#include myqt.h/加载自己的头文件extern C/让我的C+程序可以调用C语言写的子程序#include led.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灯void MyDlg: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);if(i=3)/此时点亮第三盏灯ledctl(0,0);ledctl(0,1);ledctl(1,2);i=0;/对判断点亮第几盏灯的i变量复位i+;void MyDlg:L2()if(i=1)/此时点亮第一盏灯ledctl(0,0);ledctl(0,1);ledctl(1,2);if(i=2)/此时点亮第二盏灯ledctl(0,0);ledctl(1,1);ledctl(0,2);if(i=3)/此时点亮第三盏灯ledctl(1,0);ledctl(0,1);ledctl(0,2);i=0;/对判断点亮第几盏灯的i变量复位i+;void MyDlg:CL()ledctl(0,0);ledctl(0,1);ledctl(0,2);led.c代码:#include #include #include #include void ledctl(int on, int led_number)int fd;fd = open(/dev/led, 0);if (fd 0) perror(open device /dev/led);/判断是否成功加载了 LED驱动程序exit(1);ioctl(fd, on,led_number);/执行 LED灯的亮灭操作close(fd);led.h代码:int ledctl(int on,int led_number);/定义一个LED驱动子函数int i=1;/定义一个全局变量,来控制要点亮的LED灯的号码myqt.h代码:#ifndef _DLG_H_#define _DLG_H_#include #include /QT程序的界面数据都在这里,必须加载#include class MyDlg : public QDialogQ_OBJECTpublic:MyDlg();public slots:void L1(); / 预定义L1动作的子函数void L2();/预定义L2动作的子函数void CL();/预定义CL动作的子函数private:Ui:Form ui;#endifui_testx11.h代码: /* Form generated from reading ui file testx11.ui* Created: Tue May 31 08:40:11 2011* by: Qt User Interface Compiler version 4.4.0* WARNING! All changes made in this file will be lost when recompiling ui file!*/#ifndef UI_TESTX11_H#define UI_TESTX11_H#include #include /加载行为库#include #include #include /加载按键库#include /加载窗体库QT_BEGIN_NAMESPACEclass Ui_Formpublic: QPushButton *pushButton; QPushButton *pushButton_2; QPushButton *pushButton_4; QPushButton *pushButton_5; void setupUi(QWidget *Form) if (Form-objectName().isEmpty() Form-setObjectName(QString:fromUtf8(Form); Form-resize(223, 116); pushButton = new QPushButton(Form); pushButton-setObjectName(QString:fromUtf8(pushButton);pushButton-setGeometry(QRect(10, 10, 91, 41);/定义按钮控件的四个角的坐标,可以控制控件的位置和大小 pushButton_2 = new QPushButton(Form); pushButton_2-setObjectName(QString:fromUtf8(pushButton_2); pushButton_2-setGeometry(QRect(110, 10, 91, 41); pushButton_4 = new QPushButton(Form); pushButton_4-setObjectName(QString:fromUtf8(pushButton_4); pushButton_4-setGeometry(QRect(110, 60, 91, 41); pushButton_5 = new QPushButton(Form); pushButton_5-setObjectName(QString:fromUtf8(pushButton_5); pushButton_5-setGeometry(QRect(10, 60, 91, 41); retranslateUi(Form); QObject:connect(pushButton_4, SIGNAL(clicked(), Form, SLOT(close(); QMetaObject:connectSlotsByName(Form); / setupUi void retranslateUi(QWidget *Form) Form-setWindowTitle(QApplication:translate(Form, Form, 0, QApplication:UnicodeUTF8);/按钮的名字在这里修改,可以和设计时的不相同 pushButton-setText(QApplication:translate(Form, Right, 0, QApplication:UnicodeUTF8); pushButton_2-setText(QApplication:translate(Form, Left, 0, QApplication:UnicodeUTF8); pushButton_4-setText(QApplication:translate(Form, Exit, 0, QApplication:UnicodeUTF8); pushButton_5-setText(QApplication:translate(Form, Clean, 0, QApplication:UnicodeUTF8); Q_UNUSED(Form); / retranslateUi;namespace Ui class Form

温馨提示

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

评论

0/150

提交评论