当前位置:文档之家› 钟计算机综合实践1-5

钟计算机综合实践1-5

四川大学网络教育学院实践课程报告实践课程计算机综合实践校外学习中心专业电气工程及其自动化层次专升本年级 10秋学生姓名学号2013年 9 月 18 日实验一熟悉、使用DEBUG调试工具一.实验目的:1.了解并逐步熟悉汇编语言的编辑方法及特点.2.复习8088汇编语言的段结构、常用的指令与伪指令、存储空间的分配等。

3.掌握汇编语言的编辑、汇编及连接的过程。

4.了解并逐步掌握运用DEBUG进行调试汇编语言程序。

二.实验内容:1.运用8086汇编语言,编辑多字节非压缩型BCD数除法的简单程序,文件名取为*.ASM。

2.运用MASM﹒EXE文件进行汇编,修改发现的各种语法错误,直至正确,形成*.OBJ文件。

3.运用LINK.EXE文件进行连接,形成*.EXE文件。

4.仔细阅读附录中的DEBUG部分,掌握各种命令的所有方法。

5.运用DEBUG。

EXE文件进行调试,使用单步执行命令—T两次,观察寄存器中内容的变化,使用察看存储器数据段命令—D,观察存储器数据段内数值。

6.再使用连续执行命令—G,执行程序,检查结果是否正确,若不正确可使用DEBUG的设置断点,单步执行等功能发现错误所在并加以改正。

程序清单:多字节非压缩型BCD数除法(88754/6=14792)DATA SEGMENTA DB 8,8,7,5,4B DB 6C DB 5DUP (0)N EQU 5DATA ENDSCODE SEGMENTASSUME CS:CODE;DS:DATA;ES:DATA,START MOV AX,DATAMOV DS,AXMOV ES,AXCLDLEA SI,ALEB DI,CMOV CX,NMOV AH,0LP1: LODSBAADDIV BSTOSBLOOP LP1MOV CX,NLEA DI,CLP2: MOV DL,[DI]MOV AH,2INT 21HLOOPMOV AH,4CHINTCODE:ENDS三、实验体会通过本次实验,我了解了汇编语言的编辑方法及特点,掌握汇编语言的编辑、汇编及连接的过程,并逐步掌握运用DEBUG进行调试汇编语言程序。

但对其的熟悉程度和应用还远远不够,因此需要经过加强练习,提高水平。

实验二设计汇编语言程序一.实验内容1、字符串统计程序设计2、双字乘法程序设计二.实验内容1.字符串统计。

在数据段中建立一个缓冲区BUFFER,变量VER,编程使得程序具有如下功能:从键盘输入一个子字符串存入VER,从键盘输入包含一个或几个子字符串的字符串存入BUFFER。

统计BUFFER中的字符串含有多少个子字符串以及每个子字符串的位置。

2.双字乘法程序。

设计一个程序实现32位带符号双精度数乘法运算。

由于只有8位和16位的乘法指令。

因此32位乘法运算是不能直接用指令实现的。

但可以用16位乘法指令,通过 4次想乘然后把部分积想加。

对于带符号数,可以先根据绝对值求得积。

然后判断积的符号,若积为负数,应将其用补码表示。

