51单片机驱动DS18B20温度传感器程序及心得

发布者:SparkleMagic最新更新时间:2015-05-12 来源: 51hei关键字:51单片机  DS18B20  温度传感器 手机看文章 扫描二维码
随时随地手机看文章
关于DS18B20温度传感器,在没有硬件设备的辅助下,写内部程序有些困难,因为看不到实际信号波形。对于单片机,我。。。渐渐的有些心灰意冷。。虽然掌握了1_WIRE总线,却少了很多喜悦,下雨了。。。它是我的爱好,我付出了很多,可是我看不到实际的前景。。以我个人之力,要步入尖端芯片领域,很困难,在这里,采棉花是个普遍性的大问题,大型机械设备缺陷很多,如果以微控制芯片提高精度,我想效益会相当可观,可是技术瓶颈难以逾越。。。硬件研发,失败了,所有投入赴之东流,成功了,回报丰厚。现在,各行各业都处于饱和,没有成熟先进的技术,很难有立足之地,,,,,我开始重新审视我的选择。。。。。。艰难。。

    /*
  建立时间: 2013年5月2日;
   
 前言:  我用软件仿真,测算延时时间,效果不错,但是根据教程,复位时,先释放总线
     (wd高电平),然后主机拉低wd,持续时间为400--960微妙.后主机拉高wd,持续15-
  60微妙,后 从机,会拉低电平持续时间是60--240微妙(此时表示复位成功),如果
  从机没有将总线拉低,则复位失败.然后,主机拉高电平60--240微妙.复位结束;
      可,实验证明,在,从机,拉低总线电平后,持续一定时间,从机还会将总线拉高!这
   是教程中的一个重大错误!
   temperature sensor reset module finishing time:  23:08:00 
     (   温度     传感器  复位  模块     完成    时间  )
  temperature sensor  操作过程:
  1. reset DS18B20;
        2. 发出Skip ROM 命令(CCH); (跳跃ROM命令)
  3. 发出Convert T命令(44H); (温度转换命令)
  4. reset DS18B20;
  5. 发出Skip ROM命令(CCH);(跳跃ROM命令)
  6. 发出读取命令(BEH);
  7. 读出两个字节的温度;
  8. 温度格式转换;
  
    2013年5月8日22:56:44
 
  DS18B20 Temperature sensor read data module accomplish;
   (     温度    传感器 读   数据  模块    完成   )
 
  现在还有温度显示模块没有完成,硬件是1602液晶屏......
 2013年5月9日19:32:31
   今天,温度传感器的程序主体结构全部完成!!!!!
 不容易啊,值得庆祝一下!!!!!!
 一共写了7天程序!{陆陆续续};
 喝个  品酸乳果汁.......
*/
#include
typedef unsigned char uint8 ;
typedef unsigned int uint16;

sbit wd = P3^2;  //定义数据单总线;
sbit e =P1^5; // 定义1602液晶显示器数据使能端口;
sbit rs=P1^0; // 定义数据/指令选择端口;
sbit rw=P1^1; // 定义  读/写  选择端口;
sbit BF=P0^7; // 定义繁忙位;
bit w=0;  //定义一个全局一位变量;
 
//===========1602液晶显示器模块;===============
busy() //液晶屏繁忙检测函数;
{ e=0;
    rs=0;
 rw=0;
   P0=0xff;
  do
  { e=0;   //使能位清零;
    rs=0;   //指令;
 rw=1;   //读;
 e=1;   //数据传输启动;
  }while(BF); //如果BF==0;则液晶处于空闲状态;
   e=0;
}
play_data(uint8 wr) //液晶写入数据;
{
   busy();   //繁忙检测;
   P0=wr;   //装载数据;
   rs=1;   //数据;
   rw=0;   //写入;
   e=1;    //传输开始;
   e=0;       //传输结束;
}
play_cmd(uint8 cmd)  //液晶写入指令;
{
  busy(); //繁忙检测;
  P0=cmd; //装载数据;
  rs=0;     //指令;
  rw=0;     //写入;
  e=1;      //传输开始;
  e=0;      //传输结束;
}
reset_1602()   //1602液晶显示器初始化函数;
{
  play_cmd(0x38);
  play_cmd(0x0c);
  play_cmd(0x06);
  play_cmd(0x01);

}

