汇编语言实现串口通信PC和单片机间教学文案.docx

上传人:scccc 文档编号:12725339 上传时间:2021-12-05 格式:DOCX 页数:17 大小:230.50KB
返回 下载 相关 举报
汇编语言实现串口通信PC和单片机间教学文案.docx_第1页
第1页 / 共17页
汇编语言实现串口通信PC和单片机间教学文案.docx_第2页
第2页 / 共17页
汇编语言实现串口通信PC和单片机间教学文案.docx_第3页
第3页 / 共17页
汇编语言实现串口通信PC和单片机间教学文案.docx_第4页
第4页 / 共17页
汇编语言实现串口通信PC和单片机间教学文案.docx_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《汇编语言实现串口通信PC和单片机间教学文案.docx》由会员分享,可在线阅读,更多相关《汇编语言实现串口通信PC和单片机间教学文案.docx(17页珍藏版)》请在三一文库上搜索。

1、8.用C语言或汇编语言实现串口通信 (PC和单片机间)上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据 和传送指令。单片机可单独处理数据和控制任务, 同时也将数据传送给PC机,由 PO对这些数据进行处理或显示图2 1总体设计方案梳程图41硬件电路的设计MCS-5惮片机有一个全双工的串行通讯口UART利用其RX刖TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF可同时发送和接收数据。所以单片机和PC机之

