温度采集下位机系统.docx
- 文档编号:26212588
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:31
- 大小:877.66KB
温度采集下位机系统.docx
《温度采集下位机系统.docx》由会员分享,可在线阅读,更多相关《温度采集下位机系统.docx(31页珍藏版)》请在冰豆网上搜索。
温度采集下位机系统
温度采集下位机系统说明
一、系统的硬件如图1所示。
1.说明
本系统主要由以下几个部分组成:
主控芯片MSP430F169、RS232接口(DB9)、温度传感器DS18B20、液晶显示器1602。
系统原理图见图2。
图2系统电路原理图
工作原理:
DS18B20是一种支持“一线总线”传输方式的数字化温度传感器,其结构如图3所示。
它的适用电压为3—5V,测温范围为-55℃——+125℃,以0.5℃递增。
温度以9位数字量读出。
本实验通过DS18B20采集环境温度,当单片机检测到DSl820的存在便可以发出ROM操作命令之一,ReadROM(读ROM)、MatchROM(匹配ROM)、SkipROM(跳过ROM)、SearchROM(搜索ROM)、Alarmsearch(告警搜索)然后对发存储器操作命令对DS18B20进行读写数据转换等操作。
单片机MSP430F169来读写DSl820的数据位和写命令字的位,然后将读到的数据转换后,在液晶显示器1602显示出来。
并将转换结果通过串口上传到上位机。
图3DS18B20电路图
2.单片机软件部分
(1)主程序
/*************************************************************
程序功能:
读取DS18B20进行温度测量以后的结果并在1602液晶上显示
---------------------------------------------------------------
测试说明:
观察显示温度数值。
*************************************************************/
#include
#include"cry1602.h"
#include"DS18B20.h"
typedefunsignedcharuchar;
typedefunsignedintuint;
uchardN[6];//要显示的6位温度数字
voidDisp_Numb(uinttemper);
voidDispStr(unsignedcharx,unsignedchary,unsignedchar*ptr);
unsignedcharzi[]="Temperatureis:
";
unsignedcharwendu[]="";
voidPutString(uchar*ptr)
{
while(*ptr!
='\0')
{
while(!
(IFG1&UTXIFG0));//TX缓存空闲?
TXBUF0=*ptr++;//发送数据
}
while(!
(IFG1&UTXIFG0));
TXBUF0='\n';
}
/*************************主函数*************************/
voidmain(void)
{
/*下面六行程序关闭所有的IO口*/
P1DIR=0XFF;P1OUT=0XFF;
P2DIR=0XFF;P2OUT=0XFF;
P3DIR=0XFF;P3OUT=0XFF;
P4DIR=0XFF;P4OUT=0XFF;
P5DIR=0XFF;P5OUT=0XFF;
P6DIR=0XFF;P6OUT=0XFF;
//初始化UART端口
P3SEL|=0x30;//P3.4,5=USART0TXD/RXD
ME1|=URXE0+UTXE0;//EnableUSART0T/RXD
UCTL0|=CHAR;//8-bitcharacter
UTCTL0|=SSEL0;//UCLK=ACLK
UBR00=0x03;//32k/9600-3.41
UBR10=0x00;//
UMCTL0=0x4A;//Modulation
UCTL0&=~SWRST;//InitializeUSARTstatemachine
uchari;
WDTCTL=WDTPW+WDTHOLD;//关狗
P6DIR|=BIT2;P6OUT|=BIT2;//关闭电平转换,P6.2置高。
/*------选择系统主时钟为8MHz-------*/
BCSCTL1&=~XT2OFF;//打开XT2高频晶体振荡器
do
{
IFG1&=~OFIFG;//清除晶振失败标志
for(i=0xFF;i>0;i--);//等待8MHz晶体起振
}
while((IFG1&OFIFG));//晶振失效标志仍然存在?
BCSCTL2|=SELM_2+SELS;//MCLK和SMCLK选择高频晶振
TACTL|=TASSEL_2+ID_3;//计数时钟选择SMLK=8MHz,1/8分频后为1MHz
_EINT();//打开全局中断
LcdReset();//进入液晶重置函数
DispStr(0,0,"Temperatureis:
");//在坐标(0,0)处显示
//循环读数显示
while
(1)
{
Disp_Numb(Do1Convert());
Disp1Char(4,1,dN[5]+0x30);
Disp1Char(5,1,dN[4]+0x30);//0x30是0对应的ASCII码值
Disp1Char(6,1,0x2e);//0x2e是小数点对应的ASCII码值
Disp1Char(7,1,dN[3]+0x30);
Disp1Char(8,1,dN[2]+0x30);
Disp1Char(9,1,dN[1]+0x30);
Disp1Char(10,1,dN[0]+0x30);
PutString(wendu);
DelayNus(10000);
}
}
/*******************************************
函数名称:
Disp_Numb
功能:
将从DS18B20读取的11bit温度数据转换
成液晶显示的温度数字
参数:
temper--11bit温度数据
返回值:
无
********************************************/
voidDisp_Numb(uinttemper)
{
uchari;
for(i=0;i<6;i++)dN[i]=0;//初始化显示变量
//数值转换
if(temper&BIT0)
{
dN[0]=5;
dN[1]=2;
dN[2]=6;
}
if(temper&BIT1)
{
dN[1]+=5;
dN[2]+=2;
dN[3]+=1;
}
if(temper&BIT2)
{
dN[2]+=5;
dN[3]+=2;
if(dN[2]>=10)
{
dN[2]-=10;
dN[3]+=1;
}
}
if(temper&BIT3)
{
dN[3]+=5;
}
if(temper&BIT4)
{
dN[4]+=1;
}
if(temper&BIT5)
{
dN[4]+=2;
}
if(temper&BIT6)
{
dN[4]+=4;
}
if(temper&BIT7)
{
dN[4]+=8;
if(dN[4]>=10)
{
dN[4]-=10;
dN[5]+=1;
}
}
if(temper&BIT8)
{
dN[4]+=6;
dN[5]+=1;
if(dN[4]>=10)
{
dN[4]-=10;
dN[5]+=1;
}
}
if(temper&BIT9)
{
dN[4]+=2;
dN[5]+=3;
if(dN[4]>=10)
{
dN[4]-=10;
dN[5]+=1;
}
}
if(temper&BITA)
{
dN[4]+=4;
dN[5]+=6;
if(dN[4]>=10)
{
dN[4]-=10;
dN[5]+=1;
}
if(dN[5]>=10)
{
dN[5]-=10;
}
}
ucharj=0;
for(i=7;i>0;i--)
{
if(i!
=3)
{
wendu[i-1]=dN[j]+0x30;
j++;
}
else
wendu[2]=0x2e;//小数点
}
}
(2)DS18B20传感器部分
voidDelayNus(unsignedintn);
unsignedcharInit_18B20(void);
voidWrite_18B20(unsignedcharwdata);
unsignedcharRead_18B20(void);
voidSkip(void);
voidConvert(void);
voidRead_SP(void);
unsignedintReadTemp(void);
unsignedintDo1Convert(void);
voidDispStr(unsignedcharx,unsignedchary,unsignedchar*ptr);
#include
#include"DS18B20.h"
typedefunsignedcharuchar;
typedefunsignedintuint;
#defineDQ1P1OUT|=BIT6//DQ1代表P1.6置高
#defineDQ0P1OUT&=~BIT6//DQ0代表P1.6置低
#defineDQ_inP1DIR&=~BIT6//P1.6作为温度传感器的IO口
#defineDQ_outP1DIR|=BIT6
#defineDQ_val(P1IN&BIT6)
/*******************************************
函数名称:
DelayNus
功能:
实现N个微秒的延时
参数:
n--延时长度
返回值:
无
说明:
定时器A的计数时钟是1MHz,CPU主频8MHz
所以通过定时器延时能够得到极为精确的
us级延时
********************************************/
voidDelayNus(uintn)
{
CCR0=n;
TACTL|=MC_1;//增计数到CCR0
while(!
(TACTL&BIT0));//等待
TACTL&=~MC_1;//停止计数
TACTL&=~BIT0;//清除中断标志
}
/*******************************************
函数名称:
Init_18B20
功能:
对DS18B20进行复位操作
参数:
无
返回值:
初始化状态标志:
1--失败,0--成功
********************************************/
ucharInit_18B20(void)
{
ucharError;
DQ_out;
_DINT();//关闭全局中断控制
DQ0;
DelayNus(500);//延时
DQ1;
DelayNus(55);
DQ_in;
_NOP();
if(DQ_val)
{
Error=1;
}
else
{
Error=0;
}
DQ_out;
DQ1;
_EINT();//打开全局中断控制
DelayNus(400);
returnError;
}
/*******************************************
函数名称:
Write_18B20
功能:
向DS18B20写入一个字节的数据
参数:
wdata--写入的数据
返回值:
无
********************************************/
voidWrite_18B20(ucharwdata)
{
uchari;
_DINT();
for(i=0;i<8;i++)
{
DQ0;
DelayNus(6);//延时6us
if(wdata&0X01)DQ1;
elseDQ0;
wdata>>=1;
DelayNus(50);//延时50us
DQ1;
DelayNus(10);//延时10us
}
_EINT();
}
/*******************************************
函数名称:
Read_18B20
功能:
从DS18B20读取一个字节的数据
参数:
无
返回值:
读出的一个字节数据
********************************************/
ucharRead_18B20(void)
{
uchari;
uchartemp=0;
_DINT();
for(i=0;i<8;i++)
{
temp>>=1;//temp向右移一位
DQ0;
DelayNus(6);//延时6us
DQ1;
DelayNus(8);//延时9us
DQ_in;
_NOP();
if(DQ_val)temp|=0x80;//将temp最高位置为1
DelayNus(45);//延时45us
DQ_out;
DQ1;
DelayNus(10);//延时10us
}
_EINT();
returntemp;
}
/*******************************************
函数名称:
Skip
功能:
发送跳过读取产品ID号命令
参数:
无
返回值:
无
********************************************/
voidSkip(void)
{
Write_18B20(0xcc);//跳过读取产品ID号命令
}
/*******************************************
函数名称:
Convert
功能:
发送温度转换命令
参数:
无
返回值:
无
********************************************/
voidConvert(void)
{
Write_18B20(0x44);
}
/*******************************************
函数名称:
Read_SP
功能:
发送读ScratchPad命令
参数:
无
返回值:
无
********************************************/
voidRead_SP(void)
{
Write_18B20(0xbe);
}
/*******************************************
函数名称:
ReadTemp
功能:
从DS18B20的ScratchPad读取温度转换结果
参数:
无
返回值:
读取的温度数值
********************************************/
uintReadTemp(void)
{
uchartemp_low;
uinttemp;
temp_low=Read_18B20();//读低位
temp=Read_18B20();//读高位
temp=(temp<<8)|temp_low;
returntemp;
}
/*******************************************
函数名称:
ReadTemp
功能:
控制DS18B20完成一次温度转换
参数:
无
返回值:
测量的温度数值
********************************************/
uintDo1Convert(void)
{
uchari;
do
{
i=Init_18B20();
}
while(i);
Skip();
Convert();
for(i=20;i>0;i--)
DelayNus(60000);//延时800ms以上
do
{
i=Init_18B20();
}
while(i);
Skip();
Read_SP();
returnReadTemp();
}
(3)液晶显示部分
voidDispStr(unsignedcharx,unsignedchary,unsignedchar*ptr);
voidDispNChar(unsignedcharx,unsignedchary,unsignedcharn,unsignedchar*ptr);
voidLocateXY(unsignedcharx,unsignedchary);
voidDisp1Char(unsignedcharx,unsignedchary,unsignedchardata);
voidLcdReset(void);
voidLcdWriteCommand(unsignedcharcmd,unsignedcharchk);
voidLcdWriteData(unsignedchardata);
voidWaitForEnable(void);
voidDelay5ms(void);
#include
#include"cry1602.h"
typedefunsignedcharuchar;
typedefunsignedintuint;
/**************宏定义***************/
#defineDataDirP2DIR
#defineDataPortP2OUT
#defineBusy0x80
#defineCtrlDirP6DIR
#defineCLR_RSP6OUT&=~BIT3;//RS=P6.3
#defineSET_RSP6OUT|=BIT3;
#defineCLR_RWP6OUT&=~BIT4;//RW=P6.4
#defineSET_RWP6OUT|=BIT4;
#defineCLR_ENP6OUT&=~BIT5;//EN=P6.5
#defineSET_ENP6OUT|=BIT5;
/***********************************************
函数名称:
DispStr
功能:
让液晶从某个位置起连续显示一个字符串
参数:
x--位置的列坐标
y--位置的行坐标
ptr--指向字符串存放位置的指针
返回值:
无
***********************************************/
voidDispStr(ucharx,uchary,uchar*ptr)
{
uchar*temp;
uchari,n=0;
temp=ptr;
while(*ptr++!
='\0')n++;//计算字符串有效字符的个数
for(i=0;i { Disp1Char(x++,y,temp[i]); if(x==0x0f) { x=0; y^=1; } } } /******************************************* 函数名称: DispNchar 功能: 让液晶从某个位置起连续显示N个字符 参数: x--位置的列坐标 y--位置的行坐标 n--字符个数 ptr--指向字符存放位置的指针 返回值: 无 ********************************************/ voidDispNChar(ucharx,uchary,ucharn,uchar*ptr) { uchari; for(i=0;i { Disp1Char(x++,y,ptr[i]); if(x==0x0f) { x=0; y^=1;//异或 } } } /******************************************* 函数名称: LocateXY 功能: 向液晶输入显示字符位置的坐标信息 参数: x--位置的列坐标 y--位置的行坐标 返回值: 无 ********************************************/ voidLocateXY(ucharx,uchary) { uchartemp; temp=x&0x0f;//x与00001111与 y&=0x01; if(y)temp|=0x40;//如果在第2行 temp|=0x80; LcdWriteCommand(temp,1); } /******************************************* 函数名称: Disp1Char 功能: 在某个位置显示一个字符 参数: x--位置的列坐标 y--位置的行坐标 data--显示的字符数据 返回值: 无 ********************************************/ voidDisp1Char(ucharx,uchary,uchardata) { LocateXY(x,y); LcdWriteData(data); } /******************************************* 函数名称: LcdRese
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 采集 下位 系统