DS18B20测负温度程序

发布者:红尘清梦最新更新时间:2016-01-15 来源: eefocus关键字:DS18B20  测负温度 手机看文章 扫描二维码
随时随地手机看文章
//main.c

#include     
#include
#include "18B20.h"
#include"disp.h"

#define  uint  unsigned int
#define  uchar unsigned char

const uchar shu[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
                    0x82,0xF8,0x80,0x90};
const uchar bshu[3]={0xff,0xf9,0xbf};
     
//延时函数在4M时延时1ms
void s_1ms(unsigned int ms)
{
    unsigned int aa;
 for(;ms>=1;ms--)
 {
 for(aa=0;aa<=800;aa++)
 {;}
 }

void main()
{
uint wendu,xiao,ge,shi,bai;
uchar  fh;
DDRA = 0xff;     
PORTA = 0xff;     

s_1ms(200); //延时200ms

ds1820_reset();   //DS18B20复位  
while (1)
  {
  ds1820_start();   
 
  wendu = ds1820_read_temp();   //读取温度数值
 
  fh=ds1820_fh();
 
  if(fh)
  {
  wendu=~(wendu)+1;
   wendu = (wendu * 10)/ 16;        //数值处理 
 
      wendu = wendu % 1000;  
 
  shi= wendu / 100;  //显示第2位
  wendu = wendu % 100; 
  ge= wendu / 10;   //显示ge位
  xiao=wendu % 10;    // 显示小数位
 
 
   display(0,shu[xiao]);  //小数位
   display(1,shu[ge]&0x7f);  //个位
   display(2,shu[shi]);    //shi
   display(3,bshu[2]);   //bai位,0不显示
   }
  
   else 
   {
   wendu = (wendu * 10) / 16;        //数值处理 
 
  bai = wendu / 1000;    //bai位
  wendu = wendu % 1000;  
 
  shi= wendu / 100;  //显示第2位
  wendu = wendu % 100; 
  ge= wendu / 10;   //显示ge位
  xiao=wendu % 10;    // 显示小数位
 
 
   display(0,shu[xiao]);  //小数位
   display(1,shu[ge]&0x7f);  //个位
   display(2,shu[shi]);    //shi
   display(3,bshu[bai]);   //bai位,0不显示
   }
  }
}

 

//18B20.h

 #define uchar unsigned char
#define uint  unsigned int

//设置成输入 
#define DQ_INPUT   DDRC &= ~BIT(7) 
//设置成输出
#define DQ_OUT     DDRC |= BIT(7) 
//设置成低电平
#define DQ_LO      PORTC &= ~BIT(7) 
//设置成高电平
#define DQ_HI      PORTC |= BIT(7)  
//读出
#define DQ_R       PINC & BIT(7)     

//中断标志
uchar init_f;    

//延时函数
void delay_us(uint ms)
{
    uchar  tm;
 while(ms--)
 {
  for(tm=0;tm<2;tm++);
  }

//DS18B20复位
void ds1820_reset(void)
{
 uchar i;
 //中断保护
 init_f = SREG;   
 //关中断
 CLI();     
 DQ_OUT;
 DQ_LO;
 delay_us(80);    //延时500us
 DQ_HI;
 DQ_INPUT;
 delay_us(10);     //延时80us
 i = DQ_R;
 delay_us(80);    //延时500us
 if (init_f & 0x80)  //恢复中断状态
  
  SEI();       
  }
}

//DS18B20字节读取
uchar ds1820_read_byte(void)
{
 uchar i;
 uchar value = 0;
 //中断保护
 init_f = SREG;
 //关中断   
 CLI();     
 for (i = 8; i != 0; i--) {
  value >>= 1;
  DQ_OUT;
  DQ_LO;
  delay_us(2);
  DQ_HI;
  DQ_INPUT;
  if (DQ_R)
   {
      value|=0x80;
   }
  delay_us(10);   //延时60us
  }
 if (init_f&&0x80) //恢复中断状态
  
  SEI();
  }
 return(value);
}

