基于 LabVIEW 的串口温度监控系统设计
张兴成 20051001168
摘要:本系统利用 DS18B20 数字温度传感器和 Atmel 公司生产的 AVR 系列 ATmega16
单片机采集被测环境温度,将测得的数据经串口传给计算机。计算机利用 LabVIEW 的
VISA 读取串口数据并进行处理和显示,实现基于 VISA 的串口温度采集监控。
关键词:DS18B20 温度传感器 AVR 单片机 VISA 串口
1、 概述
实时数据采集是工业控制系统中必不可少的组成部分,是进行工业分析,工业处理
和工业控制的依据。近年来由于大规模集成电路、单片机、计算机等在工业控制领域中
的广泛应用,数字化的数据采集成为必然。这就对传感器的 A/D 性能,单片机的数据采
集、处理和传输性能,计算机接口与通信技术提出了更高的要求。
本系统采用 Atmel 公司生产的高速 8 位单片机 AVR 系列 ATmega16 单片机作为
温度数据采集和传输的主控芯片,温度传感器采用单总线方式的集成数字温度传感器
DS18B20 。采集得到的数据利用单片机经串口通讯的方式传输至计算机的串口。计算
机上位机软件采用数据处理能力超强的 LabVIEW 软件编写,利用其所带的 VISA 驱动
进行串口的数据采集和处理,实现基于 VISA 的串口温度采集监控。
2、 硬件设计
AVR 单片机是 1997 年由 ATMEL 公司研发出的增强型内置 Flash 的 RISC(Reduced
Instruction Set CPU) 精简指令集高速 8 位单片机。AVR 的单片机可以广泛应用于计算机
外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域,它与 51 单片
机、PIC 单片机相比具有一系列的优点:
1:在相同的系统时钟下 AVR 运行速度最快;
2: 芯片内部的 Flsah、EEPROM、SRAM 容量较大;
3:所有型号的 Flash、EEPROM 都可以反复烧写、全部支持在线编程烧写(ISP);
4:多种频率的内部 RC 振荡器、上电自动复位、看门狗、启动延时等功能,零外围
电路也可以工作;
5:每个 IO 口都可以以推换驱动的方式输出高、低电平,驱动能力强;
6:内部资源丰富,一般都集成 AD、DA 模数器、PWM、SPI、USART、TWI、I2C
通信口、丰富的中断源等。
目前支持 AVR 单片机编译器的语言主要有汇编语言、C 语言、BASIC 语言等。其
中 C 编译器主要有 CodeVisionAVR、AVRGCC、IAR、ICCAVR 等,C 语言编译器由于
它具有功能强大、 运用灵活、代码小、运行速度快等先天性的优点,使得它在专业程
序设计上具有不可代替的地位。
DSl8B20 数字温度计提供 9 位(二进制)温度读数,指示器件的温度。信息经过单线
接口送入 DSl8B20 或从 DSl8B20 送出,因此从主机 CPU 到 DSl8B20 仅需一条线(和地
线) ,DSl8B20 的电源可以由数据线本身提供而不需要外部电源。因为每一个 DSl8B20
在出厂时已经给定了唯一的序号,因此任意多个 DSl8B20 可以存放在同一条单线总线
上,这允许在许多不同的地方放置温度敏感器件。DSl8B20 的测量范围从-55 摄氏度到
+125 摄氏度增量值为 0.5 摄氏度。可在 l s(典型值)内把温度变换成数字。
系统的硬件设计主要分为四个部分:单片机、供电电路、DS18B20、串口通讯。
图 1:单片机部分电路设计
单片机部分的电路设计如图 1 所示,主要包括复位电路、ISP 接口、JTAG 接口、晶振
电路、A/D 参考电压电路(此部分用于 AD 采集,本系统并未使用)。复位电路使用了钳位
二极管钳位,防止触点电压过高烧坏 RESET 引脚。
图 2:供电电路设计
图 3:DS18B20 电路设计
供电电路如图 2 所示,供电电路使用了 BM1117 进行稳压,防止电压过高烧坏单片机,
并可以提高系统适应电压的范围,即使供电电压高于单片机正常工作电压也可以由 BM1117
稳压到单片机正常工作电压的范围。
DS18B20 的工作电路如图 3 所示,采用外部供电而非总线供电的方式,只需一个电容
和两个电阻。
串口通信采用 Max232 进行电平转换,电路原理图如图 4 所示,实物照片如图 5 所示。
图 4:串口通信电路
3、 软件设计
图 5:实物照片
下位机软件采用 C 语言编写,包括 DS18B20 的读写和串口通信两个主要部分。上位机
软件采用 LabVIEW 编写。相关程序段如下所示:
获取 DS18B20 数据:
uint8 gettemp(void)
{
//读取温度值
//复位 18b20
// 跳过 ROM
// 温度变换
uint8 temh,teml,wm0,wm1,wm2,wm3,temp;
init_1820();
write_1820(0xCC);
write_1820(0x44);
init_1820();
write_1820(0xCC);
write_1820(0xbe);
teml=read_1820();
temh=read_1820();
wm0=teml>>4;
wm1=temh<<4;
wm2=wm1+wm0;
// 跳过 ROM
// 读暂存存储器
//读数据
//16 进制转 10 进制
//只要高 8 位的低四位和低 8 位的高四位,温度范围 0~99
return wm2;
}
系统下位机主函数:
void main(void)
{
unsigned char i=0,tmp=0;
USART_Init(9600); //波特率 9600 初始化串口
while(1)
{
tmp=gettemp();
USART_Transmit(tmp);
}
}
上位机软件采用当前测试测量应用最广泛的 LabVIEW 编写。LabVIEW(Laboratory
Virtual instrument Engineering)是一种图形化的编程语言,它广泛地被工业界、学术界
和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。LabVIEW 集成了与
满足 GPIB、VXI、RS-232 和 RS-485 协议的硬件及数据采集卡通讯的全部功能。它还内
置了便于应用 TCP/IP、ActiveX 等软件标准的库函数。这是一个功能强大且灵活的软件。
利用它可以方便地建立自己的虚拟仪器,其图形化的界面使得编程及使用过程都生动有
趣。
图形化的程序语言,又称为“G”语言。使用这种语言编程时,基本上不写程序代
码,取而代之的是流程图或流程图。它尽可能利用了技术人员、科学家、工程师所熟悉
的术语、图标和概念,因此,LabVIEW 是一个面向最终用户的工具。它可以增强你构
建自己的科学和工程系统的能力,提供了实现仪器编程和数据采集系统的便捷途径。使
用它进行原理研究、设计、测试并实现仪器系统时,可以大大提高工作效率。
利用 LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位编译器。
像许多重要的软件一样,LabVIEW 提供了 Windows、UNIX、Linux、Macintosh 的多种
版本。
上位机的软件前后面板如图 6 所示:
4、 结束语
图 6 上位机软件前后面板视图
本系统利用数字化的温度传感器进行温度的采集监控,利用串口通信将采集的温度数据
传给电脑,利用电脑进行数据处理和显示。既实现了采集监控的功能,又可以进行数据
的进一步处理和分析。
附录:主要下位机程序代码
18B20.c
#include "config.h"
uint8 count,wmh,wml; //count 为实际温度,wmh 为温度的高位,wml 为温度的低位
void init_1820(void)
{
//设置数据端口为输出
//480us 以上
SET_TEM_DDR;
SET_TEM_SDT;
CLR_TEM_SDT;
delay_us(480);
SET_TEM_SDT;
CLR_TEM_DDR;
delay_us(20);
//15~60us
while(CHECK_TEM_SDT);
SET_TEM_DDR;
SET_TEM_SDT;
delay_us(140);
//60~240us
}
void write_1820(uint8 data)
{
uint8 i;
for(i=0;i<8;i++)
{
CLR_TEM_SDT;
if(data&(1<
CLR_TEM_SDT;
delay_us(40);
SET_TEM_SDT;
//15~60us
}
SET_TEM_SDT;
}
uint8 read_1820(void)
{
uint8 temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
CLR_TEM_SDT;
SET_TEM_SDT;
CLR_TEM_DDR;
k=CHECK_TEM_SDT;
if(k)
//从高到低再到高,产生读间隙
//设为输入
//读数据,从低位开始
temp|=(1<>4;
wm1=temh<<4;
wm2=wm1+wm0;
return wm2;
// 跳过 ROM
// 读暂存存储器
//读数据
//只要高 8 位的低四位和低 8 位的高四位,温度范围 0~99
//16 进制转 10 进制
}
Sio.c
#include "config.h"
void USART_Init( unsigned int baud )
{
unsigned int tmp;
/* 设置波特率*/
tmp= F_CPU/baud/16-1;
UBRRH = (unsigned char)(tmp>>8);
UBRRL = (unsigned char)tmp;
/* 接收器与发送器使能*/
UCSRB = (1<