DS18B20 驱动
时间:10-02
整理:3721RD
点击:
/*****无敌呆呆猫--2015/7/21--12:02--DS18B20驱动*****/
#include<reg51.h>
#define wei P0
#define duan P2
sbit DQ=P3^7; //12M晶振for(x=1;x>0:x--);等于3us
unsigned long WENDU_T,WENDU_L,WENDU_H; //x每次加1等于2us
unsigned int b;
unsigned char c,jianche,fuhao;
unsigned char code zifuku[]={0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,//3641BG:4位共阳
0x80,0x90,0x88,0x83,//极数码管字符表
0xC6,0xA1,0x86,0x8E};
void delay4us(void)
{ ; ; ; }
void delay(unsigned int a){
unsigned int i;
for(;a>0;a--)
for(i=1;i>0;i--);//34us 每次a+1延时+21us
}
void _nop_(void); //1us
void fuwei(){ //复位
DQ=1;
_nop_();
DQ=0;
delay(28); //601us
DQ=1;
delay4us();
delay4us();
delay4us();
delay(2);//55us+3*4us=67us 复位脉冲过后DS18B20低电平应答最晚
//出现在60us后最短持续时间15+60=75us内 最安全的检测时间
//60us+(75-60)/2 也就是60<67.5us<75
if(DQ==0){jianche=1;}//低电平回应检测
else{jianche=0;}
delay4us();
delay(19);//412us (412us+4us)>(480us-67us)
}
void Tx(unsigned int number_x){ //写
b=0;
for(b=8;b>0;b--){
DQ=0;
_nop_(); //1us写警告
DQ=number_x&0x01; //从低位开始写
delay(3); //76us 读写一位至少要60us<(1+76)<120us
DQ=1; // 释放数据线
number_x=number_x>>1;
_nop_(); //每位读写时序要至少1us间隔
_nop_();
}
}
unsigned int Rx(void){ //读
unsigned int number_d;
b=0;
for(b=8;b>0;b--){
number_d=number_d>>1;
DQ=0;
_nop_(); //1us读警告
DQ=1;
delay4us();
delay4us(); //8us 采样一位至少要1us<(1+4us+4us)<15us
if(DQ==1){number_d=number_d|0x80;}//读取并重新排列提取到的数据位
delay(1); //55us 读取一位至少要(1us+8us+1us+55us)>60us
_nop_(); //每位读写时序要至少1us间隔
_nop_();
}
return (number_d); //返回读取到的数据
}
void main(){
DQ=1;
while(1){
b=0;
fuwei();
if(jianche==1){ //未检测到DS10B20回应会重新初始化
Tx(0xcc); //跳过ROM
Tx(0x44); //温度变换
delay(38100);//800ms DS18B20温度转换时间
fuwei();
if(jianche==1){
Tx(0xcc); //跳过ROM
Tx(0xbe); //读暂存器通知
WENDU_L=Rx();
WENDU_H=Rx();
}
}
if(WENDU_H>0x07){ //s全为1 温度小于0
WENDU_T=((~WENDU_H)*256+((~WENDU_L))+1)*625;
fuhao=0xbf;
}
else{ //s全为0 温度大于0
WENDU_T=(WENDU_H*256+WENDU_L)*625;
fuhao=0xff;
}
for(b=300;b>0;b--){
wei=0x80;
duan=fuhao; //-号
delay(130);
duan=0xff;
wei=0x40;
duan=zifuku[WENDU_T/1000000]; //百
delay(130);
duan=0xff;
wei=0x20;
duan=zifuku[WENDU_T%1000000/100000]; //十
delay(130);
duan=0xff;
wei=0x10;
duan=zifuku[WENDU_T%1000000%100000/10000]&0x7f;//加小数点 个
delay(130);
duan=0xff;
wei=0x8;
duan=zifuku[WENDU_T%1000000%100000%10000/1000];
delay(130);
duan=0xff;
wei=0x4;
duan=zifuku[WENDU_T%1000000%100000%10000%1000/100];
delay(130);
duan=0xff;
wei=0x2;
duan=zifuku[WENDU_T%1000000%100000%10000%1000%100/10];
delay(130);
duan=0xff;
wei=0x1;
duan=zifuku[WENDU_T%1000000%100000%10000%1000%100%10];
delay(130);
duan=0xff;
}
}
}
#include<reg51.h>
#define wei P0
#define duan P2
sbit DQ=P3^7; //12M晶振for(x=1;x>0:x--);等于3us
unsigned long WENDU_T,WENDU_L,WENDU_H; //x每次加1等于2us
unsigned int b;
unsigned char c,jianche,fuhao;
unsigned char code zifuku[]={0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,//3641BG:4位共阳
0x80,0x90,0x88,0x83,//极数码管字符表
0xC6,0xA1,0x86,0x8E};
void delay4us(void)
{ ; ; ; }
void delay(unsigned int a){
unsigned int i;
for(;a>0;a--)
for(i=1;i>0;i--);//34us 每次a+1延时+21us
}
void _nop_(void); //1us
void fuwei(){ //复位
DQ=1;
_nop_();
DQ=0;
delay(28); //601us
DQ=1;
delay4us();
delay4us();
delay4us();
delay(2);//55us+3*4us=67us 复位脉冲过后DS18B20低电平应答最晚
//出现在60us后最短持续时间15+60=75us内 最安全的检测时间
//60us+(75-60)/2 也就是60<67.5us<75
if(DQ==0){jianche=1;}//低电平回应检测
else{jianche=0;}
delay4us();
delay(19);//412us (412us+4us)>(480us-67us)
}
void Tx(unsigned int number_x){ //写
b=0;
for(b=8;b>0;b--){
DQ=0;
_nop_(); //1us写警告
DQ=number_x&0x01; //从低位开始写
delay(3); //76us 读写一位至少要60us<(1+76)<120us
DQ=1; // 释放数据线
number_x=number_x>>1;
_nop_(); //每位读写时序要至少1us间隔
_nop_();
}
}
unsigned int Rx(void){ //读
unsigned int number_d;
b=0;
for(b=8;b>0;b--){
number_d=number_d>>1;
DQ=0;
_nop_(); //1us读警告
DQ=1;
delay4us();
delay4us(); //8us 采样一位至少要1us<(1+4us+4us)<15us
if(DQ==1){number_d=number_d|0x80;}//读取并重新排列提取到的数据位
delay(1); //55us 读取一位至少要(1us+8us+1us+55us)>60us
_nop_(); //每位读写时序要至少1us间隔
_nop_();
}
return (number_d); //返回读取到的数据
}
void main(){
DQ=1;
while(1){
b=0;
fuwei();
if(jianche==1){ //未检测到DS10B20回应会重新初始化
Tx(0xcc); //跳过ROM
Tx(0x44); //温度变换
delay(38100);//800ms DS18B20温度转换时间
fuwei();
if(jianche==1){
Tx(0xcc); //跳过ROM
Tx(0xbe); //读暂存器通知
WENDU_L=Rx();
WENDU_H=Rx();
}
}
if(WENDU_H>0x07){ //s全为1 温度小于0
WENDU_T=((~WENDU_H)*256+((~WENDU_L))+1)*625;
fuhao=0xbf;
}
else{ //s全为0 温度大于0
WENDU_T=(WENDU_H*256+WENDU_L)*625;
fuhao=0xff;
}
for(b=300;b>0;b--){
wei=0x80;
duan=fuhao; //-号
delay(130);
duan=0xff;
wei=0x40;
duan=zifuku[WENDU_T/1000000]; //百
delay(130);
duan=0xff;
wei=0x20;
duan=zifuku[WENDU_T%1000000/100000]; //十
delay(130);
duan=0xff;
wei=0x10;
duan=zifuku[WENDU_T%1000000%100000/10000]&0x7f;//加小数点 个
delay(130);
duan=0xff;
wei=0x8;
duan=zifuku[WENDU_T%1000000%100000%10000/1000];
delay(130);
duan=0xff;
wei=0x4;
duan=zifuku[WENDU_T%1000000%100000%10000%1000/100];
delay(130);
duan=0xff;
wei=0x2;
duan=zifuku[WENDU_T%1000000%100000%10000%1000%100/10];
delay(130);
duan=0xff;
wei=0x1;
duan=zifuku[WENDU_T%1000000%100000%10000%1000%100%10];
delay(130);
duan=0xff;
}
}
}
小编这是分享还是碰到什么问题啊?
问题都解决了 只是笔记啦
分享一下是啥问题,怎么解决的呗
解决过程都在程序旁边添加注释了啊。