//=========温度传感器延时模块============================

// sbit led= P1^0;
delay(uint8 num )   //如果unm等于1;延时16.28微妙;

   while(num--);  //如果num大于一,则16.28+(num-1)*6.51.
}
delay2()    //此函数延时3.26微秒;
{
   uint8 j=0;
    j=9;
 
 
}

delay3()
{
   uint16 s=60000;
   while(s--);
 
 
}[page]

reset_1820()  //========复位温度传感器; ========
{
 
  while(wd)
  {
   wd=1;
   delay(140);   //拉高总线,延时大概921微妙左右;(延时值自定);
   wd=0;    //总线由单片机拉低,下为延时函数,大概800微秒左右;
   delay(61);  //1个此函数会延时400微妙左右;
   delay(61);  //两个是800微妙左右;
   wd=1;    //主机拉高总线,68微秒左右;
   delay(9);      //延时68微妙左右
   if(wd==0)      //如果wd是0就终止复位;(代表复位成功);
    {
       while(wd==0);   //总线一旦为低,那么就等待从机再将总线拉高.
    break;    //终止while循环;(reset function end)
    }
   else
     {
     wd=1;
     delay(20);    //延时140微妙;
  }   
   }
      delay(30); //此时总线为高电平并延时205微妙,复位成功!;
  // if(wd)led=0;//此语句为检验是否复位成功;P1^0外接9012三极管接led小灯;
}
 
write_byte(uint8 dat)

    uint8 i=0;
    
 for(i=0;i<8;i++)
      { 
      wd=0;      //A点;
   delay2(); //延时
      wd=dat & 0x01;
      dat>>=1;
  
   delay(6);  //A点到此处用时65.11微秒;
   wd=1;   //总线释放;
   delay2();  //延时3.26微秒;
   }
 }   //========此函数执行完成之后总线为高电平;

uint8  read_byte() //=====读8位数据;===================
{
 uint8 j=0,  dat =0;
 
    for(j=0;j<8;j++)
  {
     dat>>=1;
   wd=0;  // A点  mcu拉低电平3.26微秒;
  delay2();   // 延时3.26微秒;
  wd=1;  
  if(wd)
   {
     dat|=0x80;
   }      //读完数据后A点到此处是11.93微秒,保持在15微秒之内;
   delay(9);   // A点到此处80.29微秒; 理想时间范围是60--120微秒;
   wd=1;  //释放总线;
   delay2();  //延时3.26微秒;
  }
 
   return dat;

}

start_sensor()    //启动传感器;
{
  reset_1820();
  write_byte(0xcc);  //跳跃命令;
  write_byte(0x44);  //转换temperature(温度)命令;
}
uint8 read_temp()   //从温度传感器度温度数据过程;
{
  uint8 ak[2];
  uint16  dat=0 , j=0;
    reset_1820();   //复位温度传感器
    write_byte(0xcc);  //跳跃rom命令;
    write_byte(0xbe) ;  // 发出读数据命令;
    ak[0]=read_byte(); //读取第一个字节数据;
    ak[1]=read_byte(); //读取第二个字节数据;
    dat=ak[1];    //要把两个八位数据载入1个16位变量里;
    dat<<=8;
    dat|=ak[0];
       j= dat;

  //==========以下是把温度传感器内部数据编译成16进制编码;
     if((j>>11)==0x1f) //此语句是负温度进入.0x1f是二进制5个全1;
  {
  dat=(~dat)+1;    //负温度要取反加一操作; 
  dat/=16;    //传感器给的温度系数要除以16后,得到的数才是常规温度系数;
  w=0;   //此语句是在主函数中用来判断是正温度还是负温度;
  return dat;  //向主函数返回数据,并终止函数;
  }
     j=dat;
   if((j>>11)==0)   //如果是零则是正温度;
     {
     dat/=16;    //数据直接除以16,就得到了常规温度系数;
     w=1;     //1代表正;
     return dat; //向主函数返回数据,并终止函数;
  
  }
 
   return 130;  //向主函数返回数据,并终止函数;
   
}

