南京邮电大学微型计算机原理与接口技术:微机系统串行口的测试

本文详细介绍如何通过Ins8250实现串行口RS-232C的初始化,并涵盖查询方式自发自收测试和查询发送中断接收的串行通信程序设计。通过实验理解串行通信原理,以及Windows环境下串口资源管理和编程实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的和要求

  • 了解微机系统串行口RS-232C的内部结构、工作原理;
  • 掌握Ins 8250的初始化编程方法,学会串行通信程序的设计。

二、实验内容

  • 实验内容1:完成硬件测试环境,编写程序对微机系统的串口进行查询方式自发自收外环测试。

实验内容2:在查询方式的基础上,设计查询发送,中断方式接收的串行通信自发自收方式测试。

实验原理及实验步骤

实验内容1

  • 串行通信原理:

串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。

在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。

应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

  •  串行通信编程源码:
.586
DATA SEGMENT USE16
BUF DB ‘B11111111XYZ’
DATA ENDS
CODE SEGMENT USE16
    ASSUME CS:CODE, DS:DATA
START:
    MOV AX, DATA
    MOV DS, AX
    CALL I8250			; 8250初始化 
    MOV BX, OFFSET BUF
    MOV CX, LENS
SEND:MOV DX, 3FDH
	IN AL, DX
	TEST AL, 20H        ; 发送保存寄存器是否为空,查第5位
	JZ SEND
    MOV DX, 3F8H
    MOV AL,[BX]
    OUT DX, AL
    INC BX
RECE: MOV DX, 3FDH
	IN AL, DX
	TEST AL, 01H        ; 接收看第0位
	JZ RECE				; 判断一帧数据接收完整
	MOV DX, 3F8H
	IN AL, DX
	AND AL, 01111111B
	MOV DL,AL
	  MOV AH,02H
	  INT 21H
        	
	  LOOP SCAN
	  MOV AH,4CH
	  INT 21H
I8250 PROC
    MOV DX, 3FBH
    MOV AL, 80H
    OUT DX, AL
    MOV DX, 3F9H
    MOV AL, 0
    OUT DX, AL
    MOV DX, 3F8H
    MOV AL, 30H       ;存放分频系数,由两部分组成,高8位送入MSB,低8位送入LSB。
    OUT DX, AL
    MOV DX, 3FBH
    MOV AL, 0AH      ;00001010,奇校验,1位,7位
    OUT DX, AL
    MOV DX, 3F9H
    MOV AL, 0
    OUT DX, AL
    MOV DX, 3FCH
    MOV AL, 10H      ;D4=1,内环自检
    OUT DX, AL
    RET	
I8250 ENDP
CODE ENDS
    END START

程序执行结果如下:屏幕显示字符串。

实验内容2

查询方式发送,中断方式接收的串行通信程序:

.586
DATA SEGMENT USE16
MESG DB 'B11111111'
LENS EQU $-MESG
OLD0B DD ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA 
BEG:   MOV AX,DATA
	   MOV DS,AX
	   CLI                        ;关中断
	   CALL I8250                 ;主串口初始化
	   CALL I8259                 ;开放主8259A辅串口中断
	   CALL RD0B                ;读中断向量
	   CALL WR0B 				  ;写中断向量
	   STI                        ;开中断	   
	   MOV BX,OFFSET MESG
	   MOV CX,LENS

SCANT: MOV DX,2FDH
	   IN AL,DX
	   TEST AL,20H
	   JZ SCANT	   
	   MOV DX,2F8H
	   MOV AL,[BX]
	   OUT DX,AL
	   INC BX                   ;计数
	   MOV DX,0
TWAIT: DEC DX
	   JNZ TWAIT                ;加循环延时来保证中断接收的时间
	   LOOP SCANT
RETURN:CALL RESET
	   MOV AH,4CH
	   INT 21H             ;返回 DOS
	   
RECEIVE PROC
	   PUSHA
	   PUSH DS
	   MOV AX,DATA
	   MOV DS,AX
	   MOV DX,2F8H
	   IN AL,DX
	   AND AL,7FH
	   MOV AH, 2
       MOV DL, AL
       INT 21H           ;屏幕显示
       JMP EXIT
	   
EXIT:  MOV AL,20H      ;中断结束命令
	   OUT 20H,AL
	   POP DS           ;恢复现场
	   POPA
	   IRET
RECEIVE ENDP

