18B20温度传感器应用.docx
- 文档编号:4356023
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:7
- 大小:16.56KB
18B20温度传感器应用.docx
《18B20温度传感器应用.docx》由会员分享,可在线阅读,更多相关《18B20温度传感器应用.docx(7页珍藏版)》请在冰豆网上搜索。
18B20温度传感器应用
#include
#include
sbitds18b20=P1^2;
unsignedcharTT,temp1;
unsignedchartemp2;
unsignedchar codetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
//---------------------------------------
//名称:
复位DS18B20函数
//---------------------
bitReset(void)
{
unsignedinti;
bitk;
ds18b20=0; //拉低DQ总线开始复位
i=95; //保持DQ低大约870uS,符合不低于48US的要求
while(i--); //保持DQ低大约870uS,符合不低于48US的要求
//保持DQ低大约870uS,符合不低于48US的要求
ds18b20=1; //拉高准备接收数据
i=9; //大约80uS后
while(i--); //大约80uS后
//大约80uS后
k=ds18b20; //读出数据并保存
i=55; //维持约490US,符合总读时隙不低于480US的要求
while(i--); //维持约400US,符合总读时隙不低于480US的要求
//维持约400US,符合总读时隙不低于480US的要求
returnk; //k=0为复位成功,k=1为复位失败
}
//---------------------------------------
//名称:
读一字节函数
//---------------------------------------
unsignedcharReadByte(void)
{
unsignedinti;
unsignedcharj,buf=0;
for(j=0;j<8;j++) //接收8次还原一个字节数据
{
buf=buf>>1; //接收前,想将接收缓冲区右移
ds18b20=0; //拉低
_nop_(); //维持2US,符合大于1US小于15US的规范
_nop_(); //维持2US,符合大于1US小于15US的规范
ds18b20=1; //拉高,为读数据做准备
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
if(ds18b20==1)
buf|=0x80; //读出1位数据保存于buf中
i=7; //维持约52US,符合总读时隙不低于60US的要求
while(i--); //维持约52US,符合总读时隙不低于60US的要求
//维持约52US,符合总读时隙不低于60US的要求
}
returnbuf; //退出的同时将接收缓冲区参数返回
}
//---------------------------------------
//名称:
写一字节函数
//---------------------------------------
voidWriteByte(unsignedchardat)
{
unsignedinti;
unsignedcharj;
for(j=0;j<8;j++)
{
if(dat&0x01) //如果写1
{
ds18b20=0; //拉低
_nop_(); //维持2US,符合大于1US小于15US的规范
_nop_(); //维持2US,符合大于1US小于15US的规范
ds18b20=1; //拉高
i=7; //维持约63US,符合不低于60US的要求
while(i--); //维持约63US,符合不低于60US的要求
}
else //如果写0
{
ds18b20=0; //拉低
i=7; //维持约63US,符合不低于60US的要求
while(i--); //维持约63US,符合不低于60US的要求
ds18b20=1; //拉高
_nop_(); //维持2US,符合大于1US的规范
_nop_(); //维持2US,符合大于1US的规范
}
dat=dat>>1; //写入字节右移1位
}
}
//---------------------------------------
//名称:
DS18B20温度转换函数
//---------------------------------------
bitConvert(void)
{
if(Reset()==0) //复位DS18B20成功
{
WriteByte(0xcc); //写入跳过序列号命令字SkipRom
WriteByte(0x44); //写入温度转换命令字ConvertT
return1; //启动温度转换成功
}
else //失败
{
return0; //启动温度转换失败
}
}
//---------------------------------------
//名称:
转换结束处理函数
//---------------------------------------
voidReadFlash(void)
{
unsignedcharLsb,Msb;
if(Reset()==0) //复位DS18B20成功
{
WriteByte(0xcc); //写入跳过序列号命令字SkipRom
WriteByte(0xbe); //写入读取数据令字ReadScratchpad
Lsb=ReadByte(); //读出第一个字节暂存于LSB
Msb=ReadByte(); //读出第二个字节暂存于MSB
temp1=Lsb; //temp1内装温度参数的小数部分
temp2=Msb;//>>4)|(Lsb<<4);//temp2内装温度参数的整数部分
}
else
{
temp1=0; //如果复位失败,温度参数清零
temp2=0; //如果复位失败,温度参数清零
}
}
//---------------------------------------
voidmain(void) //主函数,单片机开机后就是从这个函数开始运行
{
unsignedcharTT;
while
(1) //死循环,单片机初始化后,将一直运行这个死循环
{
if(Convert()==1) //启动转换
{
ReadFlash(); //读取温度
TT=(temp2<<4)|(temp1>>4);
P3=tab[TT/10]; //温度整数部分个位
P2=tab[TT%10]; //温度整数部分十位
}
}
}
#include"reg52.h"
#include"intrins.h"
#defineucharunsignedchar
sbitDIO=P3^0;
sbitB7=B^7;
uchartL,tH;
voiddelay(ucharus)
{
while(us--);
}
bitinit18b20()
{
bitw;
DIO=0; //pulllow
delay(145); //pulllow880us
DIO=1; //pullHigh
delay(13); //pullHigh90us
w=DIO; //afterreadstate
delay(88); //Notlessthan480us
returnw; //w=0,success,w=1,fail
}
ucharr18b20(void)
{
uchari;
B=0;
for(i=0;i<8;i++)
{
B=B>>1;
DIO=0;
_nop_(); //pulllow2us
_nop_(); //12Mnop2times,6M1time.
DIO=1; //pullhigh read
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
B7=DIO; //readbittoB
delay(8);//60us
}
returnB;
}
voidw18b20(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
if(dat&0x01)
{
DIO=0;
_nop_();
_nop_();
DIO=1;
delay(10);
}
else
{
DIO=0;
_nop_();
_nop_();
DIO=0;
delay(8);
DIO=1;
_nop_();
_nop_();
}
dat=dat>>1;
}
}
bitconverT(void)
{
if(init18b20()==0) //0sucess
{
w18b20(0xcc);
w18b20(0x44);
return1;
}
else //1fail
return0;
}
voidreaddata(void)
{
ucharLsb,Msb;
if(init18b20()==0) //sucess
{
w18b20(0xcc);
w18b20(0xbe);
Lsb=r18b20();
Msb=r18b20();
tL=Lsb;
tH=Msb;
}
else
{
tL=0;
tH=0;
}
}
voidmain()
{
uchartemp;
while
(1)
{
if(converT()==1) //startconver
{
readdata();
temp=(tH<<4)|(tL>>4);
P2=temp;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 18 B20 温度传感器 应用