您的当前位置:首页正文

温度传感器DS18B20

2020-09-14 来源:榕意旅游网


#include #include #include sbit DQ=P2^3;

unsigned char tempL=0; //临时变量低位 unsigned char tempH=0; //临时变量高位 double temperature; //温度值

/*void delay10(void) //误差 0us//10us {

unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>0;a--); }

void delay15(void) {

unsigned char a; for(a=6;a>0;a--); }*/

void delay30(void) {

unsigned char a,b; for(b=3;b>0;b--) for(a=3;a>0;a--); }

void delay45(void) {

unsigned char a; for(a=21;a>0;a--); }

/*void delay60(void) {

unsigned char a,b; for(b=3;b>0;b--) for(a=8;a>0;a--); }

void delay128(void) {

unsigned char a,b; for(b=25;b>0;b--) for(a=1;a>0;a--); } */

void delay500(void) {

//误差 0us//15us //误差 0us //30us //误差 0us //45us //误差 0us //误差 0us //误差 0us//500us

unsigned char a,b; for(b=71;b>0;b--) for(a=2;a>0;a--); }

/*void delay800(void) //误差 0us //800us {

unsigned char a,b,c; for(c=1;c>0;c--) for(b=2;b>0;b--) for(a=197;a>0;a--); }

void delay70(void) //误差 0us {

unsigned char a,b; for(b=1;b>0;b--) for(a=32;a>0;a--); }

void delay14(void) //误差 0us {

unsigned char a,b,c,d; for(d=1;d>0;d--) for(c=1;c>0;c--) for(b=1;b>0;b--) for(a=1;a>0;a--); }

void delay40ms(void) //误差 0us {

unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } */

void delay150ms(void) //误差 0us //150ms {

unsigned char a,b,c; for(c=3;c>0;c--) for(b=116;b>0;b--) for(a=214;a>0;a--); }

/*void delay600ms(void) //误差 0us {

unsigned char a,b,c; for(c=244;c>0;c--)

for(b=8;b>0;b--) for(a=152;a>0;a--);

_nop_(); //if Keil,require use intrins.h } */

void delay800ms(void) //误差 0us {

unsigned char a,b,c; for(c=95;c>0;c--) for(b=138;b>0;b--) for(a=29;a>0;a--);

_nop_(); //if Keil,require use intrins.h _nop_(); //if Keil,require use intrins.h }

/**************************************************************************** 函数功能: 入口参数: 出口参数:

****************************************************************************/ Init_DS18B20(void) {

unsigned char x=0; DQ=1; //DQ 先置高 _nop_(); //延时

DQ=0; //发送复位脉冲 delay500();

//延时(>480ms)6 为 480us13 为大于 960us DQ=1;

//拉高数据线

while(DQ); //等待(15~60ms) DQ=1; delay500(); }

/**************************************************************************** 函数功能:向 DS18B20 读一字节数据 入口参数: 出口参数:dat

****************************************************************************/ bit read() { bit b; DQ=1; DQ=0; _nop_();

_nop_(); _nop_(); _nop_(); DQ=1; _nop_(); _nop_(); _nop_();

_nop_();_nop_(); b=DQ; delay45();

_nop_();_nop_(); return b; }

unsigned char ReadOneChar(void) 45us 完 成 {

unsigned char i=0; unsigned char j=0; bit b;

for (i=8;i>0;i--) {

b=read(); if(b) j+=1;

j=_cror_(j,1); }

return j; }

void write0() {

DQ=1; DQ=0; delay30();

delay30();//delay10(); //while(DQ==0); DQ=1; //delay45(); _nop_(); _nop_(); }

void write1() {

DQ=1;

//置低大于 1us 拉高大于 1us,15us 内采集,延时

DQ=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DQ=1; _nop_(); _nop_(); _nop_(); _nop_(); delay45(); //delay10(); //delay10(); }

/**************************************************************************** 函数功能:向 DS18B20 写一字节数据 入口参数:dat 出口参数:

****************************************************************************/ WriteOneChar(unsigned char dat)//置低延时 10us,赋值延时 50us {

unsigned char i=0; for(i=8;i>0;i--) {

if(dat&0x01) write1(); else write0(); dat=dat>>1; delay45(); } }

/**************************************************************************** 函数功能:向 DS18B20 读温度值 入口参数:

出口参数:temperature

****************************************************************************/ ReadTemperature(void) {

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的操作 WriteOneChar(0x44); //启动温度转换

delay800ms(); //转换需要一点时间,延时 100~200ms Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的操作

WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); //读出温度的低位 LSB tempH=ReadOneChar(); //读出温度的高位 MSB

//温度转换,把高低位做相应的运算转化为实际温度 temperature=((tempH*256)+(tempL))*0.0625; delay150ms();

return(temperature); }

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