您好,欢迎来到抵帆知识网。
搜索
您的当前位置:首页18B20温度传感器应用

18B20温度传感器应用

来源:抵帆知识网
#include #include sbit ds18b20=P1^2; unsigned char TT,temp1; unsigned char temp2; unsigned char code

tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};

//--------------------------------------- //名称:复位DS18B20函数 //--------------------- bit Reset(void) {

unsigned inti; bit k;

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的要求

return k; //k=0为复位成功,k=1为复位失败 }

//--------------------------------------- //名称:读一字节函数

//--------------------------------------- unsigned char ReadByte(void) {

unsigned inti;

unsigned char j,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的要求 }

return buf; //退出的同时将接收缓冲区参数返回 }

//--------------------------------------- //名称:写一字节函数

//--------------------------------------- void WriteByte(unsigned char dat) {

unsigned inti; unsigned char j; 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温度转换函数 //--------------------------------------- bit Convert(void) {

if(Reset()==0) //复位DS18B20成功 {

WriteByte(0xcc); //写入跳过序列号命令字 Skip Rom

WriteByte(0x44); //写入温度转换命令字 Convert T

return 1; //启动温度转换成功 }

else //失败 {

return 0; //启动温度转换失败

} }

//--------------------------------------- //名称:转换结束处理函数

//--------------------------------------- void ReadFlash(void) {

unsigned char Lsb,Msb;

if(Reset()==0) //复位DS18B20成功 {

WriteByte(0xcc); //写入跳过序列号命令字 Skip Rom

WriteByte(0xbe); //写入读取数据令字 Read Scratchpad

Lsb=ReadByte(); //读出第一个字节暂存于LSB

Msb=ReadByte(); //读出第二个字节暂存于MSB

temp1=Lsb; //temp1内装温度参数的小数部分 temp2=Msb;//>>4)|(Lsb<<4);//temp2内装温度参数的整数部分 }

else {

temp1=0; //如果复位失败,温度参数清零 temp2=0; //如果复位失败,温度参数清零 } }

//---------------------------------------

void main(void) //主函数,单片机开机后就是从这个函数开始运行 {

unsigned char TT;

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\"

#define uchar unsigned char sbit DIO=P3^0; sbit B7=B^7; uchartL,tH;

void delay(uchar us) {

while(us--); }

bit init18b20() {

bit w;

DIO=0; //pull low

delay(145); //pull low 880us DIO=1; //pull High

delay(13); //pull High 90us w=DIO; //after read state

delay(88); //Not less than 480 us return w; //w=0,success,w=1,fail

}

uchar r18b20(void) {

uchari;

B=0;

for(i=0;i<8;i++) {

B=B>>1; DIO=0;

_nop_(); //pull low 2us

_nop_(); //12M nop 2 times,6M 1 time. DIO=1; //pull high read _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

B7=DIO; //read bit to B delay(8); // 60us

}

}

return B;

void w18b20(uchardat) {

uchari;

if(dat& 0x01)

{

for(i=0;i<8;i++) {

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) //0 sucess

{

w18b20(0xcc);

w18b20(0x44); return 1;

}

else //1 fail }

voidreaddata(void) {

return 0;

ucharLsb,Msb;

if(init18b20()==0) //sucess {

w18b20(0xcc);

w18b20(0xbe); Lsb=r18b20(); Msb=r18b20(); tL=Lsb; tH=Msb;

}

else {

tL=0;

tH=0;

} }

void main() {

uchar temp;

while(1)

{

if(converT()==1) //start conver

{

readdata();

temp=(tH<<4) | (tL>>4); P2=temp;

} } }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务