ds18b20温度传感器程序 求解释!!! 延时时间怎么计算的

ds18b20温度传感器程序 求解释!!! 延时时间怎么计算的,第1张

/

必要 *** 作:连接传感器DS18B20到U6

/

#pragma db code

#include<AT89X52H>

#include "INTRINSH"

#define BUSY1 (DQ1==0) //定义busy信号

sbit LED_0=P1^0; //定义数码管控制脚为P1口的0-3脚

sbit LED_1=P1^1;

sbit LED_2=P1^2;

sbit LED_3=P1^3;

sbit DQ1=P3^5; //定义18B20单总线引脚

void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);//声明显示函数

void ds_reset_1(void); //声明18B20复位函数

void wr_ds18_1(char dat); //声明18B20写入函数

void time_delay(unsigned char time);//声明延时函数

int get_temp_1(void); //声明18B20读入温度函数

void delay(unsigned int x); //声明延时函数

void read_ROM(void); //声明18B20读ROM函数

int get_temp_d(void); //声明获取温度函数

void ds_init(void); //声明18B20初始化函数

void ds_getT(void); //声明18B20获得温度显示值函数

/定义数码管段码=====0-9=====A-G=====/

unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F

/以下定义各种变量/

unsigned char ResultSignal;

int ResultTemperatureLH,ResultTemperatureLL,ResultTemperatureH;

unsigned char ROM[8];

unsigned char idata TMP;

unsigned char idata TMP_d;

unsigned char f;

unsigned char rd_ds18_1();

unsigned int TemH,TemL; //温度的整数部分和小数部分

unsigned int count; //定义小数计算部分

void main()

{

ds_init(); //18B20初始化

while(1)

{

ds_getT(); //使用该函数获得温度,整数部分存储到TemH,小数部分存储到count的低8位

display((TemH/10)%10,TemH%10,((count/10)%10),(count%10));

//温度发送到数码管显示

}

}

/18B20初始化函数/

void ds_init(void)

{

unsigned int k=0;

ds_reset_1();

ds_reset_1(); //reset

wr_ds18_1(0xcc); //skip rom

_nop_();

wr_ds18_1(0x7f);

ds_reset_1();

wr_ds18_1(0xcc);

_nop_();

wr_ds18_1(0x44);

for(k=0;k<11000;k++)

time_delay(255);

ds_reset_1();

}

void ds_getT(void)

{

wr_ds18_1(0xcc);

wr_ds18_1(0xbe);

TemH=get_temp_1();

TemL=get_temp_d();

TemH&=0x00ff;

TemL&=0x00ff;

count=(TemH256+TemL)625;

}

/延时程序,单位us,大于10us/

void time_delay(unsigned char time)

{

time=time-10;

time=time/6;

while(time!=0)time--;

}

//

/ reset ds18b20 /

//

void ds_reset_1(void)

{

unsigned char idata count=0;

DQ1=0;

time_delay(240);

time_delay(240);

DQ1=1;

return;

}

void check_pre_1(void)

{

while(DQ1);

while(~DQ1);

time_delay(30);

}

void read_ROM(void)

{

int n;

ds_reset_1();

check_pre_1();

wr_ds18_1(0x33);

for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}

}

//

/ Read a bit from 1820 位读取 /

//

bit tmrbit_1(void)

{

idata char i=0;

bit dat;

DQ1=0;_nop_();

DQ1=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

dat = DQ1;

time_delay(50);

return dat;

}

//

/ read a bety from ds18b20 字节读取 /

//

unsigned char rd_ds18_1()

{

unsigned char idata i,j,dat=0;

for(i=1;i<=8;i++)

{

j=tmrbit_1();

dat=(j<<(i-1))|dat;

}

return dat;

}

//

/ write a bety from ds18b20 写字节 /

//

void wr_ds18_1(char dat)

{

signed char idata i=0;

unsigned char idata j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat & 0x01;

dat = dat>>1;

if(testb)

{

DQ1=0;

_nop_();

_nop_();

DQ1=1;

time_delay(60);

}

else

{

DQ1=0;

time_delay(50);

DQ1=1;

_nop_();

_nop_();

}

}

}

int get_temp_1(void)

{

unsigned char idata a=0,b=0;

unsigned char idata i;

EA=0;

ds_reset_1();

check_pre_1();

wr_ds18_1(0xcc);

wr_ds18_1(0x44);

while(BUSY1);

ds_reset_1();

check_pre_1();

wr_ds18_1(0xcc);

wr_ds18_1(0xbe);

a=rd_ds18_1();

b=rd_ds18_1();

i=b; /若b为1则为负温 /

i=(i>>4);

if(i==0)

{

f=0;

TMP=((a>>4)|(b<<4));

a=(a&0x0f);

if (a>8)

{

TMP=(TMP+1);

}

}

else

{

f=1;

a=a>>4;

b=b<<4;

TMP=(a|b);

TMP=~TMP;

TMP=(TMP+1);

}

EA=1;

return(TMP);

}

int get_temp_d(void)

{

unsigned char idata a=0,b=0;

unsigned char idata i,m;

EA=0;

ds_reset_1();//复位

check_pre_1();

wr_ds18_1(0xcc);

wr_ds18_1(0x44);

while(BUSY1);

ds_reset_1();

check_pre_1();

wr_ds18_1(0xcc);

wr_ds18_1(0xbe);

a=rd_ds18_1();

b=rd_ds18_1();

i=b; /若b为1则为负温 /

i=(i>>4);

if(i==0)

{

f=0;

TMP=((a>>4)|(b<<4));

a=(a&0x0f);

TMP_d=a;

}

else

{

f=1;

a=~a;

a=(a+1);

b=~b;

b=(b+1);

m=a;

a=a>>4;

b=b<<4;

TMP=(a|b);

m=(m&0x0f);

TMP_d=m;

}

EA=1;

return(TMP_d);

}void delay(unsigned int x)

{

unsigned int i;

for(i=0;i<x;i++);

}

void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)

{

P0=a[d1];

LED_0=0;

delay(100);

LED_0=1;

P0=a[d2] & 0x7f;

LED_1=0;

delay(100);

LED_1=1;

P0=a[d3];

LED_2=0;

delay(100);

LED_2=1;

P0=a[d4];

LED_3=0;

delay(100);

LED_3=1;

}

以上就是关于ds18b20温度传感器程序 求解释!!! 延时时间怎么计算的全部的内容,包括:ds18b20温度传感器程序 求解释!!! 延时时间怎么计算的、为什么我的DS18B20总是乱跳呢以下是我的程序 请高人指点!!!、18b20初始化程序解释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9494043.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存