微机原理与接口串行通信Word格式文档下载.docx
《微机原理与接口串行通信Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《微机原理与接口串行通信Word格式文档下载.docx(32页珍藏版)》请在冰豆网上搜索。
要求在屏幕不同的区域看到自己发出和接收的字符,可以通过调用int10BOIS中断并设定不同的显示颜色来实现。
键入数字转化为相应的音符发音,可以通过查表把数字转化成相应的发音频率,再通过发音程序,输出相应的响铃。
自动保存发送和接收的程序可以通过调用保存程序实现。
打开、发送和接收的文件也可以通过调用打开文件的子程序实现。
图1-1两台PC机之间的串口三线制连接
利用PC机的RS-232串口可以很方便的实现两台机器之间的信息互传,在实际使用RS-232时,可以采用三线制,即发送数据线TxD、接收数据线RxD及信号地线GND。
连接时,双方的的地线直接相连,收发数据线交叉相连。
通过以上的分析,可以确定该设计主要实现发送、接收、显示、响铃、保存和打开文件及退出这几种功能。
2程序设计及说明
通过以上的分析,可以确定该设计主要实现发送、接收、显示、发声、保存和打开文件及退出这几种功能。
将功能划分为以下几个模块:
①主控模块。
实现对各个子模块的调用,在主模块内定义数据区。
②显示模块。
实现将BUF缓冲区中的数据显示到屏幕特定区域。
③转换音乐模块。
实现将BUF缓冲区中的数字转换成音符并播放。
④保存文件模块。
实现将BUF缓冲区中内容存到指定的文件中。
⑤打开文件模块。
实现将指定文件中的内容读入到BUF缓冲区中。
⑥出错信息显示模块。
这是一个公用模块,读文件和写文件模块都需要调用。
在主控模板下,通过调用各个子模块的功能,实现了程序的功能调用,从而达到设计要求的操作。
这也是模块化设计的基本要求。
主流程图如图2所示:
图2-1程序主流程图
2.1宏定义和宏调用
宏是源程序中一段有独立功能的程序代码。
它只需要在源程序中定义一次,就可以多次调用它,调用时只需要用一个宏调用语句就可以了。
其格式是:
MacronameMACRO[dummyparameterlist]
(宏定义体)
ENDM
其中MACRO和ENDM是一对伪操作。
这对伪操作之间是宏定义体——是一组有独立功能的程序代码。
经过宏定义后的宏指令就可以在源程序中调用。
宏调用的格式是:
Macroname[actualparameterlist]
当源程序被汇编时,汇编程序将对每个宏调用做宏展开,即用宏定义体取代源程序中的宏指令名,并且用实元取代宏定义中的哑元。
子程序在执行时,每调用一次都要先保护断点、保护现场;
返回时先要回复现场,然后回复断点,再返回。
这些操作增加了额外的时间,因而执行时间长,速度相对较慢。
用宏定义和宏调用都可以免去执行时间上的这些额外开销,执行时间短,速度相对较快。
在进行本设计时,大量使用了宏定义和宏调用。
2.2显示程序设计
设计要求在不同的区域用不同的颜色显示接收和发送的数据信息,通过BIOS、DOS系统功能调用,实现以上的要求。
调用“INT10H”和“INT21H”实现颜色和区域的选择显示。
使用宏定义、宏调用的方式来实现程序的调用。
表2-1INT21H的功能调用表
AH
功能
调用参数
返回参数
01H
带回显的键盘输入
AL=输入字符
09H
显示字符串
DS:
DX=串地址'
$'
结束字符串
02H
显示输出
DL=输出字符
表2-2INT10H的功能表
功能号
入口参数
显示模式属性
00H
设置显示模式
AH=00H,AL=02H
80×
25的16色文本
设置光标形状
AH=01H
CH低四位=光标的起始行
CL低四位=光标的终止行
用文本坐标下
设置光标位置
AH=02
BH=显示页码
DH=行(Y坐标)
DL=列(X坐标)
2.3数字转化为音乐的程序设计
设计要求输入字符后,程序将其转化为相应的音符,并发声。
这个要求,可以通过查表实现,实现过程如下:
1从键盘读入一个字符的ASCII码;
2判断该字符是否是0-9的数字;
3如果是0-9的数字,将其转化为相应的发声频率;
4调用发声程序,驱动扬声器发声。
表2-3数字与发声频率的对应表
数字
1
2
3
4
5
6
7
8
9
频率
248
262
294
330
350
393
441
495
525
589
在设计程序时,要加入延迟程序,以使音调可以持续一段时间,效果明显。
2.4保存文件的程序设计
程序要求在键盘输入字符过程中实现自动保存,并且在接受对方发送的文件的同时,也在本机上建立文件保存。
在发送和接收文件时调用SAVE宏定义,即可实现程序的自动保存。
保存之前要先建立文件,再进行写入的操作,然后再关闭建立的文件。
当需要读取文件时通过该文件的标号即可读取。
保存文件需要调用功能号如下表:
表2-4INT21H文件操作的功能号
3CH
建立文件
DX=ASCIIZ串地址
CX=文件属性
成功:
AX=文件代号
错误:
AX=错误码
3DH
打开文件
AL=0读
=1写
=3读/写
3EH
关闭文件
BX=文件代号
失败:
40H
写入文或设备
DX=数据缓冲区地址
CX=写入的字节数
写成功:
AX=实际写入的字节数
写出错:
保存文件的子程序的流程图如下:
图2-2保存文件程序流程图
2.5打开文件程序设计
打开文件的程序设计顺序同保存文件程序的设计类似。
程序在执行打开文件时,需要调用显示子程序、设置颜色子程序、发声子程序。
其流程图如下:
图2-3打开文件程序图
2.6接收程序的设计
程序设计要求:
在执行主程序时,当键盘输入字符时,发送程序、接收程序同时启动,键盘每输入一个字符,经过判定不是[ESC]后,发送程序自动保存字符并且向另一台PC发送一个字符,此时,另一台PC的接收程序自动接收字符,并且自动保存,同时两台PC可以在屏幕的不同区域分别显示发送和接收的字符。
该程序需要调用的子程序有:
保存子程序、显示子程序、发声子程序等。
该程序的流程图如下:
图2-4接收文件程序流程图
2.7发送程序的程序设计
程序设计要求,键盘输入数据后,发送程序启动,将读入的数据发送给另一台PC,同时,也将数据显示在屏幕的一个区域并将字符保存。
程序首先保护现场,然后取状态口的状态,当检测到可以发送时,便将数据送至数据口进行发送,最后将AX出栈,回到主程序。
该程序需要调用的子程序有:
显示子程序、设置颜色子程序等。
图2-5发送文件程序流程图
2.8换行程序的设计
该程序的主要作用是当输入字符达到一定数目后,使光标定位在特定位置。
由于本程序在界面的左侧显示收到的字符,右侧显示发送的字符,为避免发送和接受的字符出现混淆的状况,定义该程序。
换行程序执行过程:
1执行INT10H中断的03H号功能,设置屏幕的显示方式为80*25彩色文本显示方式;
2定位光标的初始位置DL列数,DH行数;
3当DL达到限定值时,行数DH加1;
4在新的位置上继续显示字符。
具体程序如下:
LOCATION_PMACRO
MOVAH,03H
MOVBH,0
INT10H
LEABX,P1
CMPDL,79
JZH1
IH1:
MOV[BX],DX
jmpSH1
H1:
INCDH
MOVDL,29h
jmpIH1
SH1:
3程序调试过程
任何程序在编写完成之后都要进行调试,以测试编写的程序是否存在错误或者不妥的地方,从而改进程序,实现序的良好运行。
本程序调试过程分别对程序的各个环节进行了调试和改正,其中发现了很多错误,改正后程序可以正常运行,并能够得到正确的结果。
3.1程序界面的调试
程序运行的初始状态,该状态主要是显示提示语句和界面的美化并初步验证字符的输入和保存,调试过程中发现的问题有:
1定义的语句不能在预定的位置显示,原因:
光标定位指令执行错误。
解决办法:
从新定义光标定位指令,并赋予确切的位置参数、;
2屏幕颜色混乱,原因:
没有执行屏幕显示方式的指令。
重新调用INT10H中断的03H号指令;
3键入ESC无法退出程序,返回系统,原因:
ESC的ASCII码定义错误。
重新执行指令,并修正ESC的ASCII码值。
下图为正常的程序的运行结果:
图3-1程序出示状态的界面
3.2发送程序、接收程序、保存程序的调试
该部分的程序是整个程序的核心部分,需要实现的功能有:
键盘读入,显示,保存,发送,接收等。
调试该部分程序时,使用9针串口线将两台PC连接起来,两台PC同时执行程序进入DOS状态。
一方键入字母和数字混合字符,该字符可以在自方屏幕的右侧显示,并且将键入的字符保存在指定的文件中,屏幕下方可显示“savesucceed”提示语句;
另一方将在屏幕的左侧显示收到的字符,并将字符保存在指定的文件中。
以上过程可逆。
调试中遇到的问题:
1发送和接收的字符显示混乱,原因:
输入字符达到一定数量后,光标会自动向下移动一行,但是却没有定位到初始位置。
重新加入换行子程序,重置光标于指定位置;
2PC1发送,PC2无法接收,原因:
串口线不正常。
更换串口线;
3INT14H中断方式无法进行数据传输,原因:
没有找到。
解决办法,使用芯片16500通过查询方式检测端口状态并进行数据的传输。
以下为正常程序的运行结果:
图3-3PC2的发送和就收状态
3.3打开文件,发声程序的调试
该部分程序可以实现的功能为:
将已经保存的文件打开并显示在屏幕上,同时数字字符对应应的频率发声。
图3-4打开PC1保存文件的界面
图3-5打开PC2的程序的界面
以上就是程序运行时各个分支功能的调试过程,通过不断的修改和改进,最终达到了上述的效果,基本满足了设计的要求。
4设计总结
4.1设计优缺点分析
本程序采用模块化设计思想,可读性强,具有很强的可移植性,便于增加新的功能。
在子程序调用方面采用宏定义、宏调用的方法而不是一个个子程序的调用,原因是子程序在执行时,每调用一次都要先保护断点、保护现场;
尤其是本程序大量使用了显示、定义颜色、定义光标位置等功能,而宏定义、宏调用的使用节省了大量资源。
设计中也有一些不足,比如在打开保存的文件时,本机发送的和接收的文件同时显示在界面上,虽然本机的发送的文件显示在前面,但实际上两段字符并没有明显的断点。
对于这个问题,有两种解决方法可行:
1使发送的和接收的字符分别保存在不同的文件内,在打开文件时同时打开两个文件并在不同的位置显示;
2显示字符时分别给发送的字符和接收的定义以不同的颜色加以区分。
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]王士元.IBMPC/XT·
286·
386微机汇编语言与外设编程.南京:
南开大学出版社,1993
[7]王力虎.PC控制及接口程序设计实例.北京:
科学出版社,2004
附录:
;
***************************************************************************
标题:
串行通信程序
功能:
串行通信区域划分键盘读入文件保存文件读取
作者:
纪广杰
E-mail:
jj99981@
单位:
武汉理工大学自动化学院自动化0608班
时间:
2009年1月10日
数据段--------------------------------------------------------------
DATASSEGMENT
aa1db'
*'
'
INFORMATION1DB'
TransmissiontestdesignedbyJIGUANGJIE!
'
INFORMATION2DB'
PRESS[ESC]TOEXIT'
INFORMATION3DB'
--------------------------------------------------------------------------------'
INFORMATION4DB'
"
["
TOSAVETHEMESSAGE"
]"
TOSEEWHATYOUSAVED'
M11DB'
WHATYOUWANTTOSEND:
M22DB'
WHATYOUHAVERECEIVED:
FREGDB40,80,120,140,160,180,200,220,240,255
BUFDB255DUP(0)
BUF1DB255DUP(0)
BUF2DB255DUP(0)
P1DW0429H
P2DW0600H
FILE_SAVEDB'
c:
\WENJIAN.txt'
0
HANDLEDW?
SUCCEED_MESSAGEDB'
SAVESUCCEED'
ERRORDB'
SAVEERROR'
OPEN_INFO1DB'
[ESC]toquit!
OPEN_INFO2DB'
press[anykeyexceptESC]Returntotheserialtransmission'
OPEN_INFO3DB'
Savedmessageis:
DATASENDS
--------------------------------------------------------------------
堆栈段-------------------------------------------------------------
STACKSGSEGMENTSTACK'
S'
DW64DUP(?
)
STACKSGENDS
代码段---------------------------------------------------------------
CODESSEGMENT
初始化16550
COMRDMACRO
MOVAL,9FH
MOVDX,03FBH
OUTDX,AL;
初始化LCR
MOVAL,120;
分频低8位
MOVDX,03F8H
OUTDX,AL
MOVAL,0
MOVDX,03F9H;
高位端口
系数高位填0
MOVAL,07H;
FIFO控制字
MOVDX,03FAH
将LCR最高位清零
LCRCXMACRO
PUSHAX
MOVAL,1FH
POPAX
ENDM
换行
显示
PUTSMACROSTRING
MOVAH,9
LEADX,STRING
INT21H
定光标位置
SET_PMACROP_XY
MOVDX,P_XY
MOVAH,02H
保存光标位置
SAVE_PMACROPL
LEABX,PL
设置显示颜色
SET_CMACROCOLOR,LENGTH
MOVAL,1
MOVBH,0
MOVBL,COLOR
MOVCX,LENGTH
从串口发送一个字符
SENDSMACRO
LOCALSEND
CMPAL,1BH
JZSEND1
CMPAL,'
['
]'
SET_PP1
SET_C0EH,1
MOVDL,[SI];
显示[字符]
MOVAH,2
LOCATION_PP1
SEND1:
LCRCX
MOVDX,03FDH;
状态口
SEND2:
INAL,DX;
读状态
TESTAL,20H;
发送就绪?
JZSEND2
MOVDX,03F8H;
数据口
从串口接收一个字符
RECVSMACRO
LOCALNEXT_R,AGAIN_R
IN