计算机原理小学期实验报告.docx

上传人:b****2 文档编号:3212851 上传时间:2023-05-05 格式:DOCX 页数:33 大小:23.71KB
下载 相关 举报
计算机原理小学期实验报告.docx_第1页
第1页 / 共33页
计算机原理小学期实验报告.docx_第2页
第2页 / 共33页
计算机原理小学期实验报告.docx_第3页
第3页 / 共33页
计算机原理小学期实验报告.docx_第4页
第4页 / 共33页
计算机原理小学期实验报告.docx_第5页
第5页 / 共33页
计算机原理小学期实验报告.docx_第6页
第6页 / 共33页
计算机原理小学期实验报告.docx_第7页
第7页 / 共33页
计算机原理小学期实验报告.docx_第8页
第8页 / 共33页
计算机原理小学期实验报告.docx_第9页
第9页 / 共33页
计算机原理小学期实验报告.docx_第10页
第10页 / 共33页
计算机原理小学期实验报告.docx_第11页
第11页 / 共33页
计算机原理小学期实验报告.docx_第12页
第12页 / 共33页
计算机原理小学期实验报告.docx_第13页
第13页 / 共33页
计算机原理小学期实验报告.docx_第14页
第14页 / 共33页
计算机原理小学期实验报告.docx_第15页
第15页 / 共33页
计算机原理小学期实验报告.docx_第16页
第16页 / 共33页
计算机原理小学期实验报告.docx_第17页
第17页 / 共33页
计算机原理小学期实验报告.docx_第18页
第18页 / 共33页
计算机原理小学期实验报告.docx_第19页
第19页 / 共33页
计算机原理小学期实验报告.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

计算机原理小学期实验报告.docx

《计算机原理小学期实验报告.docx》由会员分享,可在线阅读,更多相关《计算机原理小学期实验报告.docx(33页珍藏版)》请在冰点文库上搜索。

计算机原理小学期实验报告.docx

计算机原理小学期实验报告

DA及AD转换实验报告

自03张驰昱2010012028

1、D/A转换

用DAC0832实现D/A转换,使产生的模拟电压波形分别为锯齿波,三角波和正弦波

要求:

程序运行后等待键入

(1)若键入‘1’,则产生锯齿波

(2)若键入‘2’,则产生三角波

(3)若键入‘3’,则产生正弦波

(4)若键入‘4’,则返回DOS

程序运行过程中没有新键入别的数字,则维持原状不变,用示波器能观测到连续的电压波形。

解决思路:

先写三个用于波形发生的过程,分别发出锯齿波、三角波和正弦波。

再写一个每次从DAC0832输出数据前都会调用的产生延迟的过程,在这个过程中进行有无按键的判断和分辨按键的判断。

主程序先调用这个延迟的过程,这样程序一旦运行起来就相当于不断的在检测按键了。

正弦波的值我是通过matlab生成和写入文件,并保存在数据段里的。

以下是生成一个周期256个采样sin值的matlab代码:

clear;clc;

fid=fopen('sine.txt','w');

s=round(sin(2*pi/256*[1:

256])*127.5+127.5);

s=reshape(s,16,16);

fori=1:

16

fprintf(fid,'DB');

fprintf(fid,'%03XH,',s(:

i));

fprintf(fid,'\n');

end

源代码:

DATASSEGMENT

DNUMDB01H

CSADDDW0280H

HINT1DB'TEETHWAVE',0DH,0AH,'$'

HINT2DB'TRIANGLEWAVE',0DH,0AH,'$'

HINT3DB'SINEWAVE',0DH,0AH,'$'

SINEDB083H,086H,089H,08CH,08FH,092H,095H,098H,09BH,09EH,0A2H,0A5H,0A7H,0AAH,0ADH,0B0H

DB0B3H,0B6H,0B9H,0BCH,0BEH,0C1H,0C4H,0C6H,0C9H,0CBH,0CEH,0D0H,0D3H,0D5H,0D7H,0DAH

DB0DCH,0DEH,0E0H,0E2H,0E4H,0E6H,0E8H,0EAH,0EBH,0EDH,0EEH,0F0H,0F1H,0F3H,0F4H,0F5H

