单片机驱动DS18B20

              闲着蛋疼,花了1个小时用51驱动了ds18b20。

              18b20的DQ脚要接上拉电阻,取4.7K就行了。

               直接上代码吧。               

#include "ioCC1110.h"
#include "hal.h"

#define DQ P1_5
#define INPUT 0
#define OUTPUT 1

#define DS18B20_(put) \
  do{                 \
      if(put == INPUT)\
        P1DIR &= 0xDF;\
      else            \
        P1DIR |= 0X20;\
}while(0)

BYTE Temperature[30] = "the temperature is : ";

void DS18B20_Reset(void)    //DS18B20 RESET
{
    DS18B20_(OUTPUT);      //设置为输出状态
    DQ = 0;                //拉低总线
    Delay_us(500);         //需要将总线拉低480~950us
    DQ = 1;                //释放总线
    Delay_us(60);          //DS18B20拉低信号,60~240us表示应答
    DS18B20_(INPUT);       //读入DS18B20拉低信号
    while(DQ);             //等待DS18B20应答
    while(!DQ);            //等待DS18B20释放总线
}

void Write_DS18B20(BYTE Data) 
{
//    BYTE Temp;
    DS18B20_(OUTPUT);      //设置DS18B20输出状态
    for(BYTE i=0;i<8;i++){
        DQ = 0;            //拉低总线
        Delay_us(10);      //需要拉低10~15us
 
        if(Data&0x01)
            DQ = 1;
        else
            DQ = 0;
        Delay_us(40);      //需要拉低20~40us来写0
        DQ = 1;            //释放总线
        Delay_us(1);       //稍微延时
        Data >>= 1;        
    }
}

BYTE Read_DS18B20(void)
{
    BYTE Temp;
    for(BYTE i=0;i<8;i++){
        Temp >>= 1;
        DS18B20_(OUTPUT);  //DQ为输出状态
        DQ = 0;            //拉低总线,启动输入
        Delay_us(1);       //拉低总线约1us
        DQ = 1;            //释放总线
        DS18B20_(INPUT);   //DQ为输入状态
        if(DQ)
          Temp |= 0x80;
        Delay_us(45);      //延时45us
    }
    return Temp;
}

void Read_Temperature(void)
{
//    U16 LowTemp,HighTemp,Temp;
    BYTE LowTemp;
    BYTE HighTemp;
    U16 Temp;
    DS18B20_Reset();
    Write_DS18B20(0xCC);       //跳过ROM
    Write_DS18B20(0x44);       //温度转换
    DS18B20_Reset();
    Write_DS18B20(0xCC);       //跳过ROM
    Write_DS18B20(0xbe);       //读取RAM
    LowTemp = Read_DS18B20();  //读低8位,LS Byte RAM0
    HighTemp = Read_DS18B20(); //读高8位,MS Byte RAM1
    DS18B20_Reset();
    Temp = (U16)(((HighTemp<<8)|LowTemp)*6.25); //0.0625=>xx,0.625=>xx.x,6.25=>xx.xx
    Temperature[21] = Temp/1000+48;
    Temperature[22] = Temp%1000/100+48;
    Temperature[23] = '.';
    Temperature[24] = Temp%100/10+48;
    Temperature[25] = Temp%10+48;
    Temperature[26] = ' ';
    Temperature[27] = 'C';    
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值