51单片机的ds18b20驱动程序

/*******************************************************************************
*  标题:  18b20温度芯片驱动程序                                                            *
*  文件:  18b20.h 18b20.c                                                                         *
*  日期:  2010-3-11                                                                                     *
*  版本:  1.12(试验通过版)可用51hei单片机开发板               *
*  邮箱: 
[email protected]        qq:526083029                                 *
*  网站: 无                                                                                                  *
********************************************************************************
*  描述:                                                                                                          *
*         用法:首先在主程序内添加头文件#include"18b20.c"                 *
*      在程序中使用ReadTemp();获取温度芯片内数据                             *
*      使用 temp_to_str();函数将时间数据转换液晶字符                         *         
*                                                                                                                     *
********************************************************************************
*【版权】自己参照网上,朋友,以及书本资料上写的,所以没有版权       *
*【声明】此程序,可用于学习,参考及实际设计中,欢迎转载复制以及建议批评     *
*【技术支持】qq:526083029  小张                                                      *
********************************************************************************/
 
#ifndef _18B20_H_
#define _18B20_H_
#define uchar unsigned char
#define rerom1820            0x33       // 读ROM指令   
#define matchrom1820         0x55      // 匹配ROM指令   
#define skiprom1820          0xCC      // 跳过ROM指令   
#define searchrom1820        0xF0      // 搜索ROM指令   
#define alarmsearch1820      0xEC      // 报警搜索指令   
#define wrscratchpad1820     0x4E      // 写暂存寄存器指令   
#define rescratchpad1820     0xBE      // 读暂存寄存器指令   
#define copyscratchpad1820   0x48      // 复制暂存寄存器指令   
#define convert1820          0x44      // 启动温度转换指令   
#define recalle21820         0xB8      // 重新调出E2PROM的数据 
/***********ds18b20延迟子函数*******/
extern void delaydq(uchar i);
/**********ds18b20初始化函数**********************/
extern void dqinit(void);
/***********ds18b20读一个字节**************/ 
extern uchar re1820b(void);
/*************ds18b20写一个字节****************/ 
extern void wr1820b(uchar dat);
extern void ReadTemp(void);
extern void temp_to_str();
#endif
///////////////////////////////////////////////////////////c程序//////////////////////////////////////////////
#include <AT89X52.H>
#include "18b20.h"
#include <intrins.h>
//管脚定义
sbit DQ=P3^0;
 
uchar TempBuffer[8];
uchar temp_value,temp2,xs,fflag;
             
 
/*************************************
函数名:delaydq
函数功能:延时
参数:i(秒数)
返回:无
备注:无
*************************************/
void delaydq(uchar i)
{
       while(i--);
}
/*************************************
函数名:dqinit
函数功能:初始化
参数:无
返回:无
备注:无
*************************************/
void dqinit(void)
{
        uchar x=0;
        DQ = 1;          //DQ 复位
        delaydq(8); // 稍做延时
        DQ = 0;          // 单片机将DQ拉低
        delaydq(80); // 精确延时 大于 480us
        DQ = 1;          // 拉高总线
        delaydq(14);
        x=DQ;            // 稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        delaydq(20);
}
/*************************************
函数名:re1820b
函数功能:读数据
参数:无
返回:dat(数据)
备注:无
*************************************/
uchar re1820b(void)
{
       uchar i=0;
       uchar dat = 0;
       for (i=8;i>0;i--)
        {
               DQ = 0; // 给脉冲信号
               dat>>=1;
               DQ = 1; // 给脉冲信号
               if(DQ)
               dat|=0x80;
               delaydq(4);
        }
       return(dat);
}
/*************************************
函数名:wr1820b
函数功能:写数据
参数:dat(数据)
返回:无
备注:无
*************************************/
void wr1820b(uchar dat)
{
       unsigned char i=0;
       for (i=8; i>0; i--)
       {
             DQ = 0;
              DQ = dat&0x01;
           delaydq(5);
              DQ = 1;
           dat>>=1;
       }
}
/*************************************
作者:刘温电   来源:本站原创   点击数:5292  更新时间:2013年11月26日
函数名:ReadTemp
函数功能:温度转换
参数:无
返回:无
备注:无
*************************************/
void ReadTemp(void)
{
       unsigned char a=0;
       unsigned char b=0;
       unsigned char t=0;
 
       dqinit();
       wr1820b(0xCC);        // 跳过读序号列号的操作
       wr1820b(0x44);    // 启动温度转换
 
       delaydq(100);      
       dqinit();
       wr1820b(0xCC);   // 跳过读序号列号的操作
       wr1820b(0xBE);  // 读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 
       delaydq(100);
 
       a=re1820b();       // 读取温度值低位
       b=re1820b();              // 读取温度值高位
    if(b>127)
       {
       b=(256-b);a=(256-a);fflag=1; // 负温度求补码
       }
       temp_value=b<<4;
       temp_value+=(a&0xf0)>>4;  
    temp2=a&0x0f;             // 小数的值
      
 
   xs=temp2*0.0625*10; // 小数位,若为0.5则算为5来显示   xs小数
 
        
}
 
/*************************************
函数名:temp_to_str
函数功能:温度显示
参数:无
返回:无
备注:无
*************************************/
void temp_to_str()    // 温度数据转换成液晶字符显示
{
 if(fflag==1)
 { TempBuffer[0]='-';
             TempBuffer[1]=temp_value/10+'0'; // 十位
             TempBuffer[2]=temp_value%10+'0';  // 个位
             TempBuffer[3]='.';
             TempBuffer[4]=xs+'0';
             TempBuffer[5]=0xdf;   // 温度符号
             TempBuffer[6]='C';
             TempBuffer[7]='\0';
 }
 else
 {
             TempBuffer[0]='+';
             TempBuffer[1]=temp_value/10+'0';  // 十位
             TempBuffer[2]=temp_value%10+'0'; // 个位
             TempBuffer[3]='.';
             TempBuffer[4]=xs+'0';
             TempBuffer[5]=0xdf;   // 温度符号
             TempBuffer[6]='C';
             TempBuffer[7]='\0';
 
 }
 
}

猜你喜欢

转载自blog.csdn.net/Keven__Ding/article/details/80268718