前言
课程设计报告以及IAR文件和C#上位机在文末。
一、设计内容及要求
????????ZigBee分为协调器和终端,终端把传感器采集到的数据发送给协调器,协调器把数据发送给上位机,上位机实时显示数据,达到监测水质的目的。
二、系统的硬件设计
- 传输节点为CC2530,一个作为协调器,两个作为终端
-
DS18B20(温度传感器):用于测量水体温度 -
TSW-30(浊度传感器):用于测量水体浑浊度
2.1 CC2530
?图2-1 ?CC2530引脚图
2.2? ?DS18B20
图2-2? DS18B20硬件接线图
引脚名称 | 功能 | GND | 地线 | DQ | 单总线通信接口,寄生模式时供电端口 | VDD | 电源线(2线通信时接地,以保证芯片内正确识别VDD状态) |
表2-1 ?DS18B20引脚说明
????????DS18B20温度读取函数代码段,数字量读取
void?Temp_test(void)?//温度读取函数??
{??
??uint8?V1,V2;??
???
??Ds18b20Initial();??
??Ds18b20Write(0xcc);??
??Ds18b20Write(0x44);??
????
??Ds18b20Initial();??
??Ds18b20Write(0xcc);??
??Ds18b20Write(0xbe);??
????
??V1?=?Ds18b20Read();??
??V2?=?Ds18b20Read();??
??temp?=?((V1?>>?4)+((V2?&?0x07)*16));????
}?
2.3??TSW-30
引脚定义 | 功能描述 | 备注 | VCC | 供电电压正极,5V | 不可使用3.3V | AO | 模拟信号输出 | 输出电压范围0-5V | DO | 数字信号输出 | 小于设定值输出高电平;大于设定值输出低电平 | GND | 供电电压负极 | |
表2-2? TSW-30引脚描述
????????TSW-30温度读取函数代码段,模拟量读取
uint16?ReadData(?void?)??
{??
??uint16?reading?=?0;??
????
??P0DIR?&=?~0x20;??//?设置P0.5为输入方式??
????
??//asm("NOP");asm("NOP");??
????
??/*?Clear?ADC?interrupt?flag?*/??
??ADCIF?=?0;??
????
??ADCCON3?=?(0x20?|?HAL_ADC_DEC_064?|?HAL_ADC_CHANNEL_5);??
????
??/*?Wait?for?the?conversion?to?finish?*/??
??while?(?!ADCIF?);??
????
??asm("NOP");asm("NOP");??
????
??/*?Read?the?result?*/??
??reading?=?ADCL;??
??reading?|=?(int16)?(ADCH?<<?8);??
??reading?>>=?8;??
????
??return?reading;??
}?
三、系统的软件设计
3.1 ?系统流程框图
图3-1 ?系统流程图
4.2 ?上位机编写
4.2.1 ?切割数据
? ? ? ? 由于不同终端节点的数据接收时间无法完全同步,故不能准确区分数据来源,故采用标志位的方式,在终端发送数据时,增加标志位 ’/c’?和 ’/d’?后紧接数据,由此可以判断数据的来源。
????????通过组合发送数据的标志位 ’/c’?和 ’/d’?切割数据,详情见如下代码段第14行,分离出想要的数据位。
4.2.2 ?显示数据
根据不同的标志位得到不同的数据,根据分离得到数据进行具体显示,详情见如下代码段第15-42行。
private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
string data = string.Empty;
this.Invoke((EventHandler)(delegate
{
data = serialPort1.ReadExisting();
byte[] decBytes = System.Text.Encoding.Default.GetBytes(data);
string str1 = System.Text.Encoding.Default.GetString(decBytes);
string[] info = data.Split('/');
try
{
for (int i = 0; i < info.Length; i++)
{
if (info[i] == "c")
{
//浊度
float f1 = Convert.ToSingle(info[i + 1]);
label6.Text = Convert.ToString((int)f1 * 50 / 127);
chart1.Series["浊度"].Points.AddXY(zdx++, (int)f1 * 50 / 127);
if (zdx > 20)
chart1.Series["浊度"].Points.Clear();
this.listBox1.Items.Add(Time_Count.Text + "," + "浊度," + Convert.ToString((int)f1 * 50 / 127));
}
else if (info[i] == "d")
{
//温度
float f1 = Convert.ToSingle(info[i + 1]);
label7.Text = Convert.ToString(f1);
chart1.Series["温度"].Points.AddXY(wdx++, f1);
if (wdx > 20)
chart1.Series["浊度"].Points.Clear();
this.listBox2.Items.Add(Time_Count.Text + "," + "温度," + Convert.ToString(f1));
}
}
}
catch
{
}
})
);
}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
MessageBox.Show(ex.Message);
}
}
附录?
百度网盘,? 提取码:tv6a
|