资源描述:
《武汉大学计算机学院 嵌入式实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
武汉大学计算机学院嵌入式实验报告武汉大学计算机学院课程实验报告课程名称:嵌入式实验专业、班:08级姓名:学号:学期:2016-2016第1学期成绩实验一80C51单片机P1口演示实验实验目的:掌握P1口作为I/O口时的使用方法。理解读引脚和读锁存器的区别。实验内容:用脚的状态来控制的LED亮灭。实验设备:超想-3000TB综合实验仪1台超想3000仿真器1台 连线若干根计算机1台实验步骤:编写程序实现当为低电平时,发光管亮;为高电平时,发光管灭。修改程序在执行读之前,先执行CLR,观察结果是否正确,分析在第二种情况下程序为什么不能正确执行,理解读引脚和读锁存器区别。实验结果:当为低电平时,发光管亮;为高电平时,发光管灭。不正确。因为先执行CLR之后,当读的时候它的值就一直是0,所以发光管会一直亮而不会灭。单片机在执行从端口的单个位输入数据的指令时,它需要读取引脚上的数据。此时,端口锁存器必须置为‘1’,否则,输出场效应管导通,回拉低引脚上的高输出电平。系统复位时,会把所有锁存器置‘1’,然后可以直接使用端口引脚作为输入而无需再明确设置端口锁存器。但是,如果端口锁存器被清零,就不能再把该端口直接作为输入口使用,除非先把对应的锁存器置为‘1’。而在引脚负载很大的情况下,在执行“读——改——写”一类的指令时,需要从锁存器中读取数据,以免错误地判断引脚电平。实验二80C51单片机RAM存储器扩展实验实验目的: 学习RAM6264的扩展实验内容:往RAM中写入一串数据,然后读出,进行比较实验设备:超想-3000TB综合实验仪1台超想3000仿真器1台连线若干根计算机1台实验步骤:根据流程图设计程序。RAM_CS插孔连到译码输出插孔,连接到L0。调试运行程序。对62256进行读写。若L1灯闪动,表示62256RAM读写正常。一直亮说明扩展数据存储器有损坏。读写正确数码管显示“6264—0”。若读写错误,数码管显示“6264—E”。实验结果:程序框图:连线图案:程序解读:ORG 0000HAJMPSTART;;无条件跳转到STARTORG0030H;;START的首地址START:MOVSP,#60H;;设置堆栈段,是个过程化语句,因为堆栈的前端一般有其他内容,;;此程序用不到。MOVDPTR,#0000H;;DPTR是数据指针寄存器。扩展数据存储器62256的地址,;;从0000H开始测试,共32K,但下面语句只测试了前4KMOVR6,#0FHMOVA,#55H;;测试字,本实验只用了55H;;/////////////////RAM1:MOVR7,#0FFHRAM2:MOVX@DPTR,A;;MOVX读写数据存储器,把55H写到0000HCLR;;清零,即为暗状态INCDPTR;;DJNZR7,RAM2;;R7减1,如不为零则跳转,内循环!!256DJNZR6,RAM1;;R6减1,如不为零则跳转,外循环!!16;;共测试4KMOVDPTR,#0000H;;从新给地址0000H ,下步读MOVR6,#0FH;;写多少,读多少;;////////////////////////RAM3:MOVR7,#0FFHRAM4:MOVXA,@DPTRCJNEA,#55H,RAM6;;比较前两个操作数,不相等则跳转SETB;;亮INCDPTRDJNZR7,RAM4DJNZR6,RAM3;;////////////////////RAM5:CLRCALLDELAY;;延迟,实现闪烁!!SETBCALLDELAYSJMPRAM5;;是个死循环;;////////////////////DELAY:MOVR5,#0FFHDELAY1:MOVR4,#0FFHDJNZR4,$DJNZR5,DELAY1 RETRAM6:SETB;;口常亮,相当于设置了一个错态!!SJMPRAM6;;短转移,无限循环!!END思考与改进:改进程序清单:OUTBITequ0e101hCLK164equ0e102h;段控制口DAT164equ0e102h;段控制口LEDBufequ40hINequ0e103hORG0000Hmovsp,#60hMOVDPTR,#0e100H;8155初始化MOVA,#03HMOVX@DPTR,ASTART:MOVDPTR,#8000H;往6264的8000H-9FFFH单元送入#55HMOVA,#55HDD:MOVX@DPTR,AINCDPTRmovr0,dphCJNer0,#0A0H,DDMOV DPTR,#8000hDD1:MOVXA,@DPTR;读出数据进行比较CJNEA,#55H,ERRINCDPTRMOVR0,DPHCJNER0,#0A0H,DD1mov40h,#06h;显示缓冲器初始化mov41h,#05hmov42h,#06hmov43h,#04hmov44h,#10hmov45h,#00hSTART1:LCALLDISPLAY;正确的显示“6464-0”SJMPSTART1ERR:mov40h,#06hmov41h,#05hmov42h,#06hmov43h,#04hmov44h,#10hmov45h,#0Eh;不正确的显示“6264-E。”START2:LCALLDISPLAYSJMPSTART2DISPLAY:setb0d3hmovr0, #LEDBufmovr1,#6;共6个八段管movr2,#00100000b;从左边开始显示Loop:movdptr,#OUTBITmova,#00hmovx@dptr,a;关所有八段管mova,@r0movdptr,#LEDmapmovca,@a+dptrmovB,#8;送164DLP:rlcamovr3,amov,canla,#0fdhmovdptr,#DAT164movx@dptr,amovdptr,#CLK164orla,#02hmovx@dptr,aanla,#0fDhmovx@dptr,amova, r3djnzB,DLPmovdptr,#OUTBITmova,r2movx@dptr,a;显示一位八段管movr6,#01callDelaymova,r2;显示下一位rRamovr2,aincr0djnzr1,Loopmovdptr,#OUTBITmova,#0movx@dptr,a;关所有八段管clr0d3hretLEDMAP:;八段管显示码db3fh,06h,5bh,4fh,66h,6dh,7dh,07hdb7fh,6fh,77h,7ch,39h,5eh,79h,71hDB40HDelay:movr7,#00H; 延时子程序DelayLoop:djnzr7,DelayLoopdjnzr6,DelayLoopretend实验三嵌入式Linux开发环境熟悉实验实验目的:熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。使用Linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。实验内容:本次实验使用RedhatLinux操作系统环境,安装ARM-Linux的开发库及编译器。创建一个新目录,并在其中编写和Makefile文件。学习在Linux下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。下载已经编译好的文件到目标开发板上运行。实验设备:硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上。软件:PC机操作系统REDHATLINUX +MINICOM+ARM-LINUX开发环境实验步骤:1、建立工作目录2、编写程序源代码在Linux下的文本编辑器有许多,常用的是vim和Xwindow界面下的gedit等,我们在开发过程中推荐使用vim,用户需要学习vim的操作方法,请参考相关书籍中的关于vim的操作指南。Kdevelope、anjuta软件的界面与类似,使用它们对于熟悉windows环境下开发的用户更容易上手。实际的源代码较简单,如下:我们可以是用下面的命令来编写的源代码,进入hello目录使用vi命令来编辑代码:按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,再用命令“:wq”保存并退出。这样我们便在当前目录下建立了一个名为的文件。3、编写Makefile 要使上面的程序能够运行,我们必须要编写一个Makefile文件,Makefile文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。使用它带来的好处就是自动编译,你只需要敲一个“make”命令整个工程就可以实现自动编译,当然我们本次实验只有一个文件,它还不能体现出使用Makefile的优越性,但当工程比较大文件比较多时,不使用Makefile几乎是不可能的。下面我们介绍本次实验用到的Makefile文件。下面我们来简单介绍这个Makefile文件的几个主要部分:?CC指明编译器?????EXEC表示编译后生成的执行文件名称OBJS目标文件列表CFLAGS编译参数LDFLAGS连接参数all:编译主入口与上面编写的过程类似,用vi来创建一个Makefile文件并将代码录入其中4、编译应用程序 在上面的步骤完成后,我们就可以在hello目录下运行“make”来编译我们的程序了。如果进行了修改,重新编译则运行:5、下载调试在宿主PC计算机上启动NFS服务,并设置好共享的目录,具体配置请参照前面第一章第四节中关于嵌入式Linux环境开发环境的建立。在建立好NFS共享目录以后,我们就可以进入MINICOM中建立开发板与宿主PC机之间的通讯了。如果不想使用我们提供的源码的话,可以再建立一个NFS共享文件夹。如/root/share,我们把我们自己编译生成的可执行文件复制到该文件夹下,并通过MINICOM挂载到开发板上。再进入/host目录运行刚刚编译好的hello程序,查看运行结果。实验结果:编写了一个最基本简单的程序来验证实验是否成功,主要是进行了交叉编译,生成了可在目标试验台上运行的目标文件,然后成功建立了宿主机与目标实验台仿真终端连接,然后我们成功为目标试验台建立了linux系统终端窗口,然后通过linux命令建立宿主机与目标试验台的共享连接,为了最终的下载和运行最终的可执行文件。运行文件后,屏幕正确输出程序运行结果:hello,world!思考与改进: 本次实验主要是熟悉嵌入式linux开发环境的使用,编写了一个最基本简单的程序来验证实验是否成功,主要是进行了交叉编译,生成了可在目标试验台上运行的目标文件,然后成功建立了宿主机与目标实验台仿真终端连接,然后我们成功为目标试验台建立了linux系统终端窗口,然后通过linux命令建立宿主机与目标试验台的共享连接,为了最终的下载和运行最终的可执行文件。这样,我们就完成了本次实验,熟练掌握了嵌入式实验开发的基本步骤,为以后的实验打下良好基础,我们可以在此基础上完成更多实验,编写更加复杂的程序,从而使的我们的实验顺利进行。实验四串口通信程序设计实验实验目的:了解在linux环境下串行程序设计的基本方法。掌握终端的主要属性及设置方法,熟悉终端I/O函数的使用。学习使用多线程来完成串口的收发处理。实验内容:读懂程序源代码,学习终端I/O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。实验设备:硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上软件:PC机操作系统REDHATLINUX +MINICOM+ARM-LINUX开发环境实验步骤:1、阅读理解源码进入expbasic 3_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。2、编译应用程序运行make产生term可执行文件3、下载调试切换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。进入expbasic 3_tty目录,运行term,观察运行结果的正确性。由于内核已经将串口1作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试。实验结果:实验现象:“ABCDEF.......abcdef.......12345.......”思考与改进:Linux操作系统从一开始就对串行口提供了很好的支持,为 进行串行通讯提供了大量的函数,我们的实验主要是为掌握在Linux中进行串行通讯编程的基本方法。本实验的程序流程图如下:图串口通讯实验流程图设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。实验中通过send函数发送数据,函数定义如下:void*send{intc=‘0’;printf;while{c++;c%=255;write;/*stdout*/usleep;}returnNULL;/*waitforchildtodieoritwillbecomeazombie*/}对应的通过receive函数接受数据,函数定义如下:void* receive{intc;printf;while{read;/*comport*/write;/*stdout*/}printf;returnNULL;}键盘线程接受键盘输入的数据,发送给send线程,作为其发送数据,通过改变键盘输入数据,可以得到不同结果。实验五A/D接口转换编程实验实验目的:了解在linux环境下对S3C2410芯片的8通道10位A/D的操作与控制。实验内容: 学习A/D接口原理,了解实现A/D系统对于系统的软件和硬件要求。阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口。利用外部模拟信号编程实现ARM循环采集全部前4路通道,并且在超级终端上显示。实验设备:硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上软件:PC机操作系统REDHATLINUX+MINICOM+ARM-LINUX开发环境实验步骤:1、阅读理解源码进入/arm2410s/exp/basic/04_ad目录,使用vi编辑器或其他编辑器阅读理解源代码。2、编译应用程序3、下载调试换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。我们可以通过调节开发板上的三个黄色的电位器,来查看a0、a1、a2的变化。备注:驱动程序的加载在实验台的终端提示符【mnt/yaffs】下进入ad目录【mnt/yaffs】cdad【mnt/yaffs/ad】insmods3c2410-adc initialized出现上述提示即加载成功。实验结果:初始值为:a0=a1=a2=;通过调节电位器,a0、a1、a2的值相应的发生改变。思考与改进:设定第1个采用次数为100次,统计一个值n1再设定第2个采用次数为100次,统计一个值n2??再设定第100个采用次数为100次,统计一个值n100求统计平均值N=/100。以列方式显示结果,按回车键开始采样,在按回车键结束。实验结果:采样100个之后,a0、a1、a2值趋于相同。最后平均值得到结果相同。实验六D/A接口转换编程实验实验目的:学习D/A转换原理掌握MAX504D/A转换芯片的使用方法掌握不带有D/A的CPU扩展D/A功能的主要方法 了解D/A驱动程序加入内核的方法实验内容:学习D/A接口原理,了解实现D/A系统对于系统的软件和硬件要求。阅读MAX504芯片文档,掌握其使用方法。实验设备:硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上软件:PC机操作系统REDHATLINUX+MINICOM+ARM-LINUX开发环境实验步骤:1、阅读理解源码进入/arm2410s/exp/basic/05_da目录,使用vi编辑器或其他编辑器阅读理解源代码2、编译应用程序运行make产生da可执行文件da_main切换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录,然后进入 进入/host/exp/basic/05_da目录,运行./da_main,观察运行结果的正确性。在输入./da_main后会出现下面的提示信息。这是由于我们没有指定参数造成的,它的格式为./da_main[da的id号][数字],我们可以通过选择0或1来决定输出到开发板上的哪个D/A接口;同时还需要在~之间来选择一个输出电压。下面的例子是用了开发板上的DA0并且输出1V的电压,我们可以使用万用表对其进行测量。可以通过选择0或1来决定输出到开发板上的哪个D/A接口;同时还需要在~之间来选择一个输出电压。思考与改进:改进:将D/A接口转换与A/D接口转换结合在一起,使用第一个按钮输入。具体程序代码da_如下:#include#include#include#include#include#include#include#include #include““#defineADC_DEV“/dev/adc/0raw”#defineDA0_IOCTRL_WRITE0x10#defineDA1_IOCTRL_WRITE0x11#defineDA_IOCTRL_CLR0x12#defineMax504_FULLchar*DA_DEV=“/dev/exio/0raw”;staticintda_fd=-1;staticintadc_fd=-1;staticintinit_ADdevice{if)printf;return-1;}}staticintGetADresult{intPRESCALE=0XFF;intdata=ADC_WRITE;write);read);return data;}staticvoid*comMonitor{getchar;stop=1;returnNULL;}Floatad{floatd;pthread_tth_com;void*retval;//sets3c44b0ADregisterandstartADifreturn-1;/*Createthethreads*/pthread_create;d=GetADresult*)/;usleep;/*Waituntilproducerandconsumerfinish.*/pthread_join;returnd;}int main{floatv;unsignedintvalue;while{v=ad;if{printf;return1;}value=/Max504_FULL);if)printf;return1;}ioctl;ioctl;Delay;close;printf;}return0;}实验七 直流电机编程控制实验实验目的:????熟悉ARM本身自带的PWM,掌握相应寄存器的配置。Linux下编程实现ARM系统的PWM输出,从而控制直流电机。了解直流电机的工作原理,学会用软件的方法实现步进电机的脉冲分配。掌握带有PWM的CPU编程实现其相应功能的主要方法。实验内容:学习直流电机的工作原理,了解实现电机转动对于系统的软件和硬件要求。学习ARMPWM的生成方法。使用RedhatLinux操作系统环境及ARM编译器,编译直流电机的驱动模块和应用程序。运行程序,实现直流电机的调速转动。实验设备:硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上软件:PC机操作系统REDHATLINUX+MINICOM+ARMLINUX开发环境实验步骤:1、编译直流电机模块 进入MainMenu/Characterdevices菜单,选择DCMOTOR为模块加载:编译内核模块:直流电机模块的编译结果为:2、编译应用程序生成dcm_main3、运行程序在超级终端中,通过加载NFS运行编译结果:程序运行结果:直流电机变速转动。屏幕显示转速。实验结果:观察到直流电机变速转动,因为在程序中对它的控制速度一直在变,到达一定值时,会反向转动。在屏幕中的显示如上所示。 思考与改进:思考程序分析Linux下的直流电机程序包括模块驱动程序和应用程序两部分。Module驱动程序实现了以下方法:开启设备时,配置IO口为定时器工作方式:配置定时器的各控制寄存器:在s3c2410_dcm_ioctl中提供调速功能接口:应用程序dcm_中调用:实现直流电机速度的调整。对于程序中代码更改部分如下:源程序中代码:for{for{ifsetpwm=i;elsesetpwm= -i;ioctl);Delay;printf;}status=-status;}改进后,此部分代码:增加定义变量:floatd1,d2;for{d1=GetADresult*)/;//控制转速d2=GetADresult*)/;//控制方向if{setpwm=d1;}else{setpwm=-d1;}ioctl);Delay; printf;}对于将A/D转换部分的头文件就不在此详述,加载A/D转换的接口同实验4。改进实验结果:通过调整实验台上旋钮1可以调节转速大小,通过调节实验台上旋钮2可以调节旋转的方向。实验八步进电机编程控制实验实验目的:1.了解直流电机和步进电机的工作原理2.学会Linux下用软件的方法实现步进电机的脉冲分配,用软件的方法代替硬件的脉冲分配器。实验内容:学习步进电机的工作原理,了解实现电机转动对于系统的软件和硬件要求。学习ARM知识,要掌握I/O的控制方法。Linux下编程实现ARM的四路I/O通道实现环形脉冲分配用于控制步进电机的转动。实验设备:硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上软件:PC机操作系统REDHATLINUX+MINICOM+ARM-LINUX开发环境 实验步骤:进入MainMenu/Characterdevices菜单,选择DCMOTOR为模块加载:编译内核模块:步进电机模块的编译结果为:2、编译应用程序cd/arm2410s/exp/basic/11_stepmotormake生成stepmotor3、运行程序实验结果:程序运行结果:步进电机开始转动实验九自选实验实验目的:1) 2)3)4)5)6)7)熟悉ARM本身自带的PWM,掌握相应寄存器的配置。Linux下编程实现ARM系统的PWM输出,从而控制直流电机。了解直流电机的工作原理,学会用软件的方法实现步进电机的脉冲分配。掌握带有PWM的CPU编程实现其相应功能的主要方法。了解直流电机和步进电机的工作原理。学会Linux下用软件的方法实现步进电机的脉冲分配,用软件的方法代替硬件的脉冲分配器。了解在linux环境下对S3C2410芯片的8通道10位A/D的操作与控制。实验内容:一、学习A/D接口原理,了解实现A/D系统对于系统的软件和硬件要求。阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口。利用外部模拟信号编程实现ARM循环采集全部前4路通道,并且在超级终端上显示。二、学习直流电机的工作原理,了解实现电机转动对于系统的软件和硬件要求。学习ARMPWM的生成方法。使用RedhatLinux操作系统环境及ARM编译器,编译直流电机的驱动模块和应用程序。运行程序,实现直流电机的调速转动。 三、学习步进电机的工作原理,了解实现电机转动对于系统的软件和硬件要求。学习ARM知识,要掌握I/O的控制方法。Linux下编程实现ARM的四路I/O通道实现环形脉冲分配用于控制步进电机的转动。实验设备:硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上。软件:PC机操作系统REDHATLINUX+MINICOM+ARM-LINUX开发环境实验步骤:1、编译应用程序运行make产生zonghe可执行文件2、下载调试换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。我们可以通过调节开发板上的三个黄色的电位器,来查看直流电机、步进电机的转动方向和转速变化。实验结果: 按钮1用于控制步进电机和直流电机的转速,按钮2用于控制步进电机和直流电机的转动方向,按钮3用于控制步进电机和直流电机的转动与停止。