川大2012春计算机综合实践_第1页
川大2012春计算机综合实践_第2页
川大2012春计算机综合实践_第3页
川大2012春计算机综合实践_第4页
川大2012春计算机综合实践_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四川大学网络教育学院计算机综合实践校外学习中心:贵阳学院学生姓名:吴卫专业:电气工程及其自动化层次:专升本年级:2012年春学号:DH1121Y1002实践时间: 2013年11月实验一:熟悉、使用DEBUG调试工具借助DEBUG调试工具来发现汇编语言程序的错误所在并加以改正。通过实验,掌握DEBUG的常用基本命令,学会如何在windows的命令模式下启动DEBUG,进而学会如何使用DEBUG查看CPU和内存,以及进行程序的跟踪调试等。1实验目的1.1学习如何在Windows的命令模式下启动DEBUG。1.2掌握DEBUG的常用基本命令。1.3学习如何使用DEBUG查看CPU和内存以及进行跟踪调试。2启动DEBUG2.1打开Windows命令窗口选择“开始”→“运行”→输入“cmd”命令2.2启动DEBUG在命令窗口中启动DEBUG,将显示连接符“-”,这时可输入各种DEBUG命令。2.3关于使用命令的几点说明:在提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行;命令是单个字母,命令和参数的大小写可混合输入;可用F1、F2、F3、Ins、Del、→等编辑键来编辑本行命令;=1\*GB3①用D命令查看1000:0处的内容:D1000:0=2\*GB3②用E命令输入:E1000:01‘a+b’2‘c++’3‘IBM’=3\*GB3③用D命令查看1000:0~1000:f单元中内容的变化:D1000:0例4用E命令以提问的方式来逐个地修改从某一地址开始的内存单元中的内容。以从1000:10单元开始为例。步骤:=1\*GB3①用D命令查看1000:10处的内容:D1000:10=2\*GB3②用E命令输入:E1000:10,按Enter键=3\*GB3③DEBUG将显示起始地址1000:0010以及第一个单元(即1000:0010单元)的原始内容:00.,然后光标停在“.”的后面,提示输入想要写入的数据,此时有两种选择:其一输入数据,完后按空格键,即用输入的数据改写当前的内存单元;其二不输入数据,直接按空格键,则表示不对当前内存单元进行改写=4\*GB3④当前单元处理完成后(不论是改写或者没有改写,只要按了空格键,就表示处理完成),DEBUG将显示下一个内存单元的原始内容,并提示进行修改,可以用同样的方法进行处理=5\*GB3⑤所有希望改写的内存单元改写完毕后,按ENTER键,E命令结束=6\*GB3⑥用D命令查看1000:10单元中内容的变化:D1000:104实验任务C:\>debug-F10017F00-A1000B3E:0100MOVDL,010B3E:0102MOVAH,020B3E:0104INT210B3E:0106INT200B3E:0108-NC:\1ST.COM-RBXBX0000:-RCXCX0000:8-W100Writing00008bytes-QC:\>在dos下执行程序C:\>dir1st*.*VolumeindriveCisNTFSCCCCVolumeSerialNumberisFC03-2958DirectoryofC:\2010-8-1818:5181ST.COM1File(s)8bytes0Dir(s)1,080,619,008bytesfreeC:\>1st☺C:\>方法一:C:\>DEBUG1ST.COM-G=100☺Programterminatednormally方法二:C:\>DEBUG-NC:\1ST.COM-L100-G=100☺Programterminatednormally借助DEBUG调试工具来发现汇编语言程序的错误所在并加以改正。5实验结论这次实验,因为要自己去设计整个过程,所以就去了解学习自己原来并没有真正弄懂的东西。比如一些程序的代码的意思,汇编语言的逻辑。使我对前面所做的实验有了原理性的了解,回头看一些实验,也知其然其所以然了。同时对课本上讲的一些内容,不再像以前那样觉得抽象,通过这次设计,有了具体的理解。实验二、设计汇编语言程序1实验目的进行程序设计实验,掌握汇编语言程序。实验包括对字符串统计程序进行设计;设计双字乘法程序设计;设计字符串统计程序设计双字乘法程序设计。掌握宏汇编中的标号的使用学会使用msam编写简单的程序2预备知识汇编语言程序设计是一门实践性很强的课程。编写程序、上机调试、运行程序是进一步学习和掌握汇编语言程序设计的必要手段。在编译汇编程序后,需要进行调试,DEBUG.EXE是DOS提供的用于调试可执行程序的工具软件,是汇编语程序设计中常用的调试工具。在DEBUG环境下,不但可以调试经汇编、连接生成的可执行程序,也可以编写简单的程序。调试汇编语言程序,能使用户接触到计算机内部,允许用户直接观察和修改CPU的寄存器;能观察、修改内存单元;允许直接输入机器指令并单步执行;能反汇编程序。可以说,debug是观察和了解计算机内部运行情况的有利助手。3汇编语言源程序上机操作过程3.1源程序上机过程流程图开始建立源文件Y有人工检查吗?修改源程序NASM文件存盘调MASM程序汇编源文件Y有语法错误?N调LINK程序,连接目标文件?连接有错?EXE文件存盘用DELBUG查错执行EXE文件Y结果有错?N结束3.2实验步骤1)编写一段代码(m.asm)功能是:显示字符串datasegmentmovax,numnumdw8072horax,axdataendsjnsdonecodesegmentnegaxassumecs:code,ds:datamovnum,axstartprocfardone:rte pushdsstartendp xorax,axcodeends pushaxendstartmovax,datamovds,ax2)在DOS提示符下键入:对名为m.asmd的文件进行编译,连接生产.obj和.exe文件:-cd..-cd..-cd\masm-msam-m-linkt-debugm.exe得到可执行文件后就可以直接调用可执行文件名,从盘上调到内存中运行。3)编写一段代码(m.asm)功能是:显示字符串datasegmentlp3:cmpax,64hmovdl,[bx+si]sdb4dup(?)movds,axadddl,30hxdb?jblp4int21hdataendsincdlincsicodesegmentsubax,64hlooplp7assumecs:code,ds:datajmplp3movah,1start:movax,datalp4:movs+1,dlint21hmovds,axmovdl,0movah,4chmovbx,1lp5:cmpax,0ahint21hmovax,0jblp6codeendsmovcx,100incdlendstartlop:addax,bxsubax,0ahincbxjmplp5looploplp6:movs+2,dlmovdl,0movs+3,allp1:cmpax,3e8hmovbx,offsetsjblp2movsi,0incdlmovah,2subax,3e8hmovcl,4jmplp1lp7:movdi,[bx+si]lp2:movs,dlordi,30hmovdl,04)在DOS提示符下键入:对名为m.asmd的文件进行编译,连接生产.obj和.exe文件:-cd..-cd..-msam-linkt-cd\masm–m-debugm.exe4实验结论编写好一个程序后,要想在计算机中调试、运行,必须要有一个程序来支持程序的编辑、修改等操作。这种支援程序叫编辑程序。编辑程序有很多种,但按功能划分,主要有两大类。一类是行编辑程序,如EDIT编辑程序;另一类是全屏幕编辑程序如QuickEdit(QE)。行编辑程序功能较弱,不如全屏幕编辑程序方便、灵活。在编辑汇编语言的源程序时,可以使用已熟悉的。实验三、8253定时器/计数器接口与数字电子琴选择利用实验仪扬声器/PC机内8253驱动内扬声器改变定时器2的计数值来改变声音频率,通过编程来获得声调(频率)和节奏(延时长短),利用键盘1、2、3、4、5、6、7、8设计一个电子琴,通过按数字键响相应的乐符1、2、3、4、5、6、7、i,使能演奏简单的乐曲。使计算机演奏出乐曲来。1实验目的检验和提高我在原理与接口综合应用方面分析问题与解决问题的能力,同时也给我提供更多、更好的训练机会。根据设计要求,尽可能完成设计要求的功能,选择最合适的器件,构成最有效的硬件电路来完成。2实验要求选择利用实验仪扬声器/PC机内8253驱动内扬声器与键盘1、2、3、4、5、6、7、8设计一个电子琴,通过按数字键响相应的乐符1、2、3、4、5、6、7、i,使能演奏简单的乐曲。3程序流程和程序实现3.1流程图开始键盘读入一个字符是ESC键吗?NN返回DOS是数字1~8键吗?Y读出音阶值保存赋相应频率延时3.2程序segsegmentfreqdw262,294,330,349,392,440,494,523;扬声器发声各频率值msgdb'Press1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'timdw400numdb?dsegendsssegsegmentstackdw256dup(?)ssegendscsegsegmentassumecs:cseg,ds:dsegstart:movax,dsegmovds,axmovdx,offsetmsgmovah,9int21h;显示提示信息sss:movah,7int21h;等待从键盘接收字符,不回显al=asc码cmpal,1bhjeexit;若为ESC键,则转EXIT退出cmpal,31hjlsss;小于31hcmpal,38h;大于38hjgsss;不在'1'-'8'之间转ssssubal,31hmovnum,al;num求出相应的时间常数的序号jinei:moval,numaddal,almovah,00hmovsi,axagain:movdi,freq[si]movbx,timcallgenjmpsssexit:movah,4chint21hgenprocnearmoval,0b6h;设置8253通道2方式3二进制计数out43h,almovdx,12hmovax,12928;DXAX=896*533h=18*65536+12928=1.19Mdivdiout42h,al;8253通道2口设置初值moval,ahout42h,alinal,61h;读8255PB口movah,aloral,3out61h,alwait1:movcx,0hdelay3:movax,10;延时子程序delay2:nopdecaxjnzdelay2loopdelay3decbxjnzwait1moval,ahout61h,alretgenendpcsegendsendstart3.3试验仪电子琴流程图3.4实验电路:3.5程序datasegmentioport equ0d400h-0280hio8253a equioport+280hio8253b equioport+283hio8255a equioport+288hio8255b equioport+28bhio0832a equioport+290hdata1db80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdhdb0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96hdb80h,66h,4eh,38h,25h,15h,09h,04hdb00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据timedb120,106,94,89,79,70,63,59 ;发不同音时8253的计数器初值msgdb'Press1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'numdb? ;num为8253计数器初值的序号dataendscodesegmentassumecs:code,ds:datastart: movax,data movds,ax movdx,offsetmsg movah,9 int21h;显示提示信息sss: movah,7 int21h;从键盘接收字符,不回显 cmpal,1bh jeexit;若为ESC键,则转EXIT cmpal,31h jlsss cmpal,38h jgsss;若不在'1'-'8'之间转sss subal,31h movnum,al;求出相应的时间常数的序号 movcx,60;取60次32个正弦波数据ddd: movsi,0lll: moval,data1[si];取正弦波数据movdx,io0832a outdx,al;放音 calldelay;调延时子程序 incsi cmpsi,32;是否取完32个数据 jllll;若没有,则继续 loopddd;总循环次数60是否完,没有,则继续 jmpsssexit: movah,4ch int21hdelayprocnear;延时子程序ccc: movbx,offsettime movdx,io8253b;置8253通道0为方式0工作 moval,10h outdx,al movdx,io8255b;设8255A口输入 moval,9bh outdx,al moval,num;取相应的时间常数 xlat movdx,io8253a outdx,al;向8253通道0输出kkk: movdx,io8255a inal,dx;从8255A口读一字节 testal,01;判PA0口是否为1 jzkkk;若不为1,则转KKK ret;子程序返回delayendpcodeendsendstart4测试方案和测试结果测试方案测试结果启动程序,出现按键提示,按下1~8键机内/实验仪发出相应的音阶改变开关状态(可随时任意改变),按1~8键对应发出相应的音阶“弹琴”发出优美旋律按下ESC键退出程序5实验结论通过这次微机实验课程设计,使我对微机软硬件结合有了进一步的了解。原来并不太清楚是什么意思,一直都很模糊,听课本也是很迷茫;而之前的那些单元实验,也没有都做好。之前做的实验,由于大部分是验证性的,所以就很被动地去做,甚至并没有想为什么要那样连电路,内部的代码更没有认真看。这次课程设计,要自己去设计整个过程,了解学习自己原来并没有真正弄懂的东西。比如一些程序的代码的意思,汇编语言的逻辑,比如一些芯片的用途。使我对前面所做的实验有了原理性的了解,回头看一些实验,也知其然其所以然了。同时对课本上讲的一些内容,不再像以前那样觉得抽象,通过这次设计,有了具体的理解。实验四、实时时钟实验1实验目的1.1了解RTC实时时钟特性、功能、结构1.2了解RTC实时时钟寄存器描述1.3了解RTC中断2实验过程2.1利用RTC的增量功能进行1s的定时,当定时时间到,取反LED控制#include"config.h"#defineLED1CON0x00000400/*P0.10口为LED1控制器*//*定义Fpclk值,用于设置串口波特率*/#defineFPCLK3686250L2.2初始化实时时钟voidRTCIni(void){PREINT=FPCLK/32768-1;//设置预分频器PREFRAC=FPCLK-(FPCLK/32768)*32768;YEAR=2005;//初始化年MONTH=6;//初始化月DOM=10;//初始化日CIIR=0x01;//设置秒值的增量产生一次中断CCR=0x01;//启动RTC}2.3使用RTC的秒增量中断功能控制LED闪动intmain(void){PINSEL0=0x00000000;//引脚连接设置PINSEL1=0x00000000;IODIR=LED1CON;RTCIni();//初始化RTCwhile(1){IOSET=LED1CON;//熄灭LED1while(0==(ILR&0x01));//等待RTC增量中断标志ILR=0x01;//清除中断标志IOCLR=LED1CON;//点亮LED1while(0==(ILR&0x01));ILR=0x01;}return(0);}2.4运行rtc进行计时,并将所计时间值不断地通过串口向上位机发送#include"config.h"#defineLED1CON0x00000400/*P0.10口为LED1控制端*//*定义Fpclk值,用于设置串口波特率*/#defineFPCLK2764800L/*定义串口模式设置数据结构*/typedefstructUartMode{uint8datab;//字长度,5/6/7/8uint8stopb;//停止位,1/2uint8parity;//奇偶校验位,0为无校验,1为奇数校验,2为偶数校验}UARTMODE;uint8send_buf[16];//UART0数据接收缓冲区2.5初始化串口0,设置其工作模式及波特率入口参数:baud波特率set模式设置(UARTMODE数据结构)出口参数:返回值为1时表示初始化成功,为0时表示参数出错uint8UART0_Ini(uint32baud,UARTMODEset){uint32bak;/*参数过滤*/if((0==baud)||(baud>115200))return(0);if((set.datab<5)||(set.datab>8))return(0);if((0==set.stopb)||(set.stopb>2))return(0);if(set.parity>4)return(0);/*设置串口波特率*/U0LCR=0x80;//DLAB位置1bak=(FPCLK>>4)/baud;U0DLM=bak>>8;U0DLL=bak&0xff;/*设置串口模式*/bak=set.datab-5;//设置字长度if(2==set.stopb)bak|=0x04;//判断是否为2位停止位if(0!=set.parity){set.parity=set.parity-1;bak|=0x08;}bak|=set.parity<<4;//设置奇偶校验U0LCR=bak;return(1);}2.6向串口发送字节数据,并等待发送完毕voidSendByte(uint8data){U0THR=data;//发送数据while((U0LSR&0x20)==0);//等待数据发送}2.7将缓冲区的数据发送回主机入口参数:buf数据缓冲区no发送数据的个数出口参数:无voidISendBuf(uint8const*buf,uint8no){uint8i;for(i=0;i<no;i++)SendByte(buf[i]);}2.8读取rtc的时间值,并将读出的时分秒值由串口发送到上位机显示voidSendTimeRtc(void){uint8constMESSAGE[]="RTCTimeis:";uint32times;uint8bak;times=CTIME0;//读取完整时钟寄存器0bak=(times>>16)&0x1F;//取得时的值send_buf[0]=bak/10+'0';send_buf[1]=bak%10+'0';send_buf[2]=':';bak=(times>>8)&0x3F;//取得分的值send_buf[3]=bak/10+'0';send_buf[4]=bak%10+'0';send_buf[5]=':';bak=times&0x3F;//取得秒的值send_buf[6]=bak/10+'0';send_buf[7]=bak%10+'0';send_buf[8]='\n';ISendBuf(MESSAGE,14);//发送数据ISendBuf(send_buf,9);}2.9初始化实时时钟voidRTCIni(void){PREINT=FPCLK/32768-1;//设置预分频器PREFRAC=FPCLK-(FPCLK/32768)*32768;YEAR=2005;//初始化年MONTH=6;//初始化月DOM=10;//初始化日HOUR=8;MIN=30;SEC=0;CIIR=0x01;//设置秒值的增量产生一次中断CCR=0x01;//启动RTC}2.10读取实时时钟的值,并从串口发送出去intmain(void){UARTMODEuart0_set;PINSEL0=0x00000005;//设置I/O连接到UART0PINSEL1=0x00000000;IODIR=LED1CON;//设置LED1控制口为输出,其它I/O为输入uart0_set.datab=8;//8位数据位uart0_set.stopb=1;//1位停止位uart0_set.parity=0;//无奇偶校验位UART0_Ini(9600,uart0_set);//初始化串口模式U0FCR=0x01;//使能FIFORTCIni();//初始化RTCwhile(1){IOSET=LED1CON;//熄灭LEDwhile(0==(ILR&0x01));//等待RTC增量中断标志位ILR=0x01;//清除中断标志位SendTimeRtc();//读取时钟值,并向UART0发送IOCLR=LED1CON;//点亮LEDwhile(0==(ILR&0x01));ILR=0x01;SendTimeRtc();}return(0);}3实验电路图4实验结论通过学习rtc很有收获的,这次毕竟使自己有机会去学习一些贴近硬件的知识,如果将来有机会再学习,我还是很乐意的。毕竟一个真正学习计算机的人不能只知道软件的知识。实验五、8255并行接口键盘实验1实验目的1.1掌握8255A的功能及方式0、1的实现1.2熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法。2实验过程键盘驱动的主要作用就是实时监测外部按键中断,一旦发现外部有键按下就向内核发送键盘消息实现键盘输入功能。键盘驱动创建了中断服务线程和4个键盘中断事件,每行按键对应一个键盘中断事件。有键被按下时,中断服务例程得到对应的中断标识符并报告给系统任务调度进程,同时产生键盘中断事件,键盘中断服务线程响应键盘中断事件,开始扫描矩阵键盘。根据产生的中断事件类型不同,可以首先确定被按下键的行位置。由于键盘被按下后,该键对应的行和列被连通,因此根据判断各列对应的I/O口的电平,可以得到被按下键的列位置;得到按键的准确位置后,通过向操作系统发送键盘消息KEYBD_EVENT,实现一次键盘输入。循环扫描键盘,直到按键被弹起则发送KEYEVENTF_KEYUP事件。响应键盘中断输入的整个流程如图。2.1在OAL层加入中断源矩阵键盘采用4路I/O口中断,每路中断对应1个中断源。矩阵键盘驱动首先要在OAL层加入这些中断源。以其中一路中断为例:#defineSYSINTR_KEYONE(SYSINTR_FIRMWARE+0)2.2中断服务例程(ISR)设计本键盘驱动将GPIO_6、GPIO_7、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论