I8250 PROC              ;主串口初始化子程序
	   MOV DX,2FBH
	   MOV AL,80H
	   OUT DX,AL       ;寻址位置1
	   MOV DX,2F9H
	   MOV AL,0
	   OUT DX,AL	     ;除数高8位
	   MOV DX,2F8H
	   MOV AL,60H
	   OUT DX,AL	     ;除数高8位
	   MOV DX,2FBH
	   MOV AL,03H 
	   OUT DX,AL
	   MOV DX,2F9H
	   MOV AL,01H	    ;允许接收中断
	   OUT DX,AL
	   MOV DX,2FCH
	   MOV AL,18H   	;内环,8250能送出中断请求
	   OUT DX,AL
	   RET
I8250 ENDP

I8259 PROC
	   IN AL,21H
	   AND AL,11110111B
	   OUT 21H,AL	    ;置中断屏蔽寄存器
	   RET
I8259 ENDP

RD0B PROC  	        ;保存原来系统的0BH 中断向量
	   MOV AX,350BH
	   INT 21H
	   MOV WORD PTR OLD0B,BX
	   MOV WORD PTR OLD0B+2,ES
	   RET
RD0B ENDP

WR0B PROC         	;置换0BH型中断向量指向自定义中断服务程序
	   PUSH DS
	   MOV AX,CODE
	   MOV DS,AX
	   MOV DX,OFFSET RECEIVE
	   MOV AX,250BH
	   INT 21H
	   POP DS
	   RET
WR0B ENDP
RESET PROC                ;恢复系统0B中断向量
	   IN AL,21H
	   OR AL,00001000B
	   OUT 21H,AL
	   MOV AX,250BH
	   MOV DX,WORD PTR OLD0B
	   MOV DS,WORD PTR OLD0B+2
	   INT 21H
	   RET
RESET ENDP
CODE ENDS
	END BEG

### 南京邮电大学微机实验中的串行接口 #### 一、串行接口概述 在计算机体系结构中,串行通信是一种数据传输方式,在这种模式下,数据一位接一位地顺序传送。这种方式减少了所需的物理连接线数量,从而降低了成本和复杂度[^1]。 对于南京邮电大学的微机实验而言,串行接口实验旨在让学生理解并掌握单片机或其他处理器通过RS-232标准其他设备进行异步通讯的方法和技术要点。这不仅涉及到硬件电路的设计搭建,还包括相应驱动程序编写等内容的学习实践过程[^2]。 #### 二、实验目的要求 该实验的主要目的是使学生能够熟悉常用PC机上的COM端口配置参数设置;学会利用C/C++编程实现简单的字符发送接收功能;进一步加深对中断机制的理解应用水平。具体来说: - 掌握8051系列单片机内部SCI模块的工作原理及其寄存器定义; - 编写基于查询方式或中断服务子程序控制下的UART收发例程; - 使用Proteus仿真工具完成虚拟仪器仪表连线调试工作。 #### 三、示例代码展示 下面给出一段适用于MCS-51架构MCU平台的基础版本ASCII码字符串回显测试源文件(假设波特率为9600bps),供参考学习之用: ```c #include <reg52.h> sbit LED=P2^7; // 定义LED指示灯引脚位置 void delay(unsigned int i){ while(--i); } // 初始化串行口函数, 设置SMOD=1,BREN=1,TB8=RB8=0, // 波特率发生器采用定时器T1模式2(自动重装载), SMOD位决定实际波特率高低. void InitSerial(void){ TMOD = 0x20; TH1 = 0xFD; // 设定初值对应于fosc=11.0592MHz时的标准9600bps速率 SCON = 0x50; // 工作于方式1,允许接收 TR1 = 1; // 启动计数溢出产生时钟脉冲序列供给SCON寄存器作为移位时序信号 ES = 1; // 开启串口中断请求开关 EA = 1; // 总控全局中断使能标志置位 } // 中断处理程序用于响应来自外部器件的数据到来事件触发条件满足情况 void UartInt() interrupt 4 { if(RI){ // 如果RI被置'1',表示已成功收到一字节有效信息 RI = 0; SBUF=SBUF; // 将读取到的内容原样送回到发送缓冲区准备再次发出形成自环效果 } TI = 0; // 清除发送完毕状态标记以便后续继续正常运作不受影响 } main(){ InitSerial(); while (1){ LED=~LED; delay(6000); } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cookie爱吃小饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值