电子系统设计与实践报告Word格式.docx
《电子系统设计与实践报告Word格式.docx》由会员分享,可在线阅读,更多相关《电子系统设计与实践报告Word格式.docx(26页珍藏版)》请在冰点文库上搜索。
![电子系统设计与实践报告Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/59215043-c022-4ff9-bfa3-b6c082c553cf/59215043-c022-4ff9-bfa3-b6c082c553cf1.gif)
2.2linux操作系统的常规使用
2.2.1启动Linux系统
启动VMware--》选中Ubuntu12.04---》继续运行虚拟机--》进入桌面系统--》启动命令行
--》双击terminal(ctrl+alt+t)
2.2.2linux常规命令的使用
A.查看某个位置下有什么东西ls[选项][路径]
ls查看当前的位置下有什么东西(刷新)
ls-l查看当前位置下文件的详细信息
drwxrwxr-x文件操作权限(chmod)
ls-a查看当前位置下所有的文件(包含隐藏文件)
ls-la两个功能结合在一起
B.修改工作路径(更改当前所处的文件夹的位置)cd(路径)
cd/回到根目录(起点)
cd/&
&
cdhome&
cdgec
===》cd/home/gec
cd..返回上一级
cd~返回家目录(常规操作位置:
家目录/共享目录)==>
/home/gec
C.得到当前的工作路径
pwd得到当前的位置
D.创建&
删除(文件/目录)
touch文件名1文件名2//创建空白文件
rm文件名1文件名2//删除文件
mkdir目录名1目录名2//创建目录
rm-rf目录名1目录名2//删除目录
E.编辑&
编译&
执行
geditfilename.c//怎么编写源文件(c代码)
gcc/arm-linux-gccfilename.c-ofilename//生成可执行文件(编译)
./filename//运行可执行程序
F.修改文件的为可执行权限
chmod777filename
(3)补充:
路径的组成(文件存储结构:
树状结构)
相对路径:
当前位置下/一级目录/二级目录
绝对路径:
/一级目录/二级目录
2.3windows与Linux的文件共享
虚拟机--》设置--》选项--》共享文件夹--》启用--》添加--》下一步--》配置如下
主机路径(windows):
笔记
名称(LInux):
share(必须进入/mnt/hgfs)
test1.c:
编写九九乘法表,编译,运行起来
#include<
stdio.h>
voidmain()
{
chari,j,k;
for(i=1;
i<
=9;
i++)
{for(j=1;
j<
=i;
j++)
k=i*j;
printf("
%d*%d=%d\t"
i,j,k);
}
\n"
);
return0;
2.4硬件控制
(1)双要素
驱动程序+应用程序(配套出现)
(2)驱动如何使用?
A.得到驱动程序文件led_drv.ko/gec210_beep.ko
B.加载驱动-->
产生设备文件--->
文件IO才能生效
insmodxxx.ko
==>
insmod:
can'
tinsert'
led_drv.ko'
:
Fileexists表示驱动已经存在
C.查看系统下已有的驱动
lsmod
==>
led_drv12030-Live0xbf028000//LED驱动
buzzer_drv14880-Live0xbf022000//蜂鸣器
gec210_beep12980-Live0xbf0e6000//蜂鸣器
rtnet3070ap241240-Live0xbf0d3000
rt3070ap4882611rtnet3070ap,Live0xbf044000(P)
rtutil3070ap220272rtnet3070ap,rt3070ap,Live0xbf037000
ov965088510-Live0xbf02e000
snd_soc_gec210_wm896030840-Live0xbf01c000
snd_soc_wm8960197921snd_soc_gec210_wm8960,Live0xbf011000
D.卸载原有的驱动
rmmodled_drv/buzzer_drv/gec210_beep
(3)应用程序的使用
./led_test
报错:
./led_test
Usage:
./led_test<
led_no>
<
on/off>
led_no=0,1,2,3
test1.c:
把LED和蜂鸣器的驱动加载,使用自带的应用程序进行控制
2.5写代码控制驱动对应的硬件
(1)LED灯
A.打开对应的设备文件:
/dev/leds
B.控制灯的状态
ioctl(led_fd,1,led_namb);
参数2:
灯的状态1亮0灭
参数3:
灯的序号0/1/2/3
C.关闭对应的文件描述符
test2-1:
完成的流水灯的设计。
(10次)
sleep
(1);
==》1s
usleep(1000*1000);
==》1us(1s)
(2)蜂鸣器
/dev/beep_drv
ioctl(fd,GEC210_BEEP_ON);
test2-2:
倒车雷达的实现
5s处于安全距离,5s后,进行一级报警(500ms)
再过5s,进入2级报警状态(200ms)
再过5s,进入3级报警状态(50ms)
2.6人机交互
所有的功能的启动、结束:
都是由用户来进行控制。
(人机交互)
2.6.1触摸屏的开发
linux对于常用输入设备,其开发方式都是一样的===>
输入子系统(鼠标、键盘、触摸屏...)
2.6.2输入子系统的原理
cat/dev/event0
2.6.3程序设计
输入子系统的设备文件:
/dev/event0
开发说明书(头文件):
input.h
(1)打开硬件对应的设备文件
(2)根据说明书提供的原始数据格式,进行读取操作
structinput_event{
__u16type;
__u16code;
__s32value;
};
(3)根据说明书提供的数据分类,进行拆包处理
原始数据
按住时
type=0x3code=0x0value=653
type=0x3code=0x1value=103
type=0x3code=0x18value=255
type=0x0code=0x0value=0
松开
type=0x3code=0x18value=0
A.解决设备类型type
/*
*Eventtypes输入设备当成是event,type的取值范围
*/
#defineEV_SYN0x00
#defineEV_KEY0x01//键盘
#defineEV_REL0x02//鼠标
#defineEV_ABS0x03//触摸屏
B.解决某一个设备下的动作types_code
#defineSYN_REPORT0
#defineSYN_CONFIG1
#defineSYN_MT_REPORT2
#defineSYN_DROPPED3
#defineREL_X0x00
#defineREL_Y0x01
#defineREL_Z0x02
#defineABS_X0x00X坐标
value<
==>
x的坐标值
#defineABS_Y0x01Y坐标
y的坐标值
#defineABS_PRESSURE0x18压力值
value:
>
0:
正在按压中
=0:
手已经松开了
ts.c:
实现手指按下时,坐标的捕捉及输出
打印的条件:
当压力值为0,手指弹开
test2.c:
利用触摸屏结合硬件驱动,进行点灯控制
2.7音视频的播放
(命令行./main./testmadplay)
(1)音视频播放的原理
数据输入:
音频文件/视频文件
黑匣子(播放器):
madplay/mplayer
数据输出:
LCD,耳机接口
(2)播放音乐
madplay1.mp3
mplayermv.mp4
(3)替换MP4播放器
[root@GEC210xzx]whichmplayer
/bin/mplayer
rm/bin/mplayer
test1:
完成命令行播放音乐和视频
2.8音视频的播放
命令行:
只能同时运行一个可执行文件/一条命令
代码内嵌调用命令行:
#include<
stdlib.h>
intsystem(constchar*command);
command:
命令行的写法
video.c
在代码内实现音视频的播放
test3.c:
利用触摸屏+音视频播放,实现小型播放器。
(播放音乐、上一首、下一首、暂停播放、继续播放、前进、后退)
2.9U盘下载
(1)数据放入U盘
(2)插入开发板的USB接口
----udevinsertorremove---sda1---add
(3)U盘数据的所在地?
/mnt/udisk
cp1.mp3/
第3章智能家居的具体实现
3.1智能家居整体设计图
智能家居整体功能如图1所示
3.2智能家居C语言程序
#include<
fcntl.h>
//openwritereadlseekclose
unistd.h>
sys/types.h>
sys/stat.h>
#include"
lcd.h"
api_v4l2.h"
//B.设定人生目标
void*child_fun(void*arg)
{
//定义出存放画面的变量
FreamBufferfreambuf;
unsignedchardata[640*480*3]={0};
while
(1)
//3.从缓冲区中去提取数据
linux_v4l2_get_fream(&
freambuf);
//4.将YUYV进行转换为RGB:
LCD.C
yuyv_to_rgb24(freambuf.buf,data,640,480);
//5.将RGB数据显示到LCD之上
lcd_draw_bmp_for_buf(0,0,data,640,480);
}
voidshow_camera()
{
intx,y;
//1.子功能UI的显示
lcd_draw_bmp(0,0,"
/yinshipin/camera.bmp"
//800*480
pthread_tchild_name;
pthread_create(&
child_name,NULL,child_fun,NULL);
{ts_get_xy(&
x,&
y);
if(x>
599&
x<
800&
y>
0&
y<
160)//继续
{
pthread_create(&
}
elseif(x>
159&
320)//暂停
pthread_cancel(child_name);
}
319&
480)//返回
linux_v4l2_stop_capturing();
break;
lcd_draw_bmp(0,0,"
/yinshipin/menu.bmp"
voidshow_music()
char*music_buf[30]={
"
/yinshipin/yinyue/1.mp3"
/yinshipin/yinyue/2.mp3"
/yinshipin/yinyue/3.mp3"
/yinshipin/yinyue/4.mp3"
};
/yinshipin/music.bmp"
intx,y,count=0;
music_play(music_buf[count]);
//2.获取落点坐标
ts_get_xy(&
399&
500&
299&
400)//上一首
count--;
if(count<
0)count=0;
music_stop(music_buf[count+1]);
music_play(music_buf[count]);
700&
400)//下一首
count++;
if(count>
3)count=3;
music_stop(music_buf[count-1]);
100&
400)//暂停
music_pause(music_buf[count]);
199&
300&
400)//继续
music_continue(music_buf[count]);
400&
music_stop(music_buf[count]);
lcd_draw_bmp(0,0,"
//刷新上一级的UI
voidshow_video()
char*video_buf[30]={
/yinshipin/shipin/1.mp4"
/yinshipin/shipin/2.mp4"
/yinshipin/shipin/3.mp4"
/yinshipin/video.bmp"
video_play(*video_buf);
239&
480)//上一个
video_stop(video_buf[count+1]);
video_play(video_buf[count]);
480)//下一个
2)count=2;
video_stop(video_buf[count-1]);
250&
240)//暂停
video_pause(video_buf[count]);
549&
240)//继续
video_continue(video_buf[count]);
249&
550&
video_stop(video_buf[count]);
voidshow_photo()
char*photo_buf[10]={
/yinshipin/tupian/1.bmp"
/yinshipin/tupian/2.bmp"
/yinshipin/tupian/3.bmp"
/yinshipin/tupian/4.bmp"
/yinshipin/tupian/5.bmp"
/yinshipin/tupian/6.bmp"
/yinshipin/tupian/7.bmp"
/yinshipin/tupian/8.bmp"
/yinshipin/tupian/9.bmp"
/yinshipin/tupian/10.bmp"
/yinshipin/photo.bmp"
480)//上一张
lcd_draw_bmp(0,0,photo_buf[count]);
699&
480)//下一张
9)count=9;
voidshow_home()
intx,y,d1=0,d2=0,d3=0,d4=0;
/yinshipin/home.bmp"