ds18b20多路温度采集程序.docx
《ds18b20多路温度采集程序.docx》由会员分享,可在线阅读,更多相关《ds18b20多路温度采集程序.docx(20页珍藏版)》请在冰豆网上搜索。
ds18b20多路温度采集程序
本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)亲测,更改端口即可使用。
(主要器件:
51单片机,ds18b20,lcd显示器)
附有proteus仿真图,及序列号采集程序
/****上限62度下限-20度****/
#include
#defineucharunsignedchar#defineuintunsignedintsbitds=P1^1;
sbitrs=P1^4;
sbite=P1^6;
sbitsp=P1^0;
sbitd1=P1^2;
sbitd2=P1^3;
ucharlcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},
{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},
{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},
{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};
unsignedcharcodetable0[]={"TEMPERARTURE:
U"};
unsignedcharcodetable1[]={"0123456789ABCDEF"};
intf[4];
inttvalue;
floatftvalue;
uintwarnl=320;
uintwarnh=992;
/****lcd
程序****/
voiddelayms(uintms)//{
uinti,j;for(i=ms;i>0;i--)
for(j=110;j>0;j--);}
voidwrcom(ucharcom)//
{
delayms
(1);
rs=0;
延时
写指令
P3=com;delayms
(1);e=1;
delayms
(1);
e=0;
}
voidwrdat(uchardat)//
{
rs=1;
e=0;
写数据
P3=dat;
delayms(5);
e=1;
delayms(5);
e=0;
}
voidlcdinit()//初始化lcd
{
delayms(15);
wrcom(0x38);delayms(5);
wrcom(0x0c);delayms(5);
wrcom(0x06);delayms(5);
wrcom(0x01);delayms(5);
}
voiddisplay(uchar*p)//显示
{
while(*p!
='\0')
{
wrdat(*p);
p++;
delayms
(1);
}
}
displayinit()//初始化显示
{
lcdinit();
wrcom(0x80);
display(table0);
}
复位
/****ds18b20程序****/
voiddsrst()//ds18b20
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bitdsrd0()//读一位数据
{
uinti;
bitdat;
ds=0;i++;ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchardsrd()//读1个字节数据
{
uchari,j,dat;
dat=0;
for(i=8;i>0;i--)
{
j=dsrd0();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voiddswr(uchardat)//写数据
{
uinti;
ucharj;
bittestb;
for(j=8;j>0;j--)
{
testb=dat&0x01;dat=dat>>1;
if(testb)
{
ds=0;i++;i++;
ds=1;i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;ds=1;
i++;i++;
}
}
}
voidtmstart()//初始化ds18b20
{
sp=1;
d1=1;
d2=1;
dsrst();
delayms
(1);
dswr(0xcc);
dswr(0x44);
}
voidread_dealtemp()//读取并处理温度
{
uchari,j,t;
uchara,b;
for(j=0;j<4;j++)
{
dsrst();
delayms
(1);
dswr(0x55);
for(i=0;i<8;i++)
{
dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0)
{
d1=1;
tvalue=~tvalue+1;
wrcom(0xc0);wrdat(0x2d);if(tvalue>warnl){
d2=0;
sp=0;}else
{
d2=1;
sp=1;
}
}
else
{
d2=1;wrcom(0xc0);wrdat('');
if(tvalue>warnh){
d1=0;sp=0;
}
else
{
d1=1;sp=1;
}
}
if(j==0)
{
wrcom(0x8e);wrdat('2');
}
if(j==1)
{
wrcom(0x8e);wrdat('3');
}
if(j==2)
{
wrcom(0x8e);wrdat('4');
}
if(j==3)
{
wrcom(0x8e);wrdat('5');
}
ftvalue=tvalue*0.0625;
tvalue=ftvalue*10+0.5;
ftvalue=ftvalue+0.05;
f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];
t=tvalue/1000;
wrcom(0x80+0x41);
wrdat(table1[t]);//显示百位t=tvalue%1000/100;
wrdat(table1[t]);//显示十位t=tvalue%100/10;
wrdat(table1[t]);//显示个位
wrdat(0x2e);//显示小数点儿t=tvalue%10/1;
wrdat(table1[t]);//显示小数位delayms(5000);
}
}
/****
主函数****/
voidmain()
{d1=1;
d2=1;
sp=1;
displayinit();//初始化显示while
(1)
{
tmstart();//初始化read_dealtemp();//读取温度
/****序列号读取程序****/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^1;感器信号线
sbitrs=P1^4;
据/命令选择端(H/L)位声明sbitlcden=P1^6;
端位声明
//温度传
//LCD数
//LCD使能信号
voiddelay(uintz);
//延
void
DS18B20_Reset(void);
时函数
//读1位数
//DQ18B20复位,初始化函数
bitDS18B20_Readbit(void);
//读1个
据函数
ucharDS18B20_ReadByte(void);
字节数据函数
voidDS18B20_WriteByte(uchar
dat);
//向
DQ18B20写一个字节数据函数
voidLCD_WriteCom(uchar
com);
//1602
液晶命令写入函数
voidLCD_WriteData(uchar
dat);
//1602
液晶数据写入函数
void
LCD_Init();
//LCD初始化函数
voidDisplay18B20Rom(charRom);//显示18B20序列号函数
/*
主函数
*//********************************************
voidmain()
{uchara,b,c,d,e,f,g,h;
LCD_Init();DS18B20_Reset();
delay
(1);
DS18B20_WriteByte(0x33);delay
(1);
a=DS18B20_ReadByte();
b=DS18B20_ReadByte();
c=DS18B20_ReadByte();
d=DS18B20_ReadByte();
e=DS18B20_ReadByte();
f=DS18B20_ReadByte();
g=DS18B20_ReadByte();
h=DS18B20_ReadByte();
LCD_WriteCom(0x80+0x40);
Display18B20Rom(h);
Display18B20Rom(g);
Display18B20Rom(f);
Display18B20Rom(e);
Display18B20Rom(d);
Display18B20Rom(c);
Display18B20Rom(b);
Display18B20Rom(a);
while
(1);
}
/***************************************************/
delay()
函数
/*延时函数:
void
*/
/*功能:
延时
*/voiddelay(uintz)//延时函数
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
/***************************************************/
/*
DS18B20函数:
voidDS18B20_Reset()
*/
/*
功能
复位18B20
*/
复位,初始化函数
/***************************************************/voidDS18B20_Reset(void)//DQ18B20
uinti;
DQ=0;
i=103;
while(i>0)i--;
DQ=1;
i=4;
while(i>0)i--;
/***************************************************/
/*
DS18B20函数:
voidDS18B20_Readbit()
*/
/*
功能:
读1个字节数据函数
*/
bitDS18B20_Readbit(void)//读1位数据函数
{
uinti;
bitdat;
DQ=0;
i++;//i++起延时作用
DQ=1;
i++;
i++;dat=DQ;
i=8;
while(i>0)i--;return(dat);
}
/***************************************************/
/*DS18B20函数:
voidDS18B20_ReadByte()*/
/*功能:
读1个字节数据函数*/
ucharDS18B20_ReadByte(void)//读1个字节数据函
数
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=DS18B20_Readbit();
dat=(j<<7)|(dat>>1);
}return(dat);
}
/***************************************************/
/*DS18B20函数:
voidDS18B20_WriteByte()
*/
/*功能:
向DQ18B20写一个字节数据函数
*/
//向DQ18B20
voidDS18B20_WriteByte(uchardat)
写一个字节数据函数uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
DQ=0;i++;i++;
DQ=1;
i=8;while(i>0)i--;
}
else
{
DQ=0;//写0
i=8;while(i>0)i--;
DQ=1;
i++;i++;
}
}
/*
LCD函
数
:
void
LCD_WriteCom()
*/
/*
功能:
向
LCD
写入命令
*/
voidLCD_WriteCom(ucharcom){
rs=0;
P3=com;
delay(5);
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*LCD函数:
voidLCD_WriteData(uchardat)
*/
/*功能:
向LCD写入数据
*//***********************************************/
voidLCD_WriteData(uchardat)
rs
1;
//选择LCD为写入数据状态
lcden=0;
P3=dat;
//将待写入
数据放到总线上
delay(5);
lcden=1;
//给
LCD使能端一个脉冲
delay(5);
//信号
将之前放到总线上
lcden=0;
//的数
据写入LCD
delay(5);
/***********************************************/
/*
LCD
函数
:
void
LCD_Init()
*/
/*
功能:
初始化LCD,设定LCD
的初始状态
*/
/*********************************************
voidLCD_Init()
{
LCD_WriteCom(0x38);
模式设定
delay(15);
LCD_WriteCom(0x08);
显示
delay(3);
LCD_WriteCom(0x01);
清屏
delay(3);
LCD_WriteCom(0x06);
地址指针为自动加1
delay(3);
LCD_WriteCom(0x0c);
显示,但不显示光标
}
/*********************************************
/*
//LCD显示
//关闭LCD
//LCD显示
//设定光标
//打开LCD
*/
/*显示18B20序列号*/
/*
*/
/**********************************************/
voidDisplay18B20Rom(charRom)
{
ucharh,l;
l=Rom&0x0f;//取低4位
h=Rom&0xf0;//取高4位
h>>=4;
if((h>=0x00)&&(h<=0x09))LCD_WriteData(h+0x30);
//取ASCII码
else
LCD_WriteData(h+0x37);
//取ASCII码
if((l>=0x00)&&(l<=0x09))
LCD_WriteData(l+0x30);
//取ASCII码
else
LCD_WriteData(l+0x37);
//取ASCII码
}