//DS18B20字节写入
void ds1820_write_byte(unsigned char value)
{
 uchar i;
 init_f = SREG;  
 CLI();     
 for (i = 8; i > 0; i--)
 {
  DQ_OUT;
  DQ_LO;
  if (value & 0x01)
   {
    DQ_HI;
   }
     delay_us(10);   //延时80us
     DQ_HI;    
     value >>= 1;
  }
    if (init_f & 0x80)//恢复中断状态
     
       SEI();
      }
}

//启动ds1820转换
void ds1820_start(void)
{
 ds1820_reset();
 ds1820_write_byte(0xCC); //勿略ROM
 ds1820_write_byte(0x44); //启动转换
}

//读温度
uint ds1820_read_temp(void)
 {
 uint i,wendu;
 uchar buf[2];
 ds1820_reset();
 ds1820_write_byte(0xCC); //勿略ROM
 ds1820_write_byte(0xBE); //读温度
 for (i = 0; i < 2; i++)
  {
  buf[i] = ds1820_read_byte();
  }
   wendu = (buf[1]<<8)|buf[0];
 return wendu;
}

uint ds1820_fh(void)  //读正负温度符号
 {
 uint i,bb;
 uchar buf[2];
 ds1820_reset();
 ds1820_write_byte(0xCC); //勿略ROM
 ds1820_write_byte(0xBE); //读温度
 for (i = 0; i < 2; i++)
  {
  buf[i] = ds1820_read_byte();
  }
  bb=buf[1]&0xf0;
 return bb;
}

 

 //disp.h

#define    uchar unsigned char
#define    uint  unsigned int

#define  SHCP_0   PORTA&=~BIT(1)
#define  SHCP_1   PORTA|=BIT(1)
#define  DS_0     PORTA&=~BIT(3)
#define  DS_1     PORTA|=BIT(3)
#define  STCP_0   PORTA&=~BIT(2)
#define  STCP_1   PORTA|=BIT(2)
   
void  CKin()
{
   SHCP_0;
  NOP();
  SHCP_1;
}

void  Dataout()  //并行输出
{
 STCP_0;
 NOP();
 STCP_1;
}

void Datein( uchar  date )  //数据串行输入
{
 uchar  i,mod;
 DDRA=0xff;
    for(i=0;i<8;i++)
  
   mod=date&0x80;
    if(mod==0x80)
    {DS_1;}
   else 
    {DS_0;}
    CKin();
   date<<=1;           
  }
 Dataout();  //并行输出
}

void  weihao(uchar add)
{
    DDRA=0xff;
 switch(add)
 {
   case 0:PORTA=0x1f;break;
  case 1:PORTA=0x1f|0x80;break;
  case 2:PORTA=0x1f|0x40;break;
  case 3:PORTA=0x1f|0xc0;break;
  case 4:PORTA=0x1f|0x20;break;
  case 5:PORTA=0x1f|0xA0;break;
  case 6:PORTA=0x1f|0x60;break;
  case 7:PORTA=0x1f|0xE0;break;
  default:break;
 }
 
}

void   DELAY(uint  tt)
{
    uint mm;
   while(tt--)
   {
       for(mm=30;mm>0;mm--);
   }
}

void display(uchar wei,uchar data)
{
      weihao(wei);
   Datein(data);
   DELAY(20);
   weihao(wei);
   Datein(0xff);
}

关键字:DS18B20  测负温度 引用地址:DS18B20测负温度程序

上一篇:32 x 8段液晶驱动HT1622 程序
下一篇:单片机写串口上位机时的一点心得

推荐阅读最新更新时间:2024-03-16 14:44

基于MSP430和DS18B20的温室大棚温度监测系统模块电路
  1 温度采集传感器DS18B20   DS18B20是一种单总线数字测温芯片,使用方便、耐磨耐碰、抗干扰能力强,能够直接读取被测物体的温度,其测量范围为 -55~+125℃,且测量精度高,电压适用范围宽(3.0~5.5V),供电方式既可以采用外部供电,也可以采用寄生电源的方式从数据线上获取电能。它体积小,根据应用场合的不同可以有不同的封装形式,封装后的DS18B20可用于电缆沟测温、高炉水循环测温、锅炉测温、机房测温、农业大棚测温、弹药库测温等各种非极限温度场合。   DS18B20独特的单线接口方式使得它在与微处理器连接时仅需要一条线即可实现与微处理器的双向通讯。与此同时,DS18B20还支持多点组网功能,可以将多个
