微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > DS18B20 驱动

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;                  
                                                                           }
                        }
}

小编这是分享还是碰到什么问题啊?

问题都解决了  只是笔记啦

分享一下是啥问题,怎么解决的呗

  解决过程都在程序旁边添加注释了啊。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top