福建工程学院嵌入式课程设计.docx
《福建工程学院嵌入式课程设计.docx》由会员分享,可在线阅读,更多相关《福建工程学院嵌入式课程设计.docx(29页珍藏版)》请在冰点文库上搜索。
福建工程学院嵌入式课程设计
课程设计
题目:
基于QT的界面程序设计
班级:
电子信息工程1303
学号:
姓名:
XXX
指导老师:
陈婧张平均
2016年09月30日
一设计目的与要求
1.1课题名称
Linux平台下基于TQ2440嵌入式开发板的QT编程及移植
1.2课程目标
1.进一步巩固嵌入式系统的基本知识;
2.掌握嵌入式应用系统的基本结构;
3.掌握嵌入式系统开发环境建立和使用;
4.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
5.学会查阅有关专业资料及设计手册;
6,QT界面编程。
1.3任务要求
1.掌握嵌入式系统开发环境建立和使用;
2.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
3、QT在PC上的安装、
4、QT在开发板上的移植
1)、触摸屏原理及tslib库的工作原理;
2)、QT设计LED灯控制,设计方案自由发挥,可以单个控制LED灯、也可以流水灯的控制,可控制流水灯的频率(1-5HZ可选)
3)、掌握I/O驱动的编写(ioctl/read/write),并实现蜂鸣器模块驱动的设计
5、QT界面程序设计
6.编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;
7.绘制有关图纸(硬件原理图、驱动流程图、应用流程图).
二Linux与嵌入式开发环境搭建
2.1基本环境安装
安装VMware虚拟机软件,拷贝实验室已安装CentOS系统镜像文件,复制到本机运行。
复制已构建的交叉编译工具链文件EABI-4.3.3_EmbedSky_20100610.tar.bz2到本机Linux中。
解压到根目录,执行以下命令将工具链的可执行文件加入到系统的环境变量。
exportPATH=/opt/EmbedSky/4.3.3/bin:
$PATH
2.2NFS与防火墙配置
输入setup进入系统的配置界面
进入系统服务,启用NFS服务:
禁用系统的防火墙:
修改exports文件,添加一行数据:
重启nfs服务
三QT开发环境搭建
3.1准备所需的文件
复制所需的文件到Linux中并进行解压;
所需如下文件:
tslib-1.4.1.tar.br2---------------触摸屏所需的库
Qt-4.7.tar.gz------------------QT源代码文件
root_qt-4.5.tar.bz2-------------QT根文件系统文件
wqy-zenhei-0.8.38-1.tar.gz-----字库文件
3.2编译与安装
Ø字库的编译与安装:
创建目录/opt/EmbedSky/tslib_install用于存放生成的文件;
进入到源码目录,运行autogen生成Configure文件,并进行配置:
执行make与makeinstall命令进行编译安装,在tslib_install目录中生成移植所需文件:
Ø安装Qt4.7:
创建一个文件夹qt-4.7-arm用于存放生成的文件:
输入命令进行配置:
输入yes同意用户协议:
执行make与makeinstall,生成的文件夹如下:
Øqt4.5根文件系统构建
修改qt-root文件夹的权限
拷贝触摸屏文件到根目录中
拷贝QT4.7生成文件:
创建一个存放qt文件的文件夹:
复制之前生成的qt-4.7-arm文件夹下的lib和plugin目录到新创建的文件夹中:
拷贝根文件系统知道hello_cn文件用于自动测试使用
拷贝字库文件到根文件系统中:
修改环境变量:
修改QT4运行脚本文件
修改运行文件路径
修改rcS文件,注释net_set,添加设置IP地址命令,注释掉LED进程的启动程序
四QtCreator的安装
修改二进制安装文件的权限并执行:
出现如下的安装向导逐步进行安装:
安装完成后启动程序出现如下的界面:
编写一个Helloworld程序进行测试,点击运行,出现的界面如下图:
到此说明QtCreator安装成功!
添加已安装的qmake工具
五驱动编写与安装
6.1内核的解压与编译
将内核源代码进行解压:
复制原有的配置文件为.config
执行make对内核进行编译。
6.2驱动编写与编译
修改LED与蜂鸣器的驱动文件,更改对应的Makefile为如下所示的格式:
执行make命令生成.ko文件:
五界面与程序设计
5.1UI设计
使用到的控件:
PushButton按钮;用于响应用户鼠标操作,执行响应的程序;
Label标签:
用户显示静态文本,显示LED,蜂鸣器图标;
CheckBox复选框:
用于选中和取消,更改LED灯状态;
Widget窗口:
窗口对象,显示用户控件;
控件布局:
手动拖动控件到窗口中,移动到相应位。
修改控件的名称以便在编程的时候进行调用。
选中控件的属性stylesheet,修改CSS代码用于美化布局:
设置背景颜色,边距,圆边距,间距等;
布局好之后的界面如下图:
5.2程序设计
主函数入口:
打开设备,初始化窗口,并且将窗口进行居中;
fdled=open("/dev/zytled",O_RDWR);
fdbeep=open("/dev/zytbeep",O_RDWR);
QApplicationa(argc,argv);
zytw;
w.show();
w.move((QApplication:
:
desktop()->width()-w.width())/2,(QApplication:
:
desktop()->height()-w.height())/2);
returna.exec();
生成槽函数:
选中控件,右键打开菜单,选择gotoslot打开选择框:
选中需要的信号,点击OK生成槽函数,在槽函数中编写业务代码;
在需要的控件上都执行此操作,供编程使用。
页面构造函数:
首页面的构造函数的功能是初始化页面和设置页面的风格,在构造函数中我们增加设置字体,设置背景图片的功能,代码段如下:
this->setAutoFillBackground(true);
QPalettepalette;//QPalette调色板
QPixmappixmap(":
/new/image/bg.bmp");
palette.setBrush(QPalette:
:
Window,QBrush(pixmap));
this->setPalette(palette);
ui->setupUi(this);
QFontft;//字体
ft.setPointSize(40);
ui->LED1->setFont(ft);
ui->LED2->setFont(ft);
ui->LED3->setFont(ft);
ui->LED4->setFont(ft);
ui->Beep->setFont(ft);
LED灯控制:
我们使用复选框的选中与不选中来控制LED等的亮灭;可以手动改变复选框的状态改变灯的状态,也可通过程序控制复选框的状态来控制LED灯。
voidzyt:
:
on_CheckBox_LED1_toggled(boolchecked)
{
QPaletteon;
on.setColor(QPalette:
:
WindowText,Qt:
:
red);
QPaletteoff;
off.setColor(QPalette:
:
WindowText,Qt:
:
black);
if(ui->CheckBox_LED1->isChecked()){
ui->LED1->setPalette(on);//设置UI界面中灯的状态为亮
}else{
ui->LED1->setPalette(off);//设置UI界面中灯的状态为灭
}
ioctl(fdled,checked,0);//根据选中状态控制LED灯的亮灭
}
实现流水灯:
左移与右移的实现原理相同。
这里以左移为例:
voidzyt:
:
on_turnLeftBtn_clicked()
{
//关闭所有的LED灯
on_closeLEDBtn_clicked();
//进入到左移流水灯模式
modeFlag=TURN_LEFT;
//定义QCheckBox数组,用于间接控制流水灯;
QCheckBox*CheckBoxes[4];
CheckBoxes[0]=ui->CheckBox_LED1;
CheckBoxes[1]=ui->CheckBox_LED2;
CheckBoxes[2]=ui->CheckBox_LED3;
CheckBoxes[3]=ui->CheckBox_LED4;
//定义for循环所需变量
inti=0;
//定义两个调色板用于UI界面的更新
QPaletteon;
on.setColor(QPalette:
:
WindowText,Qt:
:
red);
QPaletteoff;
off.setColor(QPalette:
:
WindowText,Qt:
:
black);
intwhileFlag=0;
while
(1)
{
for(i=3;i>=0;i--)
{
//打开蜂鸣器和LED灯
ui->Beep->setPalette(on);
ioctl(fdbeep,true,3);
CheckBoxes[i]->setChecked(true);
//进行延时
delay(500/freqSec);
//关闭蜂鸣器
ui->Beep->setPalette(off);
ioctl(fdbeep,false,3);
//判断标志位是否需要退出for循环
if(modeFlag!
=TURN_LEFT)
{
whileFlag=1;
CheckBoxes[i]->setChecked(false);
if(modeFlag==CLOSE_APP)
{
QApplication*app;
app->exit();
}
break;
}
delay(500/freqSec);
if(modeFlag!
=TURN_LEFT)
{
whileFlag=1;
CheckBoxes[i]->setChecked(false);
if(modeFlag==CLOSE_APP)
{
QApplication*app;
app->exit();
}
break;
}
//关闭LED灯
CheckBoxes[i]->setChecked(false);
}
//判断标志位是否要退出while循环
if(whileFlag==1)
{
break;
}
}
}
弹出新窗口:
创建一个新鞋窗口实例,并显示出来;
AboutMeab;
ab.exec();
其他函数:
QT延时函数:
voiddelay(unsignedintmsec)
{
QTimedieTime=QTime:
:
currentTime().addMSecs(msec);
while(QTime:
:
currentTime()QCoreApplication:
:
processEvents(QEventLoop:
:
AllEvents,100);
}
}
退出函数:
voidzyt:
:
on_exitBtn_clicked()
{
modeFlag=CLOSE_APP;
QApplication*app;
app->exit();
}
关闭LED灯:
voidzyt:
:
on_closeLEDBtn_clicked()
{
modeFlag=LED_CLOSE;
ui->CheckBox_LED1->setChecked(false);
ui->CheckBox_LED2->setChecked(false);
ui->CheckBox_LED3->setChecked(false);
ui->CheckBox_LED4->setChecked(false);
ioctl(fdbeep,false,3);
}
5.3Qt程序移值
对QT工程进行编译移值:
生成Makefile:
./qmake-makefileLEDController.pro
编译程序:
make
运行程序:
将二进制文件复制到根文件夹,在终端中运行程序:
./LEDController-qws-fontwenquanyi
开发板运行:
在开发版运行成功后,出现的界面如下:
七设计总结
通过本次嵌入式QT课程设计,更加熟悉了嵌入式的流程与操作,已经熟练掌握了嵌入式开发环境的移植,Qt界面程序设计等。
提高了发现和解决问题的实践操作能力。
本次课程设计出现和解决的主要问题:
1.开发板电源问题导致的连接不可用:
更换电源后解决问题;
2.ts_lib编译搓搓问题:
复制源编译命令解决问题;
3.nfs挂载失败问题:
更改多个配置文件后问题得以解决;
4.QT编译资源不更新问题:
删除qmake生成中间文件即可解决;
5.鼠标位置偏移:
再次运行校准程序使用笔进行精细校准;
6.字体显示异常:
下载文泉驿gpf字符并进行设置解决了问题;
7.程序与驱动需要手动加载:
编写和修改rcS与QT4配置脚本;
在两周的课程设计之后,对嵌入式开发有了更加深入的理解,提高了自学能力与实际操作解决问题的能力,通过不断的网络检索与书籍查询,收货非常多的新知识。
同时提高了与同学沟通问题的能力,对以后的工作有很大的帮助。
八参考文献
1、嵌入式系统接口设计与Linux驱动程序开发
刘淼编著北京:
北京航空航天大学出版社,2006.05
2、ARM9嵌入式LINUX系统构建与应用
潘巨龙编著北京:
北京航空航天大学出版社,2006
3、Linux驱动开发入门与实战
郑强编著:
北京:
清华大学出版社,2014
4、天嵌QT程序开发完全手册
天谴科技2009
5、Qt程序设计
Xteam(中国)软件技术有限公司编著北京:
清华大学出版社,2002
附录程序源码
main.cpp
#include
#include"zyt.h"
#include
#include
#include
#include
intfdled;
intfdbeep;
intmain(intargc,char*argv[])
{
fdled=open("/dev/zytled",O_RDWR);
fdbeep=open("/dev/zytbeep",O_RDWR);
QApplicationa(argc,argv);
zytw;
w.show();
w.move((QApplication:
:
desktop()->width()-w.width())/2,(QApplication:
:
desktop()->height()-w.height())/2);
returna.exec();
}
zyt.cpp
#include"zyt.h"
#include"ui_zyt.h"
#include
#include"aboutme.h"
#include
#include
#include
#include
#defineTURN_LEFT1
#defineTURN_RIGHT2
#defineLED_CLOSE0
#defineCLOSE_APP-1
externintfdled;
externintfdbeep;
intfreqSec=1;
intmodeFlag=0;
voiddelay(unsignedintmsec)
{
QTimedieTime=QTime:
:
currentTime().addMSecs(msec);
while(QTime:
:
currentTime()QCoreApplication:
:
processEvents(QEventLoop:
:
AllEvents,100);
}
}
zyt:
:
zyt(QWidget*parent):
QMainWindow(parent),
ui(newUi:
:
zyt)
{
this->setAutoFillBackground(true);
QPalettepalette;
QPixmappixmap(":
/new/image/bg.bmp");
palette.setBrush(QPalette:
:
Window,QBrush(pixmap));
this->setPalette(palette);
ui->setupUi(this);
QFontft;
//ft.setFamily("arial");
ft.setPointSize(40);
ui->LED1->setFont(ft);
ui->LED2->setFont(ft);
ui->LED3->setFont(ft);
ui->LED4->setFont(ft);
ui->Beep->setFont(ft);
}
zyt:
:
~zyt()
{
deleteui;
}
voidzyt:
:
on_CheckBox_LED1_toggled(boolchecked)
{
QPaletteon;
on.setColor(QPalette:
:
WindowText,Qt:
:
red);
QPaletteoff;
off.setColor(QPalette:
:
WindowText,Qt:
:
black);
if(ui->CheckBox_LED1->isChecked()){
ui->LED1->setPalette(on);
}else{
ui->LED1->setPalette(off);
}
ioctl(fdled,checked,0);
}
voidzyt:
:
on_CheckBox_LED2_toggled(boolchecked)
{
QPaletteon;
on.setColor(QPalette:
:
WindowText,Qt:
:
red);
QPaletteoff;
off.setColor(QPalette:
:
WindowText,Qt:
:
black);
if(ui->CheckBox_LED2->isChecked()){
ui->LED2->setPalette(on);
}else{
ui->LED2->setPalette(off);
}
ioctl(fdled,checked,1);
}
voidzyt:
:
on_CheckBox_LED3_toggled(boolchecked)
{
QPaletteon;
on.setColor(QPalette:
:
WindowText,Qt:
:
red);
QPaletteoff;
off.setColor(QPalette:
:
WindowText,Qt:
:
black);
if(ui->CheckBox_LED3->isChecked()){
ui->LED3->setPalette(on);
}else{
ui->LED3->setPalette(off);
}
ioctl(fdled,checked,2);
}
voidzyt:
:
on_CheckBox_LED4_toggled(boolchecked)
{
QPaletteon;
on.setColor(QPalette:
:
WindowText,Qt:
:
red);
QPaletteoff;
off.setColor(QPalette:
:
WindowText,Qt:
:
black);
if(ui->CheckBox_LED4->isChecked()){
ui->LED4->setPalette(on);
}else{
ui->LED4->setPalette(off);
}
ioctl(fdled,checked,3);
}
voidzyt:
:
on_exitBtn_clicked()
{
modeFlag=CLOSE_APP;
QApplication*app;
app->exit();
}
voidzyt:
:
on_closeLEDBtn_clicked()
{
modeFlag=LED_CLOSE;
ui->CheckBox_LED1->setChecked(false);
ui->CheckBox_LED2->setChecked(false);
ui->CheckBox_LED3->setChecked(false);
ui->CheckBox_LED4->setChecked(false);
ioctl(fdbeep,false,3);
}
voidzyt:
:
on_turnLeftBtn_clicked()
{
on_closeLEDBtn_clicked();
modeFlag=TURN_LEFT;
QCheckBox*CheckBoxes[4];
CheckBoxes[0]=ui->CheckBox_LED1;
CheckBoxes[1]=ui->CheckBox_LED2;
CheckBoxes[2]=ui->CheckBox_LED3;
CheckBoxes[3]=ui->CheckBox_LED4;
inti=0;
QPaletteon;
on.setCo