DB0F6H,0F8H,0F9H,0FAH,0FAH,0FBH,0FCH,0FDH,0FDH,0FEH,0FEH,0FEH,0FFH,0FFH,0FFH,0FFH

DB0FFH,0FFH,0FFH,0FEH,0FEH,0FEH,0FDH,0FDH,0FCH,0FBH,0FAH,0FAH,0F9H,0F8H,0F6H,0F5H

DB0F4H,0F3H,0F1H,0F0H,0EEH,0EDH,0EBH,0EAH,0E8H,0E6H,0E4H,0E2H,0E0H,0DEH,0DCH,0DAH

DB0D7H,0D5H,0D3H,0D0H,0CEH,0CBH,0C9H,0C6H,0C4H,0C1H,0BEH,0BCH,0B9H,0B6H,0B3H,0B0H

DB0ADH,0AAH,0A7H,0A5H,0A2H,09EH,09BH,098H,095H,092H,08FH,08CH,089H,086H,083H,080H

DB07CH,079H,076H,073H,070H,06DH,06AH,067H,064H,061H,05DH,05AH,058H,055H,052H,04FH

DB04CH,049H,046H,043H,041H,03EH,03BH,039H,036H,034H,031H,02FH,02CH,02AH,028H,025H

DB023H,021H,01FH,01DH,01BH,019H,017H,015H,014H,012H,011H,00FH,00EH,00CH,00BH,00AH

DB009H,007H,006H,005H,005H,004H,003H,002H,002H,001H,001H,001H,000H,000H,000H,000H

DB000H,000H,000H,001H,001H,001H,002H,002H,003H,004H,005H,005H,006H,007H,009H,00AH

DB00BH,00CH,00EH,00FH,011H,012H,014H,015H,017H,019H,01BH,01DH,01FH,021H,023H,025H

DB028H,02AH,02CH,02FH,031H,034H,036H,039H,03BH,03EH,041H,043H,046H,049H,04CH,04FH

DB052H,055H,058H,05AH,05DH,061H,064H,067H,06AH,06DH,070H,073H,076H,079H,07CH,07FH

DATASENDS

STACKSSEGMENTSTACK

