《单片机原理及应用课程设计实训报告.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用课程设计实训报告.docx(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、单片机原理及应用课程设计实训报告班级: 计算机科学与技术141班学生: 组长:张广建成员: 张校瑄成员:何金蔚成员: 韩倩倩实训时间: 2016-2017-2第15周-第16周 目录第一章 绪论21.1引言21.2课题任务要求2第二章 系统总体设计22.1小车的机械特性32.2所需程序以及使用的芯片32.3智能小车控制的基本原理3第三章 系统硬件设计33.1控制选择33.2小车搭建4第四章 系统软件设计44.1 Linux系统44.1 Arduino软件12第五章 实验总结20 第一章 绪论1.1引言我们所处的这个时代是信息革命的时代,各种新技术、新思想层出不穷,纵观世界范围内智能汽车技术的发
2、展,每一次新的进步无不是受新技术新思想的推动。随着汽车工业的迅速发展,传统的汽车的发展逐渐趋于饱和。伴随着电子技术和嵌入式的迅猛发展,这使得汽车日渐走向智能化。智能汽车由原先的驾驶更加简单更加安全更加舒适,逐渐的向智能驾驶系统方向发展。智能驾驶系统相当于智能机器人,能代替人驾驶汽车。它主要是通过安装在前后保险杠及两侧的红外线摄像机,对汽车前后左右一定区 域进行不停地扫描和监视。计算机、电子地图和光化学传感器等对红外线摄像 机传来的信号进行分析计算,并根据道路交通信息管理系统传来的交通信息,代替人的大脑发出指令,指挥执行系统操作汽车。 1.2课题任务要求一是增强学生的动手能力,众所周知,现在企业
3、的招聘需要学生有动手能力,能够动手参与项目,能够把书本上面的知识更深层次的理解,并运用到项目中来;二是为了让学生更了解单片机小车的工作原理。并让学生能够学会在项目中独立、合作完成项目,不仅仅是完成自己应该完成的项目部分,更要把整个项目流程都深刻了解,这样才能更好的完成项目。第二章 系统总体设计2.1小车的机械特性 小车采用的是一辆四轮车车模,通过2个电极控制轮胎的转动,前后轮根据转速不同和运转情况控制小车前进后退或者转弯。2.2所需程序以及使用的芯片VM虚拟机运行Linux系统、Dreamweaver、Arduino,A8开发板,小车开发板,小车模版,轮胎及各种接线,电极等等2.3智能小车控制
4、的基本原理能够用虚拟机运行Linux系统,并把Linux写入开发板,搭建服务器,通过虚拟机编写网页代码控制开发板。通过开发板控制小车开发板,用软件Arduino控制,实现网页控制,有能力的增加辅助功能;使网页UI更加美观等等。第三章 系统硬件设计3.1控制选择 通过虚拟机网页控制、蓝牙控制(增加功能)3.2小车搭建3.2.1 基础模块A8开发板通过网线连接PC虚拟机,Linux系统移植进入开发板,搭建服务器,调用Arduino开发板。3.2.2 蓝牙模块连接蓝牙模块至A8开发板,通过串口调试app连接蓝牙控制Arduino小车。第四章 系统软件设计4.1 Linux系统4.1.1 Linux的
5、环境搭建ctr+al+t:默认的路径在家目录ctr+shift+n:默认的路径为上一次终端所处在的路径.linuxubuntu:$ linux:当前登录用户名.ubuntu:主机名:和$之间:当前用户所处在的工作路径.windows下的工作路径如C:IntelLogslinux下的工作路径是:/././:代表的是/home/linux这个路径.(家目录).ls(list):列出当前路径下的文件名和目录名.ls -a(all):列出当前路径下的所有文件和目录名,包括了隐藏文件.:当前路径.:上一级路径ls -l:以横排的方式列出文件的详细信息total 269464(当前这个路径总计所占空间的大
6、小,单位是K)drwxr-xr-x 3 linux linux 4096 Dec 4 19:16 Desktop第一个位置:代表的是文件的类型.linux系统下的文件类型有以下几种.b:块设备文件c:字符设备文件d:directory,目录-:普通文件.l:连接文件.s:套接字文件.p:管道文件.rwxr-xr-x:权限r:读权限 -:没有相对应的权限w:写权限x:可执行权限修改权限:chmod u-或者+r/w/x 文件名chmod g-或者+r/w/x 文件名 chmod o-或者+r/w/x 文件名第一组:用户权限第二组:用户组的权限第三组:其他用户的权限.chmod 三个数(权限) 文
7、件名首先根据你想要的权限生成二进制数,再根据二进制数转换成十进制的三位数rwxr-x-wx111101011 7 5 3chmod 753 文件名rwx-xr-x第二个位置上的数字:对应目录下的子文件个数,如果是非目录,则数字是1第三个位置:用户名(文件创造者).第四个位置:用户组的名字(前边的用户所处在的用户组的名字).第五个位置:对应文件所占的空间大小(单位为b)第六八个位置:Dec 4 19:16时间戳(最后一次修改文件的时间)最后一个位置:文件名操作文件:1.创建一个普通文件:touch 文件名2.删除一个文件:rm(remove) 文件名3.新建一个目录:mkdir(make dir
8、ectory) 目录名 递归创建目录:mkdir -p 目录1/目录2/目录34.删除一个目录:rmdir 目录名./仅删除一个空目录 rm -rf 目录名/删除一个非空目录5.切换目录(change directory):cd 路径linux下的路径分两种相对路径:以.(当前路径)为起点.绝对路径:以/(根目录)为起点,用相对路径的方式进入Music:cd ./Music用绝对路径的方式进入Desktop:cd /home/linux/Desktop返回上一级:cd .返回加家目录的三种方式(1).cd(2).cd (3).cd /home/linux进入到1目录里并创建一个2普通文件,再退
9、回上一级,并且删除1目录6.拷贝文件.cp(copy) 路径1/源文件 路径2:把路径1下的文件拷贝到路径2下cp 路径1/源文件 路径2/目标文件:把路径1下的文件拷贝到路径2下并且重命名位目标文件.cp(copy) -r 路径1/目录名 路径2:把路径1下的目录拷贝到路径2下7.剪切文件mv(move) 路径1/源文件 路径2:把路径1下的文件剪切到路径2下mv 路径1/源文件 路径2/目标文件:把路径1下的文件剪切到路径2下并且重命名位目标文件mv 源文件 目标文件:重命名文件mv 路径1/目录名 路径2:把路径1下的目录剪切到路径2下8.clear:清屏9.exit 退出终端vi编辑器
10、.vi 文件名:如果文件不存在则创建并打开如果文件已存在,则直接打开底行模式下的快捷操作1,对第a行到第b行进行复制:航标a,行标by,enter回车,再把光标移动到你想要粘贴位置的上一行,输入p即可2,对第a行到第b行进行删除:航标a,行标bd,enter回车3.对第a行到第b行进行剪切:航标a,行标bd,enter回车,再把光标移动到你想要粘贴位置的上一行,输入p即可gcc编译器.gcc 文件名:编译成功的话,会在当前目录生成一个a.out可执行程序执行程序: ./a.out当然也可以指定可执行程序的名字,命令如下:gcc 文件名 -o 可执行程序名linux系统的库文件:静态库:.a结尾
11、动态库:.so结尾自己制作一个动态库.首先写一个简单的c功能函数编译成动态库:gcc -fPIC -shared 文件名 -o lib库文件名.so在linux系统下.程序运行时默认搜素库的路径是/lib把库拷贝到/lib下:cp lib库文件名.so /lib 错误提示:permission denied(权限不足)方法:sudo cp lib库文件名.so /lib 提示让你输入密码1:sudo暂时将普通用户 的权限提高到root用户权限 再编译一个c应用程序,在程序中来调用库里实现的函数gcc 应用程序名 -l库名(注意是去掉lib和.so的库名)操作文件:open():打开一个文件re
12、ad():/从文件里边读出数据write()/向文件里写入数据close()/关闭文件man手册:man 2 函数名open:头文件 #include #include #include 1.int open(const char *pathname, int flags);/仅限于打开一个已存在文件参数1:文件的路径参数2:打开方式的标志O_RDONLY,/只读方式打开O_WRONLY,/只写方式打开O_RDWR./可读可写方式打开返回值:打开成功:返回一个正数(文件描述符)打开失败:-12.int open(const char *pathname, int flags, mode_t m
13、ode);/可以打开一个不存在的文件参数1:文件的路径参数2:打开方式的标志O_RDONLY,/只读方式打开O_WRONLY,/只写方式打开O_RDWR./可读可写方式打开 如果文件不存在必须|O_CRAET,创建该文件参数3:权限 数 比如:0666返回值:打开成功:返回一个正数(文件描述符)打开失败:-1write:头文件: #include typedef int ssize_tssize_t write(int fd, const void *buf, size_t count);参数1:就是open函数的返回值,文件描述符参数2:你想要写入的数据参数3:你想要写入的数据的字节大小返回
14、值:写入成功:返回的是写入的字节大小写入失败:-1strlen:实际长度sizeof:数组的大小4.1.2 Linux的移植及调试linux系统的启动步骤1.运行uboot(初始化硬件,引导系统内核的加载)2.内核的运行(zImage,linux的内核).3.识别文件系统(类似于C盘,D盘,E盘).是rootfs.tgz系统=内核+文件系统.挂载系统.要对uboot环境信息进行设置首先把拨码开关拨到0000位置.选择uboot的启动方式.uboot从外存启动.1.找到自己的COM端口号;打开putty2.选中Serial,把波特率改为115200,端口号改为自己的端口号,Flow contrl
15、o选择none3.开启电源,会出现一个倒计时,在倒计时完成之前,随便敲一个键盘.4.输入命令print可以显示uboot的打印信息确保:ipaddr=192.168.1.100/代表开发板的ip地址serverip=192.168.1.200/代表ubuntu的IP地址bootargs=root=nfs nfsroot=192.168.1.200:/source/rootfs ip=192.168.1.100 init=/linuxrc console=ttySAC0,115200/打开虚拟机:1.进入到/tftpboot目录下.把zImage拖到虚拟机,前加cp ,后加 ./使用ls查看一下
16、是否出现zImage2.cd /source把rootfs这个压缩包拖到虚拟机,前加cp ,后加 ./使用ls查看一下是否出现rootfs.tgz3.解压命令:sudo tar -xvf rootfs.tgz要让你输入密码;输入1回车即可,密码是不可见的.再用ls查看是否多了一个蓝色的文件rootfs.4.修改ubuntu的ip地址.找到wiffi图标,点击选中edit connection-IPV4 seting-manual-addip netmask gateway192.168.1.200 255.255.255.0 192.168.1.1点击保存.关闭窗口.再打开图标选中wired
17、connection1 再看ip是否改回来了.5.网线连接开发板和电脑在putty界面输入:ping 192.168.1.200如果host 192.168.1.200 is alive,这是挂载系统很好的征兆.not alive的话需要关闭电脑的无线网输入boot或者重启开发板不要再按下任何键了,如果出现#很快就要挂载成功了如果出现TTTTTTTTTTTTTT在ubuntu输入命令:sudo service tftpd-hpa restart其中sudo的作用是暂时将用户的权限提升到超级用户(root)的权限.如果出现Please press Enter to activate this c
18、onsole.代表系统挂载成功.通过gcc编译生成的程序不能在开发板上运行.通过命令file a.out看到文件的格式为intel 30386,说明这是X86格式的程序,只能PC上运行而不能在arm板上运行,解决措施,使用交叉编译器来编译.交叉编译器的配置:将arm-cortex_a8-linux-gnueabi.tar.bz2拖到ubuntu的家目录解压命令tar -xvf arm-cor+tab键自动补齐,用ls查看是否生成arm-cortex_a8个目录.配置交叉编译器:sudo vi /etc/bash.bashrc文件在最后一行添加export PATH=$PATH:/home/li
19、nux/arm-cortex_a8/bin保存并退出文件保存完成后重启文件:source /etc/bash.bashrc重启成功后输入arm-cor+tab键会自动补齐成arm-cortex_a8-linux-gnueabi-代表交叉编译器配置成功.利用交叉编译器编译程序:arm-cortex_a8-linux-gnueabi-gcc 文件名,并将生成的可执行程序拷贝到/source/rootfs下然后再到putty上执行./a.out就可以在开发板上运行程序了4.1 Arduino软件viod setup()端口的配置;void loop()任务的执行;arduino之呼吸灯实验:int
20、led=13;void setup() pinMode(led,OUTPUT);void loop() digitalWrite(led,HIGH); delay(1000); digitalWrite(led,LOW); delay(1000);渐变灯:暗-亮-暗PWM波:可调脉冲宽度波.3,5,6,9,10,11这几个端口可以输出pwm波analogWrite(pin, value)/输出pwm波pin:管脚号:3,5,6,9,10,11中的任意一个value:0255中的任何一个数:0:占空比为0%255:占空比位100%远程视频监控步骤:1.将jpegsrc.v8b.tar.gz(图片
21、库) 和mjpg-streamer-code-182.tar.gz(视频查看软件) 拷贝到ubuntu的家目录 2.解压缩 tar xvf jpegsrc.v8b.tar.gz3. cd jpeg-8b 4. ./configure /创建Makefile文件5. make 6. sudo make install /安装程序运行时,默认寻找的头文件的路径在/usr/include,库文件的路径/lib cd /usr/local/include sudo cp * /usr/include cd /usr/local/lib sudo cp libjpeg* /lib 7.切换到家目录:cd
22、 移植查看视频的软件: tar xvf mjpg-streamer-code-182.tar.gz cd mjpg-streamer-code-182cd mjpg-streamermake clean /清除已经编译过的程序make 运行查看视频的软件:sudo ./start.sh 打开火狐浏览器在地址栏输入127.0.0.1:8080若发现视频绿屏 先强制结束程序运行:ctl+c.解决方法: 修改start.sh 将第30行的 -y 删除看看是否虚拟机识别到摄像头:ls /dev/video0地址栏输入:127.0.0.1:8080/?action=stream 查看视频信息 127.0
23、.0.1:8080/?action=snapshot 截屏图片,点击save image as可以保存图片windows运行之前会有一个系统的引导代码叫BIOS与windows类似,linux启动之前也有这样的一段代码叫做bootloaderbootloader有很多种,我们选用其中的一种叫做uboot.相关代码Che.c#include cgic.h#include #include #include #include #include void zigbee_serial_init(int fd) struct termios options;tcgetattr(fd, &options)
24、;options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= CSIZE;options.c_cflag &= CRTSCTS;options.c_cflag |= CS8;options.c_cflag &= CSTOPB;options.c_iflag |= IGNPAR;options.c_iflag &= (BRKINT | INPCK | ISTRIP | ICRNL | IXON); /options.c_ccVTIME = 2; options.c_ccVMIN = 12;options.c_oflag = 0;options.c
25、_lflag = 0;cfsetispeed(&options, B115200);cfsetospeed(&options, B115200);tcsetattr(fd,TCSANOW,&options);int cgiMain()int fd;char a=1;cgiHeaderContentType(text/htmlnn);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,SMART CARn);fprintf(cgiOut,n);fprintf(cgiOut,)
26、;fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut, n);fprintf(cgiOut,);fprintf(cgiOut, n);fprintf(cgiOut,n);fprintf(cgiOut,n);fprintf(cgiOut,n);fd=open(/dev/ttyUS
27、B0,O_RDWR);if(-1=fd)fprintf(cgiOut,open usart failedn);zigbee_serial_init(fd);if(cgiFormSuccess=cgiFormSubmitClicked(up) a=2;write(fd,&a,1);if(cgiFormSuccess=cgiFormSubmitClicked(down) a=1;write(fd,&a,1);if(cgiFormSuccess=cgiFormSubmitClicked(right) a=4;write(fd,&a,1);if(cgiFormSuccess=cgiFormSubmit
28、Clicked(left) a=3;write(fd,&a,1);if(cgiFormSuccess=cgiFormSubmitClicked(stop) a=0;write(fd,&a,1);fprintf(cgiOut,n);fprintf(cgiOut,n);close(fd);return 0;Test.c#include #include #include #include #include int main(int argc, const char *argv)int fd;char buff20=0;fd=open(/dev/ttyUSB0,O_RDWR);if(-1=fd)pr
29、intf(open failedn);return -1;while(1)read(fd,buff,sizeof(buff);return 0;单片机代码void setup() pinMode(2,OUTPUT); pinMode(4,OUTPUT); pinMode(6,OUTPUT); pinMode(8,OUTPUT); Serial.begin(115200);void loop() char c; c=Serial.read(); if(c=1) digitalWrite(2,LOW); digitalWrite(4,HIGH); digitalWrite(6,LOW ); dig
30、italWrite(8,HIGH);Serial.println(qianjin);if(c=2) digitalWrite(2,HIGH); digitalWrite(4,LOW); digitalWrite(6,HIGH); digitalWrite(8,LOW);Serial.println(daotui);if(c=3) digitalWrite(2,LOW); digitalWrite(4,HIGH); digitalWrite(6,LOW); digitalWrite(8,LOW);Serial.println(youzuan);if(c=4) digitalWrite(2,LOW
31、); digitalWrite(4,LOW); digitalWrite(6,LOW); digitalWrite(8,HIGH);Serial.println(zuozuan);if(c=0) digitalWrite(2,LOW); digitalWrite(4,LOW); digitalWrite(6,LOW); digitalWrite(8,LOW);Serial.println(0);第五章 实验总结历经四五天的课余时间,终于把本次嵌入式课程设计完成了,从资料的搜索到最终的调试,在整个课程过程中,感觉自己学到了许多东西,忽然间才明白,原来看起来很难的东西,其实只要努力去做,其实并没有什么。很多时候,真正阻止一个人发展的,还是自己的心。因为在很多时候,我们都被自己吓回去了。于是,这个世界,终究是属于那些敢想敢干,并坚持下去的人的。 在这之前,我也曾想做好多东西。然而真正下决心并做成的,其实并没有几个。此次的成功,无疑给予了我很大的决心。一个实验项目的成功,需要的是信心,敢于探索,不屈不挠才会获得成功。 真正的智能,我相信,还在不久之后,会在我们的制作之下,在大家面前展现。最后,感谢华清远见与学校给我们这次设计小车的实训机会。
限制150内