汇编语言实现串口通信PC和单片机间范本模板Word下载.docx

上传人:b****3 文档编号:8199208 上传时间:2023-05-10 格式:DOCX 页数:17 大小:257.80KB
下载 相关 举报
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第1页
第1页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第2页
第2页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第3页
第3页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第4页
第4页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第5页
第5页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第6页
第6页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第7页
第7页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第8页
第8页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第9页
第9页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第10页
第10页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第11页
第11页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第12页
第12页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第13页
第13页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第14页
第14页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第15页
第15页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第16页
第16页 / 共17页
汇编语言实现串口通信PC和单片机间范本模板Word下载.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

汇编语言实现串口通信PC和单片机间范本模板Word下载.docx

《汇编语言实现串口通信PC和单片机间范本模板Word下载.docx》由会员分享,可在线阅读,更多相关《汇编语言实现串口通信PC和单片机间范本模板Word下载.docx(17页珍藏版)》请在冰点文库上搜索。

汇编语言实现串口通信PC和单片机间范本模板Word下载.docx

命令码

停止标志

 

其中,单片机号代表现场第几台单片机,占用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

GET1:

CJNEA,#07FH,GET2判断是否为结束符,不是跳GET2放数据存贮区

MOVR5,COUNTER;

是结束符,放发送缓存区开始字符

INCR5

MOVPOINT,#30H

MOVSBUF,#255

GET2:

MOV@R0,A

INCR0

INCCOUNTER

EXIT:

POP01H

POPACC

RETI

②单片机中断方式发送程序

由于本次设计的系统要实现的功能是将PC机送到单片机的数据回送到PC机,所以单片机要在接收完PC机数据后立即将数据回送到PC机。

也就是说要将RAM存贮单元的初始地址30H单元内数据逐一发送出去.程序框图见下。

单片机发送主程序MAIN及中断服务程序SEND清单如下:

MAIN:

MOVTMOD,#20H;

MOVPCON,#00H;

MOVTH1,#0F4H;

MOVTL1,#0F4H

MOVR0,#30H;

MOVR1,#30H

SETBTR1;

CLRET1;

MOVSCON,#50H;

MOVIP,#10H

MAIN1:

SRT:

JBCRI,GET;

判断是否为接收,是跳GET接收程序,否执行发送程序

CLRTI

DJNZR5,SEND1

SEND1:

MOVR1,POINT

MOVA,@R1

MOVSBUF,A

INCR1

MOVPOINT,R1

③单片机显示程序

单片机显示部分可以用来检测接收到的数据是否正确,单片机显示程序主要将接AT89C51从串行口收到的数据显示出来。

在程序设计中,在AT89C51RAM存贮器中的四个显示缓冲器单元30H-34H,分别存放着由PC机方发送过来的数据,AT89C51的P2口扫描输出总是只有一位为高电平,即4位显示器中仅有一位公共阴极为低电平,其它位为高电平,AT89C51的P0口相应位(阴极为低)的显示数据的段数据,使该位显示出一个字符,其它们为暗,依次地改变P2口输出为高的位,P0口输出对应的段数据,4位显示器就显示出由缓冲器中显示数据所确定的字符。

程序框图见下:

单片机显示子程序清单如下:

DISP:

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,$

DJNZR2,DISP1;

判断接收位数

DISP2:

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=”"

PrivateSubCommand3_Click()

IfMSComm1。

PortOpen=FalseThen

MSComm1.PortOpen=True

Command3.Caption=”关闭端口”

Else

MSComm1.PortOpen=False

Command3.Caption="

打开端口"

EndIf

PrivateSubForm_Load()

CommPort=1'

定义用端口COM1

Settings="

2400,n,8,1”'

波特率,无奇偶校验,8位数据,1

位停止位

PortOpen=True'

打开端口

Command3。

Caption="

关闭端口"

PrivateSubMSComm1_OnComm()

DimlenthAsInteger,iAsInteger

lenth=Len(Text1。

ReDiminstring(1Tolenth)AsInteger

SelectCaseMSComm1.CommEvent

CasecomEvReceive

Fori=1Tolenth

instring(i)=MSComm1.Input(0)

EndSelect

Text2.Text=”"

Ifinstring(i)<

>

255Andinstring(i)〈>

127

Then

Text=Text2.Text&

instring(i)

PrivateSubTimer1_Timer()

Text3。

Text=Date

Text4.Text=Time()

PrivateSubTimer2_Timer()

Text1=Text1+1

IfText1〉9999ThenText1=1000

Command1_Click7

 

附:

单片机通信程序清单:

MOVSP,#60H

定时器T1的方式2

MOVTL1,#0F4H

MOV30H,#15

MOVCOUNTER,#1

MOVR0,#30H;

ACALLDISP

********中断服务子程序**********

JBCRI,GET;

判断是否为接收,是跳GET接收程序,否执行发送程序

MOVR1,POINT

MOVPOINT,R1

MOVA,SBUF

CJNEA,#0FFH,GET1;

判断是否为开始字符,不是跳GET1放数据存贮区

MOVR0,#30H;

MOVCOUNTER,#0

GET1:

CJNEA,#07FH,GET2;

判断是否为结束符,不是跳GET2放数据存贮区

MOVR5,COUNTER;

是结束符,放发送缓存区开始字符

MOVSBUF,#255

GET2:

*********显示程序**********

JZDISP2;

没有接收到数据,跳出DISP继续显示P.等待状态

MOVA,@R1

ANLA,#0FH

MOVCA,@A+DPTR

MOVP0,A;

MOVA,R6

MOVP2,A;

MOVR6,A

DJNZR2,DISP1;

DISP2:

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

DB77H,7CH,39H,5EH,79H,0F3H

PC机通信程序清单:

outstring=Text1.Text

MSComm1.RThreshold=Len(Text1.Text)+2

Output=Chr(Asc(Mid(outstring,i,1))—48)

MSComm1.Output=Chr(127)

Text2.Text="

"

IfMSComm1.PortOpen=FalseThen

Caption=”关闭端口”

Caption=”打开端口”

MSComm1.CommPort=1'

2400,n,8,1"

’波特率,无奇偶校验,8位数据,1

MSComm1.PortOpen=True'

DimlenthAsInteger,iAsInteger

SelectCaseMSComm1。

CommEvent

Ifinstring(i)〈>

255Andinstring(i)<

Text2.Text=Text2.Text&instring(i)

Text3.Text=Date

IfText1>

9999ThenText1=1000

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

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2