嵌入式综合实验报告.docx

上传人:b****5 文档编号:12093594 上传时间:2023-04-17 格式:DOCX 页数:33 大小:836.17KB
下载 相关 举报
嵌入式综合实验报告.docx_第1页
第1页 / 共33页
嵌入式综合实验报告.docx_第2页
第2页 / 共33页
嵌入式综合实验报告.docx_第3页
第3页 / 共33页
嵌入式综合实验报告.docx_第4页
第4页 / 共33页
嵌入式综合实验报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

嵌入式综合实验报告.docx

《嵌入式综合实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式综合实验报告.docx(33页珍藏版)》请在冰豆网上搜索。

嵌入式综合实验报告.docx

嵌入式综合实验报告

本科生课程考试成绩单

(试卷封面)

院系

自动化学院

专业

自动化

学生姓名

学号

课程名称

嵌入式系统及课程设计

课程编号

08803250

授课时间

2015年9月7日--9月18日

周学时

32

学分

2

总评成绩

(含平时成绩)

备注

任课教师签名:

日期:

注:

1.以论文或大作业为考核方式的课程必须填此表,综合考试可不填。

“简要评语

缺填无效。

2.任课教师填写后与试卷一起送院系研究生教务员处。

3.学位课总评成绩以百分制计分。

实验目的和要求

1、通过“基于华邦710的智能机器宠物”产品开发为案例,掌握基于uCLinux/ARM7的产品开发的流程及方法;

2、熟悉AC97接口的应用,了解音频文件编解码方法;

3、开发简答的人机交互界面。

实验原理

实验板功能

本系统围绕华邦的ARM7芯片(w90p710/745)实现了丰富的软硬件应用实例,既有前后台系统的应用,又有基于操作系统uClinux的应用,在这个基础上,用户可以快速开发自己的产品。

硬件

开发板由底板、核心板、LCD模块构成。

其中LCD模块采用AUO的3寸TFT真彩屏,型号为A030DL01,分辨率为960*240。

实验方案与实验步骤

实现开机动画(10分)

要求:

起始状态在屏幕中央有一蓝色方块(大小自定,背景色为黑色),蓝色方块的四条边逐渐向四周扩展,扩展到接近屏幕边界时,蓝色方块又逐渐缩小到原来的起始状态。

GUI界面设计(10分)

按键定义:

定义四个键:

左键、右键、确定键、退出键(每个按键对应一个指示灯,当按下此按键的时候,对应的指示灯点亮)

(1)在实现开机动画后,显示主界面,在主界面上有两个菜单选项,分别表示MP3播放和电子相册功能。

(所需的主界面背景图片在/exam/dat/table.dat,两个菜单图片在/exam/dat/mp3main.dat(mp3菜单图片)和/exam/dat/picturemain.dat(电子相册菜单图片),其中主界面图片为320*240大小,两个菜单图片为80*80大小)

(2)设计左键和右键来选择两个菜单,菜单选中之后,选中的菜单反色显示。

(所需的菜单反色显示图片在/exam/dat/mp3main1.dat(mp3菜单反色显示图片),/exam/dat/picturemain1.dat(电子相册菜单反色显示图片)菜单图片为80*80大小)

(3)设计确定键,退出键,当选中菜单以后,按下确定键进入相应功能。

进入相应功能以后按下退出键,可以返回到主界面。

电子相册相应功能(30分)

(1)当在主界面下按下选择电子相册菜单,按下确定键后,进入电子相册功能,将电子相册中的图片的名字以列表的形式显示在LCD上,并且通过左键和右键可以选择相应的文件名,并以高亮显示。

在此界面下按退出键可退出到主界面下。

(2)当在

(1)的状态下,按下确定键以后,显示被选中的图片,并可以通过左右键显示上或者下一张图片,按退出键可退出到

(1)的状态下(即列表状态),当图片显示在LCD的状态下,按下确定键,自动浏览,确定键再次被按下,停止自动浏览。

(电子相册所需的图片在/exam/picture下。

图片大小为320*240)

MP3相应功能(30分)

(1)当在主界面下按下选择MP3菜单,按下确定键后,进入MP3功能,将MP3的名字以列表的形式显示在LCD上,并且通过左键和右键可以选择相应的文件名,并以高亮显示。

在此界面下按退出键可退出到主界面下。

(1)当在

(1)的状态下按下确定键以后,播放选中的MP3,并在屏幕上只打印出“正在播放”文字信息(背景色为自定义),MP3播放完毕后自动返回到

(1)的状态。

屏保功能(20分)

在任何界面下,若3秒钟无任何按键按下,则进入屏保状态,按下任意键即退出屏保状态。

