Proteus实现串口控制继电器

2025-11-19 09:30:44

1、操作系统不断升级,越来越多的新特性需要.NET支持。

2、VB.NET编程更简单,功能更强大。

3、执行速度,以往大家总拿C与VB比较,认为C快,VB慢,但是在.NET平台下,C与VB 仅仅是描述语言不同,下层执行代码完全统一,没有速度区别。关于这一点大家可以拿去和idealbum.com的上一个项目“串口调试助手VB版”做个比较,差距还是很明显的。
既然是大势所趋,所以最好还是转向.NET的开发为好。以下的串口控制继电器就是基于VB.NET开发的,原来由马工出品,后经我个人修正了部分BUG并仿真与调试了下位机,作为基础项目,也算是比较完美了。上位机VB.NET源码:
Public Class Form1
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = Now
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.Close()
End Sub
Dim temp As String = “”
Dim x, y, z As Integer
Dim send As Byte()
Dim buff As String
Dim DATA1, DATA2 As String
Private Sub CheckBox_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
CheckBox1.CheckedChanged,CheckBox2.CheckedChanged,CheckBox3.CheckedChanged,
CheckBox4.CheckedChanged,CheckBox5.CheckedChanged,CheckBox6.CheckedChanged,CheckBox7.CheckedChanged,
CheckBox8.CheckedChanged,CheckBox9.CheckedChanged,CheckBox10.CheckedChanged,CheckBox11.CheckedChanged,
CheckBox12.CheckedChanged,CheckBox13.CheckedChanged,CheckBox14.CheckedChanged,CheckBox15.CheckedChanged,
CheckBox16.CheckedChanged
temp = “”
If CheckBox1.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox2.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox3.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox4.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox5.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox6.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox7.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox8.Checked Then
temp += “1″
Else
temp += “0″
End If
TextBox1.Text = temp
‘*******************************************************
‘二进制文本转换为10进制
‘*******************************************************
y = 0
‘ temp = “10010010″
For x = 1 To 8
z = Mid(temp, x, 1)
If z = 1 Then
Select Case x
Case 1
y += 1
Case 2
y += 2
Case 3
y += 4
Case 4
y += 8
Case 5
y += 16
Case 6
y += 32
Case 7
y += 64
Case 8
y += 128
End Select
End If
Next
TextBox2.Text = y
‘*******************************************************
’10进制文本转换为16进制
‘*******************************************************
If Len(Hex(y)) < 2 Then
TextBox3.Text = “0″ + Hex(y)
Else
TextBox3.Text = Hex(y)
End If
‘*****************************************************
temp = “”
If CheckBox9.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox10.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox11.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox12.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox13.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox14.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox15.Checked Then
temp += “1″
Else
temp += “0″
End If
If CheckBox16.Checked Then
temp += “1″
Else
temp += “0″
End If
TextBox4.Text = temp
y = 0
‘ temp = “10010010″
For x = 1 To 8
z = Mid(temp, x, 1)
If z = 1 Then
Select Case x
Case 1
y += 1
Case 2
y += 2
Case 3
y += 4
Case 4
y += 8
Case 5
y += 16
Case 6
y += 32
Case 7
y += 64
Case 8
y += 128
End Select
End If
Next
TextBox5.Text = y
If Len(Hex(y)) < 2 Then
TextBox6.Text = “0″ + Hex(y)
Else
TextBox6.Text = Hex(y)
End If
DATA1 = TextBox3.Text
DATA2 = TextBox6.Text
buff = “0A” + DATA1 + DATA2 + “0D”
TextBox7.Text = buff
STRTOBIN() ‘文本转换为二进制,通过串口发送二进制数据
‘********************************
‘通过端口发送命令, ‘文本转换为二进制,通过串口发送二进制数据
Try
AxMSComm1.CommPort = 1 ‘”1″ ‘参数设置 设端口号
AxMSComm1.Settings = “9600,n,8,1″ ‘ 设波特率
AxMSComm1.PortOpen = True ‘打开端口
AxMSComm1.Output = SEND
AxMSComm1.PortOpen = False ‘关闭端口
ToolStripStatusLabel1.Text = (“发送成功!” + “ 端口” + Str(AxMSComm1.CommPort) + “ ” + “ 设置” + AxMSComm1.Settings) ‘ 显示状态
Catch ex As Exception
MsgBox(“发送失败!端口可能被占用或是无效的端口!”)
End Try
End Sub
‘*******************************************************
‘文本转换为二进制,通过串口发送二进制数据
‘*******************************************************
Public Sub STRTOBIN()
‘文本转换为二进制,通过串口发送二进制数据
Dim X As Integer = 1
Dim Y As Integer = Len(buff)
Dim z As Integer = 0
‘ Dim SEND As Byte()
ReDim SEND(Y / 2 – 1)
While X < Y
SEND(z) = Val(“&H” + (Mid(buff, X, 2)))
z += 1
X += 2
End While
‘ AxMSComm1.Output = SEND
End Sub
End Class
==================================================================\
下位机的程序至关重要,在这里我是用汇编来写的,一来简洁,二来高效。代码如下:
//--------------------------------------------------
//设置串行口 波特率9600
//串行口设置MODE1,SM0=0,SM1=1,SMOD=0
//晶振11.0592,定时设置为0FDH
//常用端口设置参数
//FD 9600
//FA 4800
//F4 2400
//E8 1200
//--------------------------------------------------
//***********************************************************
//定义端口
//***********************************************************
J1 BIT P0.0
J2 BIT P0.1
J3 BIT P0.2
J4 BIT P0.3
J5 BIT P0.4
J6 BIT P0.5
J7 BIT P0.6
J8 BIT P0.7
J9 BIT P2.7
J10 BIT P2.6
J11 BIT P2.5
J12 BIT P2.4
J13 BIT P2.3
J14 BIT P2.2
J15 BIT P2.1
J16 BIT P2.0
//***********************************************************
ORG 00H
JMP START
ORG 23H
JMP UART
ORG 30H
START: MOV SP,#70H
MOV SCON,#50H //设置串口为工作方式1,即波特率由定时器控制
MOV TMOD,#21H //TIM1在模式2,即8位自动重装计数器模式 TIM0在模式1,即16位非自动重装计数器模式
MOV TH1,#0FDH //设置定时时间
MOV TL1,#0FDH
SETB TR1 //启动定时器1
SETB ES //允许串口中断
SETB EA //允许总中断
MOV P0,#0 //P0、P2输出低电平
MOV P2,#0
JMP $ //等待状态
//*****************************************
//串行口中断
//*****************************************
UART: PUSH ACC //现场保护
PUSH PSW
CLR ES //关闭串行口中断
MOV TH0,#00
MOV TL0,#00
SETB TR0 //开定时器0
MOV 30H,#00 //同步位
MOV 31H,#00 //数据1
MOV 32H,#00 //数据2
MOV 33H,#00 //结束位
MOV R0,#30H
REC:
JBC TF0,FS //接收时间是否超时?是则执行FS
JNB RI,REC //接收数据
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
JMP REC
FS: CLR TR0 //关定时器0
//********************************
CALL FUN //解码并控制继电器
SETB ES //开串行口中断
POP PSW //现场恢复
POP ACC
RETI //中断子程序返回
//****************************************
//解码并控制继电器
//下面的程序可以更简洁,但为了方便,展开来编制
//****************************************
FUN: MOV A,#0AH //判断第1字节即同步位
CJNE A,30H,ERR
MOV A,#0DH //判断第4字节即结束位
CJNE A,33H,ERR
//****************************************
//第2字节即数据位1,代表继电器J1-8
//第3字节即数据位2,代表继电器J9-16
//****************************************
MOV A,31H
MOV P0,A
MOV A,32H
MOV P2,A
RET
//**************************************
// 数据错误处理
//**************************************
ERR:
MOV 30H,#00 //同步位
MOV 31H,#00 //数据1
MOV 32H,#00 //数据2
MOV 33H,#00 //结束位
RET
END //程序结束
=========================================================

Proteus实现串口控制继电器

4、 另外,对于这个项目我做了一份完整的Proteus仿真,通过虚拟串口实现Proteus与上位机实现互联,当上位机选中某个继电器模块时,下位机相应的继电器动作。在下位机的程序中设置有数据校验,也满足了恶劣环境下工作的稳定性。

Proteus实现串口控制继电器

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