READ DS18B20
SERIAL NUMBERS
检测DS18B20,存在时,LCD1602显示:
DS18B20 OK
28D6318A000000E3 ;我的DS18B20的位序列号
低 → 高
检测DS18B20,不存在时,LCD1602显示:
DS18B20 ERROR
CHECK DS18B20
蜂鸣器报警。
有CRC码效验功能:
效验正确,LCD1602显示:
DS18B20 OK
28D6318A000000E3 ;我的DS18B20的位序列号
蜂鸣器响一声。
效验错误,LCD1602显示:
DS18B20 OK
CRC ERROR
DS18B20多点温度测量!
发表于 2007-6-3 16:19:05
最近有同学毕业设计用到DS18B20多点温度测量,到关口了牺牲了一下午的时间给他讲了一下,趁着这个机会也把我的多点温度测量的资料和程序找了出来,现在与大家一同分享。
DS18B20多点温度测量
主程序:
uchar temp[2];//存放两路温度值
uchar sflag[2];//存放两路温度值的正负号
uchar readtemp[2];//每次读出温度的温度的高低位值
uchar fentemp ;//用于拆分两路温度送入显示数组
程序:for(h=0;h<2;h++)//H循环两次读两路温度
{
Init_DS18B20();//复位18B20
// read_ROM();
//resetpulse();
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0x44);//发温度转换命令
for(j=250;j>0;j--);//延时
Init_DS18B20();//复位
WriteOneChar(0x55);//发送ROM匹配命令
for(i=0;i<8;i++)
{
WriteOneChar(rom[h][i]);
}
WriteOneChar(0xbe);//发温度转换命令
readtemp[0]=ReadOneChar();//读取相应的温度值低位
readtemp[1]=ReadOneChar();//读取相应的温度值高位
sflag[h]=0;
if((readtemp[1] & 0xf8)!=0x00)//若温度为负的处理
{
sflag[h]=1;
readtemp[1]=~readtemp[1];
readtemp[0]=~readtemp[0];
temp[h]=readtemp[0]+1;
readtemp[0]=temp[h];
if(temp[h]>255)
{
readtemp[1]++;
}
}
readtemp[1]=readtemp[1]<<4;//将高低温度和为一个字节,本方法避免了*0。0625,很简单,很准确
readtemp[1]=readtemp[1] & 0x70;
xx="readtemp"[0];
xx="xx">>4;
xx="xx"& 0x0f;
readtemp[1]=readtemp[1] | xx;
temp[h]=readtemp[1];
fentemp="temp"[h];//拆分两路温度值送入显示单元
while( fentemp/10)
{
displaybuf[k+1]= fentemp%10;
fentemp= fentemp/10;
}
displaybuf[k]= fentemp;
k+=2;
if(k==3)
k="0";
}
k=0;
子程序
//18B20延时程序
void delayy(unsigned int i)
{
while(i--);
}
//初始化18B20函数
Init_DS18B20(void)
{
unsigned char x="0";
DQ = 1; //DQ复位
delayy(8); //稍做
延时
DQ = 0; //单片机将DQ拉低
delayy(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delayy(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x="1则初始化失败"
delayy(20);
}
//18B20读一个字节
ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delayy(4);
}
return(dat);
}
//18B20写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i="0";
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delayy(5);
DQ = 1;
dat>>=1;
}
delayy(4);
}
//18B20读ROM序列号
/*void read_ROM(void)
{
int n;
writecommandtods18b20(0x33);
for(n=0;n<8;n++){rom[0][n]=readdatafromds18b20();}
}*/下载本文