基于DS18B20测温的ARM温度采集系统研究
2010-09-25任守华
任守华
(黑龙江八一农垦大学 信息技术学院,黑龙江 大庆 163319)
0 引言
由于大规模集成电路的飞速发展,计算机的微型化发展得很快,其性能价格比也大为提高,因而微型计算机的应用越来越广泛。ARM实际上是微型计算机的一个重要分支,主要用于各种智能仪器仪表和自动控制系统中[1]。在这些系统中,ARM必须从外电路采集信息,通过对采集到的外部信息分析处理后还要输出相关的控制信号对外电路进行控制。本文介绍ARM在信号数据采集系统中的应用,以水稻大棚为对象,采用ARM作为控制核心,温度传感单元采用DS18B20,针对大棚内部温度进行数据采集,以及数据传送存储和显示进行介绍。
1 系统组成
整个系统主控部分采用ARM构成应用系统,温度检测部分采用DS18B20单总线数字温度传感器对温度进行检测,数据显示部分采用静态数码管显示同时上传PC机。系统工作原理为ARM微处理器向温度传感器发出信号,启动温度传感器采集温度数据,温度传感器采集完一次数据后,将模拟数据量转变成ARM微处理器能识别的数字信号。然后由ARM微处理器根据现场对数据的不同要求可以选择两种方式来显示数据,即数码管显示方式和PC机显示方式。
本系统采用的核心芯片分别为三星公司的ARM7TDMIS3C44B0X芯片作为系统处理器,DALLAS公司的DS18B20作为温度传感器。ARM温度采集系统原理图如图1所示。
图1 ARM温度采集系统原理图
2 硬件设计
本系统主要分下位机、上位机设计,下位机部分主要由两大部分组成,即DS18B20与ARM7温度测量模块和PC机与ARM7间的串行通讯显示模块。
2.1 温度检测电路
温度检测部分采用温度传感器DS18B20,它采用独特的单口接线方式传输,在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,不需要外围器件,外加电源范围是3.0~5.5V,测温范围从-55℃~+125℃,在-10℃~+85℃固有分辨率为0.5℃,测量结果以9位到12位数字量方式直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力系统的抗干扰性。适合于恶劣环境的现场温度测量。TO-92封装的DS18B20的引脚排列如图2所示。
图2 DS18B20引脚图
DS18B20是单总线芯片,只需把其数据线连接到ARM一个I/0口上即可,本设计是把其与ARM的PortA端口的PA0相连。温度的采集不仅能把数据传输到上位机中,而且也能在下位机进行显示,由于需要,只需显示两位,所以采取数码管静态显示的方法,分别用ARM的PortE、PortF。系统硬件结构如图3所示。
2.2 PC机与ARM间的串行通信模块
图3 下位机温度采集数码管显示电路图
由于串行通信标准RS-232C具有结构简单、成本低、技术成熟等优点,并且MAX232芯片是包含两路接收器和驱动器的IC芯片,适用于各种通信接口。芯片内部有一个电源电压变换器,可以把输人的+5V电源电压变换成为RS-232C输出电平所需要的+10v或一10v电压。所以采用此芯片接口的串行通信系统只需要单一的+5V电源就可以进行通信。故本模块采用MAX232接口芯片作为ARM与PC机间的通讯接口。
3 系统软件设计
3.1温度检测子程序
DS18B20使用的关键在于清楚总线的读写时序。由于DS18B20外接电路极为简单,所以电路连接没有问题;但在软件编程上,就要求严格按照它的时序进行读写操作。具体操作如下:
对DS18B20操作时,首先要将它复位。将DQ线拉低480μs~960μs,再将数据线拉高15μs~60μs,然后,DS18B20发出60μs~240μs的低电平作为应答信号[2-3],这时主机才能对它进行其它操作。程序如下:
//复位
unsigned char ow_reset(void)
{
unsigned char presence;
do
{
rPDATA= 0; //pull DQ line low
delay_18B20(29); //拉底电平480us
rPDATA= 1; //数据位置高
delay_18B20(3);
presence = DQ; //得到当前信号
delay_18B20(25); // 延时25us
}while(presence==1);
return(presence); //返回当前信号
//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
unsigned char i;
for (i=8; i>0; i--) // 写字节一次一位
{
//从 1-wire 总线上读取一个字节
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=8;i>0;i--)
{
value>>=1;
rPDATA= 0;
rPDATA= 1;
if(rPDATA&0x1)value|=0x80;
delay_18B20(2);
}
return(value);
}
rPDATA= 0;
rPDATA= val&0x01;
delay_18B20(2);
rPDATA= 1;
val=val>>1;
} }
3.2 串口通讯子程序
串口初始化:
void Uart_Init(int mclk,int baud)
{
int i;
if(mclk==0)
{
mclk=MCLK;
}
rUFCON0=0x0; //禁止FIFO
rUMCON0=0x0;//不使用自动流控制
rULCON0=0x3;
rUCON0=0x245;//中断设置
rUBRDIV0=((int)(mclk/16.0/baud+0.5)-1);
rUMCON1=0x0;//禁止FIFO
rUFCON1=0x0;//不使用自动流控制
rULCON1=0x3;
rUCON1=0x245;
rUBRDIV0=((int)(mclk/16.0/baud+0.5)-1);
}
串口0发送一字节
void Uart_SendByte(int ch)
{
if(whichuar==0)//选择串口0
{ if(ch==' ')
{
while(!(rUTRSTAT0&0x2));//检查数据
Delay(10);
WrUTXH0( ');//发送回车符
}
while(!(rUTRSTAT0&0x2));
Delay(10);
WrUTXH0(ch);}//发送数据
串口传输字符串数据
void Uart_SendString(char *str)
{ while(*str)
{
Uart_SendByte(*str++);
}}
4 结论
基于ARM的温度采集系统,设计的电路相对简单,方便实用,能实时并且准确的显示数据。在此系统的基础上,可以加入更多的采集量,比如湿度,光照度等,也可以非常容易的实现多点采集,使得整个系统除了在传输显示的优势之外,所采集的信息量也多样化,用途也就更加广泛。
[参考文献]
[1] 季昱,林俊超,宋飞.ARM嵌入式应用系统开发典型实例[M].北京:中国电力出版社,2005:309-328
[2] 刘鸣,车立新,陈兴梧,等.温度传感器DS18B20的特性及程序设计方法[J].电测与仪表,2001(10):47-51.
[3] 陈渝,李明,杨晔.源码开放的嵌入式系统软件分析与实践[M].北京:北京航空航天大学出版社,2004:3-11.