[单片机]
基于MSP430和<font color='red'>DS18B20</font>的温室大棚温度监测系统模块电路
DS18B20数字温度计使用
1.DS18B20基本知识 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 1、DS18B20产品的特点 (1)、只要求一个端口即可实现通信。 (2)、在DS18B20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任何元器件即可实现测温。 (4)、测量温度范围在-55。C到+125。C之间。 (5)、数字温度计的分辨率用户可以从9位到12位选择。 (6)、内部有温度上、下限告警设置。 2、DS18B20的引脚介绍 TO-92封装的DS18B2
[单片机]
<font color='red'>DS18B20</font>数字温度计使用
[C51代码]DS18B20驱动
/*******************ds18b20.c**************************/ #include Atmel/AT89X51.h #include link.h #include ds18b20.h #include delay.h /**************定量定义***************/ union { uchar c ; uint x; }temp; uchar idata flag=0; uint idata cc=0; uchar idata disp ; /********************************************
[单片机]
51单片机——单总线OneWrite、DS18B20温度传感器 C语言入门编程
单总线OneWrite: (1)初始化时序: 单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少480us(该时间的时间范围可以从480到960微妙),以产生复位脉冲。接着主机释放总线,外部的上拉电阻将单总线拉高,延时15~60us,并进入接收模式。接着DS18B20拉低总线60~240us,以产生低电平应答脉冲,若为低电平,还要做延时,其延时的时间从外部上拉电阻将单总线拉高算起最少要480微妙。 (2)写时序: 写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总 线。写1时序:主机输出低电平,延时2us,然后释放总
[单片机]
51单片机——单总线OneWrite、<font color='red'>DS18B20</font>温度传感器 C语言入门编程
DS18B20温度传感器完整C程序
#include reg51.h #include intrins.h //_nop_();延时函数用 #define Disdata P0 //段码输出口 #define discan P2 //扫描口 #define uchar unsigned char #define uint unsigned int sbit DQ=P3^7; //温度输入口 sbit DIN=P0^0; //LED小数点控制 uint h; uint temp; // // //***********
[单片机]
51单片机AT89C52与DS18B20的接口电路及源代码
本文将介绍51单片机AT89C52与温度传感器芯片DS18B20构成测温系统,并提供源程序供读者参考.其测量的温度精度达到0.1度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。 硬件电路原理图 图2 AT89S52与DS18B20组成的测温系统原理图 工作原理 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20产品的特点 (1)、只要求一个I/O口即可实现通信。 (2)、在DS18B20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任
[单片机]
51单片机AT89C52与<font color='red'>DS18B20</font>的接口电路及源代码
单片机温度检测报警程序(ds18b20
程序采用数字温度采集芯片 ds18b20 获取温度 分辨率为12位 可以由此程序获的更低分辨率温度 ds18b20 只有三个i/o接口 其中两个为电源引脚 一个为数据总线 只需要一条口线通信 简化了分布式温度传感应用 无需外部元件 可用数据总线供电 电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 ° C至+125 ℃ ds18b20 相关介绍: ds18b20 百度百科 Proteus 仿真: Code: #include reg51.h #include math.h #define uchar unsigned char // 宏定义uchar 为无符号字符 #define ui
[单片机]
单片机温度检测报警程序(<font color='red'>ds18b20</font>)
基于单片机和CDMA的车载温控系统
  该系统利用GSM远程通信系统控制车内空调等器械运作。用户通过短信形式达到人机互动,克服红外线、无线等远程控制距离短的问题,还可以实现实时监控汽车的状态,为车主提供便利。   1 系统原理与结构   1.1 系统功能介绍   本系统能以10次/s的速度自动采集现场的环境温度和光照强度、采集空调和窗帘的开闭状态,并通过LCD液晶屏实时地显示出来。温度的感应范围-55~+125℃,精度为±0.5℃。光强的强度范围分为强、较强、中、较弱、弱5档。空调和窗帘的状态为开或者关。   用户可以通过手机或者小灵通等终端与GSM模块连接的系统之间进行无线通信,通信范围为移动网络覆盖的所有范围,做到了真正的通信范围无穷大。具体的通信为:
[单片机]
基于单片机和CDMA的车载温控系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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