多路温度采集系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
小型多路温控采集系统设计
一.系统说明
本系统采用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<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar TMP[4]; //读取后的4个温度值
uchar SN[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个器件的序列号,先读出单个序列号后填上才可以读取温度
uint f[4]; //结果是否为负温,“0”为正温,“1”为负温。
sbit DQ=P3^7;//ds18b20与单片机连接口
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
unsigned char code str0[]={"temperature:U "};
unsigned char code str5[]={" "};
uchar data disdata[5];
uint tvalue;//温度值
uchar tflag[4];//温度正负标志
/*************************LCD1602程序*****************************************************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void wr_com(unsigned char com)//写指令//
{ delay1ms(1);
RS=0;
RW=0;
EN=0;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(unsigned char dat)//写数据// { delay1ms(1);;
RS=1;
RW=0;
EN=0;
P2=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_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);
}
void display(unsigned char *p)//显示// {
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
init_play()//初始化显示
{ lcd_init();
wr_com(0x80);
display(str0);
wr_com(0xc0);
}
/*****************************************************************************
******************************DS18B20程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=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()/*读取温度值并转换*/
{ //
uchar i,j; //
uchar a,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]);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat,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);
}
}
/********************主程序***********************************/
void main()
{ init_play();//初始化显示
while(1)
{
tmstart();//开始转换
read_temp();//读取温度
ds1820disp();//显示
}
}
/
2.程序二:读取DS18B20序列号程序
注:读ROM时,只能有一个器件与单片机通信。
可以逐个相连来读出其ROM #include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint sn[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10};
sbit DQ=P3^7;//ds18b20与单片机连接口
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=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(); //
}
/********************主程序***********************************/
void main()
{
while(1)
{ rom(); //调用读序列号子程序//
}
}
本文档部分内容来源于网络,如有内容侵权请告知删除,感谢您的配合!。