实验报告
课程名称汇编语言与微机接口技术
实验项目
实验仪器 PC微机、CZ-CIU实验箱
学院__ _ _计算机学院_ _ _
专业计算机科学与技术
班级/学号 *
学生姓名___ _ _ *________
实验日期 2018/12/3
成绩
指导教师 *
指导书中实验16
一、实验目的
1、了解串行通讯的基本原理。
2、掌握串行接口芯片8251的工作原理和编程方法。
二、实验原理、内容描述和硬件连接
1、按图4-16-1连接好电路,(8251插通用插座)其中8254计数器用于产生8251的发送和接收时钟,TXD和RXD连在一起。
2、编程: 从键盘输入一个字符,将其ASCII码加 1 后发送出去,再接收回来在屏幕上显示,实现自发自收。
3、接线: CLK0 /8254 接 1M时钟
GATE0 /8254 接 +5V
0UT0 /8254 接 TX/RXCLK /8251
CS /8254 接 Y0 /IO地址
CS /8251 接 Y7 /IO地址
RXD /8251 接 TXD /8251
三、程序流程图
四、代码、和关键注释
;E8251.ASM
data segment
io8254a equ 280h
io8254b equ 283h
io8251a equ 2b8h
io8251b equ 2b9h
mes1 db 'you can play a key on the keybord!',0dh,0ah,24h
mes2 dd mes1
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,io8254b ;设置8254计数器0工作方式
mov al,16h ;00010110B,通道0,只读低字节,方式3方波发生器,
二进制计数
out dx,al
mov dx,io8254a
mov al,52 ;计数初值,给8254计数器0送初值
out dx,al
mov dx,io8251b ;初始化8251
xor al,al ;和自己异或,即清0
mov cx,03 ;设置循环次数为3,即向8251控制端口送三次0
delay: call out1
loop delay ;loop循环减一
mov al,40h ;向8251控制端口送40H,使其复位
call out1
mov al,4eh;01001110B,方式字,设置为1个停止位,8个数据位,波特率因子为16
call out1
mov al,27h;00100111B,命令字,向8251送命令字允许其发送和接收
call out1
lds dx,mes2 ;显示提示信息
mov ah,09
int 21h
waiti: mov dx,io8251b
in al,dx
test al,01 ;检测TxRDY是否为1,发送是否准备好
jz waiti
mov ah,01 ;是,从键盘上读入一个字符
int 21h
cmp al,27 ;若为ESC,结束
jz exit
mov dx,io8251a ;数据口
inc al ;ASC码加1
out dx,al ;发送
mov cx,40h
s51: loop s51 ;延时
next: mov dx,io8251b
in al,dx
test al,02;检测RxRDY是否为1,检查接收是否准备好
jz next
mov dx,io8251a
in al,dx ;准备好,接收
mov dl,al
mov ah,02 ;将接收到的字符显示在屏幕上
int 21h
jmp waiti
exit: mov ah,4ch ;退出
int 21h
out1 proc near ;向外发送一字节的子程序
out dx,al
push cx ;因为使用到了CX,压栈再出栈来保护主程序中的CX
mov cx,40h
gg: loop gg ;延时
pop cx
ret
out1 endp
code ends
end start
五、按老师要求如何改变程序功能或改进程序?
无其他要求,主要是读懂和记住程序。
六、解答实验课上老师的提问?
1.问:计数器的初值52是怎么来的?
回答:首先波特率选1200 波特率因子选16 时钟频率是1MHZ 那么用1MHZ/(1200*16)≈52 所以计数器的初值是52。
2.问:有没有可能数据口和控制口反过来?
回答:不可能,数据口一个是奇地址,一个是偶地址,连续的地址,所以不可以调换,一个是2b8h,一个是2b9h,不能反过来。
七、实验收获与总结
通过这次微机操作原理实践实验,使得我对汇编语言编程产生了浓厚的兴趣,并在实验的过程中掌握了各种功能语句的运用,并熟知了8254和8251的构造,工作方式等相关知识,了解了串行通讯的基本原理,掌握了串行接口芯片8251的工作原理和编程方法,能够熟悉地对8251的输入输出端口进行初始化,对程序中的循环语句,循环体能够更加透彻地运用,明白了对功能号的灵活运用会使得编程更加便捷与灵活,为之后的学习生活奠定了深厚的基础。
指导书中实验17
一、实验目的
了解数/模转换器的基本原理,掌握DAC0832芯片的使用方法。
二、实验原理、内容描述和硬件连接
1、实验电路原理如图4-17-1,DAC0832采用单缓冲方式,具有单双极性输出端(图中的Ua、Ub),利用debug输出命令(Out 290 数据)输出数据给DAC0832,用万用表测量单极性输出端Ua及双极性输出端Ub的电压,验证数字与电压之间的线性关系。
2、编程产生以下波形(从Ub输出,用示波器观察)
(1)锯齿波
(2)正弦波
3、接线: CS /0832 接 Y2 /IO地址
三、程序流程图
第一题:第二题:
修改要求后的流程图:(三角波)
四、代码、和关键注释
第一题:
;DA_1.ASM
io0832a equ 290h
code segment
assume cs:code
start:
mov cl,0
mov dx,io0832a
lll: mov al,cl
out dx,al
inc cl ;cl加1
inc cl
inc cl
inc cl
inc cl
inc cl
inc cl
push dx
mov ah,06h ;判断是否有键按下
mov dl,0ffh
int 21h
pop dx
jz lll ;若无则转lll
mov ah,4ch ;返回
int 21h
code ends
end start
第二题:
;DA_2.ASM
data segment
io0832a equ 290h
sin db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据
data ends
code segment
assume cs:code ,ds:data
start:
mov ax,data
mov ds,ax
ll: mov si,offset sin ; 置正弦波数据的偏移地址为si mov bh,32
lll: mov al,[si] ;将数据输出到D/A转换器mov dx,io0832a
out dx,al
mov ah,06h
mov dl,0ffh
jne exit
mov cx,1
delay: loop delay ;延时
inc si ;取下一个数据
dec bh
jnz lll ;若未取完32个数据则转lll
jmp ll
exit: mov ah,4ch ;退出
int 21h
code ends
end start
五、按老师要求如何改变程序功能或改进程序?
如何将锯齿波改成三角波?
答:设计思想:设置上限和下限,并增加判断:是否超过上限和下限?如果超过上限则dec,若超过下限则inc,否则继续。修改代码如下:
;DA_1.ASM
io0832a equ 290h
code segment
assume cs:code
start:
mov cl,1ah ;下限值
mov dx,io0832a
lll: mov al,cl
out dx,al
inc cl ;cl加1
cmp cl,0e1h ;超过上限了吗?
jnz lll ;没有继续转换
dec cl ;超过了,数值减量
ll: mov al,cl
out dx,al
dec cl ;cl减1
cmp al,19h ;低于下限了吗?
jnz ll ;没有
jmp start ;转下一个周期
push dx
mov ah,06h ;判断是否有键按下
mov dl,0ffh
int 21h
pop dx
jz lll ;若无则转lll
mov ah,4ch ;返回
code ends
end start
六、解答实验课上老师的提问?
1.问:如何将锯齿波改成三角波?
回答:在程序代码中设置上限和下限,然后在程序中增加判断语句:检测是否超过了上限或者低于下限。如果超过上限则用自减一dec功能向下减,低于下限则继续执行自加一inc功能往回加。
七、实验收获与总结
通过这次微机操作原理实践实验,使得我对汇编语言编程产生了浓厚的兴趣,并了解了数/模转换器的基本原理,掌握了DAC0832芯片的使用方法。而且在实验的过程中掌握了各种功能语句的运用,而且通过示波器清晰明了地观察到了实验的变化,对程序中的循环语句,循环体能够更加透彻地运用,明白了对功能号的灵活运用会使得编程更加便捷与灵活,为之后的学习生活奠定了深厚的基础。
指导书中实验18
一、实验目的
了解模/数转换的基本原理,掌握ADC0809的使用方法。
二、实验原理、内容描述和硬件连接
1、实验电路原理图如图4-18-1。通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0),利用debug的输出命令启动A/D转换器,输入命令读取转换结果,验证输入电压与转换后数字的关系。
启动IN0开始转换: O 0298 0
读取转换结果: I 0298
2、编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)。
3、给IN1输入一个低频变化信号(幅度为0-5V),编程采集这个信号数据并在屏幕上显示波形。
4、接线: CS /0809 接 Y3 /IO地址
IN0 /0809 接 0~5V /直流信号
三、程序流程图
第一题:
第二题:
四、代码、和关键注释
第一题:
;AD_1.ASM
code segment
assume cs:code
start:
mov dx,io0809a ;启动A/D转换器
out dx,al
mov cx,0ffh ;延时
delay: loop delay
in al,dx ;从A/D转换器输入数据
mov bl,al ;将AL保存到BL
mov cl,4
shr al,cl ;将al右移4位
call disp ;调显示子程序显示其高四位
mov al,bl
and al,0fh
call disp ;调显示子程序显示其低四位
mov ah,02
mov dl,20h ;加回车符
int 21h
mov dl,20h
int 21h
push dx
mov ah,06h ;判断是否有按键按下
mov dl,0ffh
int 21h
pop dx
je start ;若没有转start
mov ah,4ch
int 21h
disp proc near ;显示子程序
mov dl,al
cmp dl,9 ;比较dl是否>9
jle ddd ;若不大于则为‘0’-‘9’,加30h为其ASCII码add dl,7 ;否则为‘A’-‘F’,再加7
ddd: add dl,30h ;显示
mov ah,02
int 21h
ret
disp endp
code ends
end start
第二题:
;AD_2.ASM
code segment
assume cs:code
start:
mov ax,0012h ;设屏幕显示方式为VGA 640x480模式
int 10h
start1: mov ax,0600h
int 10h ;清屏
and cx,0 ;cx为横坐标
draw: mov dx,io0809b ;启动A/D转换器通道1
out dx,al
mov bx,200 ;延时
delay: dec bx
jnz delay
in al,dx ;读入数据
mov ah,0
mov dx,368 ;dx为纵坐标
sub dx,ax
mov al,0ah ;设置颜色
mov ah,0ch ;画点
int 10h
cmp cx,639 ;一行是否满
jz start1 ;是则转start
inc cx ;继续画点
push dx
mov ah,06h ;是否有按键按下
mov dl,0ffh
int 21h
pop dx
je draw ;无,则继续画点
mov ax,0003 ;有恢复屏幕为字符方式
int 10h
mov ah,4ch ;退出
int 21h
code ends
end start
五、按老师要求如何改变程序功能或改进程序?
改进要求:原先屏幕上显示出ASCII码值不断循环,试将程序改成仅显示一次,避免无限循环。
设计思路:将上一次显示出来的值存在另一个寄存器,每次循环用cmp指令与之判断,若该寄存器值相等,则不调用显示子程序,反之调用显示子程序显示其
ASCII码值。
六、解答实验课上老师的提问?
问题:怎么让电压得出的数值在表格上仅仅显示一次?
回答:增加判断条件,就像之前的实验一样,增加CMP比较指令,如果比较相等就不再输出,如果不相等,就证明电压发生了变化,就显示出。
七、实验收获与总结
通过这次微机操作原理实践实验,使得我对汇编语言编程产生了浓厚的兴趣,并了解了模/数转换的基本原理,掌握了ADC0809的使用方法。而且在实验的过程中掌握了各种功能语句的运用,而且清晰明了地观察到了实验的变化,对程序中的循环语句,循环体能够更加透彻地运用,明白了对功能号的灵活运用会使得编程更加便捷与灵活,为之后的学习生活奠定了深厚的基础。