软件说明
利用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的频率,而不能各自用各自的频率)。
| Pout | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 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.
1万+

被折叠的 条评论
为什么被折叠?