三.实验流程与程序:32位带符号数乘法流程图32位无符号乘法子程序流程图data segmentioport equ 0d400h-0280hio8253a equ ioport+280hio8253b equ ioport+283hio8255a equ ioport+288hio8255b equ ioport+28bhio0832a equ ioport+290hdata1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdhdb 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96hdb 80h,66h,4eh,38h,25h,15h,09h,04hdb 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据time db 120,106,94,89,79,70,63,59 ;发不同音时8253的计数器初值msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'num db ? ;num为8253计数器初值的序号data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,offset msgmov ah,9int 21h ;显示提示信息sss: m ov ah,7int 21h ;从键盘接收字符,不回显cmp al,1bhje exit ;若为ESC键,则转EXITcmp al,31hjl ssscmp al,38hjg sss ;若不在'1'-'8'之间转ssssub al,31hmov num,al ;求出相应的时间常数的序号mov cx,60 ;取60次32个正弦波数据ddd: mov si,0lll: mov al,data1[si] ;取正弦波数据mov dx,io0832aout dx,al ;放音call delay ;调延时子程序inc sicmp si,32 ;是否取完32个数据jl lll ;若没有,则继续loop ddd ;总循环次数60是否完,没有,则继续jmp sssexit: mov ah,4chint 21hdelay proc near ;延时子程序ccc: mov bx,offset timemov dx,io8253b ;置8253通道0为方式0工作mov al,10hout dx,almov dx,io8255b ;设8255A口输入mov al,9bhout dx,almov al,num ;取相应的时间常数xlatmov dx,io8253aout dx,al ;向8253通道0输出kkk: mov dx,io8255ain al,dx ;从8255A口读一字节test al,01 ;判PA0口是否为1jz kkk ;若不为1,则转KKKret ;子程序返回delay endpcode endsend start四、实验体会编辑程序有很多种,但按功能划分,主要有两大类。

一类是行编辑程序,如EDIT编辑程序;另一类是全屏幕编辑程序如Quick Edit(QE)。

行编辑程序功能较弱,不如全屏幕编辑程序方便、灵活。

实验三 8253定时器/计数器接口与数字电子琴一、实验目的改变定时器2的计数值来改变声音频率,通过编程来获得声调(频率)和节奏(延时长短),使计算机演奏出乐曲来。

二、实验原理PC机的主机箱上装有一只小喇叭,由定时器8253和并行接口芯片8255控制其发音,其电路如下:8253 DRIVER18253用定时器2来产生896Hz的音频信号使喇叭发声,我们可以改变定时器2的计数值来改变声音频率,通过发声的延时程序来获得时间长短不同的声音,于是就可以通过编程;来获得声调(频率)和节奏(延时长短),使计算机演奏出乐曲来。

如果再把音符1,2,3,4, . . .5,6,7,1,2,3,······与数字键1,2,3,4,5,6,7,8,9,······对应起来,就可以把计算机变成电子琴。

以下给出有关资料:1.音符 1., 2., 3., 4 .,5 .,6., 7., 1, 2, 3, 4, 5, 6,7,ⅰ频率 131 147 165 175 196 220 247 262 294 330 349 392 440 494 5232.计数值计算公式计数值=1.19318MHz(时钟频率)/ 给定频率=1234DCH / 给定频率8253道地地定时器通道2的端口地址:42H(存放计数值,先送低位字节,后送高位字节)命令寄存器地址:43H4.实验程序:1)计算计数值程序段:MOV DI,给定频率MOV DX, 12HMOV AX, 34DCHDIV DIAX中即为计数值。

2)打开扬声器发声,8255PB0,PBI送出高电平:IN AL 61HOR AL 3OUT 61H AL3)关闭扬声器,停止发声:IN AL 61HOR AL 0FCHOUT 61H AL三.实验体会实验刚开始有点不知如何下手,经过请教别人和网上查找资料,慢慢有了思路。

通过学习和研究利用8253定时器/计数器的特点和功能,应用编程知识慢慢调试,最终编出音乐来。

获得实验成功的时候,觉得知识在生活中的应用真是太美妙了!以后将学着去编出其他曲目的程序来。

实验四实时时钟实验一、实验目的设计一个时钟显示程序,要求利用定时器0的定时中断记录时间。

二、实验原理PC机中8253定时器0是作为系统时钟的定时中断使用的,它被设置为每秒产生18。

2次定时中断。

用户可以改写中断向量表,使这个0级中断转入自己的定时服务程序中去,也可以重新初始化该计数器,使之产生用户所需要的定时中断,这样就可以在计算机控制系统中用来定时采样压力,温度等等被控制参数,然后进行开环或闭环控制。

