DS18B20单总线多点式测温系统教学文案Word文档格式.docx
《DS18B20单总线多点式测温系统教学文案Word文档格式.docx》由会员分享,可在线阅读,更多相关《DS18B20单总线多点式测温系统教学文案Word文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
write_data(0x80);
init(0x85);
write_data(0x74);
//temperature
init(0x86);
write_data(0x65);
init(0x87);
write_data(0x6d);
init(0x88);
write_data(0x70);
init(0x89);
init(0x8a);
write_data(0x72);
init(0x8b);
write_data(0x61);
init(0x8c);
init(0x8d);
write_data(0x75);
init(0x8e);
init(0x8f);
init(0xc0);
init(0xc1);
init(0xc2);
write_data(0x69);
//is:
init(0xc3);
write_data(0x73);
init(0xc4);
write_data(0x3a);
if((t/1000)!
=0)
{init(0xc5);
write_data(0x2d);
init(0xc6);
write_data(shu[t/1000]);
init(0xc7);
write_data(shu[t/100]);
}
else
write_data(0xfe);
init(0xc8);
write_data(0x2e);
init(0xc9);
write_data(shu[(t0)/10]);
init(0xca);
write_data(shu[t]);
init(0xcb);
write_data(0x27);
init(0xcc);
write_data(0x43);
init(0xcd);
init(0xce);
init(0xcf);
voidlcd_1602()
//当为正温度时,液晶显示可以高位为0屏蔽.
init(0x84);
//temperature
if(t/10000!
write_data(shu[t/10000]);
}
{if((t/1000)!
{init(0xc5);
else
init(0xc8);
init(0xc9);
voidjiance()
//初始化,即检测是否存在DS18B20.
{unsignedchark=0;
loop:
DS=1;
DS=0;
//主机将总线从高电平拉到低电平
del(100);
//持续400us~960us
DS=1;
//然后释放总线
del(10);
//DS18B20检测到总线上升沿后,等待15us~60u后发低电平。
k=DS;
del(20);
//低电平至少要持续60~240us
if(k==1)
//60~240us内若为高电平则要重新检测。
gotoloop;
read()
//从DS18B20中读出数据
{unsignedchari;
unsignedlongdate=0;
for(i=0;
i<
16;
i++)
{DS=0;
//主机在某一时刻将总线从高电平拉到低电平.
date>
>
=1;
del(3);
//保持15us将总线拉到高电平,产生读时间隙
if(DS)
date|=0x8000;
del(8);
//读数据需要持续35us~60us.
return(date);
void
main()
{unsignedlong
flag=0;
EA=0;
SP=0X60;
init(0x01);
//对液晶屏初始化
init(0x38);
init(0x0c);
init(0x06);
while
(1)
{
jiance();
//对DS18B20初始化
matchrom();
write(0x44);
//启动温度变换
del(100);
jiance();
if(f==1)
{f=0;
{
write(0xbe);
//读暂存存储器
t=read();
flag=t&
0x8000;
//对读取的数据进行处理
if(flag==0x8000)
{t=~t;
t=t+1;
t=t*25;
t>
=2;
flcd_1602();
lcd_1602();
头文件:
#ifndef__XUANZE_H__
#define__XUANZE_H__
unsignedchark,f=0;
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sbitDS=P1^1;
voiddel(intcount)
//延时程序
{while(count--)
;
voiddelay(unsignedintcount)//延时程序
{intp;
while(count--)
for(p=0;
p<
125;
p++);
voidwrite(unsignedchardate)//向DS18B20中写入数据
{inti;
8;
i++)
//由于是单总线每次只能写一位,一个字节需循环8次
{DS=0;
//主机在某一时刻将总线从高电平拉到低电平,产生写时间隙
DS=date&
0x01;
//写入数据。
del(15);
//写如数据要15us,ds18b20对数据采样需要15us~60us,共需35us~70us.
voidinit(unsignedintn)//
RW=0,RS=0;
向指令寄存器中写入命令,即对1602初始化。
{delay(10);
E=0;
RS=0;
RW=0;
E=1;
P0=n;
voidwrite_data(unsignedcharn)//RS=1,RW=0;
向数据寄存器中写入数据,即显示的数符。
{delay(10);
E=0;
RS=1;
RW=0;
E=1;
P0=n;
voidmatchrom()
//匹配ROM
{
k=P3;
switch(k)
{case0:
f=1;
write_data(0x57);
//which
write_data(0x68);
init(0x83);
write_data(0x63);
write_data(0x79);
//you
write_data(0x6f);
//want
write_data(0x6e);
//press
init(0xc5);
init(0xca);
init(0xcb);
init(0xcc);
write_data(0x6b);
//key
init(0xcd);
init(0xce);
init(0xcf);
}break;
case1:
write_data(0x31);
//NO1
write(0x55);
write(0x28);
write(0x30);
write(0xc5);
write(0xb8);
write(0x00);
write(0x8e);
case2:
write_data(0x32);
//NO2
write(0x31);
write(0xb9);
case4:
write_data(0x33);
//NO3
write(0x32);
write(0xe0);
case8:
write_data(0x34);
//NO4
write(0x33);
write(0xd7);
}
break;
case16:
write_data(0x35);
//NO5
write(0x34);
write(0x52);
case32:
write_data(0x36);
//NO6
write(0x35);
write(0x65);
case64:
write_data(0x37);
//NO7
write(0x36);
write(0x3c);
}break;
case128:
write_data(0x38);
//NO8
write(0x37);
write(0x0b);
default:
write_data(0x50);
//please
write_data(0x6c);
//one
//key
write_data(