1、实验八 串行接口应用实验,一、实验目的 1、熟悉8251的工作方式及应用编程 2、学习RS-232C标准的串行通信接口电路及串行通信收/发程序的设计原理与方法,二、实验内容 甲乙两台微机之间,按RS-232C标准协议进行零MODEM方式,半双工串行通信。甲机通过键盘向乙机发送字符,发送的字符在甲机的屏幕上显示。乙机接收甲机发来的字符,接收的字符在乙机的屏幕上显示。接收方按任意键,程序退出。发送方按ESC键,程序退出。通信数据格式为1位停止位,7位数据位,无校验位,波特率因子为16,波特率为1200bps。,三、实验原理 RS232-C标准串行通信接口电路原理如图1所示。接口电路以8251为核心
2、,利用8253提供8251所需的发送/接收时钟, 8255的PC6控制8253的GATE2门。另外,还有MAX232作电平转换,MAX491作RS-232与RS-485的转换。,端口地址有: 8251:数据口308H,命令/状态口309H 8253:304H307H 8255:300H303H,图1 串行通信接口电路 原理图,1.19318MHz,四、实验要求 使用3芯屏蔽电缆线,直接将甲乙两机MFID平台板上的RS232-C串行接口插座J7连接起来,如图2所示。分别编写甲机的发送程序和乙机的接收程序,并进行调试,直至程序正常运行。,图2 RS232-C标准双机串行通信模块连接图,五、实验步骤
3、,1、跳线设置:,JP1 JP2 JP3 JP4 JP11,跳接 2-3 2-3 空/跳接(RXD-TXD) 跳接 1-2,说明 零MODEMN方式 选择RS232协议 双机通信/自发自收 收发时钟由OUT2提供 用PC6接Gate2,六、实验程序流程图,七、写出接收端源程序(加注释),八、实验结果分析,2、使用3芯屏蔽电缆线直接将甲乙两机MFID平台板上的RS232-C串行接口插座J7连接起来 3、将平台的电源开关拨到“内”的位置上 4、MF2KP环境下输入汇编源程序,编译、连接、运行,在甲机运行发送程序发送字符,在乙机运行接收程序接收字符。 5、观察发送和接收现象,编程提示:,计数初始值n
4、=输入脉冲时钟频率*t,t是定时时间,=,1.19318MHz,检查有无键按下的DOS功能调用,功能号:AH=0BH 返回参数:AL=00 ;无键按下AL=0FFH ; 有键按下 说明:若有键按下,该调用不断返回0FFH标志,直到有键盘输入的功能调用(如功能号01H)来实际取走该字符。,lop: mov ah,0bh ;检测有键按下?int 21hcmp al,00je lop ;无,等待mov ah,01h ;有,检测是否是Esc键int 21h .,发送端程序流程图,接收端程序流程图,data51 equ 308h ;8251A数据口 ctrl51 equ 309h ;8251A命令/状态
5、口 ctrl55 equ 303h ;8255命令口 timer2 equ 306h ;8253的2号计数器端口 timctl equ 307h ;8253的命令口 clk00 equ 12h ;8251输入时钟频率(十六进制表示) clk01 equ 34deh factor equ 16 ;波特率因子16,【发送段参考程序】:,data segment bps00 dw (?) input_message db now enter the serial communication,0ah,0dhdb end with esc,0ah,0dhdb please input character
6、s to transmit,0dh,0ah,$ data ends,code segmentassume cs:code,ds:data,init51 proc near ;8251A初始化子程序mov dx,ctrl51 ;8251A命令口xor ax,ax ;空操作out dx,almov al,40h ;8251A内部复位call charout,mov al,4ah ;8251A方式命令call charoutmov al,23h ;8251A工作命令call charoutret ;返回 init51 endp,;以下是各子程序,charout proc near ;送数据子程序 o
7、ut dx,al mov cx,100 ;延时 gg: loop ggret charout endp,set_bps proc near ;8253-5计数初值计算与装入子程序mov dx,clk00 ;取8253-5输入时钟频率clk做被除数mov ax,clk01 mov bx,bps00 ;所选波特率做第一个除数div bx ;除法运算,商数送ax mov dx,0 ;余数清零mov bx,factor ;取波特率因子做第二个除数div bx ;除法运算,的计数初值(商数)送axmov bx,ax ;保存计数初值至bx,mov dx,timctl ;8253-5命令口mov al,0b
8、6h ;8253-5初始化命令out dx,almov dx,timer2 ;8253-5计数器2的端口mov ax,bx ;取计数初值out dx,al ;取计数初值低字节mov al,ah ;取计数初值高字节out dx,alret ;返回 set_bps endp,main proc far ;通信主程序 begin:mov bps00,1200 ;送传输率call set_bpscall init51mov dx,ctrl55 ;初始化8255Amov al,80hout dx,almov al,0dh ;置PC6=1,打开8253的GATE2输出方波out dx,al,mov dx,
9、seg input_message ;提示输入信息mov ds,dxmov dx,offset input_messagemov ah,09hint 21h,m0: mov ah,0bh ;读取键盘int 21hcmp al,0 ;有键按下?je m0 ;无键按下等待mov ah,01h ;将字符在CRT上等待int 21hmov bl,al ;保存键值cmp al,1bh ;是否为ESCjz over ;是,则退出,mov dx,ctrl51 ;不是,则发送数据 m1: in al,dxtest al,01h ;发送准备好?RxRDY=1?jz m1 ;未准备好,则等待mov dx,data51 ;已准备好,则将键入的字符发出去mov al,blout dx,al,jmp m0 ;发送完,在转按键发送 over: mov al,0ch ; 关PC6=0,关闭8253的GATE2mov dx,ctrl55out dx,al,mov ah,4ch ;程序退出int 21h main endp code endsend main,