多路温度采集系统.docx

上传人:b****6 文档编号:3405838 上传时间:2022-11-22 格式:DOCX 页数:12 大小:76.03KB
下载 相关 举报
多路温度采集系统.docx_第1页
第1页 / 共12页
多路温度采集系统.docx_第2页
第2页 / 共12页
多路温度采集系统.docx_第3页
第3页 / 共12页
多路温度采集系统.docx_第4页
第4页 / 共12页
多路温度采集系统.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

多路温度采集系统.docx

《多路温度采集系统.docx》由会员分享,可在线阅读,更多相关《多路温度采集系统.docx(12页珍藏版)》请在冰豆网上搜索。

多路温度采集系统.docx

多路温度采集系统

小型多路温控采集系统设计

 

一.系统说明

本系统采用51单片机作为控制器,控制温度采集及显示。

温度传感器选用DS18B20,其单总线的通信方式可以减少系统的线路连接。

DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。

DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路。

内温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。

同时本系统选用LCD1602作为显示器件,能够同时显示16x02即32个字符(16列2行)。

其显示清晰,并可以显示阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,满足了系统要求。

二.系统电路图

三、程序流程图

四、程序解读

注:

程序分两部分。

可以先用程序二读出各个器件的序列号,再将序列号填入程序一的SN[4][8]数组中,若要加入更多的器件可以扩大数组,并在程序中增加读显的循环次数。

1.程序一:

已知各个器件序列号读取温度

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharTMP[4];//读取后的4个温度值

ucharSN[4][8]={{0x28,0x44,0x30,0xc5,0xb8,0x00,0x00,0x12},

{0x28,0x15,0x30,0xc5,0xb8,0x00,0x00,0x0b},

{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},

{0x28,0x05,0x30,0xc5,0xb8,0x00,0x00,0x50}};//4个器件的序列号,先读出单个序列号后填上才可以读取温度

uintf[4];//结果是否为负温,“0”为正温,“1”为负温。

sbitDQ=P3^7;//ds18b20与单片机连接口

sbitRS=P3^0;

sbitRW=P3^1;

sbitEN=P3^2;

unsignedcharcodestr0[]={"temperature:

U"};

unsignedcharcodestr5[]={""};

uchardatadisdata[5];

uinttvalue;//温度值

uchartflag[4];//温度正负标志

/*************************LCD1602程序*****************************************************************/

voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)