DW100DUP(?

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

 

DELAYPROC;延时子程序

PUSHDX

PUSHAX

MOVAH,0BH;检测键盘有无按键,不等待

INT21H

CMPAL,0FFH;如果没有按键,继续

JNZCONTINUE

MOVAH,01H;如果有按键,读取键盘缓冲区的值并回显

INT21H

CMPAL,'1'

JNZDUE

CALLTEETH;如果是1,调用锯齿波

DUE:

CMPAL,'2'

JNZTRE

CALLTRI;如果是2,调用三角波

TRE:

CMPAL,'3'

JNZQUA

CALLSIN;如果是3,调用正弦波

QUA:

CMPDL,'4';如果是4,退出

JZEXIT

EXIT:

MOVAX,4C00H

INT21H

CONTINUE:

MOVDL,DNUM;如果无按键,那么哪里调用的就返回到哪里去

L:

DECDL

JNZL

POPAX

POPDX

RET

DELAYENDP

TRIPROC;三角波子程序

PUSHAX

PUSHDX

LEADX,HINT1

MOVAH,09H

INT21H

MOVAH,0FFH

DOWN:

CALLDELAY;三角波下降过程

MOVAL,AH

MOVDX,0280H

OUTDX,AL

CMPAH,1

JEUP

SUBAH,2

JMPDOWN

UP:

CALLDELAY;三角波上升过程

MOVAL,AH

MOVDX,0280H

OUTDX,AL

CMPAH,0FFH

JEDOWN

ADDAH,2

JMPUP

POPDX

POPAX

RET

TRIENDP

TEETHPROC;锯齿波子程序

PUSHAX

PUSHDX

LEADX,HINT2

MOVAH,09H

INT21H

PEAK:

MOVAH,0FFH;我写的是一个下降的锯齿波

Z:

CALLDELAY

MOVAL,AH

MOVDX,0280H

OUTDX,AL

CMPAH,0

JEPEAK

DECAH

JMPZ

POPDX

POPAX

RET

TEETHENDP

SINPROC;正弦波子程序

PUSHDI

PUSHSI

PUSHAX

PUSHDX

LEADX,HINT3

MOVAH,09H

INT21H

LEADI,SINE

ADDDI,0FFH;相当于用一个指针取顺序的扫描数据段里的数据

HEAD:

LEASI,SINE;扫描到结尾了再返回到开头

TAIL:

CALLDELAY

MOVAL,[SI]

MOVDX,0280H

OUTDX,AL

CMPSI,DI

JEHEAD

INCSI

JMPTAIL

POPDX

POPAX

POPSI

POPDI

RET

SINENDP

START:

MOVAX,DATAS

MOVDS,AX

CALLDELAY;主程序一开始就不断调用DELAY检查有无按键

JMPSTART

CODESENDS

ENDSTART

2、A/D转换

用ADC0809实现A/D转换,用汇编语言程序自动对一个模拟信号重复采集20组不同的数据,在CRT上将每组数据对应显示成如下形式:

D/AA/D

xxxx

……

然后等待键盘输入,若键入字母C则接着往下再做20组数据;若键入字母E则退回DOS。

输入字母大小写应能兼容。

源代码:

DATASSEGMENT

DNUMDW0FFFFH

TDB0DH,0AH,'D/AA/D',0DH,0AH,'$';标题D/AA/D

BLANKDB'','$';三个空格,为了与上面标题对对齐

ENTDB0DH,0AH,'$';回车加换行

DATASENDS

STACKSSEGMENTSTACK

DW20DUP(?

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

DELAYMACRO;延时子程序

LOCALN

PUSHDX

MOVDX,DNUM

N:

DECDX

JNZN

POPDX

ENDM

PLAYMACROSEG;显示AL寄存器十六进制值的子程序,这个子程序我在实验三中写过

LOCALA2

LOCALA1

PUSHCX

PUSHDX

PUSHAX

MOVDL,SEG

ANDDL,0F0H;取前四位

MOVCL,4

SHRDL,CL

CMPDL,09H

JBEA1

ADDDL,07H

A1:

ADDDL,30H

PUSHAX

MOVAH,02H;输出前四位

INT21H

POPAX

MOVDL,SEG

ANDDL,0FH;取后四位

CMPDL,09H

JBEA2

ADDDL,07H

A2:

ADDDL,30H

MOVAH,02H;输出后四位

INT21H

POPAX

POPDX

POPCX

ENDM

START:

MOVAX,DATAS

MOVDS,AX

MOVCH,0

AGAIN:

MOVCL,20

LEADX,T

MOVAH,09H

INT21H

NEXT:

PLAYCH;显示转换前的数字值

MOVAL,CH;数模转换

MOVDX,280H

OUTDX,AL

LEADX,BLANK;输出空格

MOVAH,09H

INT21H

DELAY

MOVAL,0;模数转换

MOVDX,0289H

OUTDX,AL

DELAY

JMPGO;这里三行只是一个中途的跳板,因为程序过长,JMP超出限度

JUMP:

JMPNEXT

AGA:

JMPAGAIN

GO:

MOVDX,0289H;读入AD结果

INAL,DX

PLAYAL;输出AD结果

LEADX,ENT;输出回车

MOVAH,09H

INT21H

ADDCH,0FH;每两个值相隔0FH

DECCL

JNZJUMP

READ:

MOVAH,01H;检查键盘

INT21H

CMPAL,'E';E退出

JEEXIT

CMPAL,'e’

JEEXIT

CMPAL,'C';C继续读

JNEREAD

CMPAL,'c'

JNEREAD

JMPAGA

EXIT:

MOVAX,4C00H

INT21H

CODESENDS

ENDSTART

计算机原理应用综合实验报告

自03张驰昱2010012028

1、方式0I/O

将TPC实验台上的8255电路A口设置成方式0输入,检测8只开关的状态;将C口设置成方式0输出,控制8只LED灯。

程序运行后不断地读入8只开关的状态,送往对应的LED灯显示,直至在计算机键盘上敲入空格键退回DOS。

源代码:

codesegment

assumecs:

code

START:

MOVAL,10010000B;写控制字

MOVDX,0283H

OUTDX,AL

AGAIN:

MOVDX,0280H;从A口输入

INAL,DX

MOVDX,0282H;C口输出

OUTDX,AL

MOVAH,0BH;检查键盘有无按键,不等待

INT21H

CMPAL,0FFH;如果有按键,去检查是不是空格

JEEXIT

JMPAGAIN;如果无按键,继续

EXIT:

MOVAH,01H

INT21H

CMPAL,''

JNEAGAIN

movax,4c00h

int21h

codeends

endstart

2、选作内容

A口仍保持方式0输入开关状态,C口仍以方式0输出LED灯显示,满足如下条件:

(1)若仅K7=1,8只LED的状态循环左移

(2)若仅K6=1,8只LED的状态循环右移

(3)若仅K6=K7,8只LED一起闪烁。

源代码:

codesegment

assumecs:

code

DELAYMACRO;延时子程序

LOCALN

PUSHDX

MOVDX,0FFFFH

N:

DECDX

JNZN

POPDX

ENDM

HOLDMACRO;发现一次0FFFFH的计数不够长,四次够长了,五次的话JMP就超限了

DELAY

DELAY

DELAY

DELAY

ENDM

LEFTMACRO;向左亮灯子程序

LOCALL

PUSHCX

MOVCL,8

MOVAL,00000001B

L:

HOLD

MOVDX,0282H

OUTDX,AL

SHLAL,1;向左亮灯的本质就是寄存器的移位

DECCL

JNEL

POPCX

ENDM

RIGHTMACRO;向左亮灯子程序,与向左几乎一样,指示寄存器向右移位

LOCALR

PUSHCX

MOVCL,8

MOVAL,10000000B

R:

HOLD

MOVDX,0282H

OUTDX,AL

SHRAL,1

DECCL

JNER

POPCX

ENDM

BLINKMACRO;闪烁子程序,本质就是全亮停片刻,全灭停片刻

MOVAL,0FFH

MOVDX,0282H

OUTDX,AL

HOLD

MOVAL,0

MOVDX,0282H

OUTDX,AL

HOLD

ENDM

START:

MOVAL,10010000B;主程序,写控制字

MOVDX,0283H

OUTDX,AL

AGAIN:

MOVDX,0280H;读入A口状态

INAL,DX

CMPAL,10000000B;如果仅K7开,则调用向左亮灯子程序

JNEA1

LEFT

JMPAGAIN;向左一遍马上回去继续检测A口状态

A1:

CMPAL,01000000B;如果仅K6开,则调用向右亮灯子程序

JNEA2

RIGHT

JMPAGAIN

A2:

CMPAL,11000000B;如果仅K7、K6开,则调用向闪灯子程序

JNEAGAIN

BLINK

JMPAGAIN

EXIT:

movax,4c00h

int21h

codeends

endstart

3、方式1I/O

实验中每按一次单脉冲按键,通过8255电路发一次中断请求。

CRT上显示一个A口的ASCII码字符,直到A口数据为FFH退出。

4、选作内容

修改主程序实现密码检测功能,连续两次从A口拨入数据,与计算机内部事先存放的两字节数比较,相符则在CRT上显示“OK”,否则重新输入。

以下代码已把3、4两个程序合并在一起。

源代码:

DATASSEGMENT

PASSWORDDB38H,38H;密码写在数据段中,定位88

HINTDB0DH,0AH,'OK',0DH,0AH,'$';提示语句”OK”

DATASENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATAS

CHECKPASSMACROBLA;检验密码子程序,入口参数为8位寄存器“BLA”

LOCALBAD

LOCALGOOD

LOCALNEXT

CMPBLA,[SI];如果对了第一位密码,SI向后走一个字节,一旦有错,SI回到PASSWORD头

JNEBAD

CMPSI,DI;DI指向PASSWORD尾,如果正确,则可以显示“OK”了

JNEGOOD

LEADX,HINT

MOVAH,09H

INT21H

GOOD:

INCSI

JMPNEXT

BAD:

LEASI,PASSWORD

NEXT:

ENDM

SERVPROC;中断服务程序

MOVDX,0280H;读入A口数据

INAL,DX

CMPAL,0FFH;如果是FF那么退出

JNEGO

MOVAX,4C00H

INT21H

GO:

PUSHAX;这里保护AX

MOVDL,AL;显示A口ASCII码值

MOVAH,02H

INT21H

POPAX

CHECKPASSAL;顺便检验一下是不是密码

MOVAL,20H;EOI命令退出中断

OUT20H,AL

IRET

SERVENDP

START:

MOVAX,DATAS

MOVDS,AX

LEASI,PASSWORD;SI指向PASSWORD头

MOVDI,SI

INCDI;DI指向PASSWORD尾

PUSHDS;置中断矢量

MOVDX,OFFSETSERV

MOVAX,SEGSERV

MOVDS,AX

MOVAH,25H

MOVAL,0BH

INT21H

POPDS

INAL,21H;消除中断屏蔽

ANDAL,11110111B

OUT21H,AL

MOVAL,10111011B;写8255方式控制字

MOVDX,0283H

OUTDX,AL

MOVAL,00001001B;消除8255的中断屏蔽,这里好像没有明确讲

MOVDX,0283H

OUTDX,AL

STI;允许中断过程

W:

JMPW

movax,4c00h

int21h

codeends

endstart

这个实验主要的问题就是一开始没有消除8255的中断屏蔽,我在书上也没有找到有关内容,希望如果教科书再版的话,加入详细的8255方式1输入输出的中断说明。

5、选作内容

将8255电路A口改成方式1输出(仅将PA7接一只LED示范即可),修改前面的程序实现每次中断后,通过A口输出数据控制LED状态在0,1之间翻转。

源代码:

STACKSSEGMENT

DB20DUP(?

STACKSENDS

CODESEGMENT

ASSUMECS:

CODE,SS:

STACKS

SERVPROC

MOVAL,CL;CL相当于一个全局的控制灯翻转的变量

MOVDX,0280H;输出给A口

OUTDX,AL

NOTCL;每次输出完,把CL反向一下,下一次输出的就是反向值了

MOVAL,20H;EOI命令

OUT20H,AL

IRET

SERVENDP

START:

MOVDX,OFFSETSERV;置中断矢量

MOVAX,SEGSERV

MOVDS,AX

MOVAH,25H

MOVAL,0BH

INT21H

INAL,21H;消除中断屏蔽

ANDAL,11110111B

OUT21H,AL

MOVAL,10100000B;写8255方式控制字

MOVDX,0283H

OUTDX,AL

MOVAL,00001001B;清除8255中断屏蔽

MOVDX,0283H

OUTDX,AL

MOVCL,0FFH

STI

W:

JMPW

movax,4c00h

int21h

codeends

endstart

6、扫描显示接口电路

8255电路A口以方式0输出,C口也初始化成方式0输出且仅用其最低两位:

PC1接数码管位码输入端S1,PC0接位码输入端S0。

程序实现当A口输出字形“0”的段码时,C口输出01H,第一个数码管显示“0”,当A口输出字形“1”的段码时,C口输出02H,于是第二个数码管显示“1”。

每一位显示之后调用一段延时程序,选择恰当的延时程序,使“01”几乎同时显示在两位数码管上。

源代码:

codesegment

assumecs:

code

DELAYMACRO

LOCALGO

PUSHDX

MOVDX,01H

GO:

DECDX

JNEGO

POPDX

ENDM

HOLDMACRO;与之前一样,四次Delay才够长

DELAY

DELAY

DELAY

DELAY

ENDM

START:

MOVAL,10000000B;写8255方式控制字

MOVDX,0283H

OUTDX,AL

AGAIN:

MOVAL,0;这里尤其关键,先要输出全暗,在输出所需值,这是为了消除重影

MOVDX,0280H

OUTDX,AL

MOVAL,01H;选通S0

MOVDX,0282H

OUTDX,AL

MOVAL,3FH;输出0

MOVDX,0280H

OUTDX,AL

H

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2