要求屏保图片在屏幕边角起沿屏幕边缘按顺时针移动。

(屏保图片为/exam/dat/protect.dat,图片大小为80*80)。

注意事项:

(1)凡是上述的图片大小为320*240的DAT文件均适用函数ShowPictureOnLcd();凡是上述图片大小为80*80的DAT文件,均使用函数ShowIconOnLcd();

(2)ShowIconOnLcd()前两个参数为图片的在屏上显示的起始坐标。

坐标单位大小与图片像素点单位距离相同。

(3)Exam文件夹下有示例程序及代码,如需运行示例程序将(exam\示例程序和代码\程序以及示例程序所需文件)下的所有文件拷至U盘的根目录下。

实验设备与器材配置

实验设备及工具:

PC机一台

WindbondW90P710试验开发平台一套

耳机线一条

交叉编译器:

arm-elf-gcc

实验记录

实现开机动画

题目分析

第一步需要清屏,将屏幕设置为黑色。

第二步调用ShowHighLightLcd()这一函数显示蓝色的色块,由于屏幕大小为320*240,左上角为(0,0),右上角为(0,240),左下角为(320,0),右下角为(320,240),在这样的坐标系下要显示蓝色色块在屏幕中间,必须先计算出它们的坐标。

可以使蓝色色块由无逐渐铺满全屏。

接下来要让方块在扩展或缩回的时段不断清屏,每次清屏过后,方块的位置扩展或缩回。

程序流程

关键代码及注释

for(i=0;i<=10;i++)

{

usleep(500000);

memset(fb,0x00,ScreenSize);

ShowHighLightLcd(160-i*16,120-i*12,160+i*16,120+i*12);

}

for(i=0;i<=10;i++)

{

usleep(500000);//延时0.5s

memset(fb,0x00,ScreenSize);//清屏,刷为黑色

ShowHighLightLcd(i*16,i*12,320-i*16,240-i*12);//画出蓝色矩形

}

注:

通过修改for循环的步进大小及延时时间大小可以调整闪屏现象。

问题及其原因分析

A,刚开始用ShowHighLightLcd(Ax1,Ay1,Ax2,Ay2)将左上角、右下角参数顺序写反了,导致访问越界,内存错误。

把左上角右下角的参数对调以后正确。

B,未清屏,蓝色方块变成一长条,加入每次清屏的代码以后正常。

C,左右移动的方向反了,这个主要是因为我们屏幕摆的方向不对,在我们一开始摆放屏幕的那个角度我们写的这个代码确实是分别向左右移动的,但是另一个方向看起来就是上下移动了。

效果图如下:

GUI界面设计

题目分析

首先,显示开机动画结束以后需要显示出主界面,只要加载主界面的背景图和菜单图就可以了。

其次,在没有按下确定键的时候,左键右键按下应该一直可以选择不同功能,因此,此处,检测到左键右键按下的时候,如果确定键没有按下过,就记录选择的功能是mp3还是图片,把选中的菜单反色显示。

最后,假如确定键第一次按下,switch_flag应该肯定有一个值了,如果switch_flag=1,那么显示mp3的目录,并且将switch_flag置为1,说明确定键第一次按下了;如果switch_flag=2,那么显示图片的目录,并且将switch_flag置为2。

这就实现了按下确定键进入相应功能。

如果检测到退出键按下,就重新回到主界面,这个时候除了显示主界面的背景图和菜单图还需要将mp3和图片的序号重新置为0,确定键按下的标志位switch_flag重新置为1或2。

程序流程

见程序框架流程图。

关键代码及注释

if((buf.row==0)&&(buf.col==0))

{

usleep(500000);//延时一秒

switch_flag=1;

ShowIconOnLcd(120,20,"/usb/mp3main1.dat");

Set_EBILED(0x01);

}

if((buf.row==0)&&(buf.col==1))

{

usleep(500000);//延时一秒

switch_flag=2;

ShowIconOnLcd(120,140,"/usb/picturemain1.dat");

Set_EBILED(0x02);

}

if((buf.row==0)&&(buf.col==2))

{

Set_EBILED(0x04);

if(switch_flag==1)

{

...

}

elseif(switch_flag==2)

{

...

}

}

问题及其原因分析

A,问题:

一开始我们只设置了switch_flag。

想让switch_flag=0表示没有选中任何菜单,switch_flag=1表示选中了mp3功能,switch_flag=2表示选中了图片功能。

但是我们发现按下左键以后,mp3菜单反色显示了,可是再按右键就不能选择到图片菜单了。

原因:

