已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京邮电大学嵌入式系统实验实验报告学院:电子工程学院专业:电子信息科学与技术班级:2010211203班学号:姓名: 2013年11月13日一、实验目的1.基本实验搭建PXA270嵌入式LINUX开发软硬件环境;安装LINUX操作系统;安装与配置建立宿主机端交叉编译调试开发环境;配置宿主机 PC 机端的minicom(或超级终端)、TFTP服务、NFS服务,使宿主PC机与PXA270开发板可以通过串口通讯,并开通TFTP和NFS服务。2.人机接口键盘驱动;LCD控制;触摸屏数据采集与控制实验;3.应用实验完成VGA显示;Web服务器实验;网络文件传输实验;多线程应用实验。4.扩展应用实验完成USB摄像头驱动与视频采集;GPS实验;GSM/GPRS通讯;视频播放移植;USB蓝牙设备无线通讯;NFS文件服务器;蓝牙视频文件服务器。5.QT实验完成基本嵌入式图形开发环境搭建;“Hello world!”QT初探;创建一个窗口并添加按钮;对象通信:Signal和Slot;菜单和快捷键;工具条和状态栏;鼠标和键盘事件;对话框;QT的绘图;俄罗斯方块;基于QT的GSM手机在嵌入式LINUX下的设计与实现。二、实验内容1.人机接口实验实验十九 键盘驱动实验 实验目的:矩阵键盘驱动的编写 实验内容:矩阵键盘驱动的编写 作业要求:完成键盘加减乘除运算 实验作业源码及注释:#INCLUDE#INCLUDE#INCLUDE#INCLUDE#INCLUDE#INCLUDE#DEFINE DEVICE_NAME “/DEV/KEYBOARD”INT MAIN(VOID)INT FD;INT RET;UNSIGNED CHAR BUF1;INT I,F,J;DOUBLE X;INT A2=0;CHAR PRE_SCANCODE=0XFF;FD=OPEN(DEVICE_NAME,O_RDWR);IF(FD=-1)PRINTF(“OPEN DEVICE %S ERRORN”,DEVICE_NAME);ELSEBUF0=0XFF;I=0;F=0;WHILE(1)READ(FD,BUF,1);IF(BUF0!=PRE_SCANCODE)/判断是否放开按键IF(BUF0!=0XFF)/判断是否键入PRE_SCANCODE=BUF0;USLEEP(50000);SWITCH(BUF0)CASE 0X12:/按下ENTERSWITCH(F)/判断运算符CASE 1:J=I;I=(I+1)%2;X=AI+AJ;PRINTF(“%D+%D=%D”,AI,AJ,X);BREAK;/加法CASE 2:J=I;I=(I+1)%2;X=AI-AJ;PRINTF(“%D-%D=%D”,AI,AJ,X);BREAK;/减法CASE 3:J=I;I=(I+1)%2;X=AI*AJ;PRINTF(“%D*%D=%D”,AI,AJ,X);BREAK;/乘法CASE 4:J=I;I=(I+1)%2;X=AI/AJ;PRINTF(“%D/%D=%D”,AI,AJ,X);BREAK;/除法DEFAUIT:F=0;BREAK;CASE 0X13:F=1;I=(I+1)%2;BREAK;/键入运算符CASE 0X14:F=2;I=(I+1)%2;BREAK;CASE 0X15:F=3;I=(I+1)%2;BREAK;CASE 0X16:F=4;I=(I+1)%2;BREAK;DEFAULT:AI=BUF0;/存入数据RET=CLOSE(FD);RETURN 0; 实验结果:实验效果图实验二十 LCD控制实验 实验目的:了解LCD的基本原理 实验内容:使用总线方式驱动LCD模块,体会与QT下LCD显示的差别 作业要求:在目标板的LCD上显示彩色竖条纹或彩色圆环。 实验作业源码及注释:#include #include #include #include / open() close()#include / read() write()#define DEVICE_NAME /dev/fb#define VERSION PXA2700EP-LCD-V1.00-060530void showversion(void) printf(*n); printf(t %s tn, VERSION); printf(*nn);int main(void) int fd;int ret;int i,j,r,R;unsigned short buf640*480;showversion(); printf(nstart test_lcd testnn); fd = open(DEVICE_NAME, O_RDWR);printf(fd = %dn,fd); if (fd = -1) printf(open device %s errorn,DEVICE_NAME); else for(i=0;i640*480;i+) bufi=0x0001; ret=write(fd,buf,sizeof(buf);usleep(500000);close(fd);fd = open(DEVICE_NAME, O_RDWR);/竖条纹算法:通过横坐标分布进行填色for(r=0;r=0&i=60&i=120&i=180&i=240&i=300&i=360&i=420&i=480)bufr=0xffff;/*/圆环算法:通过离圆心半径分布进行填色for(r=0;r=0&R=2500&R=10000&R=22500&R=40000&R=62500&R=90000&R=122500&R=160000)bufr=0xffff;*/ ret=write(fd,buf,sizeof(buf); getchar(); return 0; 实验结果:实验效果图实验二十一 触摸屏数据采集与控制 实验目的:通过实验掌握触摸屏的设计与控制方法 实验内容:编程实现触摸屏到LCD坐标的校准以及坐标采集和计算随着使用电脑作为信息来源的与日俱增,触摸屏以其易于使用、坚固耐用、反应速度快、节省空间等优点,使得系统设计师们越来越多的感到使用触摸屏的确具有相当大的优越性。通过此试验,我们学习了触摸屏原理,并通过编写测试程序验证了触摸屏的工作过程。学习它,掌握它是非常必要的。2.应用程序实验实验二十二 VGA显示实验 实验目的:了解VGA接口的标准和特点 实验内容:编程实现图像通过VGA接口在显示器上输出通过本实验的操作,VGA设备成功启动,在液晶屏和显示器上可以看到完全同步的画面。由于两者格式和刷新频率的差别,实验中做了折中处理,可能显示效果没有达到最优。实验二十三 Web服务器实验 实验目的:学习在PXA270开发板上的SOCKET网络编程 实验内容:SOCKET进行通讯编程学习使用socket 进行通讯编程的过程,了解一个实际的网络通讯应用程序整体设计,阅读HTTP协议的相关内容,学习几个重要的网络函数的使用方法。读懂HTTPD.C源代码。在此基础上增加一些其他功能。在宿主PC机上使用浏览器测试嵌入式WEB服务器的功能。 通过此实验,我们实现了嵌入式Web服务器的基本功能。实验二十五 多线程应用实验 实验目的:学习PTHREAD 库函数的使用 实验内容:熟悉PTREAD库函数的使用,掌握共享锁和信号量的使用方法。 作业要求:利用多线程技术实现键盘控制在LCD液晶屏上显示的可移动的图形。 实验作业源码及注释:#include #include #include #include pthread.h#include / open() close()#include / read() write()#include #define DEVICE_NAME /dev/fb#define BUFFER_SIZE 16struct prodcons int bufferBUFFER_SIZE; /* the actual data */ pthread_mutex_t lock; /* mutex ensuring exclusive access to buffer */ int readpos, writepos; /* positions for reading and writing */ pthread_cond_t notempty; /* signaled when buffer is not empty */ pthread_cond_t notfull; /* signaled when buffer is not full */;void init(struct prodcons * b) pthread_mutex_init(&b-lock, NULL); pthread_cond_init(&b-notempty, NULL); pthread_cond_init(&b-notfull, NULL); b-readpos = 0; b-writepos = 0;void put(struct prodcons * b, int data)pthread_mutex_lock(&b-lock);while (b-writepos + 1) % BUFFER_SIZE = b-readpos) printf(wait for not fulln); pthread_cond_wait(&b-notfull, &b-lock); b-bufferb-writepos = data; b-writepos+; if (b-writepos = BUFFER_SIZE) b-writepos = 0; pthread_cond_signal(&b-notempty);pthread_mutex_unlock(&b-lock);int get(struct prodcons * b) int data;pthread_mutex_lock(&b-lock); while (b-writepos = b-readpos) printf(wait for not emptyn);pthread_cond_wait(&b-notempty, &b-lock); data = b-bufferb-readpos; b-readpos+; if (b-readpos = BUFFER_SIZE) b-readpos = 0; pthread_cond_signal(&b-notfull); pthread_mutex_unlock(&b-lock); return data;struct prodcons buffer;/键盘输入线程void * producer(void * data) int fd;int ret;unsigned char buf2 ;/int i; / double x;char pre_scancode = 0x44; fd = open(/dev/keypad, O_RDWR);/printf(fd = %dn,fd); if (fd = -1) printf(open device %s errorn,DEVICE_NAME); else buf0=0x22;while (1) read (fd,buf,1);if(buf0!= pre_scancode)if(buf0!=0x44) printf(key=%xn,buf0); put(&buffer, buf0);pre_scancode = buf0;/sleep(1);usleep(50000);/ close ret = close(fd);/ printf (ret=%dn,ret);/ printf (close keypad_driver testn);/LCD显示线程void * consumer(void * data) int d;int ret; int fd;int i;int j;unsigned short buf640*480; fd = open(/dev/fb, O_RDWR); if (fd = -1) printf(open device %s errorn,DEVICE_NAME); else while(1) d = get(&buffer);printf(get num is %dn, d); for(i=0;id;i+) for(j=640*480*i/d;jCCounter.h/* * 文件名:CCounter.cpp* 类名:CCounter* 功能:计算器* 作者:WNX* 时间:2011年10月17日* 版本:0.01* */#ifndef _CCELLPHONE_H_#define _CCELLPHONE_H_#include / 包含Qt头文件#include #include #include #include #include #include CDigitalButton.h/ 包含自定义头文件#define iWidthDigital50/ 数字按钮宽度#define iHeightDigital50/ 数字按钮高度#define iWidthOther100/ 其它按钮宽度#define iHeightOther40/ 其它按钮高度#define cAppWidth(iWidthDigital*4)/ 总宽度#define cAppHeight(iWidthDigital*4+iHeightOther*2)/ 总高度#define iWidthOn100/On按钮宽度#define iWidthCancel100/ Cancel按钮宽度#define DisLenth 5#define cDigital1/ 没用到#define cErro2#define cCall3class CCounter : public QDialogQ_OBJECT/ Never forget it when using signal&slotpublic:CCounter ( QWidget * parent = 0, const char * name = 0, bool modal = true );/ 重载构造函数,默认模态CCounter();protected:QLCDNumber *m_pLCD;CDigitalButton *m_pDigitalBtn11;QPushButton *m_pOn;QPushButton *m_pCancel;QPushButton *AddButton;QPushButton *SubButton;QPushButton *MulButton;QPushButton *DivButton;QPushButton *EqlButton;QString m_strLCD;int m_stateLCD;protected:void InitConnect(void);/ 初始化Signal/Slot的连接void InitButton(void);/ 初始化各个按钮public slots:/ 定义插槽void ClearLCDNumber();void AddLCDNumber( const QString& str );void DeleteLCDNumber();void Culculate();void IncCounter();void SubCounter();void MulCounter();void DivCounter();signals:/ 定义信号void LCDChanged( const QString& str );private:int counter;int fh; / +1,-2,*3,/4,=5int flag; /0:clear; 1:un-doint ans;#endifCCounter.cpp#include CCounter.hCCounter:CCounter ( QWidget * parent, const char * name, bool modal ):QDialog( parent, name, modal )m_stateLCD = cDigital;InitButton();InitConnect();setMinimumSize( cAppWidth, cAppHeight );setMaximumSize( cAppWidth, cAppHeight );CCounter:CCounter()void CCounter:InitConnect(void)/ 建立信号和插槽的连接。二者的参数列表要相同QObject:connect( m_pOn, SIGNAL( clicked() ),this, SLOT( ClearLCDNumber() ) );QObject:connect( m_pCancel, SIGNAL( clicked() ),this, SLOT( DeleteLCDNumber() ) );QObject:connect( AddButton, SIGNAL( clicked() ),this, SLOT( IncCounter() ) );QObject:connect( SubButton, SIGNAL( clicked() ),this, SLOT( SubCounter() ) );QObject:connect( MulButton, SIGNAL( clicked() ),this, SLOT( MulCounter() ) );QObject:connect( DivButton, SIGNAL( clicked() ),this, SLOT( DivCounter() ) );QObject:connect( EqlButton, SIGNAL( clicked() ),this, SLOT( Culculate() ) );int i;for ( i=0; isetSegmentStyle( QLCDNumber:Flat );m_pLCD-setGeometry( 0, 0, cAppWidth, iHeightOther );m_pOn = new QPushButton( On, this );/ On Buttonm_pOn-setGeometry( 0*iWidthOn, 1*iHeightOther, iWidthOn, iHeightOther );m_pCancel = new QPushButton( C, this );/ Cancel Buttonm_pCancel-setGeometry( 1*iWidthOn, 1*iHeightOther, iWidthCancel, iHeightOther );AddButton = new QPushButton( +, this );AddButton-setGeometry( 3*iWidthDigital, 2*iHeightOther, iWidthDigital, iHeightDigital );SubButton = new QPushButton( -, this );SubButton-setGeometry( 3*iWidthDigital, 2*iHeightOther+1*iHeightDigital, iWidthDigital, iHeightDigital );MulButton = new QPushButton( *, this );MulButton-setGeometry( 3*iWidthDigital, 2*iHeightOther+2*iHeightDigital, iWidthDigital, iHeightDigital );DivButton = new QPushButton( /, this );DivButton-setGeometry( 3*iWidthDigital, 2*iHeightOther+3*iHeightDigital, iWidthDigital, iHeightDigital );EqlButton = new QPushButton( =, this );EqlButton-setGeometry( 2*iWidthDigital, 2*iHeightOther+3*iHeightDigital, iWidthDigital, iHeightDigital );for( i=0; im_strNum = s;for( i=0; i3; i+ )/ 3 rows for digital buttons from 1 to 9for( j=0; jsetGeometry( j*iWidthDigital, 2*iHeightOther+i*iHeightDigital, iWidthDigital, iHeightDigital );m_pDigitalBtn0-setGeometry( 0*iWidthDigital, 2*iHeightOther+3*iHeightDigital, iWidthDigital, iHeightDigital );ans=0;fh=0;flag=1;void CCounter:IncCounter()int num;bool ok;if ( flag != 0)num = m_strLCD.toInt( &ok , 10 );if ( fh =1 ) ans += num; if ( fh =2 ) ans = ans-num; if ( fh =3 ) ans = ans*num; if ( fh =4 ) ans = ans/num;if ( fh =0 ) ans = num;flag=0;fh=1;m_strLCD = m_strLCD.setNum( ans );emit LCDChanged( m_strLCD );void CCounter:SubCounter()int num;bool ok;if ( flag != 0)num = m_strLCD.toInt( &ok, 10 );if ( fh =1 ) ans += num; if ( fh =2 ) ans = ans-num; if ( fh =3 ) ans = ans*num; if ( fh =4 ) ans = ans/num;if ( fh =0 ) ans = num;flag=0;fh=2; m_strLCD = m_strLCD.setNum( ans );emit LCDChanged( m_strLCD );void CCounter:MulCounter()int num;bool ok;if ( flag != 0)num = m_strLCD.toInt( &ok, 10 ); if ( fh =1 ) ans += num; if ( fh =2 ) ans = ans-num; if ( fh =3 ) ans = ans*num; if ( fh =4 ) ans = ans/num;if ( fh =0 ) ans = num;flag=0;fh=3;m_strLCD = m_strLCD.setNum( ans );emit LCDChanged( m_strLCD );void CCounter:DivCounter()int num;bool ok;if ( flag !=0 )num = m_strLCD.toInt( &ok , 10 );if ( fh =1 ) ans += num; if ( fh =2 ) ans = ans-num; if ( fh =3 ) ans = ans*num; if ( fh =4 ) ans = ans/num;if ( fh =0 ) ans = num;flag=0;fh=4;m_strLCD = m_strLCD.setNum( ans );emit LCDChanged( m_strLCD );void CCounter:Culculate()int num;bool ok;num = m_strLCD.toInt( &ok , 10 );if ( flag != 0)if ( fh =1 ) ans += num;if ( fh =2 ) ans = ans-num;if ( fh =3 ) ans = ans*num;if ( fh =4 ) ans = ans/num;if ( fh =0 ) ans = num;fh=0;m_strLCD = m_strLCD.setNum( ans );emit LCDChanged( m_strLCD );void CCounter:ClearLCDNumber()int len = m_strLCD.length();if( len DisLenth )flag=1;fh=0;ans=0;m_strLCD.truncate( 0 );emit LCDChanged( m_strLCD );/ 发射信号void CCounter:AddLCDNumber( const QString& str )if (flag = 0) m_strLCD.truncate(0);int len = m_strLCD.length();if( len 0 )flag=1;m_strLCD.truncate( len-1 );emit LCDChanged( m_strLCD );/ 发射信号*说明*InitConnect(void)初始化链接InitButton(void)绘制按钮IncCounter()定义“+”按钮函数。得出上次计算结果并将下次计算符号计为“加”SubCounter()定义“-”按钮函数。得出上次计算结果并将下次计算符号计为“减”MulCounter()定义“*”按钮函数。得出上次计算结果并将下次计算符号计为“乘”DivCounter()定义“”按钮函数。得出上次计算结果并将下次计算符号计为“除”Culculate()定义“=”按钮函数。得出计算结果ClearLCDNumber()定义“On”按钮函数。重置清空计算器AddLCDNumber( const QString& str )定义数字按钮。添加数字DeleteLCDNumber()定义“C”按钮。清除一位数字CDigitalButton.h/* * 文件名:CCounter.h* 类名:CCounter* 功能:计算器* 作者:WNX* 时间:2011年10月17日* 版本:0.01* */#ifndef _CDIGITALBUTTON_H_#define _CDIGITALBUTTON_H_#include #include class CDigitalButton : public QPushButtonQ_OBJECT/ 使用Signal/Slotpublic:CDigitalButton( const QString& text, QWidget* parent, const char* name=0 );QString m_strNum;/ 数字按钮显示的数字public slots:/ 插槽void myClicked();signals:/ 信号void numChanged( const QString&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年香皂行业分析报告及未来发展趋势报告
- 2026年冲茶器行业分析报告及未来发展趋势报告
- 2025年钻井工试题及答案
- 2026年福建高一历史试题及答案
- 2026年幼师培训行业分析报告及未来发展趋势报告
- 2026年医疗保险资金绩效考核试题及答案
- 重庆市涪陵区(2025年)网格员考试练习题(附答案)
- 2026年园林安全员类考试试题及答案
- 2025年内科住院医师动脉粥样硬化和冠状动脉粥样硬化性心脏病试卷练习题附答案
- 2025年小儿血液科专科复习题+答案
- 2024年江西省遂川县文化馆公开招聘试题带答案详解
- CJ/T 340-2016绿化种植土壤
- CJ/T 106-2016生活垃圾产生量计算及预测方法
- 食品行业技术文件管理员岗位职责
- 诈骗赔偿协议书模板
- 生物安全管理体系文件
- 物流基础培训课件
- GB/T 45083-2024再生资源分拣中心建设和管理规范
- 地锚抗拔力计算
- 汽车设计驱动桥设计
- 中国食物成分表2018年(标准版)第6版
评论
0/150
提交评论