[C51代码]DS18B20驱动

发布者:龙腾少年最新更新时间:2016-07-28 来源: eefocus关键字:C51代码  DS18B20驱动 手机看文章 扫描二维码
随时随地手机看文章

/*******************ds18b20.c**************************/
#include "Atmel/AT89X51.h"
#include "link.h"
#include "ds18b20.h"
#include "delay.h"

/**************定量定义***************/
union
  {
   uchar c[2];
   uint x;
  
   }temp;

uchar idata flag=0;
uint idata cc=0;
uchar idata disp[8];

 /****************************************************************
 *函数功能:复位DS18B20
 *入口参数:无 
 *出口参数:presence,指示复位是否成功
 ****************************************************************/
uchar Reset_DS18B20(void)
{
 uchar presence;
 DQ = 0;    //pull DQ line low
 delay(248);    // leave it low for 500us
 DQ = 1;    // allow line to return high
 delay(48);    // wait for presence 100us
 presence = DQ;   // get presence signal
 delay(198);    // wait for end of timeslot 400us
 return(presence); // presence signal returned
}       // 0=presence, 1 = no part

 /****************************************************************
 *函数功能:读取DS18B20的一个字节
 *入口参数:无 
 *出口参数:value,读取的一个字节
 ****************************************************************/
uchar read_byte(void)
{
 uchar i;
 uchar value = 0;
 for (i=8;i>0;i--)
 {
  value>>=1;
  DQ = 0;      // pull DQ low to start timeslot
  DQ = 1;      // then return high
  delay(3);    //   11us
  if(DQ) value|=0x80;
  delay(25); // wait for rest of timeslot   55us
 }
 return(value);
}

 /****************************************************************
 *函数功能:写一个字节到DS18B20
 *入口参数:val,要写的一个字节 
 *出口参数:无
 ****************************************************************/
void write_byte(uchar val)
{
 uchar i;
 for (i=8; i>0; i--) 
 {
  DQ = 0;         // pull DQ low to start timeslot
  DQ = val&0x01; // 写1时,使得15us以内拉高 整个写1时隙不低于60us,写0时保持低在60us到120us之间
  delay(38);      // hold value for remainder of timeslot    80us
  DQ = 1;
  val=val/2;
 }
 delay(38);      //80us
}
 /****************************************************************
 *函数功能:读取DS18B20的温度值
 *入口参数:无 
 *出口参数:temp.x温度值
 ****************************************************************/
uint Read_Temperature(void)
{ EA=0;
  Reset_DS18B20();
  write_byte(0xCC); // Skip ROM
  write_byte(0xBE); // Read Scratch Pad
  temp.c[1]=read_byte();
  temp.c[0]=read_byte();
  Reset_DS18B20();
  write_byte(0xCC); //Skip ROM
  write_byte(0x44); // Start Conversion
  return temp.x;
}
 /****************************************************************
 *函数功能:将DS18B20的温度值送LCD显示
 *入口参数:无 
 *出口参数:无
 ****************************************************************/
void DS18B20Disp(void)

    flag=0;                   //温度正负标志位
    cc=Read_Temperature();
 if (cc>0xf800)
  {
    flag=1;

    cc=~cc+1;
   }
     cc=cc*0.625;

    disp[0]='0'+cc/1000; 
 disp[1]='0'+(cc/100)%10;
 disp[2]='0'+(cc/10)%10;
 disp[3]='.';       //小数点
 disp[4]='0'+cc%10;
 disp[5]=0xdf;
 disp[6]='C';
 disp[7]='\0';

 if(flag)
    { if (disp[1]=='0')
        { 
       disp[0]=' ';
       disp[1]='-';
           
      }
   else disp[0]='-';
     
    }
 else 
    { if (disp[0]=='0')
      {
     disp[0]=' ';
     if(disp[1]=='0') disp[1]=' ';
   }
    
        
    }
}
/* 延时函数为
void delay(unsigned char i)
{
 while(--i);                                       
}
*/

/*******************ds18b20.h**************************/
#ifndef _DS18B20_h_
#define _DS18B20_h_
#include "Atmel/AT89X51.h"
#include "link.h"
/**************引脚定义***************/
sbit DQ=P1^0; //IO

/**************变量声明***************/
extern uchar idata disp[8];

/**************函数声明***************/
extern uchar Reset_DS18B20(void);
extern uchar read_byte(void);
extern void write_byte(uchar val);
extern uint Read_Temperature(void); 
extern void DS18B20Disp(void);

#endif

关键字:C51代码  DS18B20驱动 引用地址:[C51代码]DS18B20驱动

上一篇:[C51代码]MAX7219驱动
下一篇:[C51代码]DS1302驱动

推荐阅读最新更新时间:2024-03-16 15:02

[C51代码]I2C总线协议程序
/**************************************************************** I2C总线协议程序 ****************************************************************/ #define NOP {_nop_();_nop_();_nop_();_nop_();} sbit SDA=P1^2; /*模拟I2C数据传送位*/ sbit SCL=P1^3; /*模拟I2C时钟控制位*/ bit ack; /*应答标志位*/ void Start_I2c() {
[单片机]
keil C51语言编程如何缩减编译代码长度
1、整形数字符做乘除法的C51程序,代码比较大。约9B左右,所以尽量不做乘除法。 例如:uchar a=6;a=a*6;第二行代码要9个字节,而平时的语句只有2B。 2、定义变量的语句,不赋值或者不参与运算是不算代码的,能用短变量就用短变量,省RAM也省代码空间. 例如:uchar a; 这句有没有代码长度不变。但是赋非0值 uchar a=5;字符型,就要3B的代码长度。 uint a=5;整形变量赋值要6B字节,比较大,所以能定义短变量就定义短变量。 unsigned long int a=6.0;或者 long int a=6.0;会增加9B的代码。赋值整数浮点数一样。 3、对长整形变量,有符号变量比无符号变量
[单片机]
PIC16F877A驱动DS18B20温度采集芯片
今天开始驱动DS18B20温度采集芯片! 从网上收集的资料 DS18B20的内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下: DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的
[单片机]
PIC16F877A<font color='red'>驱动</font><font color='red'>DS18B20</font>温度采集芯片
51单片机1602、18B20电子钟--C51代码
#include REGx52.h #include RICHMCU.H sbit a0 = ACC^0; sbit a1 = ACC^1; sbit a2 = ACC^2; sbit a3 = ACC^3; sbit a4 = ACC^4; sbit a5 = ACC^5; sbit a6 = ACC^6; sbit a7 = ACC^7; sbit DQ = P3^3 ; //18B20接口 sbit speaker = P3^6 ; //蜂鸣器 sbit MODE = P1^4 ; //模式键 sbit INC = P1^5 ; //增加键 sbit DEC = P1^6 ; //减少键 sbit OK
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved