51单片机多路DS18B20温度测量程序

发布者:快乐飞跃最新更新时间:2015-06-25 来源: 51hei关键字:51单片机  DS18B20  温度测量 手机看文章 扫描二维码
随时随地手机看文章
仿真图:


仿真文件和完整源码的下载地址:http://www.51hei.com/bbs/dpj-20600-1.html
源代码:
#include
#include
#include
#include
#define uchar unsigned char
#define uint  unsigned int

sbit RS=  P2^0  ;       //液晶显示引脚定义
sbit RW=  P2^1  ;
sbit EN=  P2^2  ;
uint  t=0,dian=0;
uchar LCD_LINE_ONE[16]={"tp1:           "};  //定义显示屏幕
uchar LCD_LINE_TWO[16]={"tp2:           "};
//uchar LCD_LINE_THR[16]={"                "};

int Tm;
int  fushu=0 ;
sbit DQ= P3^3;             
static unsigned char get_serial[]={    //获取的八个DS18B20内部RAM64位序列号
   224, 0,0,0,  184,  197, 50, 40,
   215, 0,0,0,  184,  197, 51, 40
  //  82, 0,0,0,  184,  197, 52, 40
 // 101, 0,0,0,  184,  197,  53,40,
  //60, 0,0,0,  184,  197,  54,40,
   //11, 0,0,0,  184,  197,  55,40,
    //47, 0,0,0,  184,  197,  56,40,
  //185, 0,0,0,  184,  197,  49,40,
 };
void delay( ms )       //用于液晶显示的延时函数
{
   int i ;
   while(ms--)
   {
        for(i=0 ;i<5 ;i++ )  ;

   }
}

uchar Read_LCD_State()      //读取液晶显示的状态
{
  uchar state;
 RS=0;RW=1;EN=1;delay(1);
 state=P0;
 EN = 0;delay(1);
 return state;
}
void LCD_Busy_Wait()     //如果忙则等待函数
{
  while((Read_LCD_State()&0x80)==0x80);
 delay(5);
}