delay_ms()  //延时1秒;
{
  uint8 i=250;
  uint16 j=608;
   while(j--)
    { while(i--);
       i=250;
      
    }
 
}
 
error()  //测温出错;
{
   uint8 i=5, j=0 ,ak[]="Error!";
 
 while(i--)
 {
     play_cmd(0x82);
     while(ak[j]!='')
   {
     play_data(ak[j++]);
   }  j=0;
      delay3();
     play_cmd(0x01);
     delay3();  
 }   
}

main()
{

  uint8 dat=0 ,j=3,len=0 ,num[]="start.....";
 
  reset_1602();
 
 while(j--)    //这是启动电源时,液晶显示:start....(并闪烁3次)
 {   play_cmd(0x82);
    while(num[len]!='')
     {
     play_data(num[len++]);  
  } 
       len=0;
       delay3();
       play_cmd(0x01);
       delay3();
 }
 
 
 
 while(1)
   {    
     start_sensor();   //启动温度传感器;
  delay_ms();    //等待1秒;
  dat = read_temp(); //读取温度数据并赋给dat变量;
  
   if(dat==130)    //如果返回来的数据是130,表明采集温度出错;
   {
     error();
   }
  else if(w==1)  //如果w是1,就代表正温度.输出;
   {
     play_cmd(0x83);
    play_data(dat/10+'0');
    play_data(dat%10+'0');
   }
   else    //否则,就是负温度,输出时前面加一个负号;
     {
    play_cmd(0x82);
    play_data('-');
    play_data(dat/10+'0');
    play_data(dat%10+'0');
  }
  
   } //我的亲娘四舅奶奶啊!!!!!!终于完成了!!!!2013年5月9日19:32:10
 
  
    
}

关键字:51单片机  DS18B20  温度传感器 引用地址:51单片机驱动DS18B20温度传感器程序及心得

上一篇:如何做一台自己的手机蓝牙遥控车
下一篇:STC单片机实现可调PWM输出的C51程序

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

基于51单片机89C51的超声波LCD1602液晶显示距离C语言程序
#include AT89X51.H #include intrins.h #define uint unsigned int #define uchar unsigned char sbit rs=P1^2; sbit rw=P1^1; sbit en=P1^0; char idata disp_buf1 ;//1602显示缓冲区1(即上排16个字符) char idata disp_buf2 ;//1602显示缓冲区2(即下排16个字符) uchar code table = celiang ok ! ; uchar i; char idata jul
[单片机]
PIC单片机与51单片机的区别
(1)总线结构:MCS-51单片机的总线结构是冯-诺依曼型,计算机在同一个存储空间取指令和数据,两者不能同时进行;而PIC单片机的总线结构是哈佛结构,指令和数据空间是完全分开的,一个用于指令,一个用于数据,由于可以对程序和数据同时进行访问,所以提高了数据吞吐率。正因为在PIC单片机中采用了哈佛双总线结构,所以与常见的微控制器不同的一点是:程序和数据总线可以采用不同的宽度。数据总线都是8位的,但指令总线位数分别位12、14、16位。 (2)流水线结构:MCS-51单片机的取指和执行采用单指令流水线结构,即取一条指令,执行完后再取下一条指令;而PIC的取指和执行采用双指令流水线结构,当一条指令被执行时,允许下一条指令同时被取出,这样
[单片机]
利用智能射频芯片nRF9E5设计无线温湿度测量电路
  nRF9E5是一款工作频率为433/868/915MHz的智能射频芯片,集成了8051微控器、4通道10位A/D转换以及多通道RF收发。   本文介绍采用该射频芯片、温度传感器LM71、湿度传感器HS1101实现温度和湿度无线测量的电路设计方法和编程实现,该设计具有简单可靠和灵活方便的特点。   nRF9E5 是一款工作频率为433/868/915MHz的智能射频芯片,该芯片采用1.9V~3.6V单电源供电,32脚QFN封装(5×5mm),发射功率为 10dBm,接收灵敏度-100dBm,在低功耗时电流仅2.5μA,特别适合采用电池供电,适用于无线键盘、无线电话、无线耳机、工业无线传感器、遥控器和无线报警器等。   无线传感测
