引言
无论是在日常生活还是在工业生产中,温度都是一个非常重要的指标。所以,对温度数据的采集、测量和传输,一直都是研究的重点。传统的温度采集系统的实现方法包括专门铺设有线通信线路传输温度数据(如采用RS485总线结构)和采用无线通信传输温度数据(如蓝牙,GPRS等)。传统的铺设专有的通信线路的方法设计成本较高、施工麻烦、出现问题时很难排除,已经很难适应高速发展的现代社会的需求。采用无线的方式则具有不用布线、实时性高等优点,但是其设计成本也相应的非常高。而在现代社会中,电力线几乎无处不在,因此,本文提出了一种基于电力线通信的温度采集系统,无需专门铺设通信线路,能够大大降低设计成本。
1 系统总体设计方案
1.1 温度检测模块总体构架
温度检测模块中,STC12LE5A60S2是主控芯片,由电源模块、LCD显示、电力线通信芯片RISE3501、DS18B20温度传感器、RS232等电路构成。总体构架如图1所示。

图1 温度检测模块总体构架
1.2 系统的拓扑结构
该系统采用主从式的工作模式,在满足电力线通信距离的检测区域内,放置一个嵌入式上位机、一个主机模块和多个温度检测模块,如图2所示。嵌入式上位机可以发起抄温度的指令给主机模块,主机模块则通过电力线抄写相应模块的。

图2 系统的拓扑结构
温度,并将温度数据返回给上位机。例如:在某居民小区,每户人家放置一个检测模块,整个小区设置一个主机模块和上位机,则可以实现对小区内每户人家的温度采集。
本文主要实现温度检测模块和主机模块的软硬件设计。在本设计中,可以更改温度检测模块的主控芯片内的程序,从而将其当做主机模块使用。
2 系统硬件设计
2.1 电源模块
2.1.1 220V交流电转16V直流电
变压器将220V交流电转换为16V交流电,桥式整流电路将16V交流电转化为直流电,通过电容电感滤波后得到大约16V直流电。这个16V直流将直接给电力线通信芯片的发送电路的功率放大器供电。如图3所示。

图3 220V交流转16V直流
2.1.2 16V电压转化为5V电压
使用78M05电源芯片将16V直流电转化为5V直流电。这个5V直流电将给DS18B20温度传感器供电。如图4所示。

图4 16V电压转5V电压
2.1.2 5V电压转3.3V电压
使用AP1117将5V直流电转化为VCC3.3V电压。再通过磁珠F-BEAD分出来VCCA3.3V,VCCA3.3V将给电力线通信芯片的接收电路供电。

图5 5V电压转3.3V电压
2.2 主控芯片STC12LE5A60S2
本系统采用具有两个串口的STC12LE5A60S2作为系统的主控单片机。其特点如下:
是单时钟周期、高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统的8051单片机,但速度快8~12倍。片上集成60K Flash存储器,可用于存储程序和温度数据,非常有利于系统的软件的升级换代。
该单片机具有双串口,这是选择这款单片机最主要的原因之一。在系统设计中,使用其中的一个串口和电力线通信芯片进行通信,从而控制电力线通信芯片收发数据。另一个串口则用于下载程序、打印系统调试信息以及和上位机通信(温度检测模块用作主机模块时)等。
无需专用下载器,无需专用仿真器,可通过串口直接下载用户程序。从而降低了设计开发的难度,降低了设计成本。
2.3 电力线通信电路
本系统使用RISE3501实现电力线通信。RISE3501是一款智能型电力载波控制芯片,内部集成电力收发模块,Flash、SRAM以及 8位处理器内核。设计符合EIA-709.1和EIA-709.2标准规范。
RISE3501可以通过串口和主控单片机通信。单片机将满足645规约的指令和数据通过串口发送给RISE3501,RISE3501则通过电力线将数据发送出去。当RISE3501从电力线上接收到发给自己的数据时,其将数据收下,并将数据通过串口发送给主控单片机。
2.4 LCD显示模块
本系统使用6位笔段式LCD EDS826来显示当前温度,采用HT1621B 驱动芯片来驱动EDS826的显示。这里不使用STC12LE5A60S2单片机直接驱动EDS826,这样可以简化系统软硬件设计的复杂度,减轻主控单片机的任务,从而有利用系统的升级与扩展。其电路结构如图6所示。

图6 LCD显示电路
2.5 温度检测电路
本系统的温度传感器使用DS18B20。DS18B20 数字温度计以9 位数字量的形式反映器件的温度值。通过一个单线接口发送或接收信息,因此在主控单片机和DS18B20 之间仅需一条连接线(加上地线)。测温范围-55~+125℃,以0.5℃递增。温度数字量转换时间200ms(典型值)。电路结构如图7所示。

图7 温度检测电路
3 系统软件设计
在本系统中,主机模块的硬件和温度检测模块的硬件是完全相同的,但是运行在主机模块内的程序和运行在温度检测模块内的程序不同。
3.1 主程序设计
3.1.1 主机模块的主程序流程图如图8所示。主要分为以下几步:
(1) 系统上电复位后,主程序初始化LCD显示的驱动芯片HT1621B、初始化温度传感器DS18B20、初始化串口1和串口2、复位电力线通信芯片RISE3501。
(2) 初始化完成后,单片机检测和RISE3501的连接状态,如果没有连接好,RISE3501将会通过串口2不断的给单片机发送握手序列,此时单片机给RISE3501回复满足645规约的指令,将RISE3501置于发送模式。
(3) 接下来是温度的显示。在应用中,主程序没有必要随时去读取温度来显示,所以,这里设置一个变量来划分时间,时间间隔大约1000ms,变量减为0时,单片机读取温度数据,并将温度数据发送给HT1621B,HT1621B驱动LCD显示出来。
(4) 然后,单片机判断上位机是否给自己发来数据。前面提到,上位机通过串口1和单片机通信。如:当上位机需要抄写温度时,通过串口1给单片机发送抄写温度的指令。当单片机检测到串口1有数据时,将数据接收下来,并解析数据包含的指令信息。
(5)接下来,主机模块的单片机判断是否需要抄写从机的温度。需要抄写时,单片机执行抄写温度的代码,并将抄写的温度数据返回给上位机。
至此,一个主程序流程走完,程序返回到(2)的位置,检测单片机和RISE3501的状态。需要再次检测单片机和RSIE3501的连接状态的原因是:当RISE3501与单片机握手成功后,其90秒后会再次发送握手指令,以确保与单片机的连接。所以,主程序需要循环检测单片机与RISE3501的连接状态。

图8 主机模块的主程序流程图
3.1.2 温度检测模块的主程序
温度检测模块的主程序流程图如图9所示。主要分为以下几步:
(1) 系统初始化(和主机模块相同)。
(2) 单片机和RISE3501握手,且将RISE3501置于接收模式,随时准备接收主机模块发来的数据。
(3) 读取温度并显示(和主机模块相同)
(4) 如果收到主机模块的抄温度请求,则将温度数据发送给主机模块。
(5) 返回步骤(2)

图9 温度检测模块的主程序流程图
3.2 与电力线通信相关的程序设计
本系统使用RISE3501实现电力线通信。通信的数据格式满足645规约。可以通过软件给RISE3501设定唯一的地址,这个地址也就是本模块的地址。
3.2.1 645规约规定的数据格式

每字节含8 位二进制码,传输时加上一个起始位(0)、一个偶校验位和一个停止位(1),共11 位。其传输序列如图7。D0 是字节的最低有效位,D7 是字节的最高有效位。先传低位,后传高位。
(2) 帧格式

帧是传送信息的基本单元。帧格式如上表所示。
帧起始符 68H:标识一帧信息的开始,其值为68H=01101000B。
地址域A0~A5:地址域由6 个字节构成,每字节2 位BCD 码。地址长度可达12 位十进制数,可以为表号、资产号、用户号、设备号等。具体使用可由用户自行决定。当使用的地址码长度不足6 字节时,用十六进制AAH 补足6 字节。低地址位在先,高地址位在后。当地址为999999999999H 时,为广播地址。
控制码 C:控制码的格式如下所示:

