串行通信实验16550
- 格式:doc
- 大小:74.00 KB
- 文档页数:7
实验4:16550串行接口应用实验一、实验目的1、掌握串行通信接口芯片16550的工作方式及应用编程。
2、学习有关串行通信知识。
二、实验原理分析1、异步传送方式与异步通信串行通信分为同步传送方式和异步传送方式两种,本实验是异步方式下的串行通信,其具体原理如下。
异步传送的数据以字节为单位,传送时各个字符可以连续传送,也可以断续传送,由发送方来决定。
数据传输的速率(波特率)是双方事先约定好的。
双方各自用自己的时钟信号来控制发送和接收。
异步通信采用异步传送方式,通信以“帧”为传送单位,一个帧由起始位开始,停止位结束。
两个帧之间为空闲位。
通常一帧信息由7~12位二进制组成,每帧数据由四个部分组成,帧格式如下图所示。
其中:(1)起始位:当传输线上没有信号时,处于连续的逻辑1状态。
当有数据帧传输时,以1位逻辑0开始,作为数据帧的起始位。
(2)数据位:起始位后紧接的是数据位,一般为5~8位,具体位数由收发双方约定,先发送低位。
(3)奇偶校验位:使用1位数据作为传送数据的奇偶位校验。
(4)停止位:最后传输的是停止位,用1~2位(1、1.5或2)逻辑1来标志数据帧的传输结束。
2、16550基本结构16550内部结构见实验指导书P57,图3-6-2所示:实验指导书P57,16550内部结构示意图(1)数据总线缓冲器:是一个三态双向8位数据缓冲器,16550通过它与系统的数据总线连接,传送控制字、数据和状态信息。
(2)选择和读写控制逻辑:接收来自CPU的地址、片选和控制信息,产生16550内部各端口的读写操作命令。
(3)发送器:由发送保持寄存器(THR)、发送移位寄存器和发送同步控制器等三部分组成。
待发送的数据写入发送保持寄存器,数据发送时,其内容自动转入到发送移位寄存器,并转换为串行数据格式,在同步时钟控制下,由SOUT(TXD)引脚发送。
(4)接收器:由接收缓冲寄存器(RBR)、接收移位寄存器和接收同步控制器等三部分组成。
第三次实验(2) 16550串口实验9.8(1)串口通讯基础实验(16550-1.asm )需要示波器MY16550_0 EQU 9C80HMY16550_1 EQU 9C81HMY16550_3 EQU 9C83HMY16550_4 EQU 9C84HCODE SEGMENTASSUME CS:CODESTART: MOV DX,MY16550_3MOV AL,80HOUT DX,ALCALL DALLYMOV DX,MY16550_0MOV AL,0CHOUT DX,ALCALL DALLYMOV DX,MY16550_1MOV AL,00HOUT DX,ALCALL DALLYMOV DX,MY16550_3MOV AL,1BHOUT DX,ALCALL DALLYMOV DX,MY16550_4MOV AL,03HOUT DX,ALCALL DALLYMOV DX,MY16550_1 MOV AL,00HOUT DX,ALCALL DALLYA1: MOV DX,MY16550_0 MOV AL,55HOUT DX,ALCALL DALLYCALL BREAKJMP A1DALLY: PUSH CXPUSH AXMOV CX,0100HD1: MOV AX,1000HD2: DEC AXJNZ D2LOOP D1POP AXPOP CXRETBREAK PROC NEARMOV AH,06HMOV DL,0FFHINT 21HJE RETURNMOV AX,4C00HINT 21HRETURN:RETBREAK ENDPCODE ENDSEND START.8 (2)串口自发自收应用实验( 16550-2.asm )可以做显示26个大写字母MY16550_0 EQU 9C80H;收发寄存器 DLAB = 0 ;;或 DLAB = 1波特率低8位除数 Page 290 表9.3 MY16550_1 EQU 9C81H;中断允许寄存器IER DLAB = 0;或 DLAB = 1波特率高8位除数 Page 290 表9.3 MY16550_3 EQU 9C83H ; LCR 线路控制寄存器MY16550_4 EQU 9C84H ; MODEM 控制寄存器 MCRMY16550_5 EQU 9C85H ; LCR 线路状态寄存器 LSRDATA SEGMENTAA DB 40H 41H ~ 5A H : A ~ ZDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,MY16550_3MOV AL,80HOUT DX,ALCALL DALLYMOV DX,MY16550_0MOV AL,0CHOUT DX,ALCALL DALLYMOV DX,MY16550_1MOV AL,00HOUT DX,ALCALL DALLYMOV DX,MY16550_3MOV AL,1BHOUT DX,ALCALL DALLYMOV DX,MY16550_4MOV AL,03HOUT DX,ALCALL DALLYMOV DX,MY16550_1MOV AL,00HOUT DX,ALCALL DALLYA1: INC AA ; AA DB 40H 41H ~ 5A H : A ~ ZMOV DX,MY16550_0 ; 发送MOV AL,AAOUT DX,ALCALL DALLYA2: CALL BREAKMOV DX, MY16550_5 ; LCR 线路状态寄存器 LSRIN AL,DXAND AL,01HJZ A2MOV DX,MY16550_0IN AL,DXMOV AH,0EHINT 10H ;收到 ---屏幕显示 CALL DALLYCMP AL,5AHJNZ A1MOV AX,4C00HINT 21HDALLY: PUSH CXPUSH AXMOV CX,0100HD1: MOV AX,2000HD2: DEC AXJNZ D2LOOP D1POP AXPOP CXRETBREAK PROC NEARMOV AH,06HMOV DL,0FFHINT 21HJE RETURNMOV AX,4C00HINT 21HRETURN:RETBREAK ENDPCODE ENDSEND START9.8(3)与PC串口通讯基础实验(16550-3.asm )MY16550_0 EQU 9C80HMY16550_1 EQU 9C81HMY16550_3 EQU 9C83HMY16550_4 EQU 9C84HPC16550_0 EQU 03F8HPC16550_1 EQU 03F9HPC16550_3 EQU 03FBHPC16550_4 EQU 03FCHINTCSR_BYTE0 EQU 9438HINTCSR_BYTE1 EQU 9439HINTCSR_BYTE2 EQU 943AHINTCSR_BYTE3 EQU 943BHIMB4_BYTE3 EQU 941FHDATA SEGMENTCSBAK DW ?IPBAK DW ?MKBAK DB ?DTABLE DB 54H, 68H,69H,73H,20H,69H,73H,20H,54H,61H,6EH,67H, 64H, 75H, 20H, 53H,DB 70H, 65H, 61H, 6BH,69H,6EH,67H,21HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: CLIMOV AX,DATAMOV DS,AXMOV AX,0000HMOV ES,AXMOV DI,01CCH ;INT 73H,01CCH=73H*4 MOV AX,ES:[DI]MOV IPBAK,AX ;IPMOV AX,OFFSET MYINTCLDSTOSWMOV AX,ES:[DI] ;CSMOV CSBAK,AXMOV AX,SEG MYINTSTOSWIN AL,0A1HMOV MKBAK,ALAND AL,0F7HOUT 0A1H,ALMOV DX,PC16550_3MOV AL,80HOUT DX,ALCALL DALLYMOV DX,PC16550_0 ;9600 (bit/s)MOV AL,0CHOUT DX,ALCALL DALLYMOV DX,PC16550_1MOV AL,00HOUT DX,ALCALL DALLYMOV DX,PC16550_3MOV AL,1BHOUT DX,ALCALL DALLYMOV DX,PC16550_4MOV AL,03HOUT DX,ALCALL DALLYMOV DX,PC16550_1MOV AL,00HOUT DX,ALCALL DALLYMOV DX,MY16550_3MOV AL,80HOUT DX,ALCALL DALLYMOV DX,MY16550_0 ;9600 (bit/s) MOV AL,0CHOUT DX,ALCALL DALLYMOV DX,MY16550_1MOV AL,00HOUT DX,ALCALL DALLYMOV DX,MY16550_3MOV AL,1BHOUT DX,ALCALL DALLYMOV DX,MY16550_4MOV AL,03HOUT DX,ALCALL DALLYMOV DX,MY16550_1MOV AL,01HOUT DX,ALCALL DALLYMOV DX,INTCSR_BYTE0 MOV AL,00HOUT DX,ALMOV DX,INTCSR_BYTE1 MOV AL,1FHOUT DX,ALMOV DX,INTCSR_BYTE2 MOV AL,3FHOUT DX,ALMOV DX,INTCSR_BYTE3 MOV AL,00HOUT DX,ALSTIMOV BX,OFFSET DTABLE MOV CX,0018HA1: MOV DX,PC16550_0MOV AL,[BX]OUT DX,ALINC BXCALL DALLYLOOP A1CALL BREAKMYINT: PUSH DSPUSH AXPUSH BXPUSH CXPUSH DXMOV DX,IMB4_BYTE3 IN AL,DXMOV DX,INTCSR_BYTE2 MOV AL,3FHOUT DX,ALMOV AL,63HOUT 0A0H,ALMOV AL,62HOUT 20H,ALMOV DX,MY16550_0IN AL,DXMOV AH,0EHINT 10HPOP DXPOP CXPOP BXPOP AXPOP DSIRETDALLY: PUSH CXPUSH AXMOV CX,0100HD1: MOV AX,2000HD2: DEC AXJNZ D2LOOP D1POP AXPOP CXRETBREAK PROC NEARCLIMOV AL,MKBAKOUT 0A1H,ALMOV AX,0000HMOV ES,AXMOV DI,01CCH ;INT 73H,01CCH=73H*4 MOV AX,IPBAKCLDSTOSWMOV AX,CSBAKSTOSWMOV DX,INTCSR_BYTE1MOV AL,00HOUT DX,ALSTIMOV AX,4C00HINT 21HBREAK ENDPCODE ENDSEND START9.8(4-1)串口双机通讯基础实验1号机程序(16550-41.asm 发)MY16550_0 EQU 9C80HMY16550_1 EQU 9C81HMY16550_3 EQU 9C83HMY16550_4 EQU 9C84HMY16550_5 EQU 9C85HDATA SEGMENTAA DB 2FHDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,MY16550_3MOV AL,80HOUT DX,ALCALL DALLYMOV DX,MY16550_0 MOV AL,0CHOUT DX,ALCALL DALLYMOV DX,MY16550_1 MOV AL,00HOUT DX,ALCALL DALLYMOV DX,MY16550_3 MOV AL,1BHOUT DX,ALCALL DALLYMOV DX,MY16550_4 MOV AL,03HOUT DX,ALCALL DALLYMOV DX,MY16550_1 MOV AL,00HOUT DX,ALCALL DALLYA1: INC AAMOV DX,MY16550_0 MOV AL,AAOUT DX,ALCALL DALLYCMP AL,39HJNZ A1MOV AX,4C00HINT 21HDALLY: PUSH CXPUSH AXMOV CX,0300HD1: MOV AX,3000HD2: DEC AXJNZ D2LOOP D1POP AXPOP CXRETCODE ENDSEND START9.8(4-2)串口双机通讯基础实验2号机程序(16550-42.asm 中断方式收)MY16550_0 EQU 9C80HMY16550_1 EQU 9C81HMY16550_3 EQU 9C83HMY16550_4 EQU 9C84HINTCSR_BYTE0 EQU 9438HINTCSR_BYTE1 EQU 9439HINTCSR_BYTE2 EQU 943AHINTCSR_BYTE3 EQU 943BHIMB4_BYTE3 EQU 941FHDATA SEGMENTCSBAK DW ?IPBAK DW ?MKBAK DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: CLIMOV AX,DATAMOV DS,AXMOV AX,0000HMOV ES,AXMOV DI,01CCH ;INT 73H,01CCH=73H*4 MOV AX,ES:[DI]MOV IPBAK,AX ;IPMOV AX,OFFSET MYINTCLDSTOSWMOV AX,ES:[DI] ;CSMOV CSBAK,AXMOV AX,SEG MYINTSTOSWIN AL,0A1HMOV MKBAK,ALAND AL,0F7HOUT 0A1H,ALMOV DX,MY16550_3MOV AL,80HOUT DX,ALCALL DALLYMOV DX,MY16550_0 ;9600 (bit/s) MOV AL,0CHOUT DX,ALCALL DALLYMOV DX,MY16550_1MOV AL,00HOUT DX,ALCALL DALLYMOV DX,MY16550_3MOV AL,1BHOUT DX,ALCALL DALLYMOV DX,MY16550_4MOV AL,03HOUT DX,ALCALL DALLYMOV DX,MY16550_1MOV AL,01HOUT DX,ALCALL DALLYMOV DX,INTCSR_BYTE0MOV AL,00HOUT DX,ALMOV DX,INTCSR_BYTE1MOV AL,1FHOUT DX,ALMOV DX,INTCSR_BYTE2MOV AL,3FHOUT DX,ALMOV DX,INTCSR_BYTE3MOV AL,00HOUT DX,ALSTIA1: CALL BREAKJMP A1MYINT: PUSH DS ;中断服务程序 PUSH AXPUSH BXPUSH CXPUSH DXMOV DX,IMB4_BYTE3IN AL,DXMOV DX,INTCSR_BYTE2MOV AL,3FHOUT DX,ALMOV AL,63HOUT 0A0H,ALMOV AL,62HOUT 20H,ALMOV DX,MY16550_0IN AL,DXMOV AH,0EHINT 10HPOP DXPOP CXPOP BXPOP AXPOP DSIRETDALLY: PUSH CXPUSH AXMOV CX,0100HD1: MOV AX,2000HD2: DEC AXJNZ D2LOOP D1POP AXPOP CXRETBREAK PROC NEARMOV AH,06HMOV DL,0FFHINT 21HJE RETURNCLIMOV AL,MKBAKOUT 0A1H,ALMOV AX,0000HMOV ES,AXMOV DI,01CCH ;INT 73H,01CCH=73H*4 MOV AX,IPBAKCLDSTOSWMOV AX,CSBAKSTOSWMOV DX,INTCSR_BYTE1MOV AL,00H OUT DX,AL STIMOV AX,4C00H INT 21H RETURN:RET BREAK ENDP CODE ENDSEND START。
(一)实验名称串行通信实验16550(二)实验内容1)串行通讯基础实验。
编写程序,向串口连续发送一个数据(55H),将串口输出连接到示波器上,用示波器观察数据输出产生的波形。
2)串口自发自收应用实验。
编写程序,将一串数据发送至串口,再接收回来显示。
(三)实验目的1)学习和掌握有关串行通信的知识2)学习和体会16550的工作原理、工作方式,利用其进行应用编程3)学习和掌握PC机串口的操作方法(四)实验日期、时间和地点2011—1—4 6,7节2011-1-7 1,节微机高级实验室(五)实验环境(说明实验用的软硬件环境及调试软件)PC机一台,PIT-B实验箱一套,TDPIT、td-debug软件环境一套(六)实验步骤(只写主要操作步骤,要简明扼要,还应该画出程序流程图或实验电路的具体连接图)一:二:自发自收(七)实验结果(经调试通过的源程序的所有代码,应包含必要的说明文字)MY_03F8 EQU 0E480HMY_03FB EQU 0E483HMY_03FD EQU 0E485HDATAS SEGMENTNUM DB 55H;此处输入数据段代码DATAS ENDSSTACKS SEGMENTDW 10 DUP(0);此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;初始化16550MOV DX,MY_03FB ;16550控制寄存器地址送DXMOV AL,80H ;置DLAB=1,设置除数寄存器OUT DX,ALCALL DALLYMOV DX,MY_03F8 ;除数寄存器地址送DXMOV AX,03C0H ;波特率为1200bit/sOUT DX,ALCALL DALLYMOV AL,AHINC DXOUT DX,ALCALL DALLYMOV DX,MY_03FB ;16550控制寄存器地址送DXMOV AL,0BH ;8位数据位,奇校验,1位停止位OUT DX,ALCALL DALLYCALL GOMOV AH,4CHINT 21HGO PROC NEARLOP1:MOV DX,MY_03FD ;通信状态寄存器地址送DXIN AL,DXCALL DALLYTEST AL,20H ;检测发送器是否准备就绪 JZ LOP1LOP2:MOV DX,MY_03F8MOV AL,NUMOUT DX,ALCALL DALLYCALL BREAKJMP LOP2RETGO ENDPDALLY PROC NEARPUSH CXPUSH AXMOV CX,0100HD1: MOV AX,1000HD2: DEC AXJNZ D2LOOP D1POP AXPOP CXRETDALLY ENDPBREAK PROC NEARMOV AH,06HMOV DL,0FFHINT 21HJE RETURNMOV AX,4C00HINT 21HRETURN:RETBREAK ENDPCODES ENDSEND START二:自发自收MY_03F8 EQU 0E480HMY_03FB EQU 0E483HMY_03FD EQU 0E485HMY_03FC EQU 0E48CHDATAS SEGMENTSTR1 DB'this is good'LEN EQU $-STR1STR2 DB 20 DUP (0),'$';此处输入数据段代码DATAS ENDSSTACKS SEGMENTDW 10 DUP (0);此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AX,STACKSMOV SS,AX;初始化16550MOV DX,MY_03FB ;16550控制寄存器地址送DXMOV AL,80H ;置DLAB=1,设置除数寄存器OUT DX,ALCALL DALLYMOV DX,MY_03F8 ;除数寄存器地址送DXMOV AX,03C0H ;波特率为1200bit/sOUT DX,ALCALL DALLYMOV AL,AHINC DXOUT DX,ALCALL DALLYMOV DX,MY_03FB ;16550控制寄存器地址送DXMOV AL,1BH ;8位数据位,奇校验,1位停止位OUT DX,ALCALL DALLYMOV DX,MY_03FCMOV AL,03HOUT DX,ALCALL DALLYCALL GOLEA DX,STR2 ;显示str2MOV AH,09HINT 21HMOV AH,4CHINT 21HGO PROC NEARLEA BX,STR1LEA DI,STR2MOV CX,LENINC CXLOP1:DEC CXJZ DONELOP2:MOV DX,MY_03FDIN AL,DXTEST AL,20H ;测试发送是否就绪JZ LOP2MOV DX,MY_03F8MOV AL,[BX] ;取出发送区域的待发送数据 OUT DX,ALLOP3:MOV DX,MY_03FDIN AL,DXTEST AL,1EH ;数据是否有错误JNZ ERROR ;跳转错误处理TEST AL,01H ;查看接受缓存器是否有信息 JZ LOP3MOV DX,MY_03F8IN AL,DXMOV [DI],ALINC BXINC DIJMP LOP1CLC ;接收成功,清CY标志位JMP DONEERROR:STC ;接收不成功,置CY标志位DONE:RETGO ENDPDALLY: PUSH CXPUSH AXMOV CX,0100HD1: MOV AX,2000HD2: DEC AXJNZ D2 LOOP D1POP AXPOP CX RETCODES ENDSEND START。
【实验目的】掌握16550的工作方式及应用。
学习PC机串口的操作方法。
【试验设备】PC微机一台、TD-PIT+实验系统一套、示波器一台。
【实验内容】编写程序,向串口连续发送一个数据53H(“1”的个数为偶数)或57H(“1”的个数为奇数)。
将串口输出连接到示波器上,用示波器观察数据输出产生的波形,分析串行数据格式。
【实验原理】16550是一种连接任何类型虚拟串行接口的可编程通信接口,与Intel微处理器完全兼容的使用非常广泛的异步接收器/发送器(UART)。
它内置了16字节的FIFO缓冲,最大通讯速率可达115Kb/s,是现代基于微处理器设备包括PC机和许多调制解调器的最普遍的通信接口。
16550的引脚如图11-1所示,其内部结构如图11-2所示。
图11-1 16550引脚图1.端口地址的使用16550内部有11个寄存器,在芯片选择有效的前提下,由芯片的寄存器选择输入线A2,A0和A0来确定访问的寄存器,芯片中采用两条措施来解决端口地址少的问题(只有8个地址)。
(1)保持寄存器和接收数据寄存器共用一个地址,以“写入”访问前者、“读出”访问后者加以区分。
(2)除数寄存器的高字节与中断允许寄存器使用相同地址,高字节和接收数据寄存器、发送保持寄存器使用相同的地址,为了区分,借用线路控制寄存器的最高位DLAB位来区分。
访问除数寄存器时,令DLAB位为“1”;访问接收数据寄存器、发送保持寄存器和中断允许寄存器时,则将DLAB位置“0”。
具体说明如表11-1所示。
图11-2 16550的内部结构图DLAB A2A1A0 被访问的寄存器0 000 接收数据寄存器(读),发送保持寄存器(写)0 001 中断允许寄存器IER1 000 波特率除数寄存器(低字节)1 001 波特率除数寄存器(高字节)X 010 中断识别寄存器IIR(只读),FIFO控制器FCR(只写)X 011 线路控制寄存器LCRX 100 MODEM控制寄存器MCRX 101 线路状态寄存器LSRX 110 MODEM状态寄存器MSRX 111 Scratch寄存器2.(1)线路控制寄存器(LCR),主要用于指定异步串行通信的数据格式。
;T16550-2.asm;16550与PC机串口通信实验;***************根据CHECK配置信息修改下列符号值*******************INTR_IV ADD EQU 01CCH ;INTR对应的中断矢量地址INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址INTR_IM EQU 0F7H ;INTR对应的中断屏蔽字PCI_INTCSR EQU 9438H ;PCI卡中断控制寄存器地址IOY0 EQU 9C00H ;片选IOY0对应的端口始地址;****************************************************************MY16550_0 EQU IOY0+00H*4 ;16550数据缓冲寄存器端口地址MY16550_1 EQU IOY0+01H*4 ;16550中断允许寄存器端口地址MY16550_3 EQU IOY0+03H*4 ;16550线路控制寄存器端口地址PC_COM1_0 EQU 03F8H ;PC机COM1数据缓冲寄存器端口地址PC_COM1_1 EQU 03F9H ;PC机COM1中断允许寄存器端口地址PC_COM1_3 EQU 03FBH ;PC机COM1线路控制寄存器端口地址STACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDA TA SEGMENTCS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量IM_BAK DB ? ;保存INTR原中断屏蔽字的变量STR1 DB 'Communication with computer!$' ;字符串DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXCLIMOV DX,PCI_INTCSRSUB DX,19HIN AL,DXMOV DX,PCI_INTCSR ;初始化PCI卡中断控制寄存器MOV AX,1F00H ;向PCI_INTCSR中写入003F1F00HOUT DX,AXADD DX,2MOV AX,003FHOUT DX,AXMOV AX,0000H ;替换INTR的中断矢量MOV ES,AXMOV DI,INTR_IV ADDMOV AX,ES:[DI]MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址MOV AX,OFFSET MYISRMOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址ADD DI,2MOV AX,ES:[DI]MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址MOV AX,SEG MYISRMOV ES:[DI],AX ;设置当前中断处理程序入口段地址MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR的屏蔽位IN AL,DXMOV IM_BAK,AL ;保存INTR原中断屏蔽字AND AL,INTR_IMOUT DX,ALMOV DX,PC_COM1_3 ;设置PC机COM1线路控制寄存器MOV AL,80H ;准备设置波特率除数寄存器OUT DX,ALMOV DX,PC_COM1_0 ;设置COM1除数寄存器低字节0CHMOV AL,0CH ;000C对应9600 bit/sOUT DX,ALMOV DX,PC_COM1_1 ;设置COM1除数寄存器高字节00HMOV AL,00HOUT DX,ALMOV DX,PC_COM1_3 ;设置COM1线路控制寄存器,初始化数据格式MOV AL,1BH ;偶校验,1位停止位,字符宽度为8OUT DX,ALMOV DX,PC_COM1_1 ;设置中断允许寄存器MOV AL,00H ;中断不打开OUT DX,ALMOV DX,MY16550_3 ;设置16550线路控制寄存器MOV AL,80H ;准备设置波特率除数寄存器OUT DX,ALMOV DX,MY16550_0 ;设置除数寄存器低字节0CHMOV AL,0CH ;000C对应9600 bit/sOUT DX,ALMOV DX,MY16550_1 ;设置除数寄存器高字节00HMOV AL,00HOUT DX,ALMOV DX,MY16550_3 ;设置线路控制寄存器,初始化数据格式MOV AL,1BH ;偶校验,1位停止位,字符宽度为8OUT DX,ALMOV DX,MY16550_1 ;设置中断允许寄存器MOV AL,01H ;允许接收缓冲寄存器满产生中断OUT DX,ALSTIMOV BX,OFFSET STR1MOV CX,001CHSEND: MOV DX,PC_COM1_0 ;将字符串数据写入COM1发送缓冲寄存器MOV AL,[BX]OUT DX,ALINC BXCALL DALL YLOOP SENDQUIT: CLIMOV DX,PCI_INTCSR ;恢复PCI卡中断控制寄存器MOV AX,0000HOUT DX,AXMOV AX,0000H ;恢复INTR原中断矢量MOV ES,AXMOV DI,INTR_IV ADDMOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址MOV ES:[DI],AXADD DI,2MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址MOV ES:[DI],AXMOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字MOV AL,IM_BAKOUT DX,ALSTIMOV AX,4C00H ;返回到DOSINT 21HMYISR PROC NEAR ;中断处理程序MYISRMOV DX,MY16550_0 ;读取16550接收缓冲寄存器数据并显示IN AL,DXMOV AH,0EHINT 10HOVER: MOV DX,PCI_INTCSRSUB DX,19HIN AL,DXMOV DX,PCI_INTCSR ;清PCI卡中断控制寄存器标志位ADD DX,2MOV AX,003FHOUT DX,AXMOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令MOV AL,20HOUT DX,ALMOV AL,20HOUT 20H,ALIRETMYISR ENDPDALL Y PROC NEAR ;软件延时子程序PUSH CXPUSH AXMOV CX,0100HD1: MOV AX,2000HD2: DEC AXJNZ D2LOOP D1POP AXPOP CXRETDALL Y ENDPCODE ENDSEND START。
(一)实验名称
串行通信实验16550
(二)实验内容
1)串行通讯基础实验。
编写程序,向串口连续发送一个数据(55H),将串口输出连
接到示波器上,用示波器观察数据输出产生的波形。
2)串口自发自收应用实验。
编写程序,将一串数据发送至串口,再接收回来显示。
(三)实验目的
1)学习和掌握有关串行通信的知识
2)学习和体会16550的工作原理、工作方式,利用其进行应用编程
3)学习和掌握PC机串口的操作方法
(四)实验日期、时间和地点
2011—1—4 6,7节
2011-1-7 1,节
微机高级实验室
(五)实验环境(说明实验用的软硬件环境及调试软件)
PC机一台,PIT-B实验箱一套,TDPIT、td-debug软件环境一套
(六)实验步骤(只写主要操作步骤,要简明扼要,还应该画出程序流程图或实验电路的具体连接图)
一:
二:自发自收
(七)实验结果(经调试通过的源程序的所有代码,应包含必要的说明文字)
MY_03F8 EQU 0E480H
MY_03FB EQU 0E483H
MY_03FD EQU 0E485H
DATAS SEGMENT
NUM DB 55H;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
DW 10 DUP(0);此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;初始化16550
MOV DX,MY_03FB ;16550控制寄存器地址送DX
MOV AL,80H ;置DLAB=1,设置除数寄存器
OUT DX,AL
CALL DALLY
MOV DX,MY_03F8 ;除数寄存器地址送DX
MOV AX,03C0H ;波特率为1200bit/s
OUT DX,AL
CALL DALLY
MOV AL,AH
INC DX
OUT DX,AL
CALL DALLY
MOV DX,MY_03FB ;16550控制寄存器地址送DX
MOV AL,0BH ;8位数据位,奇校验,1位停止位
OUT DX,AL
CALL DALLY
CALL GO
MOV AH,4CH
INT 21H
GO PROC NEAR
LOP1:
MOV DX,MY_03FD ;通信状态寄存器地址送DX
IN AL,DX
CALL DALLY
TEST AL,20H ;检测发送器是否准备就绪 JZ LOP1
LOP2:
MOV DX,MY_03F8
MOV AL,NUM
OUT DX,AL
CALL DALLY
CALL BREAK
JMP LOP2
RET
GO ENDP
DALLY PROC NEAR
PUSH CX
PUSH AX
MOV CX,0100H
D1: MOV AX,1000H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
BREAK PROC NEAR
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN
MOV AX,4C00H
INT 21H
RETURN:RET
BREAK ENDP
CODES ENDS
END START
二:自发自收
MY_03F8 EQU 0E480H
MY_03FB EQU 0E483H
MY_03FD EQU 0E485H
MY_03FC EQU 0E48CH
DATAS SEGMENT
STR1 DB'this is good'
LEN EQU $-STR1
STR2 DB 20 DUP (0),'$';此处输入数据段代码DATAS ENDS
STACKS SEGMENT
DW 10 DUP (0);此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
;初始化16550
MOV DX,MY_03FB ;16550控制寄存器地址送DX
MOV AL,80H ;置DLAB=1,设置除数寄存器
OUT DX,AL
CALL DALLY
MOV DX,MY_03F8 ;除数寄存器地址送DX
MOV AX,03C0H ;波特率为1200bit/s
OUT DX,AL
CALL DALLY
MOV AL,AH
INC DX
OUT DX,AL
CALL DALLY
MOV DX,MY_03FB ;16550控制寄存器地址送DX
MOV AL,1BH ;8位数据位,奇校验,1位停止位
OUT DX,AL
CALL DALLY
MOV DX,MY_03FC
MOV AL,03H
OUT DX,AL
CALL DALLY
CALL GO
LEA DX,STR2 ;显示str2
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
GO PROC NEAR
LEA BX,STR1
LEA DI,STR2
MOV CX,LEN
INC CX
LOP1:
DEC CX
JZ DONE
LOP2:
MOV DX,MY_03FD
IN AL,DX
TEST AL,20H ;测试发送是否就绪
JZ LOP2
MOV DX,MY_03F8
MOV AL,[BX] ;取出发送区域的待发送数据 OUT DX,AL
LOP3:
MOV DX,MY_03FD
IN AL,DX
TEST AL,1EH ;数据是否有错误
JNZ ERROR ;跳转错误处理
TEST AL,01H ;查看接受缓存器是否有信息 JZ LOP3
MOV DX,MY_03F8
IN AL,DX
MOV [DI],AL
INC BX
INC DI
JMP LOP1
CLC ;接收成功,清CY标志位JMP DONE
ERROR:
STC ;接收不成功,置CY标志位DONE:
RET
GO ENDP
DALLY: PUSH CX
PUSH AX
MOV CX,0100H
D1: MOV AX,2000H
D2: DEC AX
JNZ D2 LOOP D1
POP AX
POP CX RET
CODES ENDS
END START。