经过检查,发现原因是我们检测到左键或者右键都会先判断是不是switch_flag=0,然后才会根据按下的键是左还是右来选择不同的菜单,这样就会导致只能选择一次,选择完一次以后switch_flag就不再是0了,就不能再用左右键来选择不同功能了。

解决办法:

先判断确定键是否按下,在没有按下确定键之前,按下左键就能选择mp3功能,按下右键就能选择图片功能,可以自由地切换,不会只能进行一次选中。

B,问题:

按下退出键以后会重新显示主菜单,但是不能再选择功能了。

原因:

switch_flag键这时候已经置为1了,虽然按下退出键,我们写了重新显示主界面的代码,但是没有把switch_flag重新置为0,恢复到没有确定键按下的状态。

解决办法:

按下退出键以后还要将switch_flag置为0。

左键或右键对switch_flag重新进行赋值。

效果图如下:

MP3相应功能

题目分析

按下确定键以后,左右键应该可以选择各种不同的mp3,其实现的原理就是对mp3的序号num进行加和减。

高亮显示也是根据num的数值来计算蓝色高亮条显示的位置。

因为在读取mp3文件名的时候我们已经把各个mp3的文件名存入了一个char型的二维数组里面,所以只要根据num的数字,就可以找到对应的文件名,然后显示在屏幕上即可。

另外,将mp3的名字显示在lcd是mp3功能第一个状态,如果按下确定就进入了播放mp3的状态。

第一个状态下flag2=1,那么如果再次检测到按下确定,这时候应该会有flag2=1并且flag1=1,那么我们就把flag2置为3,这样就进入了mp3播放的模式。

程序流程

见程序框架流程图。

关键代码及注释

while

(1)

{

usleep(1000000);////延时0.05秒

ShowPictureOnLcd("/usb/huache.dat");//显示图片,图片大小为320*240

ReadFileName("/usb/mpsong");

count=read(fd_key,&buf,sizeof(keymap));//countequaltohowmanykeyhasbeenpressedatontime

if(count>0)

{

if((buf.row==0)&&(buf.col==3))

{

Set_EBILED(0x08);

break;

}

if((buf.row==0)&&(buf.col==0))

{

Set_EBILED(0x01);

usleep(500000);

if(loop==1)

{

loop=6;

}

elseif(loop!

=1)

{

loop-=1;

}

//ShowHighLightLcd(0,(loop-1)*20,320,loop*20);

//ReadFileName("/usb/mpsong");

usleep(100000);

}

if((buf.row==0)&&(buf.col==1))

{

Set_EBILED(0x02);

usleep(500000);//延时一秒

if(loop==7)

{

loop=1;

}

elseif(loop!

=7)

{

loop+=1;

}

//ShowHighLightLcd(0,(loop-1)*20,320,loop*20);

//ReadFileName("/usb/mpsong");

usleep(50000);////延时0.05秒

}

if((buf.row==0)&&(buf.col==2))

{

Set_EBILED(0x04);

strcpy(song_file,"/usb/mpsong/");

strcpy(num2str,file[loop-1].filename);//产生"123"

strcat(song_file,num2str);

printf("%s\n",song_file);

switch(loop)

{

/*

case1:

ShowPictureOnLcd("/usb/xiangrikui.dat");

ShowStringOnLCD(160,120,"NoSong!

Pleaseselectnext",fb,ScreenSize);

break;

case2:

ShowPictureOnLcd("/usb/xiangrikui.dat");

ShowStringOnLCD(160,120,"NoSong!

Pleaseselectnext",fb,ScreenSize);

break;

*/

case1:

ShowPictureOnLcd("/usb/huache.dat");

//sprintf(num2str,"%d",6);//产生"123"

//music_only("/usb/mpsong/6.mp3");//播放MP3文件,函数路口参数为MP3文件在U盘的存储路径

break;

case2:

ShowPictureOnLcd("/usb/huayuan.dat");

//sprintf(num2str,"%d",1);//产生"123"

//music_only("/usb/mpsong/1.mp3");

break;

case3:

ShowPictureOnLcd("/usb/meigui.dat");

//sprintf(num2str,"%d",2);//产生"123"

//music_only("/usb/mpsong/2.mp3");

break;

case4:

ShowPictureOnLcd("/usb/pugongying.dat");

//sprintf(num2str,"%d",3);//产生"123"

//music_only("/usb/mpsong/3.mp3");

break;

case5:

ShowPictureOnLcd("/usb/qiangwei.dat");

//sprintf(num2str,"%d",4);//产生"123"

//music_only("/usb/mpsong/4.mp3");

break;

case6:

ShowPictureOnLcd("/usb/table.dat");

//sprintf(num2str,"%d",5);//产生"123"

//music_only("/usb/mpsong/5.mp3");

break;

default:

//ShowPictureOnLcd("/usb/movie/huache.dat");

break;

}

ShowStringOnLCD(180,80,file[loop-1].filename,fb,ScreenSize);

ShowStringOnLCD(180,120,"正在播放",fb,ScreenSize);

music_only(song_file);//播放MP3文件,函数路口参数为MP3文件在U盘的存储路径

}

}

else//无按键

{

if(stopflag==0)

{

delay_times++;

}

if(delay_times>10)

{

protectflag=1;

delay_times=0;

}

}

ShowHighLightLcd(0,(loop-1)*20,320,loop*20);

ReadFileName("/usb/mpsong");

if(protectflag)

{

//ShowIconOnLcd(120,80,"/usb/movie/protect.dat");

for(i=0;i<=10;i++)

{

memset(fb,0x00,ScreenSize);

if(i<=3)

ShowIconOnLcd(i*80,0,"/usb/protect.dat");

elseif(i<=5)

ShowIconOnLcd(240,(i-3)*80,"/usb/protect.dat");

elseif(i<=8)

ShowIconOnLcd(240-(i-5)*80,160,"/usb/protect.dat");

elseif(i<=10)

ShowIconOnLcd(0,160-(i-8)*80,"/usb/protect.dat");

else

i=0;

count=read(fd_key,&buf,sizeof(keymap));//countequaltohowmanykeyhasbeenpressedatontime

if(count>0)

{

protectflag=0;

break;

}

usleep(200000);//延时0.1秒

}

//memset(fb,0xff,ScreenSize);

}

}

