ds18b20多路温度采集程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。
亲测,更改端口即可使用。(主要器件:51单片机,ds18b20,lcd 显示器)
附有proteus仿真图,及序列号采集程序
/****上限62度下限-20度****/
#include
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^1;
sbit rs=P1^4;
sbit e=P1^6;
sbit sp=P1^0;
sbit d1=P1^2;
sbit d2=P1^3;
uchar lcdrom[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}};
unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"};
int f[4];
int tvalue;
float ftvalue;
uint warnl=320;
uint warnh=992;
/****lcd程序****/
void delayms(uint ms)//延时
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void wrcom(uchar com)//写指令{
delayms(1);
rs=0;
P3=com;
delayms(1);
e=1;
delayms(1);
e=0;
}
void wrdat(uchar dat)//写数据{
rs=1;
e=0;
P3=dat;
delayms(5);
e=1;
delayms(5);
e=0;
}
. void lcdinit()//初始化lcd
{
delayms(15);
wrcom(0x38);delayms(5);
wrcom(0x0c);delayms(5);
wrcom(0x06);delayms(5);
wrcom(0x01);delayms(5);
}
void display(uchar *p)//显示
{
while(*p!='\0')
{
wrdat(*p);
p++;
delayms(1);
}
}
displayinit()//初始化显示
{
lcdinit();
wrcom(0x80);
display(table0);
. }
/****ds18b20程序****/
void dsrst()//ds18b20复位
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit dsrd0()//读一位数据
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar dsrd()//读1个字节数据{
uchar i,j,dat;
dat=0;
for(i=8;i>0;i--)
{
j=dsrd0();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void dswr(uchar dat)//写数据{
uint i;
uchar j;
bit testb;
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++;
}
}
}
void tmstart()//初始化ds18b20 {
sp=1;
d1=1;
d2=1;
dsrst();
delayms(1);
dswr(0xcc);
dswr(0x44);
}
void read_dealtemp()//读取并处理温度
{
uchar i,j,t;
uchar a,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();