让我们来个彻底的研究:如何用VB实现PC机与单片机的通信?
有做过单片机通讯工程的工程师们都一起来吧!让我们一起愉快地交流、轻松的探讨,把您的思想和大家说说,把您未能解决的问题和大家讨论,把您拥有的经验和大家交流,把您宝贵成果和大家分享......哪怕每个人只是奉献出一点点,说了,讨论了,交流了,那我们将拥在座所有人的智慧,come on!
全部回复(3)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
我先顶了
实现功能:
用VB编一个界面,界面如下:
实现功能:
用VB编一个界面,界面如下:
计算机任意发送一个十六进制0-FFH,单片机对应接收一个十六进制0-FFH,
用单片机P2口依次接上八个指示灯,以观看其输出结果(亮代表1,灭代表0).
上位机程序(发送):计算机
'******************************************
'初始化串口
'******************************************
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.Handshaking = comNone
MSComm1.EOFEnable = False
MSComm1.DTREnable = False
MSComm1.RTSEnable = False
MSComm1.InputLen = 1
MSComm1.RThreshold = 1
MSComm1.InBufferSize = 1
MSComm1.OutBufferSize = 1
MSComm1.SThreshold = 0
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.InputMode = comInputModeBinary
'******************************************
'计算机根据用户输入数据发送数据给单片机
'******************************************
Private Sub Button_SEND_Click()
Dim X As String
Dim Num As Variant
Dim outbyte(0) As Byte
If Text_SEND.Text = "" Then
X = MsgBox("发送数据不能为空", 16)
Exit Sub
End If
If Not MSComm1.PortOpen Then
MSComm1.PortOpen = True
End If
Num = str(Text_SEND.Text)
outbte(0) = CByte(Num)
MSComm1.OutBufferCount = 0 '...清空输出寄存器
MSComm1.Output = outbyte '...发送数据
End Sub
下位机程序(接收):单片机
;*****************************************
;CPU:AT89C51 晶振:11.0592MHz
;*****************************************
BUFFER EQU 7FH
ORG 0000H
JMP MAIN
ORG 0023H
JMP RECEIVE
MAIN:
MOV SP,#30H
MOV BUFFER,#00H
MOV PCON,#00H ;波特率不倍增
MOV SCON,#40H ;串行通讯为方式1,即1起始位+8数据位+停止位,无校验位
MOV TMOD,#20H ;定时器T1为方式1
MOV TH1 ,#0FDH
MOV TL1 ,#0FDH ;波特率为9600 bit/s
SETB REN ;允许接收
SETB ES ;使能单片机串行中断
SETB EA ;打开总中断
SETB TR1 ;启动定时T1
LOOP:
MOV A,BUFFER
CPL A
MOV P2,A ;实时将接收缓存值BUFFER取反输出
JMP LOOP
RECIVE:
PUSH ACC
CLR RI
MOV A,SBUF
MOV BUFFER,A ;读取计算机发送过来的数据到BUFFER
RETI
END
实现功能:
用VB编一个界面,界面如下:
实现功能:
用VB编一个界面,界面如下:
计算机任意发送一个十六进制0-FFH,单片机对应接收一个十六进制0-FFH,
用单片机P2口依次接上八个指示灯,以观看其输出结果(亮代表1,灭代表0).
上位机程序(发送):计算机
'******************************************
'初始化串口
'******************************************
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.Handshaking = comNone
MSComm1.EOFEnable = False
MSComm1.DTREnable = False
MSComm1.RTSEnable = False
MSComm1.InputLen = 1
MSComm1.RThreshold = 1
MSComm1.InBufferSize = 1
MSComm1.OutBufferSize = 1
MSComm1.SThreshold = 0
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.InputMode = comInputModeBinary
'******************************************
'计算机根据用户输入数据发送数据给单片机
'******************************************
Private Sub Button_SEND_Click()
Dim X As String
Dim Num As Variant
Dim outbyte(0) As Byte
If Text_SEND.Text = "" Then
X = MsgBox("发送数据不能为空", 16)
Exit Sub
End If
If Not MSComm1.PortOpen Then
MSComm1.PortOpen = True
End If
Num = str(Text_SEND.Text)
outbte(0) = CByte(Num)
MSComm1.OutBufferCount = 0 '...清空输出寄存器
MSComm1.Output = outbyte '...发送数据
End Sub
下位机程序(接收):单片机
;*****************************************
;CPU:AT89C51 晶振:11.0592MHz
;*****************************************
BUFFER EQU 7FH
ORG 0000H
JMP MAIN
ORG 0023H
JMP RECEIVE
MAIN:
MOV SP,#30H
MOV BUFFER,#00H
MOV PCON,#00H ;波特率不倍增
MOV SCON,#40H ;串行通讯为方式1,即1起始位+8数据位+停止位,无校验位
MOV TMOD,#20H ;定时器T1为方式1
MOV TH1 ,#0FDH
MOV TL1 ,#0FDH ;波特率为9600 bit/s
SETB REN ;允许接收
SETB ES ;使能单片机串行中断
SETB EA ;打开总中断
SETB TR1 ;启动定时T1
LOOP:
MOV A,BUFFER
CPL A
MOV P2,A ;实时将接收缓存值BUFFER取反输出
JMP LOOP
RECIVE:
PUSH ACC
CLR RI
MOV A,SBUF
MOV BUFFER,A ;读取计算机发送过来的数据到BUFFER
RETI
END
0
回复
提示