{unsignedinti,j;

for(i=0;i

for(j=0;j<100;j++);

}

voidwr_com(unsignedcharcom)//写指令//

{delay1ms

(1);

RS=0;

RW=0;

EN=0;

P2=com;

delay1ms

(1);

EN=1;

delay1ms

(1);

EN=0;

}

voidwr_dat(unsignedchardat)//写数据//

{delay1ms

(1);;

RS=1;

RW=0;

EN=0;

P2=dat;

delay1ms

(1);

EN=1;

delay1ms

(1);

EN=0;

}

voidlcd_init()//初始化设置//

{delay1ms(15);

wr_com(0x38);delay1ms(5);

wr_com(0x08);delay1ms(5);

wr_com(0x01);delay1ms(5);

wr_com(0x06);delay1ms(5);

wr_com(0x0c);delay1ms(5);

}

voiddisplay(unsignedchar*p)//显示//

{

while(*p!

='\0')

{

wr_dat(*p);

p++;

delay1ms

(1);

}

}

init_play()//初始化显示

{lcd_init();

wr_com(0x80);

display(str0);

wr_com(0xc0);

display(str5);

}

/*****************************************************************************

******************************DS18B20程序***************************************/

voiddelay_18B20(unsignedinti)//延时1微秒

{

while(i--);

}

voidds1820rst()/*ds1820复位*/

{unsignedcharx=0;

DQ=1;//DQ复位

delay_18B20(4);//延时

DQ=0;//DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;//拉高

delay_18B20(40);

}

uchards1820rd()/*读数据*/

{unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

voidds1820wr(ucharwdata)/*写数据*/

{unsignedchari=0;

for(i=8;i>0;i--)

{DQ=0;

DQ=wdata&0x01;

delay_18B20(10);

DQ=1;

wdata>>=1;

}

}

/*******************发送ds1820开始转换/**************************************************************************************/

tmstart(void)//

{//

ds1820rst();//复位//

delay1ms

(1);//延时//

ds1820wr(0xcc);//跳过序列号命令,对所有器件有效//

ds1820wr(0x44);//发转换命令44H,//

}

/*****************************************************************************/

read_temp()/*读取温度值并转换*/

{//

uchari,j;//

uchara,b;//

for(j=0;j<4;j++)//

{//

ds1820rst();//复位//

delay1ms

(1);//延时//

ds1820wr(0x55);//发送ROM匹配命令//

for(i=0;i<8;i++)//

{//

ds1820wr(SN[j][i]);//发送64位序列号//

}//

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();//连续读取两位温度//

b=ds1820rd();//

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<0xf800)

tflag[j]=0;

else

{tvalue=~tvalue+1;

tflag[j]=1;}

f[j]=tvalue*(0.625);//温度值扩大10倍,精确到1位小数

}

//return(f[4]);

}

/*******************************************************************/

voidds1820disp()//温度值显示

{ucharflagdat,i;

for(i=0;i<4;i++)

{tvalue=f[i];

disdata[0]=tvalue/1000+0x30;//百位数

disdata[1]=tvalue%1000/100+0x30;//十位数

disdata[2]=tvalue%100/10+0x30;//个位数

disdata[3]=tvalue%10/1+0x30;//小数位

if(tflag[i]==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号:

-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示

}

}

if(i==0){wr_com(0x8d);//第一个传感器在LCD第一行第14字符显示“1”

wr_dat('1');}

if(i==1){wr_com(0x8d);//第二个传感器在LCD第一行第14字符显示“2”

wr_dat('2');}

if(i==2){wr_com(0x8d);//第三个传感器在LCD第一行第14字符显示“3”

wr_dat('3');}

if(i==3){wr_com(0x8d);//第四个传感器在LCD第一行第14字符显示“4”

wr_dat('4');}

wr_com(0xc0);//在LCD第二行第1个字符显示温度正负号

wr_dat(flagdat);//显示符号位

wr_com(0xc1);//在LCD第二行第2个字符显示百位温度值

wr_dat(disdata[0]);//显示百位

wr_com(0xc2);//在LCD第二行第3个字符显示十位温度值

wr_dat(disdata[1]);//显示十位

wr_com(0xc3);//在LCD第二行第4个字符显示个位温度值

wr_dat(disdata[2]);//显示个位

wr_com(0xc4);//在LCD第二行第5个字符显示小数点

wr_dat(0x2e);//显示小数点

wr_com(0xc5);//在LCD第二行第6个字符显示小数位温度值

wr_dat(disdata[3]);//显示小数位

delay1ms(1500);

}

}

/********************主程序***********************************/

voidmain()

{init_play();//初始化显示

while

(1)

{

tmstart();//开始转换

read_temp();//读取温度

ds1820disp();//显示

}

}

/

2.程序二:

读取DS18B20序列号程序

注:

读ROM时,只能有一个器件与单片机通信。

可以逐个相连来读出其ROM

#include

#defineucharunsignedchar

#defineuintunsignedint

uintsn[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10};

sbitDQ=P3^7;//ds18b20与单片机连接口

sbitRS=P3^0;

sbitRW=P3^1;

sbitEN=P3^2;

voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)

{unsignedinti,j;

for(i=0;i

for(j=0;j<100;j++);

}

voiddelay_18B20(unsignedinti)//延时1微秒

{

while(i--);

}

voidds1820rst()/*ds1820复位*/

{unsignedcharx=0;

DQ=1;//DQ复位

delay_18B20(4);//延时

DQ=0;//DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;//拉高

delay_18B20(40);

}

uchards1820rd()/*读数据*/

{unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

voidds1820wr(ucharwdata)/*写数据*/

{unsignedchari=0;

for(i=8;i>0;i--)

{DQ=0;

DQ=wdata&0x01;

delay_18B20(10);

DQ=1;

wdata>>=1;

}

}

////////////////////////读取器件序列号子程序////////////////////////////

rom(void)

{

ds1820rst();//复位//

delay1ms

(1);//延时//

ds1820wr(0x33);//发送读序列号子程序//

sn[0]=ds1820rd();//连续读出64位ROM

sn[1]=ds1820rd();//

sn[2]=ds1820rd();//

sn[3]=ds1820rd();//

sn[4]=ds1820rd();//

sn[5]=ds1820rd();//

sn[6]=ds1820rd();//

sn[7]=ds1820rd();//

}

/********************主程序***********************************/

voidmain()

{

while

(1)

{rom();//调用读序列号子程序//

}

}

本文档部分内容来源于网络,如有内容侵权请告知删除,感谢您的配合!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1