BIOS在初始化8253定时器以后,给用户留下了一个INT 1CH 的软件接口,其处理程序只是一条空操作返回指令,用户可以将其入口地址填入中断向量表1CH型中断向量,使得一进入1CH型中断,便立即执行用户自己的程序,执行完又返回中断服务程序继续执行第二种方式是重新设置定时器0,使其工作在方式3,装入计数值11932,使其每10ms发一次定时中断。

由于定时器0的中断类型号是08H,所以应将用户的中断服务程序入口地址填入中断向量表的08H向量中。

三、实验内容:1.用第二种方式重新设置定时器0,使其工作在方式3(控制寄存器地址43H),装入计数值11932(端口地址40H),使超10ms产生一次中断;2.设计一个时钟显示程序,要求利用定时器0的定时中断记录时间,然后以hh:mm:ss的形式在屏幕上显示出来(hh是小时,mm是分,ss是秒),每秒钟显示一次,而且必须在同一位置显示,才能看见变化数位的数字跳动。

3.将程序的入口地址写入中断向量08H,注意在写入前,必须设置一个变量将原中断向量保存起来,以便在程序结束时恢复。

4.程序中要设计输入正确计时点(当前时间值)的方法。

5.按ESC键推出,返回DOS。

(注意:要恢复原来的中断向量,此功能才能实现)。

6.程序中允许时钟和键盘中断。

四、简略流程图。

定时中断子程序流程图主程序流程图五、实验程序1、利用RTC的增量功能进行1s的定时,当定时时间到,取反LED 控制#include "config.h"#define LED1CON 0x00000400 /*P0.10口为LED1控制器*//*定义Fpclk值,用于设置串口波特率*/#define FPCLK 3686250L2、初始化实时时钟void RTCIni(void){ PREINT=FPCLK/32768-1; //设置预分频器PREFRAC=FPCLK-(FPCLK/32768)*32768;YEAR=2005; //初始化年MONTH=6; //初始化月DOM=10; //初始化日CIIR=0x01; //设置秒值的增量产生一次中断CCR=0x01; //启动RTC}3、使用RTC的秒增量中断功能控制LED闪动int main(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);}制端*//* 定义Fpclk值,用于设置串口波特率*/#define FPCLK 2764800L/*定义串口模式设置数据结构*/typedef struct UartMode{ uint8 datab; //字长度,5/6/7/8uint8 stopb; //停止位,1/2uint8 parity; //奇偶校验位,0为无校验,1为奇数校验,2为偶数校验} UARTMODE;uint8 send_buf[16]; //UART0数据接收缓冲区5、初始化串口0,设置其工作模式及波特率入口参数: baud 波特率set 模式设置(UARTMODE数据结构)出口参数: 返回值为1时表示初始化成功,为0时表示参数出错uint8 UART0_Ini(uint32 baud, UARTMODE set){ uint32 bak;/*参数过滤*/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);}6、向串口发送字节数据,并等待发送完毕void SendByte(uint8 data){ U0THR=data; //发送数据while((U0LSR&0x20)==0); //等待数据发送}7、将缓冲区的数据发送回主机入口参数: buf 数据缓冲区no 发送数据的个数出口参数: 无void ISendBuf(uint8 const *buf,uint8 no){ uint8 i;for(i=0;i<no;i++)SendByte(buf[i]);}8、读取rtc的时间值,并将读出的时分秒值由串口发送到上位机显示void SendTimeRtc(void){ uint8 const MESSAGE[]="RTC Time is:";uint32 times;uint8 bak;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);}9、初始化实时时钟void RTCIni(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}10、读取实时时钟的值,并从串口发送出去int main(void){ UARTMODE uart0_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);}六、实验体会本次实验,使我对微机软硬件结合有了进一步的了解。

相关主题