问题及其原因分析

A,问题:

mp3播放完以后不能自动回到mp3文件目录的界面。

原因分析:

mp3播放的时候flag2=3,如果不把flag2改回1,那么一直会播放歌曲,不会停下来,只有flag2重新置为1,那么就会重新显示mp3的文件名。

解决办法:

mp3播放完以后把flag2重新置为1。

B,问题:

播放的时候显示文件名加“正在播放”,存储文件名的时候设置的字符串数组报错。

原因分析:

我们设置的是char*类型的一维数组,这样使用的时候应该对char*的指针开辟内存空间,没有初始化是不能使用的。

解决办法:

后来我们仿照”pub.h”里面定义了char型的二维数组,这样就不会出错了。

效果图如下:

电子相册相应功能

题目分析

电子相册稍微复杂一点,进入这一功能以后要检测多个按键,实现不同的功能,要能够左右键实现显示上一张、下一张图片,要能够按确定键自动浏览,再次按下确定键能暂停,最后还要能退出,因此我们考虑进入这个状态以后就设一个for(;;)的循环,在里面不断检测按键,实现不同的功能,直到退出键按下再使用break退出这个for(;;)循环,否则,如果还在整个程序的while循环里面检测按键的话,一个按键能够实现的功能就比较多,写起来有点复杂。

上一张下一张主要就是修改num2的数值。

循环显示则还需要再设一个for(;;)循环,不断显示图片,只有再次按下确定键才能暂停,暂停以后才能退出。

程序流程

见程序框架流程图。

关键代码及注释

while

(1)

{

usleep(1000000);////延时0.05秒

ShowPictureOnLcd("/usb/xiangrikui.dat");//显示图片,图片大小为320*240

ReadFileName("/usb/picture");

count=read(fd_key,&buf,sizeof(keymap));//countequaltohowmanykeyhasbeenpressedatontime

if(count>0)

{

if((buf.row==0)&&(buf.col==3))

{

Set_EBILED(0x08);

break;

}

if((buf.row==0)&&(buf.col==0))

{

Set_EBILED(0x01);

usleep(500000);

if(pic_loop==1)

{

pic_loop=6;

}

elseif(pic_loop!

=1)

{

pic_loop-=1;

}

//ShowHighLightLcd(0,(pic_loop-1)*20,320,pic_loop*20);

//ReadFileName("/usb/picture");

usleep(100000);

}

if((buf.row==0)&&(buf.col==1))

{

Set_EBILED(0x02);

usleep(500000);//延时一秒

if(pic_loop==7)

{

pic_loop=1;

}

elseif(pic_loop!

=7)

{

pic_loop+=1;

}

//ShowHighLightLcd(0,(pic_loop-1)*20,320,pic_loop*20);

//ReadFileName("/usb/picture");

usleep(50000);////延时0.05秒

}

if((buf.row==0)&&(buf.col==2))

{

Set_EBILED(0x04);

while

(1)

{

usleep(1000000);////延时0.5秒

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1