课程实验报告
实验名称: 串行接口
专业班级:
学 号:
姓 名:
同组人员:
指导教师:
报告日期:
实验二
1. 实验目的... 3
2. 实验内容... 3
3. 实验原理... 3
4. 程序代码... 6
5. 实验体会... 13
实验二
1.实验目的
1.熟悉串行接口芯片8251的工作原理
2.掌握串行通讯接收/发送程序的设计方法
2.实验内容
通过对8251芯片的编程,使得实验台上的串行通讯接口(RS232)以查询方式实现信息在双机上的。具体过程如下:
1. 从A电脑键盘上输入一个字符,将其通过A试验箱的8251数据口发送出去,然后通过B试验箱的8251接收该字符,最后在B电脑的屏幕上显示出来。
2.从A试验箱上输入步进电机控制信息(开关信息),通过A试验箱的8251数据口发送到B试验箱的 8251数据口,在B试验箱上接收到该信息之后,再用这个信息控制B试验箱上的步进电机的启动停止、转速和旋转方向。
3.实验原理
1.8251控制字说明
在准备发送数据和接收数据之前必须由CPU把一组控制字装入8251。控制字分两种:方式指令和工作指令,先装入方式指令,后装入工作指令。
另外,在发送和接收数据时,要检查8251状态字,当状态字报告“发送准备好”/“接收准备好”时,才能进行数据的发送或接收。
2.8251方式指令(端口地址2B9H)
3.8251工作指令(端口地址2B9H)
4.8251状态字(端口地址2B9H)
5.8253控制字(283H)
6.8253计数初值(283H)
计数初值=时钟频率/(波特率× 波特率因子)
本实验:脉冲源=1MHz
波特率=1200
波特率因=16
计数初值= 1000000/1200*16=52
7.程序流程框图
4.程序代码
Fxc.asm
;************************;
;*8251串行通讯(自发自收)*;
;************************;
data segment
io8253a equ 280h ;8253计数0端口地址
io8253b equ 283h ;8253控制端口地址
io8251a equ 2b8h ;8251数据端口地址
io8251b equ 2b9h ;8251控制端口地址
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,io8253b ;设置8253计数器0工作方式
mov al,16h ;控制字为00010110B
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个数据位,波特率因子为16
call out1
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 next
mov ah,0bh
int 21h
test al,0ffh ;检测是否有键盘输入
jz next
mov dl,0ffh ;有键盘输入,读入字符
mov ah,06h
int 21h
cmp al,27 ;若为ESC,结束
jz exit
mov dx,io8251a
;inc al
out dx,al ;发送
; mov cx,40h
;s51: loop s51 ;延时
next: mov dx,io8251b
in al,dx
test al,02 ;检查接收是否准备好
jz waiti ;没有,等待
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
;mov cx,40h
;gg: loop gg ;延时
; pop cx
ret
out1 endp
code ends
end start
Send .asm
;************************;
;*8251串行通讯(自发自收)*;
;************************;
data segment
io8253a equ 280h ;8253计数0端口地址
io8253b equ 283h ;8253控制端口地址
io8251a equ 2b8h ;8251数据端口地址
io8251b equ 2b9h ;8251控制端口地址
buf3 byte 0
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,io8253b ;设置8253计数器0工作方式
mov al,16h ;控制字为00010110B
out dx,al
mov dx,io8253a
mov al,52 ;给8253计数器0送初值
out dx,al
mov dx,io8251b ;初始化8251
mov dx,28bh ;8255控制口初始化
mov al,81h ;1000,0001
out dx,al
;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个数据位,波特率因子为16
call out1
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 next
mov ah,0bh
int 21h
test al,0ffh ;检测是否有键盘输入
jz next
; mov dl,0ffh ;有键盘输入,读入字符
;mov ah,06h
; int 21h
mov dx,28ah
in al,dx
cmp al,27 ;若为ESC,结束
jz exit
mov dx,io8251a
;inc al
out dx,al ;发送
; mov cx,40h
;s51: loop s51 ;延时
next: mov dx,io8251b
in al,dx
test al,02 ;检查接收是否准备好
jz waiti ;没有,等待
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
;mov cx,40h
;gg: loop gg ;延时
; pop cx
ret
out1 endp
code ends
end start
步进电机:
1.K0=0,逆时针转;K0=1,顺时针转
2.K1=0,慢转;K1=1,快转
data segment
buf1 db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;LED显示
buf2 byte 0 ;步进电机数据
buf3 byte 0 ;保存开关数据
buf4 byte 0 ;保存顺转数据
buf5 byte 9 ;保存反转数据
buf6 byte 0 ;开关机
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov buf2,00110011b ;步进电机数据
mov dx,28bh ;8255控制口初始化
mov al,81h ;1000,0001
out dx,al
;-----------------------------逆转控制----------------
R0: mov dx,28ah ;读C口
in al,dx
mov buf3,al ;保存C口数据
test al,04 ;
jnz kai ;转反转
test al,01 ;测试K0=1?
jnz L0 ;转反转
mov al,buf4 ;走马灯开始一步顺转
cmp al,9
jnz S1
call change9_0
S1: inc al ;数据加1
mov buf4,al
mov bx,offset buf1
xlat
mov dx,289h ;B口输出
out dx,al ;数据完成加1
mov al,buf2 ;电机开始一步逆转
ror al,1 ;数据左移
mov buf2,al
mov dx,288h ;A口输出
out dx,al ;电机完成一步逆转
mov al,buf3 ;回复C口数据
test al,02
jnz R1 ;转快转
call delay_s ;否则慢转
jmp R0
R1: call delay_q ;快转
jmp R0
;------------------------------顺转控制-----------------
L0: mov al,buf5 ;走马灯开始一步顺转
cmp al,0
jnz S2
T2: test al,03 ;测试K2=1?
jnz T2
call change0_9
S2: dec al ;数据减1
mov buf5,al ;
mov bx,offset buf1
xlat
mov dx,289h ;B口输出
out dx,al ;走马灯结束一步顺转
mov al,buf2 ;电机开始一步顺转
rol al,1 ;数据右移
mov buf2,al
mov dx,288h ;A口输出
out dx,al ;电机结束一步顺转
mov al,buf3 ;回复C口数据
test al,02
jnz L1 ;转快转
call delay_s ;否则慢转
jmp R0
T3: test al,03 ;测试K2=1?
jnz T3
L1: call delay_q ;快转
jmp R0
kai: mov dx,28ah ;读C口
in al,dx
mov buf3,al ;保存C口数据
test al,04 ;
jz L0 ;转反转
jmp kai
exit: mov ah,4ch
int 21h
delay_s proc near ;长延时
mov bx,20h
lp1: mov cx,0ffffh
lp2: loop lp2
dec bx
jnz lp1
ret
delay_s endp
delay_q proc near ;短延时
mov bx,1
lp11: mov cx,0ffffh
lp22: loop lp22
dec bx
jnz lp11
ret
delay_q endp
change9_0 proc near
mov buf4,-1
mov al,buf4
ret
change9_0 endp
change0_9 proc near
mov buf5,10
mov al,buf5
ret
change0_9 endp
code ends
end start
5.实验体会
这次实验需要用到两种芯片8253和8251,两种芯片的作用分别是8253提供串行通讯所需的特定频率的脉冲信号,8251提供输入输出控制,所以在实验的过程中需要熟悉这两种芯片的方式字等使用规范,在仔细阅读了书本以及书本的编程实例后,基本摘掉了程序的设计方法
实验过程中,出现了程序编译通过了但是不能运行的情况,后来经过检查发现是程序没有设置好的原因,要设置为编译后运行状态,否知只编译不运行,经过这次实验,知道了8253和8251两种芯片的基本用法,对课本上的知识有了更深入的理解,收获不少。