b多路温度采集程序.docx
《b多路温度采集程序.docx》由会员分享,可在线阅读,更多相关《b多路温度采集程序.docx(18页珍藏版)》请在冰豆网上搜索。
b多路温度采集程序
本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。
亲测,更改端口即可使用。
(主要器件:
51单片机,ds18b20,lcd显示器)
附有proteus仿真图,及序列号采集程序
/****上限62度下限-20度****/
#include<>
#defineucharunsignedchar
#defineuintunsignedint
sbitds=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"};
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*;
tvalue=ftvalue*10+;
ftvalue=ftvalue+;
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;//LCD数据/命令选择端(H/L)位声明
sbitlcden=P1^6;//LCD使能信号端位声明
voiddelay(uintz);//延时函数
voidDS18B20_Reset(void);//DQ18B20复位,初始化函数
bitDS18B20_Readbit(void);//读1位数据函数
ucharDS18B20_ReadByte(void);//读1个字节数据函数
voidDS18B20_WriteByte(uchardat);//向DQ18B20写一个字节数据函数
voidLCD_WriteCom(ucharcom);//1602液晶命令写入函数
voidLCD_WriteData(uchardat);//1602液晶数据写入函数
voidLCD_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);
}
/***************************************************/
/*延时函数:
voiddelay()*/
/*功能:
延时函数*/
/***************************************************/
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写一个字节数据函数*/
/***************************************************/
voidDS18B20_WriteByte(uchardat)//向DQ18B20写一个字节数据函数
{
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函数:
voidLCD_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函数:
voidLCD_Init()*/
/*功能:
初始化LCD,设定LCD的初始状态*/
/***********************************************/
voidLCD_Init()
{
LCD_WriteCom(0x38);//LCD显示模式设定
delay(15);
LCD_WriteCom(0x08);//关闭LCD显示
delay(3);
LCD_WriteCom(0x01);//LCD显示清屏
delay(3);
LCD_WriteCom(0x06);//设定光标地址指针为自动加1
delay(3);
LCD_WriteCom(0x0c);//打开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码
}