<meta name="keywords" content="必胜时时彩开户,keywords" /> 51单片机的ds18b20驱动法式模范 联系我们

51单片机的ds18b20驱动法式模范模范

 

//////////////////////////////////////////////////////头文件///////////////////////////////////////////////////////
/*******************************************************************************
*  效果:  18b20温度芯片驱动法式模范模范                                                            *
*  文件:  18b20.h 18b20.c                                                                         *
*  日期:  2010-3-11                                                                                     *
*  版本:  1.12(实验经由历程版)可用51hei单片机开发板               *
*  邮箱: 
acsdf139@163.com       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;
      }
}
/*************************************
函数名: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';
 
 }
 
}