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