基于51的多路DA调节监控软件实现

@基于51的多路DA实现

软件说明

利用VS设计PC监控软件0(上位机)通过串口与单片机(STC12C5A60S2)实现网络通信,控制多路DA输出(频率可控,占空比可控),上位机采用modbus协议实现对多路DA的控制,并且可利用通信地址对多路DA的工作状态,输出强度进行查询与监控。

设计

上位机部分

界面设计,除正常的串口选择、波特率设置、以及发送接收模式外,添加一个扫描按键,可直接扫描到连接单片机的串口号,若未扫到则整个下拉框显示空白。设置按键为发送DA控制块调节的上数据。
在这里插入图片描述
串口扫描程序

//函数名/函数参数传递(串口号,下拉框)
 SearchAndAddSerialToComBox(serialPort1, comboBox1);
// An highlighted block
private void SearchAndAddSerialToComBox(SerialPort Myport, ComboBox MyBox)
{
      string[] MyString = new string[20];
      string Buffer;
      MyBox.Items.Clear();        //清空
      int count = 0;
      for (int i = 1; i < 20; i++){
          try
          {
              Buffer = "COM" + i.ToString();
              Myport.PortName = Buffer;
              Myport.Open();
              MyString[count] = Buffer;
              count++;
              MyBox.Items.Add(Buffer);
              Myport.Close();
          }
          catch{;}
      }
      MyBox.Text = MyString[0];
}

对于DA控制块,在选择输出的占空比后,采用modbus协议并通过串口发送。

modbus协议简略介绍

modbus 是一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单。
先来简单分析一条MODBUS-RTU报文,例如:01 06 00 01 00 17 98 04
01 06 00 01 00 17 98 04
从机地址 功能号 数据地址 数据 CRC校验

在此软件中,采用 从机地址 + 功能码 + DA控制管脚地址 + DA数据(占空比)+ 截止位
从机地址:01,
功能码:01为改变DA输出,02位查询DA状态
管脚地址:1-8,分别对应单片机的P1^0 - P1^7
DA数据:0-10
截止位:暂定为0xff
例:
在这里插入图片描述

注:此处采用虚拟串口驱动连接电脑的com1和com2,再启动两上位机进行互相通信。(虚拟串口软件为VSPD)

只改变第一个输出口的DA变化,得到的第一个报文为 01 01 01 02 FF
其中,报文解释为01:从机地址 01:改变DA(02为查询DA) 01:输出DA的管脚地址 02:占空比百分之二十 FF:截止码(判断一次报文的结束)

单片机部分

uart接收,没有任何特殊的地方,直接配置STC12的串口初始化后即可使用。

if (RI)				
	{
		RI = 0;			
		UartData[j] = SBUF;
		if(j==0&&UartData[j]==0x01)j++;
		else if (j==1||j==2|j==3) j++;
		else if(j==4&&UartData[j]==0xff)
		{j=0;RIsign=1;}
	}

判断报文第一位是否为从机地址(0x01),二三四位为数据,第五位为截止码(0xff),成功收取到一条报文将RIsign拉高。

DA部分

此部分采用将8路DA整合后共同输出的方法。定义一个8位数组,u8 Pout[10],共10个8位数,每个8位数分别对应DA输出的8个管脚。共10个,直接将数组赋给输出的端口(P1管脚),即可得到8位不同占空比的PWM波。(此处他们8路PWM所用的时钟是相同的,导致频率一致,若要更改则更改的是8路DA的频率,而不能各自用各自的频率)。

Pout76543210
Pout[0]1
Pout[1]1
Pout[2]1
Pout[3]1
Pout[4]1
Pout[5]1
Pout[6]
Pout[7]
Pout[8]
Pout[9]

如上表,没填数的地方全为0。横轴代表u8定义的8个位,若如上图所示,将Pout依次赋给单片机输出管脚(P1),P1^6将会输出占空比位60%的方波。用这种方式就达到了仅用一个数组完成了对8路DA的调控。

for(i=0;i<10;i++)
{
	if(i<PWM)	Pout[i] |= (0x01 << da_add - 1);
	else	Pout[i] &= ~(0x01 << da_add - 1);					
}

da_add是报文中的第三个数。每来一条报文就将报文中的DA数据提取并存储到Pout数组里对应的位置。变量PWM为报文第四位。
由上位机部分发送数据的方式得知,一次设置是发送8条报文,每个地址的DA都需要发送一条,则在单片机接收端,每次收到一条报文后进行一次上述解析,即可得到所要的DA输出数据。
最终在定时器中,输出Pout,达到8路输出不同占空比方波的目的。

DA状态查询功能

已将输出DA数据全部存储到Pout中,状态查询即是在Pout中提取每个管脚的占空比(也就是上述表格中一列里1的个数)。

for(j=0;j<8;j++)
{
	for(i=0;i<10;i++)
	{
		xx = Pout[i];
		if(xx & (0x01<<j)) lPWM[j] += 1;
	}
}

此中,将得到的每个PWM数据放在lPWM中,lPWM[0]则是P1^0输出方波的占空比。
最后将查询到的数据在通过串口发送给上位机。

总结

此次设计中,没有难点,各个块的思路很清晰,且代码也很简单。唯一让我觉得巧妙的地方就是DA输出采用一个数组控制的方式,是一个8位数组的每一位都能得到利用。

初尝Blog,描述混乱,见谅!
源代码链接: 多路DA上位机+单片机源码.zip.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>