void Write_LCD_Zhilin(uchar zl)     //液晶显示写指令函数
{
 LCD_Busy_Wait();
 RS=0;RW=0;
 EN=0;
 P0=zl;
 EN=1;
 delay(1);
 EN=0; 
}
void Write_LCD_shuju(uchar date)      //液晶显示写数据函数
{
  LCD_Busy_Wait();
 RS=1;RW=0;
 EN=0;
 P0=date;
 EN=1;
 delay(1);
 EN=0; 
}
 void LCD_INIT()    //液晶显示初始化
{
    Write_LCD_Zhilin(0x38);   // 显示模式设置
 delay(1);      
 Write_LCD_Zhilin(0x01);   // 显示清屏
 delay(1);     
 Write_LCD_Zhilin(0x06);   // 光标移动设置
 delay(1);
 Write_LCD_Zhilin(0x0c);   // 开及光标设置
 delay(1);
}
 void Display_LCD_String(uchar p,uchar *s)    //液晶显示写入函数
{
  uchar i;
 Write_LCD_Zhilin(p|0x80) ;    //写地址高位为一
 //Write_LCD_Zhilin(0x40|0x80) ;
 for(i=0;i<16;i++)
 {
  Write_LCD_shuju(s[i]);
  delay(1);  
 }
}[page]
/***************************************************************************************/
void delays(int us)        //用于DS18B20的延时函数
{ int s;
for ( s=0; s }
void rst(void)      //DS18B20初始化
{
DQ = 1;
delays(2);
DQ = 0;
delays(30); //精确延时 480~960us
DQ = 1;
delays(8);
}
void write(unsigned char ku)  //DS18B20写函数
{
int i=0;
     for (i=0;i<8;i++)
    {
  DQ=0;
  DQ =ku&0x01;
  delays(3);
  DQ=1;
  ku>>=1;
    }
}
void match_rom(unsigned char *rom)   //DS18B20匹配ROM函数
{
 unsigned char i;
 rst();         //初始化
 write(0x55);       //匹配ROM
 for(i=8;i>0;i--)
 {
          write(*(rom+i-1));
 }

}
unsigned int read(void)     //DS18B20读函数,每次读16位
{
 int i=0;
 unsigned int u=0;
    for (i=0;i<16;i++)
    {
  DQ=0;
  u>>=1;
  DQ=1;
  if(DQ) u|=0x8000;
  delays(4);
     }
    return (u);
}
int  read0(unsigned char *seria) //读取对应温度值并转换函数
{
     int temperature ;
    unsigned int tp;
    unsigned int lsb;
    rst();      //初始化
    write(0xCC);    //跳过RAM
 write(0x44);    //温度转换
 rst();      //再次初始化
 write(0xCC); 
 match_rom(seria);    //匹配ROM函数调用
   write(0xBE);  //读取存储器指令
 tp=read();    //读取温度值
 if((tp&0xf800)==0xf800)  //判断正负数
     {
       fushu=1 ;
        tp=~tp+1 ;
      lsb=(unsigned int)(tp*6.25); 
   dian=lsb%100;    //取小数部分
  
       temperature=lsb/100;

  }
     else
     {
      fushu=0;
      lsb=(unsigned int)(tp*6.25); 
   dian=lsb%100;  
  
       temperature=lsb/100;

      } 
     return(temperature);
}
/*****************************************************************************************/
void main()
{
      uint i ;
   LCD_INIT();
   EA=0 ;   //使用DS18B20禁止任何中断
   while(1)
  {   
       for(i=0;i<2;i++)
    { 
        Tm=read0(get_serial+i*8);
    if(i==0)       //判断是第几个的数据
    {
        if(fushu==0)        //判断是否加负号
             sprintf(LCD_LINE_ONE+5," %d", Tm); 
        if(fushu==1)
          sprintf(LCD_LINE_ONE+5,"-%d", Tm); 
           sprintf(LCD_LINE_ONE+10,".%d",dian);  //加入小数部分
        Display_LCD_String(0x00,LCD_LINE_ONE);
     }
    if(i==1)
    {  
           if(fushu==0) 
              sprintf(LCD_LINE_TWO+5," %d", Tm); 
        if(fushu==1)
           sprintf(LCD_LINE_TWO+5,"-%d", Tm); 
           sprintf(LCD_LINE_TWO+10,".%d",dian);
        Display_LCD_String(0x40,LCD_LINE_TWO); 
    }

    }

  
  }
}

关键字:51单片机  DS18B20  温度测量 引用地址:51单片机多路DS18B20温度测量程序

上一篇:51单片机+8*8点阵实现的贪食蛇源代码
下一篇:基于51单片机的无线遥控自行车风火轮程序

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

由80C552单片机构成的轴类零件温度测量系统
一、 前言 零件在加工过程中由于受各种热的影响而产生变形,从而导致原有的加工精度遭到破坏或直接引起加工误差。对于精密加工而言,热变形的影响尤为显著,由此而引起的加工误差约占总加工误差的40%以上。本文给出一种对轴类零件的温度进行较准确测量的系统组成,系统由单片机80C552为控制核心,简单可靠,精度高。同时能计算出在不同温度下轴的热变形量。 二、 传感器组成及接口电路 1.传感器组成 传感器采用Pt温度传感器,如图1所示。 图1 Pt温度传感器 这种传感器是由一个直径为30微米的铂丝绕成的线圈被夹在两层聚酰亚胺箔片之间,通过两条镍带与外界连接,其厚度只有0.3mm厚,易用于曲面的温度测量,热损失极少,测量面积较大,达到快速响应。在
[单片机]
8051单片机的串行通信
计算机的数据交换有两种方式,分别是串行通信和并行通信。 并行通信:我们以8位(一个字节)的数据为例,在并行通信下,8位数据是同时传输的,同时发送,同时接受。所以通信的双方需要一个公共的时钟信号。并行传输速度快,效率高。但是传输需要的数据线多,传输距离近。 串行通信:仍然以8位的数据为例,每一位数据都是分时发送的,接收方也是一位一位的接受。串行通信只需要一根数据线就可以,成本低。适用于大规模和远距离的数据传输。 异步传输模式:每个传输的字符都用起始位和终止位包装起来,在字符间允许有长短不一的间隙。 同步传输模式:一个数据块包含着许多连续的字符,在字符之间没有空闲。同步传输可以方便的实现某一通信协议要求的格式。 波
[单片机]
51单片机(AT89C52)一键多功能(短按、长按)
短按(按下持续时间小于3s)一次数码管显示加1,同时流水灯计数加1。 长按(按下持续时间大于3s)时,数码管显示每500ms加1,同时流水灯每500ms计数加1。 #include reg52.h typedef unsigned char uchar; typedef unsigned int uint; #define NOKEY 0 #define KEYDOWN 1 #define KEYUP 2 uchar keystate; sbit key=P2^7; void keyscan(void); uchar timeflag; uchar code table = { 0x80,0xf2,0x48,0x60,
[单片机]
<font color='red'>51单片机</font>(AT89C52)一键多功能(短按、长按)
DS18B20温度传感器 ------ 自学笔记
一、简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变外观。具有耐磨,防高温,体积小,封装形式多样等特点。适用于各种狭小空间设备数字测温和控制领域。 二、DS18B20的特点 适用电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电(寄生电源:不是实际的电源器件,而是一种供电方式,即通过数据线供电) 独特的单线接口方式(一条总线),DS18B20在与微处理连接时仅需要一条线即可实现微处理器与DS18B20的双向通信。 DS18B20支持多点网络功能,多个DS18B20可以并联在唯一的三线上,实现网络多点测温。 DS18B20
[单片机]
<font color='red'>DS18B20</font>温度传感器 ------ 自学笔记
MAX813L在51系统抗干扰中的应用及工作原理
  近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。其中系统的抗干扰性能是系统可靠性的重要指标。 1 MAX813L芯片及其工作原理 1.1 芯片特点    · 加电、掉电以及供电电压下降情况下的复位输出,复位脉冲宽度典型值为200 ms。 · 独立的看门狗输出,如果看门狗输入在1.6 s内未被触发,其输出将变为高电平。 · 1.25 V门限值检测器,用于电源故障报警、电池低电压检测或+5 V以外的
[单片机]
MAX813L在51系统抗干扰中的应用及工作原理
51单片机应用之无线通讯模块NRF24L01+
本教程关于NRF24L01+的内容十分详细,对于大家的学习和调试及其有帮助 内含详细教程: 单片机源程序如下: 接下来我们写发送程序: //********************************** // NRF24L01+模块发射程序 // 用8个LED调试 // Txz001 2012.05.16 //********************************** #include reg52.h typedef unsigned char uchar; //将无符号字节类型重定义为uchar typedef unsigned int uint; //将无符号整数类型重定义为Uint
[单片机]
<font color='red'>51单片机</font>应用之无线通讯模块NRF24L01+
AT89S51单片机对十字路口交通信号灯的控制设计
一、技术要求 某十字路口,如下图所示,设计一个交通灯信号控制器,指挥交通车的通行。要求如下: 1)东西通道和南北通道交替通行,东西通道每次放行时间大于南北通道每次放行时间。 2)绿灯亮表示可以通行,红灯亮表示禁止通行。 3)每次绿灯变红灯时,绿灯先闪转变黄灯(此时另一干道上的红灯不变)。 4)要有数字显示,作为时间提示,以便人们更直观地把握时间。具体要求东西通道、南北通道通行时间及黄灯亮的时间均以秒为单位作减计数。 二、硬件电路说明 2.1电路设计原理图 本设计是以89S51为主控芯片 ,利用P1口控制74LS240(八反相缓冲器,线驱动器)驱动发光二极管模拟交通灯。倒计时显示部分采用串口实现。串口工作在方式0时通过外接
[单片机]
AT89S<font color='red'>51单片机</font>对十字路口交通信号灯的控制设计
基于STC89C51单片机的出租车计费器设计
出租车计费器是出租车上必不可少的一种仪表,随着电子技术,特别是嵌入式应用技术的飞速发展,智能芯片越来越广的应用到了出租车计费器上。这使得出租车计费器能够精准的计算出行车里程及对应的价格,使乘客能够更直观明了的知道自己的乘车价格,而司机师傅也不用再靠人工计算来得出乘客的费用,避免了很多麻烦。本文以单片机STC89C51 为核心设计一款出租车计费器, 使能够实现里程及对应价格的显示,由于采用芯片的自动定时计数,所以能够准确的计算出总的行车里程并能转换成对应的价格来,这样能够避免出租车司机作弊的可能性,做到公平公正。 1 出租车计费器的设计要求与设计方案 1.1 出租车计费器设计要求 设计一个出租车自动计费器,计费包括起步价、行车里程、总
[单片机]
基于STC89C<font color='red'>51单片机</font>的出租车计费器设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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