2、间可以方便地进行串口通讯。单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND信号地)。因此在通信距离较短时可采用零 MODEM式,简单三连线结构。IBM-PC机有 两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由 TXD(发 送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了 PC机与MCS-51机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIMA司生产的专用芯片MAX23进行转换。电路如图1所示。硬件连接时,可从MAX23中的2路发送器和接收器 中任选一路,只要注意发送与接收的引脚对应关系即

3、可。接口电路如图3.5所示。囲1斗按芯片路龄卜TXDRXDCI +V匚UC1-5円yC2 +1 piFU芥TlinT1 c*u«RtourR HuGNDV-HFrMAX23?I两R 232CRXDTXDGNT>E 3- 5 PC 机与单片机通信接口电8&设计框图4总体设计按照整体设计思路方案绘制原理图如下所示:IXTALITTAL2raoruxi PG I阳 TO2/W2 PG3XJ3POS/ABS 旳SMX 初加射P?(WPn朋 H肿W K 311 P2IW2 P2 5AA13 K&AK P2 71£阿耐 M 1OXM2JLrKKC5MMAX232士

4、丄士丄士paafco rai/rw pjatfflL w wi 旳剧in n«i£ pjfei 旳丁莎2系统软件设计软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行, 但它们要做的工作是对应的:一个发送,另一个接收。为了保证数据通信的可靠性,要制定 通信协议,然后各自根据协议分别编制程序。现约定通信协议如下:pc机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS-232串口异步通信,1 上位PC机与下位单片机异步串行通信的通信协议为了保证可靠的通信,必须有一套完善的通信协议。分布式控制

5、系统中的每台单片机 均有唯一的番号。通信开始时,先由PC机呼叫被叫单片机的番号,单片机在接收到微机的呼叫后,首先判断是不是自己的番号,如果是,则发送呼叫应答信号,否则不予理睬。微机 在接收到呼叫应答信号之后, 将向单片机发出通信命令字符串。以下是上位PC机协议的格式:单片机号单片机号命令码命令码停止标志其中,单片机号代表现场第几台单片机,占用1个字节,发送两次的目的是为了防止 干扰;命令码则代表上位机向下位机发布的工作命令,它也占用1个字节, 发送两次的目的也是为了防止干扰。而停止标志则表明一次命令发送完毕。使用时可依据该标志判断上位机的命令是否发送完毕。下位机协议格式如下:数据块校验位该格式

6、中,数据块为下位机上传到上位PC机的数据。校验位则用于PC机对收到的 数据进行奇偶校验(占1个字节)。校验正确后,可将数据写入内存,否则发出数据传输错 误信息,以要求单片机重新传输数据。另外,作为一个完整的通信协议,只有上述约定还不够,还必须在发送和接收数据的时间间隔上加以限制。 否则,很可能由于某些原因而造成无限制的等待对方应答,使整个系统处于工作不正常状态, 或者延误其它动作的处理。 具体时间限制可根据通信内容、 CPU 处理速度,再加上适当的余量来确定。2 单片机通信程序设计单片机的数据通信由串行口完成,定时器T1作为波特率发生器,其波特率要与PC机一致。数据的传送格式为1位起始位、8位

7、数据位和1位停止位。采用中断方式发送和接收数 据,定时器T1设置为工作工作模式2,串行口设置为工作方式 3,由第9位判断停止。具体的 程序流程图见下。程序流程图主程序匸开殖1定时酩丨1别跆此1訥荷口初哺y1开和行中li,吏走时凸叮f调卅城示思瓠订中卜|復 单片机中断方式接收程序当pc机不发送任何数据的时候,从机单片机始终处于等待状态(p.),直到pc机发送数据过来。由于PC机在发送有效数据之前会加一个开始符(FFH),在有效数据之后会加一个开始符(7FH),所以单片机接收到主机发送来的FFH之后,置RAM存贮单元的初始地址30H单元,用来放紧接着接收的数据,程序中还用了一个计数器COUNTER

8、来计接收到的数据位数,直到接收到7FH为止。单片机接收主程序MAIN及中断服务程序STR清单如下:COUNTER EQU 40HPOINT EQU 41HORG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H定时器T1的方式2MOV PCON,#00H串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R1,#30HSETB TR1 ;开始计数CLR ET1 ; 清定时中断MOV SCO

9、N,#50H ;串行口控制寄存器给值SETB EA ; 开总中断SETB ES ; 开串行口中断MOV IP,#10HMAIN1: ACALL DISPSJMP MAIN1SRT: PUSH ACCPUSH 01HJBC RI,GETSJMP EXITGET: MOV A,SBUFCJNE A,#0FFH,GET1 ; 判断是否为开始字符,不是跳 GET1 放数据存贮MOV R0,#30H ;是开始符就置存贮区首地址 30H,计数器清0并跳出中断MOV COUNTER,#0SJMP EXITGET1: CJNE A,#07FH,GET2 判断是否为结束符,不是跳 GET2 放数据存贮区MOV

10、R5,COUNTER是结束符,放发送缓存区开始字符INC R5MOV POINT,#30HMOV SBUF,#255SJMP EXITGET2: MOV R0,AINC R0INC COUNTEREXIT: POP 01HPOP ACCRETI 单片机中断方式发送程序由于本次设计的系统要实现的功能是将PC机送到单片机的数据回送到 PC机,所以单片机要在接收完PC机数据后立即将数据回送到 PC机。也就是说要将RAM存贮单元的初始地址30H 单元内数据逐一发送出去。程序框图见下。中断服齐单片机发送主程序MAIN及中断服务程序SEN清单如下:COUNTER EQU 40HPOINT EQU 41HO

11、RG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H定时器T1的方式2MOV PCON,#OOH串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R1,#30HSETB TR1 ;开始计数CLR ET1 ; 清定时中断MOV SCON,#50H ;串行口控制寄存器给值SETB EA ; 开总中断SETB ES ; 开串行口中断MOV IP,#10HMAIN1: ACALL DISPSJ

12、MP MAIN1SRT: PUSH ACCPUSH 01HJBC RI,GET ; 判断是否为接收,是跳 GET 接收程序,否执行发送程序CLR TIDJNZ R5,SEND1SJMP EXITSEND1: MOV R1,POINTMOV A,R1MOV SBUF,AINC R1MOV POINT,R1SJMP EXITEXIT: POP 01HPOP ACCRETI 单片机显示程序 单片机显示部分可以用来检测接收到的数据是否正确, 单片机显示程序主要将接 AT89C51 从 串行口收到的数据显示出来。在程序设计中,在AT89C51RAM存贮器中的四个显示缓冲器单元30H 34H,分别存放着由

13、PC机方发送过来的数据,AT89C51的P2 口扫描输出总是只有一 位为高电平,即4位显示器中仅有一位公共阴极为低电平,其它位为高电平,AT89C51的P0口相应位(阴极为低)的显示数据的段数据,使该位显示出一个字符,其它们为暗,依次地 改变P2 口输出为高的位,P0 口输出对应的段数据,4位显示器就显示出由缓冲器中显示数 据所确定的字符。程序框图见下:单片机显示子程序清单如下DISP: PUSH ACCMOV DPTR,#TABMOV R1,#30HMOV A,COUNTERJZ DISP2 ;没有接收到数据,跳出 DISP继续显示P.等待状态MOV R2,AMOV R6,#08HDISP1

14、:MOV A,R1CPL AANL A,#0FHMOVC A,A+DPTRMOV P0,A ; 送字形码到 P0 口MOV A,R6MOV P2,A ; 送位控制到 P2 口RR AMOV R6,ADJNZ R7,$INC R1DJNZ R2,DISP1 ; 判断接收位数DISP2:MOV R1,#30HPOP ACCRETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDB 77H,7CH,39H,5EH,79H,0F3HEND3 PC 机通信程序PC通信程序采用 Visual Basic 语言编程,VB提供了串行端口控制Mscomn来为应用程序

15、提供串行通讯。该控件屏蔽了通信过程中的底层操作,我们可以设置、监视Mscomm控件的属性和事件,结合 Timer 控件即可完成对串行口的初始化和数据的输入输出工作。主然后调用发送子程序将键盘输入 须要在发送命令以后设定等待 对发送的命令, 可能是文本方式程序按照通信协议的要求, 首先确定波特率和信息帧格式, 的数据发送出去, 为了使主机能够对整个检测过程进行控制, 的时间, 也可以通过条件判断下一步是发送还是接收命令。 或二进制代码。在发送二进制代码时,应特别注意发送的格式。PC 机通信程序清单:Private Sub Command1_Click()Dim outstring As Stri

16、ngDim i As IntegerDim de As Integer outstring = Text1.TextMSComm1.RThreshold = Len(Text1.Text) + 2 MSComm1.Output = Chr(255)For i = 1 To Len(outstring)MSComm1.Output = Chr(Asc(Mid(outstring, i, 1) - 48) Next iMSComm1.Output = Chr(127)End SubPrivate Sub Command2_Click()Text2.Text = ""End Su

17、bPrivate Sub Command3_Click()If MSComm1.PortOpen = False ThenMSComm1.PortOpen = True Command3.Caption = " 关闭端口 " ElseMSComm1.PortOpen = False Command3.Caption = " 打开端口 " End IfEnd Sub定义用端口 COM1 波特率,无奇偶校验 ,8 位数据 ,1打开端口Private Sub Form_Load() MSComm1.CommPort = 1'MSComm1.Settin

18、gs = "2400,n,8,1" ' 位停止位MSComm1.PortOpen = True'Command3.Caption = " 关闭端口 " End SubPrivate Sub MSComm1_OnComm()Dim lenth As Integer, i As Integer lenth = Len(Text1.Text) + 2ReDim instring(1 To lenth) As IntegerSelect Case MSComm1.CommEventCase comEvReceiveFor i = 1 To len

19、thinstring(i) = MSComm1.Input(0)Next iEnd SelectText2.Text = ""For i = 1 To lenthIf instring(i) <> 255 And instring(i) <> 127ThenText2.Text = Text2.Text & instring(i)End IfNext iEnd SubPrivate Sub Timer1_Timer()Text3.Text = DateText4.Text = Time()End SubPrivate Sub Timer2_T

20、imer()Text1 = Text1 + 1If Text1 > 9999 Then Text1 = 1000Command1_Click7End Sub单片机通信程序清单:COUNTER EQU 40HPOINT EQU 41HORG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H定时器T1的方式2MOV PCON,#OOH串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R

21、1,#30HSETB TR1 ;开始计数CLR ET1 ;清定时中断MOV SCON,#50H串行口控制寄存器给值SETB EA ;开总中断SETB ES ;开串行口中断MOV IP,#10HMAIN1:ACALL DISPSJMP MAIN1*中断服务子程序*SRT: PUSH ACCPUSH 01HJBC RI,GET ;判断是否为接收,是跳 GET接收程序,否执行发送程序CLR TIDJNZ R5,SEND1SJMP EXITSEND1: MOV R1,POINTMOV A,R1MOV SBUF,AINC R1MOV POINT,R1SJMP EXITGET: MOV A,SBUFCJN

22、E A,#0FFH,GET1;判断是否为开始字符,不是跳GET1放数据存贮区MOV R0,#30H ;是开始符就置存贮区首地址 30H,计数器清0并跳出中断MOV COUNTER,#0SJMP EXITGET1: CJNE A,#07FH,GET2 ; 判断是否为结束符,不是跳 GET2 放数据存贮区MOV R5,COUNTER是结束符,放发送缓存区开始字符INC R5MOV POINT,#30HMOV SBUF,#255 SJMP EXITGET2: MOV R0,A INC R0INC COUNTEREXIT: POP 01HPOP ACCRETI*显示程序*DISP: PUSH ACCM

23、OV DPTR,#TABMOV R1,#30HMOV A,COUNTERJZ DISP2 ;没有接收到数据,跳出 DISP继续显示P.等待状态MOV R2,AMOV R6,#08HDISP1:MOV A,R1ANL A,#0FHMOVC A,A+DPTRMOV P0,A ; 送字形码到 P0 口MOV A,R6MOV P2,A ; 送位控制到 P2 口RR AMOV R6,ADJNZ R7,$INC R1DJNZ R2,DISP1 ; 判断接收位数DISP2:MOV R1,#30HPOP ACCRETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

24、 DB 77H,7CH,39H,5EH,79H,0F3HENDPC 机通信程序清单:Private Sub Command1_Click()Dim outstring As StringDim i As IntegerDim de As Integer outstring = Text1.TextMSComm1.RThreshold = Len(Text1.Text) + 2 MSComm1.Output = Chr(255)For i = 1 To Len(outstring)MSComm1.Output = Chr(Asc(Mid(outstring, i, 1) - 48)Next iM

25、SComm1.Output = Chr(127)End SubPrivate Sub Command2_Click()Text2.Text = ""End SubPrivate Sub Command3_Click()If MSComm1.PortOpen = False ThenMSComm1.PortOpen = True Command3.Caption = " 关闭端口 " ElseMSComm1.PortOpen = False Command3.Caption = " 打开端口 " End IfEnd SubPrivate

26、 Sub Form_Load()定义用端口 COM1 波特率,无奇偶校验 ,8 位数据 ,1打开端口MSComm1.CommPort = 1'MSComm1.Settings = "2400,n,8,1" ' 位停止位MSComm1.PortOpen = True'Command3.Caption = " 关闭端口 " End SubPrivate Sub MSComm1_OnComm()Dim lenth As Integer, i As Integer lenth = Len(Text1.Text) + 2ReDim inst

27、ring(1 To lenth) As IntegerSelect Case MSComm1.CommEvent Case comEvReceiveFor i = 1 To lenthinstring(i) = MSComm1.Input(0)Next iEnd SelectText2.Text = ""For i = 1 To lenthIf instring(i) <> 255 And instring(i) <> 127 ThenText2.Text = Text2.Text & instring(i)End IfNext iEnd SubPrivate Sub Timer1_Timer()Text3.Text = DateText4.Text = Time()End SubPrivate Sub Timer2_Timer()Text1 = Text1 + 1If Text1 > 9999 Then Text1 = 1000Command1_Click7End Sub

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1