D7=0:由主站发出的命令帧
D7=1:由从站发出的应答帧
D6=0:从站正确应答
D6=1:从站对异常信息的应答
D5=0:无后续数据帧
D5=1:有后续数据帧
D4~D0:请求及应答功能码
00000:保留
00001:读数据
00010:读后续数据
00011:重读数据
00100:写数据
01000:广播校时
01010:写设备地址
01100:更改通信速率
01111:修改密码
10000:最大需量清零
数据长度L:L 为数据域的字节数。读数据时L≤200,写数据时L≤50,L=0 表示无数据域。
数据域DATA:数据域包括数据标识和数据、密码等,其结构随控制码的功能而改变。传输时发送方按字节进行加33H 处理,接收方按字节进行减33H 处理。
校验码CS:从帧起始符开始到校验码之前的所有各字节的模256 的和,即各字节二进制算术和,不计超过256 的溢出值。
结束符 16H:标识一帧信息的结束,其值为16H=00010110B。
在发送帧信息之前,先发送 1~4 个字节FEH,以唤醒接收方。
所以,单片机向RISE3501发送数据前,需要先将要发送的数据打包成满足以上帧格式的帧,然后再发送。单片机接收收到RISE3501的帧后,也要按上述帧格式解析,得到实际数据。如:
主机向从机发送的抄写温度的指令的帧,其实现代码如下:
void Get_slave_cmd_3501(unsigned char *arr)
{
unsigned char i;
unsigned char tmp=0;
arr[0] = 0xFE;
arr[1] = 0xFE;
arr[2] = 0xFE;
arr[3] = 0xFE;
arr[4] = 0x68;
for(i=0;i<6;i++)
arr[i+5] = SLAVE_ADDR_BUF[i]; //将从机的地址拷贝进来
arr[11] = 0x68;
arr[12] = 0x04; //C控制码
arr[13] = 0x06; //L 指令的长度
for(i=0;i<6;i++)
arr[i+14] = 0xCC; // 向slave 发送的抄温度指令
for(i=4;i<20;i++)
tmp = tmp + arr[i]; //计算校验位CS
arr[20] = tmp;
arr[21] = 0x16;
}
其中,SLAVE_ADDR_BUF[]内是需要抄温度的从机的地址,0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC 是表示抄写温度的指令。
温度检测模块返回的温度数据的帧,其代码实现如下:
void Get_TMP_3501(unsigned char *arr)
{
unsigned char i;
unsigned char tmp = 0;
arr[0] = 0xFE;
arr[1] = 0xFE;
arr[2] = 0xFE;
arr[3] = 0xFE;
arr[4] = 0x68;
for(i=0;i<6;i++)
arr[i+5] = HOST_ADDR_BUF[i]; //将主机的地址拷贝进来
arr[11] = 0x68;
arr[12] = 0x04; //C控制码
arr[13] = 0x06; //L 温度数据的长度
for(i=0;i<6;i++)
arr[i+14] = TMP[i]; //将温度数据拷贝过来
for(i=4;i<20;i++)
tmp += arr[i]; //计算校验位CS
arr[20] = tmp;
arr[21] = 0x16;
}
其中,HOST_ADDR_BUF[]内是主机的地址,TMP[]内是当前的温度。
3.2.2 单片机与RISE3501握手程序
RISE3501具有发送工作模式和接收工作模式。当处于发送工作模式时,可以将单片机发给自己的数据转发到电力线上;当处于接收工作模式时,可以接收电力线上的属于与自己地址相符合的数据,并将数据转发给单片机。从而实现了在电力线上的数据的收发。
RISE3501复位后,将给单片机发送握手请求:68 AA AA AA AA AA AA 68 13 00 DF 16。
单片机给RISE3501回复:68 A0 A1 A2 A3 A4 A5 68 81 08 65 F3 (A0 +33) (A1+33)(A2 +33)(A3 +33)(A4 +33)(A5+33)CS 16,则将RISE3501置于接收模式,其中A0~A5是本模块的地址。
单片机给RISE3501回复:68 CC CC CC CC CC CC 68 81 08 65 F3 (A0 +33) (A1+33)(A2 +33)(A3 +33)(A4 +33)(A5+33)CS 16 ,则将RISE3501置于发送模式,其中A0~A5是本模块的地址。
在应用中,即使握手成功后,RISE3501也需要随时和单片机保持连接状态,为此RISE3501隔90秒后将再次给单片机发送握手信号。所以,单片机的主程序需要循环检测RISE3501发送的握手信号。
3.2.3 温度数据的抄写和传输程序
主机模块抄写温度检测模块的温度的程序流程图如图10所示。

图10 主机模块抄写温度检测模块的温度的程序流程图
温度检测模块给主机模块发送温度数据流程图如图11所示。

图11 温度检测模块返回温度数据给主机模块流程图
3.3 温度检测程序
通过DS18B20检测温度的单片机程序如下
void GetTemperature(void)
{
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!DQ); //等待转换完成
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TPL = DS18B20_ReadByte(); //读温度低字节
TPH = DS18B20_ReadByte(); //读温度高字节
}
读取到的温度数据的高字节保存在TPH里、低字节保存在TPL里。此时的温度数据时十六进制的,为了方便温度显示和人们的日常习惯,需要将温度数据转化为十进制。
3.4 LCD显示温度的程序
EDS826是6位笔段式LCD,温度显示为2位小数位、3位整数位、1位符号位和小数点。如:0090.50,表示零上90.5度。-005.50,表示零下5.5度。
符号位 百位 十位 个位 小数点后1位 小数点后2位
单片机通过向HT1621B发送命令来控制LCD的显示。HT1621B显示驱动芯片具有两种命令模式:数据模式和命令模式。数据模式命令包括READ、WRITE和READ-MODIFY-WRITE,它们的识别码分别为110、101、101。命令模式的命令较多,其识别码是100。
EDS826显示一位数据的流程图如图12所示。

图12 EDS826显示一位数据的流程图
完整的温度显示只需要将每一位的温度数据显示出来即可。
4 PCB板设计以及系统实现
本系统使用Cadence公司的原理图设计工具concept-HDL进行电路原理图设计,使用Allegro进行PCB板设计。最终模块的实现如下:

结语
本文设计了一种温度采集系统,利用电力线通信技术,实现了主机模块和温度检测模块之间的温度数据在电力线上传输。系统使用STC12LE5A60S2、RISE3501电力线通信芯片、DS18B20温度传感器、EDS826笔段式LCD进行设计。具有本地显示温度以及远程抄温度的功能。可以应用在铺设有220V交流电的地方,具有很宽的应用范围和较好的实用价值。