汇编语言实现串口通信PC和单片机间.docx
- 文档编号:8471352
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:16
- 大小:257.35KB
汇编语言实现串口通信PC和单片机间.docx
《汇编语言实现串口通信PC和单片机间.docx》由会员分享,可在线阅读,更多相关《汇编语言实现串口通信PC和单片机间.docx(16页珍藏版)》请在冰豆网上搜索。
汇编语言实现串口通信PC和单片机间
8.用C语言或汇编语言实现串口通信(PC和单片机间)
上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。
由于PC机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC
机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。
单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示
1硬件电路的设计
MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。
所以单片机和PC机之间可以方便地进行串口通讯。
单片机串口有3条引线:
TXD(发送数据),RXD(接收数据)和GND(信号地)。
因此在通信距离较短时可采用零MODEM方式,简单三连线结构。
IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。
电路如图1所示。
硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。
接口电路如图3.5所示。
总体设计按照整体设计思路方案绘制原理图如下所示:
2系统软件设计
软件设计分上位机软件设计和下位机软件设计。
这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:
一个发送,另一个接收。
为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。
现约定通信协议如下:
PC机和单片机都可以发送和接收。
上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。
采用RS-232串口异步通信,
1 上位PC机与下位单片机异步串行通信的通信协议
为了保证可靠的通信,必须有一套完善的通信协议。
分布式控制系统中的每台单片机均有唯一的番号。
通信开始时,先由PC机呼叫被叫单片机的番号,单片机在接收到微机的呼叫后,首先判断是不是自己的番号,如果是,则发送呼叫应答信号,否则不予理睬。
微机在接收到呼叫应答信号之后,将向单片机发出通信命令字符串。
以下是上位PC机协议的格式:
单片机号
单片机号
命令码
命令码
停止标志
其中,单片机号代表现场第几台单片机,占用1个字节,发送两次的目的是为了防止干扰;命令码则代表上位机向下位机发布的工作命令,它也占用1个字节,发送两次的目的也是为了防止干扰。
而停止标志则表明一次命令发送完毕。
使用时可依据该标志判断上位机的命令是否发送完毕。
下位机协议格式如下:
数据块
校验位
该格式中,数据块为下位机上传到上位PC机的数据。
校验位则用于PC机对收到的数据进行奇偶校验(占1个字节)。
校验正确后,可将数据写入内存,否则发出数据传输错误信息,以要求单片机重新传输数据。
另外,作为一个完整的通信协议,只有上述约定还不够,还必须在发送和接收数据的时间间隔上加以限制。
否则,很可能由于某些原因而造成无限制的等待对方应答,使整个系统处于工作不正常状态,或者延误其它动作的处理。
具体时间限制可根据通信内容、CPU处理速度,再加上适当的余量来确定。
2单片机通信程序设计
单片机的数据通信由串行口完成,定时器T1作为波特率发生器,其波特率要与PC机一致。
数据的传送格式为1位起始位、8位数据位和1位停止位。
采用中断方式发送和接收数据,定时器T1设置为工作工作模式2,串行口设置为工作方式3,由第9位判断停止。
具体的程序流程图见下。
①单片机中断方式接收程序
当PC机不发送任何数据的时候,从机单片机始终处于等待状态(P.),直到PC机发送数据过来。
由于PC机在发送有效数据之前会加一个开始符(FFH),在有效数据之后会加一个开始符(7FH),所以单片机接收到主机发送来的FFH之后,置RAM存贮单元的初始地址30H单元,用来放紧接着接收的数据,程序中还用了一个计数器COUNTER来计接收到的数据位数,直到接收到7FH为止。
单片机接收主程序MAIN及中断服务程序STR清单如下:
COUNTEREQU40H
POINTEQU41H
ORG0000H
LJMPMAIN
ORG0023H
LJMPSRT
MAIN:
MOVSP,#60H
MOVTMOD,#20H;定时器T1的方式2
MOVPCON,#00H;串行口波特率控制位
MOVTH1,#0F4H;2400Kb/s
MOVTL1,#0F4H
MOV30H,#15
MOVCOUNTER,#1
MOVR0,#30H;接收数据存放区
MOVR1,#30H
SETBTR1;开始计数
CLRET1;清定时中断
MOVSCON,#50H;串行口控制寄存器给值
SETBEA;开总中断
SETBES;开串行口中断
MOVIP,#10H
MAIN1:
ACALLDISP
SJMPMAIN1
SRT:
PUSHACC
PUSH01H
JBCRI,GET
SJMPEXIT
GET:
MOVA,SBUF
CJNEA,#0FFH,GET1;判断是否为开始字符,不是跳GET1放数据存贮
MOVR0,#30H;是开始符就置存贮区首地址30H,计数器清0并跳出中断
MOVCOUNTER,#0
SJMPEXIT
GET1:
CJNEA,#07FH,GET2判断是否为结束符,不是跳GET2放数据存贮区
MOVR5,COUNTER;是结束符,放发送缓存区开始字符
INCR5
MOVPOINT,#30H
MOVSBUF,#255
SJMPEXIT
GET2:
MOV@R0,A
INCR0
INCCOUNTER
EXIT:
POP01H
POPACC
RETI
②单片机中断方式发送程序
由于本次设计的系统要实现的功能是将PC机送到单片机的数据回送到PC机,所以单片机要在接收完PC机数据后立即将数据回送到PC机。
也就是说要将RAM存贮单元的初始地址30H单元内数据逐一发送出去。
程序框图见下。
单片机发送主程序MAIN及中断服务程序SEND清单如下:
COUNTEREQU40H
POINTEQU41H
ORG0000H
LJMPMAIN
ORG0023H
LJMPSRT
MAIN:
MOVSP,#60H
MOVTMOD,#20H;定时器T1的方式2
MOVPCON,#00H;串行口波特率控制位
MOVTH1,#0F4H;2400Kb/s
MOVTL1,#0F4H
MOV30H,#15
MOVCOUNTER,#1
MOVR0,#30H;接收数据存放区
MOVR1,#30H
SETBTR1;开始计数
CLRET1;清定时中断
MOVSCON,#50H;串行口控制寄存器给值
SETBEA;开总中断
SETBES;开串行口中断
MOVIP,#10H
MAIN1:
ACALLDISP
SJMPMAIN1
SRT:
PUSHACC
PUSH01H
JBCRI,GET;判断是否为接收,是跳GET接收程序,否执行发送程序
CLRTI
DJNZR5,SEND1
SJMPEXIT
SEND1:
MOVR1,POINT
MOVA,@R1
MOVSBUF,A
INCR1
MOVPOINT,R1
SJMPEXIT
EXIT:
POP01H
POPACC
RETI
③单片机显示程序
单片机显示部分可以用来检测接收到的数据是否正确,单片机显示程序主要将接AT89C51从串行口收到的数据显示出来。
在程序设计中,在AT89C51RAM存贮器中的四个显示缓冲器单元30H-34H,分别存放着由PC机方发送过来的数据,AT89C51的P2口扫描输出总是只有一位为高电平,即4位显示器中仅有一位公共阴极为低电平,其它位为高电平,AT89C51的P0口相应位(阴极为低)的显示数据的段数据,使该位显示出一个字符,其它们为暗,依次地改变P2口输出为高的位,P0口输出对应的段数据,4位显示器就显示出由缓冲器中显示数据所确定的字符。
程序框图见下:
单片机显示子程序清单如下:
DISP:
PUSHACC
MOVDPTR,#TAB
MOVR1,#30H
MOVA,COUNTER
JZDISP2;没有接收到数据,跳出DISP继续显示P.等待状态
MOVR2,A
MOVR6,#08H
DISP1:
MOVA,@R1
CPLA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A;送字形码到P0口
MOVA,R6
MOVP2,A;送位控制到P2口
RRA
MOVR6,A
DJNZR7,$
INCR1
DJNZR2,DISP1;判断接收位数
DISP2:
MOVR1,#30H
POPACC
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DB77H,7CH,39H,5EH,79H,0F3H
END
3PC机通信程序
PC通信程序采用VisualBasic语言编程,VB提供了串行端口控制Mscomm来为应用程序提供串行通讯。
该控件屏蔽了通信过程中的底层操作,我们可以设置、监视Mscomm控件的属性和事件,结合Timer控件即可完成对串行口的初始化和数据的输入输出工作。
主程序按照通信协议的要求,首先确定波特率和信息帧格式,然后调用发送子程序将键盘输入的数据发送出去,为了使主机能够对整个检测过程进行控制,须要在发送命令以后设定等待的时间,也可以通过条件判断下一步是发送还是接收命令。
对发送的命令,可能是文本方式或二进制代码。
在发送二进制代码时,应特别注意发送的格式。
PC机通信程序清单:
PrivateSubCommand1_Click()
DimoutstringAsString
DimiAsInteger
DimdeAsInteger
outstring=Text1.Text
MSComm1.RThreshold=Len(Text1.Text)+2
MSComm1.Output=Chr(255)
Fori=1ToLen(outstring)
MSComm1.Output=Chr(Asc(Mid(outstring,i,1))-48)
Nexti
MSComm1.Output=Chr(127)
EndSub
PrivateSubCommand2_Click()
Text2.Text=""
EndSub
PrivateSubCommand3_Click()
IfMSComm1.PortOpen=FalseThen
MSComm1.PortOpen=True
Command3.Caption="关闭端口"
Else
MSComm1.PortOpen=False
Command3.Caption="打开端口"
EndIf
EndSub
PrivateSubForm_Load()
MSComm1.CommPort=1'定义用端口COM1
MSComm1.Settings="2400,n,8,1"'波特率,无奇偶校验,8位数据,1
位停止位
MSComm1.PortOpen=True'打开端口
Command3.Caption="关闭端口"
EndSub
PrivateSubMSComm1_OnComm()
DimlenthAsInteger,iAsInteger
lenth=Len(Text1.Text)+2
ReDiminstring(1Tolenth)AsInteger
SelectCaseMSComm1.CommEvent
CasecomEvReceive
Fori=1Tolenth
instring(i)=MSComm1.Input(0)
Nexti
EndSelect
Text2.Text=""
Fori=1Tolenth
Ifinstring(i)<>255Andinstring(i)<>127
Then
Text2.Text=Text2.Text&instring(i)
EndIf
Nexti
EndSub
PrivateSubTimer1_Timer()
Text3.Text=Date
Text4.Text=Time()
EndSub
PrivateSubTimer2_Timer()
Text1=Text1+1
IfText1>9999ThenText1=1000
Command1_Click7
EndSub
附:
单片机通信程序清单:
COUNTEREQU40H
POINTEQU41H
ORG0000H
LJMPMAIN
ORG0023H
LJMPSRT
MAIN:
MOVSP,#60H
MOVTMOD,#20H;定时器T1的方式2
MOVPCON,#00H;串行口波特率控制位
MOVTH1,#0F4H;2400Kb/s
MOVTL1,#0F4H
MOV30H,#15
MOVCOUNTER,#1
MOVR0,#30H;接收数据存放区
MOVR1,#30H
SETBTR1;开始计数
CLRET1;清定时中断
MOVSCON,#50H;串行口控制寄存器给值
SETBEA;开总中断
SETBES;开串行口中断
MOVIP,#10H
MAIN1:
ACALLDISP
SJMPMAIN1
;********中断服务子程序**********
SRT:
PUSHACC
PUSH01H
JBCRI,GET;判断是否为接收,是跳GET接收程序,否执行发送程序
CLRTI
DJNZR5,SEND1
SJMPEXIT
SEND1:
MOVR1,POINT
MOVA,@R1
MOVSBUF,A
INCR1
MOVPOINT,R1
SJMPEXIT
GET:
MOVA,SBUF
CJNEA,#0FFH,GET1;判断是否为开始字符,不是跳GET1放数据存贮区
MOVR0,#30H;是开始符就置存贮区首地址30H,计数器清0并跳出中断
MOVCOUNTER,#0
SJMPEXIT
GET1:
CJNEA,#07FH,GET2;判断是否为结束符,不是跳GET2放数据存贮区
MOVR5,COUNTER;是结束符,放发送缓存区开始字符
INCR5
MOVPOINT,#30H
MOVSBUF,#255
SJMPEXIT
GET2:
MOV@R0,A
INCR0
INCCOUNTER
EXIT:
POP01H
POPACC
RETI
;*********显示程序**********
DISP:
PUSHACC
MOVDPTR,#TAB
MOVR1,#30H
MOVA,COUNTER
JZDISP2;没有接收到数据,跳出DISP继续显示P.等待状态
MOVR2,A
MOVR6,#08H
DISP1:
MOVA,@R1
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A;送字形码到P0口
MOVA,R6
MOVP2,A;送位控制到P2口
RRA
MOVR6,A
DJNZR7,$
INCR1
DJNZR2,DISP1;判断接收位数
DISP2:
MOVR1,#30H
POPACC
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DB77H,7CH,39H,5EH,79H,0F3H
END
PC机通信程序清单:
PrivateSubCommand1_Click()
DimoutstringAsString
DimiAsInteger
DimdeAsInteger
outstring=Text1.Text
MSComm1.RThreshold=Len(Text1.Text)+2
MSComm1.Output=Chr(255)
Fori=1ToLen(outstring)
MSComm1.Output=Chr(Asc(Mid(outstring,i,1))-48)
Nexti
MSComm1.Output=Chr(127)
EndSub
PrivateSubCommand2_Click()
Text2.Text=""
EndSub
PrivateSubCommand3_Click()
IfMSComm1.PortOpen=FalseThen
MSComm1.PortOpen=True
Command3.Caption="关闭端口"
Else
MSComm1.PortOpen=False
Command3.Caption="打开端口"
EndIf
EndSub
PrivateSubForm_Load()
MSComm1.CommPort=1'定义用端口COM1
MSComm1.Settings="2400,n,8,1"'波特率,无奇偶校验,8位数据,1
位停止位
MSComm1.PortOpen=True'打开端口
Command3.Caption="关闭端口"
EndSub
PrivateSubMSComm1_OnComm()
DimlenthAsInteger,iAsInteger
lenth=Len(Text1.Text)+2
ReDiminstring(1Tolenth)AsInteger
SelectCaseMSComm1.CommEvent
CasecomEvReceive
Fori=1Tolenth
instring(i)=MSComm1.Input(0)
Nexti
EndSelect
Text2.Text=""
Fori=1Tolenth
Ifinstring(i)<>255Andinstring(i)<>127
Then
Text2.Text=Text2.Text&instring(i)
EndIf
Nexti
EndSub
PrivateSubTimer1_Timer()
Text3.Text=Date
Text4.Text=Time()
EndSub
PrivateSubTimer2_Timer()
Text1=Text1+1
IfText1>9999ThenText1=1000
Command1_Click7
EndSub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实现 串口 通信 PC 单片机