资源描述
课程设计任务书
学生姓名: 专业班级:
指导教师: 工作单位
题 目: 编写串行通信程序
初始条件:
用汇编语言编写程序,实现两台计算机之间的通信。两台计算机之间通过RS-232连接。
要求完成的主要任务:
①使两台pc机通过串口互联,每一台的用户均可在自己的屏幕上不同区域看到自己和对方由键盘输入的字符(并由不同的颜色加以区分);
②若一方敲入数字(1,2,3......8,9),另一方的机器将其理解为相应的音符发出声音;
③一方退出该程序,能返回DOS状态,而另一方也能收到相应的信息;
④程序能自动将双方传送的信息自动保存在文件中(分为本机和对方两个文件);
⑤有相应的程序可将已记录的文件内容显示出来,并将其中的数字作为音符播放;
⑥撰写设计说明书及调试心得。
时间安排:
2009年1月5日~2009年1月16日下午17:30分
指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日
目录
1 设计任务及要求 1
1.1 设计题目 1
1.2 设计要求 1
1.3 设计分析 1
2程序设计及说明 2
2.1 宏定义和宏调用 4
2.2 显示程序设计 4
2.3数字转化为音乐的程序设计 5
2.4 保存文件的程序设计 5
2.5 打开文件程序设计 7
2.6 接收程序的设计 8
2.7 发送程序的程序设计 9
2.8 换行程序的设计 10
3 程序调试过程 11
3.1 程序界面的调试 11
3.2 发送程序、接收程序、保存程序的调试 12
3.3 打开文件,发声程序的调试 14
4 设计总结 15
4.1 设计优缺点分析 15
4.2 心得体会 15
参考文献 17
附录: 18
摘要
本文是基于汇编语言的串口通信程序的设计,通过RS-232串口连接,实现PC机之间的串行通信。在此基础上将接收和发送的程序在不同的区域以不同颜色的字体显示出来。如果传送的字符中含有数字,则将数字转化为相应音符并发出声音。接收和发送文件的同时要实现自动保存到不同的文件中。传送完毕之后,可以再次打开保存的文件,显示接收和发送的数据或字符串。程序设计过程中大量使用了子程序调用和宏定义、宏调用等方式,已达到简化的目的。
关键字: 模块化设计 RS-232串口 宏定义
II
编写串行通信程序
1 设计任务及要求
1.1 设计题目
用汇编语言编写程序,实现两台计算机之间的通信。两台计算机之间通过RS-232连接 。
1.2 设计要求
①使两台pc机通过串口互联,每一台的用户均可在自己的屏幕上不同区域看到自己和对方由键盘输入的字符(并由不同的颜色加以区分);
②若一方敲入数字(1,2,3......8,9),另一方的机器将其理解为相应的音符发出声音;
③一方退出该程序,能返回DOS状态,而另一方也能收到相应的信息;
④程序能自动将双方传送的信息自动保存在文件中(分为本机和对方两个文件);
⑤有相应的程序可将已记录的文件内容显示出来,并将其中的数字作为音符播放;
⑥撰写设计说明书及调试心得
1.3 设计分析
程序设计采用模块化的思想,采用宏定义、宏调用的方式来实现不同功能,宏定义的方式可以减少程序的书写,提高程序的执行速度。
设计要求主要是实现两台PC之间的串行通信程序,可以通过串行通信接口RS-232来实现通信。要求在屏幕不同的区域看到自己发出和接收的字符,可以通过调用int 10 BOIS中断并设定不同的显示颜色来实现。键入数字转化为相应的音符发音,可以通过查表把数字转化成相应的发音频率,再通过发音程序,输出相应的响铃。自动保存发送和接收的程序可以通过调用保存程序实现。打开、发送和接收的文件也可以通过调用打开文件的子程序实现。
TxD
RxD
GND
TxD
RxD
GND
A机的
RS-232
B机的
RS-232
图1-1 两台PC机之间的串口三线制连接
利用PC机的RS-232串口可以很方便的实现两台机器之间的信息互传,在实际使用RS-232时,可以采用三线制,即发送数据线TxD、接收数据线RxD及信号地线GND。连接时,双方的的地线直接相连,收发数据线交叉相连。
通过以上的分析,可以确定该设计主要实现发送、接收、显示、响铃、保存和打开文件及退出这几种功能。
2程序设计及说明
通过以上的分析,可以确定该设计主要实现发送、接收、显示、发声、保存和打开文件及退出这几种功能。将功能划分为以下几个模块:
①主控模块。实现对各个子模块的调用,在主模块内定义数据区。
②显示模块。实现将BUF缓冲区中的数据显示到屏幕特定区域。
③转换音乐模块。实现将BUF缓冲区中的数字转换成音符并播放。
④保存文件模块。实现将BUF缓冲区中内容存到指定的文件中。
⑤打开文件模块。实现将指定文件中的内容读入到BUF缓冲区中。
⑥出错信息显示模块。这是一个公用模块,读文件和写文件模块都需要调用。
在主控模板下,通过调用各个子模块的功能,实现了程序的功能调用,从而达到设计要求的操作。这也是模块化设计的基本要求。
主流程图如图2所示:
图2-1 程序主流程图
2.1 宏定义和宏调用
宏是源程序中一段有独立功能的程序代码。它只需要在源程序中定义一次,就可以多次调用它,调用时只需要用一个宏调用语句就可以了。其格式是:
Macro name MACRO [dummy parameter list]
(宏定义体)
ENDM
其中MACRO和ENDM是一对伪操作。这对伪操作之间是宏定义体——是一组有独立功能的程序代码。经过宏定义后的宏指令就可以在源程序中调用。宏调用的格式是:
Macro name [actual parameter list]
当源程序被汇编时,汇编程序将对每个宏调用做宏展开,即用宏定义体取代源程序中的宏指令名,并且用实元取代宏定义中的哑元。
子程序在执行时,每调用一次都要先保护断点、保护现场;返回时先要回复现场,然后回复断点,再返回。这些操作增加了额外的时间,因而执行时间长,速度相对较慢。用宏定义和宏调用都可以免去执行时间上的这些额外开销,执行时间短,速度相对较快。
在进行本设计时,大量使用了宏定义和宏调用。
2.2 显示程序设计
设计要求在不同的区域用不同的颜色显示接收和发送的数据信息,通过BIOS、DOS系统功能调用,实现以上的要求。调用“INT 10H”和“INT 21H”实现颜色和区域的选择显示。使用宏定义、宏调用的方式来实现程序的调用。
表2-1 INT 21H 的功能调用表
AH
功能
调用参数
返回参数
01H
带回显的键盘输入
AL=输入字符
09H
显示字符串
DS:DX=串地址'$'结束字符串
02H
显示输出
DL=输出字符
表2-2 INT 10H的功能表
功能号
功能
入口参数
显示模式属性
00H
设置显示模式
AH=00H ,AL=02H
80×25的16色 文本
01H
设置光标形状
AH=01H
CH低四位=光标的起始行
CL低四位=光标的终止行
02H
用文本坐标下
设置光标位置
AH=02
BH=显示页码
DH=行(Y坐标)
DL=列(X坐标)
2.3数字转化为音乐的程序设计
设计要求输入字符后,程序将其转化为相应的音符,并发声。这个要求,可以通过查表实现,实现过程如下:
① 从键盘读入一个字符的ASCII码;
② 判断该字符是否是0-9的数字;
③ 如果是0-9的数字,将其转化为相应的发声频率;
④ 调用发声程序,驱动扬声器发声。
表2-3 数字与发声频率的对应表
数字
0
1
2
3
4
5
6
7
8
9
频率
248
262
294
330
350
393
441
495
525
589
在设计程序时,要加入延迟程序,以使音调可以持续一段时间,效果明显。
2.4 保存文件的程序设计
程序要求在键盘输入字符过程中实现自动保存,并且在接受对方发送的文件的同时,也在本机上建立文件保存。
在发送和接收文件时调用SAVE宏定义,即可实现程序的自动保存。保存之前要先建立文件,再进行写入的操作,然后再关闭建立的文件。当需要读取文件时通过该文件的标号即可读取。
保存文件需要调用功能号如下表:
表2-4 INT 21H 文件操作的功能号
AH
功能
调用参数
返回参数
3CH
建立文件
DS:DX=ASCIIZ串地址
CX=文件属性
成功:AX=文件代号
错误:AX=错误码
3DH
打开文件
DS:DX=ASCIIZ串地址
AL=0 读
=1 写
=3 读/写
成功:AX=文件代号
错误:AX=错误码
3EH
关闭文件
BX=文件代号
失败:AX=错误码
40H
写入文或设备
DS:DX=数据缓冲区地址
BX=文件代号
CX=写入的字节数
写成功:
AX=实际写入的字节数
写出错:AX=错误码
保存文件的子程序的流程图如下:
图2-2 保存文件程序流程图
2.5 打开文件程序设计
打开文件的程序设计顺序同保存文件程序的设计类似。程序在执行打开文件时,需要调用显示子程序、设置颜色子程序、发声子程序。
其流程图如下:
图2-3 打开文件程序图
2.6 接收程序的设计
程序设计要求:在执行主程序时,当键盘输入字符时,发送程序、接收程序同时启动,键盘每输入一个字符,经过判定不是[ESC]后,发送程序自动保存字符并且向另一台PC发送一个字符,此时,另一台PC的接收程序自动接收字符,并且自动保存,同时两台PC可以在屏幕的不同区域分别显示发送和接收的字符。
该程序需要调用的子程序有:保存子程序、显示子程序、发声子程序等。
该程序的流程图如下:
图2-4 接收文件程序流程图
2.7 发送程序的程序设计
程序设计要求,键盘输入数据后,发送程序启动,将读入的数据发送给另一台PC,同时,也将数据显示在屏幕的一个区域并将字符保存。
程序首先保护现场,然后取状态口的状态,当检测到可以发送时,便将数据送至数据口进行发送,最后将AX出栈,回到主程序。
该程序需要调用的子程序有:显示子程序、设置颜色子程序等。
图2-5发送文件程序流程图
2.8 换行程序的设计
该程序的主要作用是当输入字符达到一定数目后,使光标定位在特定位置。由于本程序在界面的左侧显示收到的字符,右侧显示发送的字符,为避免发送和接受的字符出现混淆的状况,定义该程序。
换行程序执行过程:
① 执行INT 10H中断的03H号功能,设置屏幕的显示方式为80*25彩色文本显示方式;
② 定位光标的初始位置DL列数,DH行数;
③ 当DL达到限定值时,行数DH加1;
④ 在新的位置上继续显示字符。
具体程序如下:
LOCATION_P MACRO
MOV AH,03H
MOV BH,0
INT 10H
LEA BX,P1
CMP DL,79
JZ H1
IH1: MOV [BX],DX
jmp SH1
H1: INC DH
MOV DL,29h
jmp IH1
SH1:
ENDM
3 程序调试过程
任何程序在编写完成之后都要进行调试,以测试编写的程序是否存在错误或者不妥的地方,从而改进程序,实现序的良好运行。本程序调试过程分别对程序的各个环节进行了调试和改正,其中发现了很多错误,改正后程序可以正常运行,并能够得到正确的结果。
3.1 程序界面的调试
程序运行的初始状态,该状态主要是显示提示语句和界面的美化并初步验证字符的输入和保存,调试过程中发现的问题有:
① 定义的语句不能在预定的位置显示,原因:光标定位指令执行错误。解决办法:从新定义光标定位指令,并赋予确切的位置参数、;
② 屏幕颜色混乱,原因:没有执行屏幕显示方式的指令。解决办法:重新调用INT 10H中断的03H号指令;
③ 键入ESC无法退出程序,返回系统,原因:ESC的ASCII码定义错误。解决办法:重新执行指令,并修正ESC的ASCII码值。
下图为正常的程序的运行结果:
图3-1 程序出示状态的界面
3.2 发送程序、接收程序、保存程序的调试
该部分的程序是整个程序的核心部分,需要实现的功能有:键盘读入,显示,保存,发送,接收等。
调试该部分程序时,使用9针串口线将两台PC连接起来,两台PC同时执行程序进入DOS状态。一方键入字母和数字混合字符,该字符可以在自方屏幕的右侧显示,并且将键入的字符保存在指定的文件中,屏幕下方可显示“save succeed”提示语句;另一方将在屏幕的左侧显示收到的字符,并将字符保存在指定的文件中。以上过程可逆。
调试中遇到的问题:
① 发送和接收的字符显示混乱,原因:输入字符达到一定数量后,光标会自动向下移动一行,但是却没有定位到初始位置。解决办法:重新加入换行子程序,重置光标于指定位置;
② PC1发送,PC2无法接收,原因:串口线不正常。解决办法:更换串口线;
③ INT 14H 中断方式无法进行数据传输,原因:没有找到。解决办法,使用芯片16500通过查询方式检测端口状态并进行数据的传输。
以下为正常程序的运行结果:
图3-2 PC1的发送和接收状态
图3-3 PC2的发送和就收状态
3.3 打开文件,发声程序的调试
该部分程序可以实现的功能为:将已经保存的文件打开并显示在屏幕上,同时数字字符对应应的频率发声。
图3-4 打开PC1保存文件的界面
图3-5 打开PC2的程序的界面
以上就是程序运行时各个分支功能的调试过程,通过不断的修改和改进,最终达到了上述的效果,基本满足了设计的要求。
4 设计总结
4.1 设计优缺点分析
本程序采用模块化设计思想,可读性强,具有很强的可移植性,便于增加新的功能。在子程序调用方面采用宏定义、宏调用的方法而不是一个个子程序的调用,原因是子程序在执行时,每调用一次都要先保护断点、保护现场;返回时先要回复现场,然后回复断点,再返回。这些操作增加了额外的时间,因而执行时间长,速度相对较慢。用宏定义和宏调用都可以免去执行时间上的这些额外开销,执行时间短,速度相对较快。尤其是本程序大量使用了显示、定义颜色、定义光标位置等功能,而宏定义、宏调用的使用节省了大量资源。
设计中也有一些不足,比如在打开保存的文件时,本机发送的和接收的文件同时显示在界面上,虽然本机的发送的文件显示在前面,但实际上两段字符并没有明显的断点。对于这个问题,有两种解决方法可行:
① 使发送的和接收的字符分别保存在不同的文件内,在打开文件时同时打开两个文件并在不同的位置显示;
② 显示字符时分别给发送的字符和接收的定义以不同的颜色加以区分。
4.2 心得体会
通过对本题目程序的编写,我有下面几点体会:
(1) 中断是汇编语言最精彩的地方, 实时控制、故障自动处理、计算机与外围设备间的数据传送都采用中断系统。中断系统的应用大大提高了计算机效率,接口需要服务时向CPU申请中断,其他时间CPU正常工作,免去了CPU不断的查询,节约了时间。通过中断的调用,可以实现很多扩展的功能,同时中断也使得编程工作变得相对容易。汇编语言提供了各种中断功能是我们可以利用的丰富的资源,灵活利用这些功能会使工作事倍功半;
(2) 书写程序时要有良好的习惯,比如缩进和随时添加程序注释等,这样不仅有利于程序的阅读也便于查找错误。子程序位置的合理设置也是重要的问题,合理的放置子程序可以增强程序的可读性,有利于模块化设计;
(3) 调试工作是一项很枯燥、繁琐的工作,要做到耐心、信心、细心。通常程序不可能一次成功,需要反复的调试,以达到最优状态。在调试过程中,有的时候仅凭一个人的力量是很难完成的,需要大家的通力合作,每个人的关注的角度不同,可能会从不同的发面发现并解决问题;
(4) 汇编语言是一种很复杂的语言,有的时候实现一个很简单的功能,却需要大量的代码,很长时间的运算,同时,汇编语言也是计算机系统提供给用户的最快、最有效的语言,也是对硬件直接编程的语言。
(5) 这次课设收获颇丰,虽然部分程序是参考别人的,但是经过仔细的研究,已经将他人的东西为己用了,同时再一次体会到学习计算机程序语言方法的重要性,只有不断的使用才能够彻底的掌握这种工具。只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
参考文献
[1] 周佩玲.微机原理与接口技术(基于16位机).北京:电子工业出版社,2005
[2] 沈美明.IBM-PC汇编程序语言设计.北京:清华大学出版社,1991
[3] 袁新燕.计算机外设与接口简明教程.北京:北京航空航天大学出版社,2005
[4] 沈美明.IBM-PC汇编语言程序设计实验教程.北京:清华大学出版社,1992
[5] 毛明.宏汇编语言程序设计编程知道.北京:机械工业出版社,1993
[6] 王士元.IBM PC/XT·286·386微机汇编语言与外设编程.南京:南开大学出版社,1993
[7] 王力虎.PC控制及接口程序设计实例.北京:科学出版社,2004
附录:
;***************************************************************************
;标题: 串行通信程序
;功能:串行通信 区域划分 键盘读入 文件保存 文件读取
;作者: 纪广杰
;E-mail : jj99981@
;单位: 武汉理工大学 自动化学院 自动化0608班
;时间: 2009年1月10日
;***************************************************************************
; 数据段--------------------------------------------------------------
DATAS SEGMENT
aa1 db '*','$'
INFORMATION1 DB ' Transmission test designed by JI GUANGJIE! ','$'
INFORMATION2 DB ' PRESS [ESC] TO EXIT ','$'
INFORMATION3 DB '--------------------------------------------------------------------------------','$'
INFORMATION4 DB ' "[" TO SAVE THE MESSAGE "]" TO SEE WHAT YOU SAVED ','$'
M11 DB 'WHAT YOU WANT TO SEND: ','$'
M22 DB 'WHAT YOU HAVE RECEIVED: ','$'
FREG DB 40,80,120,140,160,180,200,220,240,255
BUF DB 255 DUP (0)
BUF1 DB 255 DUP (0)
BUF2 DB 255 DUP (0)
P1 DW 0429H
P2 DW 0600H
FILE_SAVE DB 'c:\WENJIAN.txt' , 0
HANDLE DW ?
SUCCEED_MESSAGE DB ' SAVE SUCCEED ','$'
ERROR DB ' SAVE ERROR ','$'
OPEN_INFO1 DB '[ESC] to quit! ','$'
OPEN_INFO2 DB ' press [any key except ESC]Return to the serial transmission ','$'
OPEN_INFO3 DB 'Saved message is : ','$'
DATAS ENDS
; --------------------------------------------------------------------
; 堆栈段 -------------------------------------------------------------
STACKSG SEGMENT STACK 'S'
DW 64 DUP(?)
STACKSG ENDS
; --------------------------------------------------------------------
; 代码段---------------------------------------------------------------
CODES SEGMENT
; 初始化16550
COMRD MACRO
MOV AL, 9FH
MOV DX, 03FBH
OUT DX, AL ; 初始化LCR
MOV AL, 120 ; 分频低8位
MOV DX, 03F8H
OUT DX, AL
MOV AL, 0
MOV DX, 03F9H ; 高位端口
OUT DX, AL ; 系数高位填0
MOV AL, 07H ; FIFO控制字
MOV DX, 03FAH
OUT DX, AL
ENDM
; 将LCR最高位清零
LCRCX MACRO
PUSH AX
MOV AL, 1FH
MOV DX, 03FBH
OUT DX, AL
POP AX
ENDM
;换行
LOCATION_P MACRO
MOV AH,03H
MOV BH,0
INT 10H
LEA BX,P1
CMP DL,79
JZ H1
IH1: MOV [BX],DX
jmp SH1
H1: INC DH
MOV DL,29h
jmp IH1
SH1:
ENDM
;显示
PUTS MACRO STRING
PUSH AX
MOV AH, 9
LEA DX, STRING
INT 21H
POP AX
ENDM
;定光标位置
SET_P MACRO P_XY
PUSH AX
MOV DX,P_XY
MOV BH,0
MOV AH,02H
INT 10H
POP AX
ENDM
;保存光标位置
SAVE_P MACRO PL
MOV AH,03H
MOV BH,0
INT 10H
LEA BX,PL
MOV [BX],DX
ENDM
;设置显示颜色
SET_C MACRO COLOR,LENGTH
MOV AH, 9
MOV AL, 1
MOV BH, 0
MOV BL, COLOR
MOV CX, LENGTH
INT 10H
ENDM
; 从串口发送一个字符
SENDS MACRO
LOCAL SEND
PUSH AX
CMP AL,1BH
JZ SEND1
CMP AL,'['
JZ SEND1
CMP AL,']'
JZ SEND1
SET_P P1
SET_C 0EH,1
MOV DL,[SI] ; 显示[字符]
MOV AH,2
INT 21H
LOCATION_P P1
SEND1: LCRCX
PUSH AX
MOV DX, 03FDH ; 状态口
SEND2: IN AL, DX ; 读状态
TEST AL, 20H ; 发送就绪?
JZ SEND2
POP AX
MOV DX, 03F8H ; 数据口
OUT DX, AL
POP AX
ENDM
; 从串口接收一个字符
RECVS MACRO
LOCAL NEXT_R,AGAIN_R
LCRCX
MOV DX, 03FDH ; 状态口
IN AL, DX ; 读状态
TEST AL, 01H ; 收到数据?
JZ AGAIN_R
MOV DX, 03F8H ; 数据口
IN AL, DX
CMP AL,1BH
JZ AGAIN_R
CMP AL,'['
JZ AGAIN_R
CMP AL,']'
JZ AGAIN_R
MOV [DI],AL
CMP AL,30H
JL NEXT_R
CMP AL,39H
JG NEXT_R
SOUND AL
NEXT_R: SET_P P2
SET_C 0AH,1
MOV DL,[DI]
MOV AH,2
INT 21H
SAVE_P P2
INC DI
AGAIN_R:
ENDM
;字符串复制
COPY MACRO
LOCAL R_COPY1,COPY1,R_COPY2,COPY2
PUSH AX
R_COPY1: MOV AL,'$'
MOV [SI],AL
MOV [DI],AL
LEA SI,BUF1
LEA DI,BUF
MOV CX,0
COPY1: MOV AL,[SI]
CMP AL,'$'
JZ R_COPY2
MOV [DI],AL
INC SI
INC DI
INC CX
JMP COPY1
R_COPY2: LEA SI,BUF2
COPY2: MOV AL,[SI]
展开阅读全文