东南大学
《微机实验及课程设计》
实验报告
实验七8251串行通信
实验八数模与模数转换
姓名:学号:08011
专业:自动化实验室:计算机硬件技术
实验时间:2013年05月14日报告时间:2013年05月27日评定成绩:审阅教师:
实验七8251串行通信
一、实验目的与内容
实验目的
(1)了解串行通信的基本原理,认识串行收发过程;
(2)掌握串行接口芯片8251的工作原理和编程方法。
实验内容
(1)按图1 连接好电路 (8251插在带锁通用插座D上),其中8253计数器用于产生8251的发送和接收时钟,TXD和RXD直接相连。
(2)编写测试程序,初始化8251,实现连续发送固定字符,试用多种不同字符格式和字符。(3)编程实现从键盘输入一个字符, 将其ASCII码加1后发送出去,再接收回来在屏幕上显示,实现自发自收。
二、基本实验原理
1.实验原理:
串行输入输出接口电路、串行收发过程原理;
串行接口芯片8251的工作原理和编程方法;
2.关键电路原理图:
3.主要程序流程图:
图2 8251通信查询程序流程图
三. 方案实现与测试
实验步骤:
(1)连好电缆,TPC测试卡地址,运行点阵演示程序(正常后继续)
(2)按图8253和8251连线,(假定io地址c800h),TD/Debug下单步o c803 16(初始化方式字),CLK—按键或连续脉冲输入后i c800,检查计数变化。
(3)o c839 0(三次,确保内部复位);o c839 40(内部复位);o c839 4E(格式字);o c839 27(允许其发送和接收);i c839 读状态,o c838 xx(发送任意数),I c838(接收数据),重复收发不同8位数过程,编程运行;重复发送字符AEH或E5H,用示波器观察发送端TxD 等(格式,波特率),改变参数,观察。
(4)编程:查询收发——读键+1后发送;中断接收;中断收发(调中断程序先用按键模式)(TxRDY+)RxRDY——IRQ。
程序如下:
data segment
ioport equ 0b400h-0280h ;tpc卡中设备的io地址
io8253a equ ioport+280h ;计数器0地址
io8253b equ ioport+283h ; 8253控制寄存器地址
io8251a equ ioport+2b8h ;8251数据口地址
io8251b equ ioport+2b9h ;8251控制口地址
mes1 db 'you can play a key on the keybord!',0dh,0ah,24h
mes2 dd mes1
data ends
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks
main proc far
start: mov ax,stacks
m ov ss,ax
mov ax,data
mov ds,ax
mov dx,io8253b ;设置8253计数器0工作方式
mov al,16h
out dx,al
mov dx,io8253a
mov al,52 ;给8253计数器0送初值
out dx,al
mov dx,io8251b ;初始化8251
xor al,al
mov cx,03 ;向8251控制端口送3个0
delay: call out1
loop delay
mov al,40h ;向8251控制端口送40H,使其复位
call out1
mov al,4eh ;设置为1个停止位,8个数据位
call out1 ;波特率因子为16
mov al,27h ;向8251送控制字允许其发送和接收
call out1
lds dx,mes2 ;显示提示信息
mov ah,09
int 21h
waiti: mov dx,io8251b
in al,dx
test al,01 ;发送是否准备好
jz waiti
mov ah,01 ;是,从键盘上读一字符
int 21h
cmp al,27 ;若为ESC,结束
jz exit
mov dx,io8251a
inc al
out dx,al ;发送
mov cx,0F00h
s51: loop s51 ;延时
next: mov dx,io8251b
in al,dx
test al,02 ;检查接收是否准备好
jz next ;没有,等待
mov dx,io8251a in al,dx ;准备好,接收
inc al ;如果需要处理,如加1
mov dl,al
mov ah,02 ;将接收到的字符显示在屏幕上
int 21h
jmp waiti
exit: mov ah,4ch ;退出
int 21h
main endp
out1 proc near ;向外发送一字节的子程序
out dx,al
push cx
mov cx,0F00h
gg: loop gg ;延时
pop cx
ret
out1 endp
code ends
end start
实验现象:
由于芯片的问题,实验运行的结果是输入一个字符后输出的是空格。用TD进行单步调试后发现AL在执行 in al,dx 语句后始终变为FF,且将test al,01(02)语句跳过不执行。在执行inc al语句后al变为00,所以不论输入什么字符输出总是空格。按键esc可以成功退出程序的运行。
确保连线没错的情况下我们借了一块别人的芯片,程序运行正常,从键盘输入字符1,收到字符,并在屏幕上显示3。因为发送时将a的ASCⅡ码加1,接收时又将ASCⅡ码加1
接收,所以显示的字符为3。
这是程序的问题。通过在next片段中去掉语句inc al,这样就可以达到ASCII码加一得输出了,即可满足题目原来的意思。修改后重新运行的现象如下:
不过在我们打算进一步修改程序的时候,貌似由于实验箱不稳定的原因,同样的程序刚才还正常的,却再次运行出错,只显示FF,出现空格,由于时间限制,我们的实验就这样结束了。
四.提高与创新研究
1.
在实验中,可以在源程序的基础上进行改动,即可以不通过键盘来输入字符,而通过对8251的初始化直接进行控制,从而实现连续发送字符,可以是固定字符,也可以是多个字符,在本实验中,我主要通过利用整个程序的循环框架,在程序中通过加来输出所有ASCII 码,又由于本实验中的程序退出时通过按ESC来实现的,而ESC是有延时的,所以我改用通过按下任意键来实现退出,这样就不会导致频繁的死锁现象,具体改动如下所示:首先在程序的数据段加个数据临时变量,用来存放al中的数据,即temp db 0,然后把waiti改动为:waiti: mov dx,io8251b
in al,dx
test al,01 ;发送是否准备好
jz waiti
mov ah,0bh
int 21h
cmp al,0ffh ;若为任意键,结束
jz exit
mov dx,io8251a
mov al,temp
out dx,al ;发送
Inc al
Mov temp,al
mov cx,0F00h
s51: loop s51 ;延时
next: mov dx,io8251b
in al,dx
test al,02 ;检查接收是否准备好
jz next ;没有,等待
mov dx,io8251a
in al,dx ;准备好,接收
inc al ;如果需要处理,如加1
mov dl,al
mov ah,02 ;将接收到的字符显示在屏幕上
int 21h
jmp waiti
现象表述:将改动好的程序载入运行后,可以发现屏幕上会有从1开始的所有字符,如
果不按任意键将会一直循环下去,直至按下任意键结束,并且将8251的19脚接入示波器,可以观察到两种波形,一个为一条直线,另一条为跳动的波形,即发送一个字符就会出现一段跳动的波形,并且不同的波形所对应的波形宽度不尽相同,这种差异是由字符的不同所导致的。
2.
分析一下,实验系统中握手信号如CTS、RTS等如何起作用的。
RTS――请求发送,是输出信号,低电平有效。用于通知Modem,8251要求发送。它由命令字的D5置“1”来使其有效。
CTS――允许传送,是输入信号,低电平有效。是Modem对8251的RTS信号的响应,当其有效时,8251方可发送数据。
实验中RTS接地,始终有效。当8251准备好发送时,输出RTS信号,8253收到信号后,若允许发送,则回答一个低电平信号作为CTS输入,于是握手成功,传送可以开始。
五.分析与总结
从实验中我们可以明白用8251做简单的输入输出接口时,首先要计算8253的初值,具体计算公式是:
8253计数器初值=时钟频率/(波特率*波特率因子)
就一般情况而言,波特率因子取16,在实验中,选择的时钟频率脉冲为1MHz,波特率选择为1200B/s,则计数器初值为52。
而对于收发程序既可以用查询方式,也可以用中断方式,而且不管是接收数据还是发送数据,都要检查相应的线路状态是否空闲或者准备好。这样通过本实验的学习,认识到单步调试的重要性,增强了自己的错误检查能力和程序改进能力,以及对BIOS的命令调用进行了复习,达到了对实验的原理深刻认识的效果。
通过实验,进一步了解了串行通信的原理以及通过串行方式发送和接收数据的过程。输出数据是以字符为单位首先送到数据发送保持寄存器中,再进入发送移位寄存器,这些过程都是并行方式传送的。在发送移位寄存器中,按照事先和接收端约定的字符传输格式,加上起始位,奇偶校验位和停止位,然后再以约定的波特率先低位后高位地发送出去。
实验八数模与模数转换
一、实验目的与内容
1.实验目的
1)了解数/模转换器的基本原理,掌握DAC0832芯片的使用方法;
2)了解模/数转换器的基本原理,掌握ADC0809芯片的使用方法。
2.基本实验内容和要求
(1)DAC实验电路原理如图1,DAC0832采用单缓冲方式,具有单双极性输入端(图中的Ua、Ub)。进入DEBUG调试,输出命令(O 290 数据)输出数据给DAC0832,用
万用表测量单极性输出端Ua及双极性输出端Ub的电压,验证数字与电压之间的
线性关系。
(2)分别编程产生锯齿波、正弦波电压波形(从Ub输出,用示波器观察)。
(3)ADC实验电路原理图如图2,通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0),利用debug的输出命令启动A/D转换器,输入命令
读取转换结果,检查硬件是否正常,验证输入电压与转换后数字的关系。启动IN0开始转换: O 0C818 0;读取转换结果: I 0C818。
(4)编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)。 (5)将JP3的1、2短接,使IN1处于双极性工作方式,并给IN1输入一个低频交流信
号(幅度为±5V),编程采集这个信号数据并在屏幕上显示波形。
二、基本实验原理
1. 实验原理:
(1)D/A 转换
① 8位D/A 转换器DAC0832的口地址为290H ,输入数据与输出电压的关系为:
256REF
a U U N =-
? 25256REF b U
U N =?-
(UREF 表示参考电压,N 表示数数据),这里的参考电压为PC 机的+5V 电源。 ② 产生锯齿波只须将输出到DAC0832的数据由0循环递增,产生正弦波可根据正弦函数建一个下弦数字量表,取值范围为一个周期,表中数据个数在16个以上。 (2)A/D 转换
① 图2中ADC0809的IN0口地址为298H ,IN1口地址为299H 。 ② IN0单极性输入电压与转换后数字的关系为
/256
i
REF U N U =
其中Ui 为输入电压,UREF 为参考电压,这里的参考电压为PC 机的+5V 电源。 ③ 一次A/D 转换的程序可以为:
MOV DX,口地址
OUT DX,AL ;启动转换 ;延时
IN AL,DX ;读取转换结果放在AL 中
2. 关键电路原理图:
3.主要程序框图:
图3 锯齿波发生程序流程图图4 正弦波发生程序流程图
三. 方案实现与测试
实验步骤:
(1)连好电缆,TPC测试卡地址,运行点阵演示程序(正常后继续)
(2)按图连接DAC0832片选(290-298H译码)线,Ub接逻辑笔。(假定IO地址C800H),TD/Debug下单步o C810 00(00V输出,绿灯亮);o C810 FF(5V输出,红灯亮);o C810 80H(2.5V 输出,黄灯亮);
输入FF红灯亮:
输入00绿灯亮:
(3)分别编程产生锯齿波、正弦波电压波形(从Ub输出,用示波器观察)
(4)按图接DAC0809片选(298-29FH译码)线等,启动IN0开始转换,o c818 0,读取转换结果i c818,IN0从0-5V变化,观察结果(IN1 C819H)
采集IN0的信号,随着电位器的转动,转换结果从FF-00变化。
(5)编程采集IN0输入的电压信号,在屏幕上显示出转换后的数据。
(6)将JP3的1、2短接,使IN1处于双极性工作方式,并给IN1输入一个低频交流信号(幅度为±5V),编程采集这个信号数据并在屏幕上显示波形。
DA转换关键程序段:
程序1:锯齿波发生程序
start: mov ax,stacks
mov ss,ax
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 ;返回DOS
int 21h
程序2:正弦波发生程序
data segment
ioport equ 0d400h-0280h ;tpc 卡中设备的io 地址
io0832a equ ioport+290h ;DAC0832 的口地址为290H
sin db
80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db
0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96 h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据
data ends
stacks segment
start: mov ax,stacks
mov ss,ax
mov ax,data
mov ds,ax
ll: mov si,offset sin ;置正弦波数据的偏移地址为SI
mov bh,32 ;一组输出32 个数据
lll: mov al,[si] ;将数据输出到D/A 转换器
mov dx,io0832a
out dx,al
mov ah,06h
mov dl,0ffh
int 21h
jne exit
mov cx,1
delay:
loop delay ;延时
inc si ;取下一个数据
dec bh
jnz lll ;若未取完32 个数据则转lll jmp ll
exit: mov ah,4ch ;退出
int 21h
AD转换关键程序段:
程序1:数据转换和数据显示
start: mov ax,stacks
mov ss,ax
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 右移四位
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
main endp
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
程序2:A/D转换曲线绘制
start: mov ax,stacks
mov ss,ax
mov ax,0012h ;设屏幕显示方式为VGA 640X480 模示
int 10h
and cx,0 ;cx 为横坐标
draw:mov dx,io0809b ;启动A/D 转换器通道1
out dx,al
mov bx,500 ;延时
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 start ;是则转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 ;返回DOS 操作系统 int 21h
实验现象:
连线如上图所示,在运行锯齿波程序的可执行程序后,将Ub 的信号接入示波器可以观察到下述波形:
在运行正弦波程序的可执行程序后,将Ub 的信号接入示波器可以观察到下述波形:
当载入ADC实验的可执行程序,即数据转化程序后随着改变IN0端的电位器,会在整个屏幕上出现从0~FF转换的所有数据,由于0809的时钟信号是1MHZ,所以整个变化过程非常快。
载入曲线绘制程序之后,可以看到在屏幕上会出现绿色的连续波形,从而验证了实验电路和原理的正确性。闪动比较快,不易记录,因此没有拍下照片。
四、提高与创新研究
编程实现数字录音器。连接电路,将声传感器接J2,把代表语音的电信号送给ADC0809 通道2(IN2);D/A 转换器的输出端通过K8 跳线接喇叭。编程以每秒钟5000 次的速率采集IN2 输入的语音数据并存入内存,共采集60000 个数据(录12 秒),然后再以同样的速率将数据送DAC0832 使喇叭发声(放音)。
(1)关键程序段如下:
Begin:
Mov dx, io0809a;ADC0809的地址
Out dx,al;启动一次A/D转换器
Call delay;调用延时子程序
In al,dx;从端口读入数据
Mov [di],al;将数据放入缓冲区中
Inc di
Loop begin ;循环装入60000个数据
Play:
Mov di,offset buf;取缓冲区的入口地址
Mov cx,60000
Begin1:
Mov dx,io0832a;DAC0832的入口地址
Mov al,[di];将要转换的数据从内存中取出
Out dx,al;将数据打入寄存器
Call delay;调用延时子程序
Inc di
Loop begin1
Mov dx,offset word3;显示循环放音提示
Mov ah,9
Int 21h
Mov ah,1
Int 21h
Delay proc near
Push dx;保存dx的内容
Mov dx,io8253c;8253的控制字地址
Mov al,00010000b ;计数器0只读低字节以方式0工作,二进制计数
Out dx,al
Mov dx,io8253a;8253的入口地址
Mov al,200;写入循环计数初值
Out dx,al
Mov dx,io8255c;8255的控制字的地址
Mov al,10010000b;D7=1控制字标志位,D6D5=00 方式0 ,;D4=1表示A口输入
Out dx,al
Mov dx,io8255a;8255的入口地址
首先在连好DAC实验电路以后,开启纯DOS系统,进入DEBUG调试界面,将Ua和Ub 的输出信号分别接入示波器观察,当在DEBUG界面下输入o 0b810 0 时,波形为一条直线在零位置,当随着输入o 0b810 2或者更大一些的数据时,波形向上移动,当输入FF时,波形到最高位置,而且可以通过示波器每格幅度表示,大致能够读出数字量进而得到数字量与模拟量之间的关系,从而验证了数字量与模拟量之间的线性关系。
此外,在连接好ADC实验电路以后,同样可以在DEBUG调试界面下用o 0b818 数据来读取转换结果,验证输入电压与转换数字之间的关系。
五.分析与总结
这次实验连线简单,示波器可以正常使用,总体操作比较顺利,这是第一次电脑,板子,示波器相连,感受到了知识的共通连接性,操作仪器获得我们所预期的结果,收获很多。
在本实验进行过程中,同样遇到了多方面的问题,主要有从Ub输出的波形跳动很快,使人不能很好的分析记录波形,这时需要调试示波器,通过调整示波器的辉度和幅度旋钮使得波形基本稳定下来。此外,在观察逻辑笔的变化时,只能使得红灯和绿灯亮,设定为2.5V,黄灯不亮。这个问题没能够解决。
从本次实验,从基本的数模和模数转换理论中,通过程序在计算机上形象的用波形来描述,使得我们更好的理解了数模/模数转换的原理,同时了解到了0809芯片和0832芯片的基本工作模式和相应的初始化编程,对于A/D和D/A转换的公式
有了更深一步的理解;此外,在高性能系统中,往往需要精确定时启动采样,DAC的波形发生也需要精确地定时,所以两者均可引入8253定时中断,以便得到更加稳定和准确的结果。