[测试测量]
利用智能射频芯片nRF9E5设计无线温湿度测量电路
基于AT89C2051单片机的六位数显多路定时电子钟
这里介绍的电子钟,电路可称得上极简,它仅使用单片的20引脚单片机完成电子钟的全部功能,而笔者见到的其它设计方案均采用二片以上的多片IC实现。 一片20引脚的单片机STC2032(引脚排列与AT89C2051完全相同)为电子钟主体,其显示笔画数据从P1口分时输出,P3口则输出对应的六位选通信号。由于LED数码管点亮时耗电较大,故不能使用AT89C2051单片来完成,但是可以可以用STC89C2032来完成。另外,本站制作时用超高亮的发光二极管代替昂贵的大数码管,成本低,效果独特。 本电子钟设计有三个轻触式按键,这里我们分别命名为:模式设定键K1、加调整键K2、减调整键K3。由于STC89C2032内部已经集成有复位电阻,所以,复
[单片机]
基于AT89C20<font color='red'>51单片机</font>的六位数显多路定时电子钟
51单片机定时器/计数器提高
定时器方式0的使用 通过设置TMOD寄存器中的M1M0为00选择定时方式0,方式0的计数位数是13位,对T0来说,有TL0寄存器的低5位,和TH0的8位组成 那么最多能装入2^13=8192个数,也就是说,经过8192个计数,寄存器就会溢出,向CPU发出中断请求。 所以计算公式为 TH0=(8192-X)/32 TL0=(8192-X)2 程序例子: #include #define uchar unsigned char #define uint unsigned int sbit led1=P1^0; uchar num; void main() { TMOD=0X00;
[单片机]
<font color='red'>51单片机</font>定时器/计数器提高
基于P89V51单片机的电力线载波温湿控制系统设计
  以单片机为核心的控制系统可准确实现交互信息的输入输出,信息量大,被广泛应用于工控系统、移动电子设备中。利用电力线网络作为高速数据的传输媒介,能够创造出很高的经济效益和社会效益。电力线载波通讯是利用电网的电力线作为传输媒介的有线传输模式,作为载波通讯在同一电力变压器范围内无需另外架设线路,成本低,使用方便。双音多频DTMF(Dual Tone Multi Frequency)信号由于具有较强的抗干扰能力和可靠的信号传输等优点,已逐渐被广泛使用。本系统设计采用以单片机为核心结合PID算法的智能载波温湿控制系统,实验证明系统运行稳定可靠。   1 P89V51单片机简介   P89V51是PHILIPS生产的高性能、低功耗的8位
[单片机]
基于P89V<font color='red'>51单片机</font>的电力线载波温湿控制系统设计
51单片机实现矩阵键盘的单个触发
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: Matrix-KEY ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200508 ---- @ModifiedTime: 20200513
[单片机]
<font color='red'>51单片机</font>实现矩阵键盘的单个触发
基于C8051单片机和FPGA实现导纳测量仪的系统设计
虚拟仪器的广泛应用,使得用户可以根据需求,设计自己的仪器系统。无源网络导纳测量仪即是虚拟仪器设计思想的一种具体运用,旨在实现对端口网络的导纳进行自动测量。测量仪是以C8051单片机为控制和处理核心,采用可编程逻辑器件EPF10K10,根据DDS原理产生信号源,将信号源连接到待测的网络上,对网络两端的电压和电流进行差分放大,使其输出电压尽可能达到ADC的最大输入电压,然后进行A/D采样,采样时,频率随信号频率而改变,一个周期内固定采32个点,用单片机的P1、P2直接接收数据,边采样边接收。对采样所得的电流、电压数据进行快速傅立叶变换(FFT),并分别求出其模值和相位,则导纳的模值为电流模值与电压模值之比,相位为电流与电压的相位之差。
[单片机]
基于C80<font color='red'>51单片机</font>和FPGA实现导纳测量仪的系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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