原创 DS18B20多点温度测量!

2007-6-3 16:19 6237 8 15 分类: MCU/ 嵌入式

      最近有同学毕业设计用到DS18B20多点温度测量,到关口了牺牲了一下午的时间给他讲了一下,趁着这个机会也把我的多点温度测量的资料和程序找了出来,现在与大家一同分享。


pdfDS18B20多点温度测量


主程序:


uchar temp[2];//存放两路温度值
uchar sflag[2];//存放两路温度值的正负号
uchar readtemp[2];//每次读出温度的温度的高低位值


uchar fentemp ;//用于拆分两路温度送入显示数组


程序:for(h=0;h<2;h++)//H循环两次读两路温度
    {
      Init_DS18B20();//复位18B20
      // read_ROM();
      //resetpulse();
      WriteOneChar(0xcc);//发跳过ROM命令
      WriteOneChar(0x44);//发温度转换命令
      for(j=250;j>0;j--);//延时
      Init_DS18B20();//复位
      WriteOneChar(0x55);//发送ROM匹配命令
         for(i=0;i<8;i++)
            {
              WriteOneChar(rom[h]);
            }
      WriteOneChar(0xbe);//发温度转换命令
      readtemp[0]=ReadOneChar();//读取相应的温度值低位
      readtemp[1]=ReadOneChar();//读取相应的温度值高位
      sflag[h]=0;
          if((readtemp[1] & 0xf8)!=0x00)//若温度为负的处理
             {
               sflag[h]=1;
               readtemp[1]=~readtemp[1];
               readtemp[0]=~readtemp[0];
               temp[h]=readtemp[0]+1;
               readtemp[0]=temp[h];
                   if(temp[h]>255)
                     {
                        readtemp[1]++;
                     }


              }


      readtemp[1]=readtemp[1]<<4;//将高低温度和为一个字节,本方法避免了*0。0625,很简单,很准确
      readtemp[1]=readtemp[1] & 0x70;
      xx="readtemp"[0];
      xx="xx">>4;
      xx="xx"& 0x0f;
      readtemp[1]=readtemp[1] | xx;
      temp[h]=readtemp[1];
      fentemp="temp"[h];//拆分两路温度值送入显示单元
           while( fentemp/10)
              {
               displaybuf[k+1]= fentemp%10;
               fentemp= fentemp/10;
               }
      displaybuf[k]= fentemp;
      k+=2;
      if(k==3)
      k="0";


      }
k=0;


 


子程序


//18B20延时程序
void delayy(unsigned int i)
{
     while(i--);


}
//初始化18B20函数
Init_DS18B20(void)
{
 unsigned char x="0";
 DQ = 1;    //DQ复位
 delayy(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delayy(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delayy(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x="1则初始化失败"
 delayy(20);
}
//18B20读一个字节
ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delayy(4);
 }
 return(dat);
}
//18B20写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i="0";
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delayy(5);
  DQ = 1;
  dat>>=1;
 }
delayy(4);
}
//18B20读ROM序列号
/*void read_ROM(void)
{
 int n;


  writecommandtods18b20(0x33);
  for(n=0;n<8;n++){rom[0][n]=readdatafromds18b20();}
}*/


 


说明读取序列号时一定要独个读取。子程序参考了别人得程序

文章评论7条评论)

登录后参与讨论

用户1489025 2011-3-18 19:06

readdatafromds18b20();这个函数在哪里啊?

用户45261 2008-5-30 18:57

用51单片机语言怎么编写啊 不要用单片机C语言编写

用户1364249 2008-5-23 16:13

正用得着

用户67237 2008-4-26 14:51

resetpulse();是个什么函数?怎么没定义?

用户33037 2007-12-6 16:40

真是个好东东,顶!

用户7521 2007-6-4 08:24

感谢水哥支持,哈哈,水哥最近好呀!

用户1477888 2007-6-4 02:54

错字很正常,习惯了,是吧,小黑,呵呵!

 

 

相关推荐阅读
用户7521 2010-01-24 17:43
带驱动器的步进电机控制
     带驱动器的电机,就是给脉冲就能动,不用自己用驱动芯片LM298等做驱动电路了,我用最简单的52。看了驱动器的资料内部带隔离,输入端电流要在10MA左右,我用了74HC04,和ULN2003,...
用户7521 2009-06-11 10:52
pcb再总结
  前一阵学了学FPGA,抽时间画了块开发板,结果做板子时又给我发了回来,说做不了,大连地区的一般的做板要求:现在开工费100拉,线最小8个MIL,线间距最小8个MIL,过孔,内径最小15个MIL,外...
用户7521 2007-09-03 21:34
基于RS485和VB6.0的PC机与51单片机多机通信
前一段时间主要做了几个小项目,都是单片机与PC机的串行通信,采用RS485,上位机采用VB6.0语言编写软件。自己看VB有一段时间了,终于等到用的机会,现在学习的程度还可以完全够用。单片机采用了51单...
用户7521 2007-08-04 08:28
如何成为一个杰出电子工程师
...
用户7521 2007-07-19 19:09
新的起点,新的希望,新的人生!
   从家回来有一个星期了,最近的一周过的很糟糕,先是送走了我最好的朋友去工作,然后有是忙着项目,一个星期下来自己一点收获都没有,最近的状态不知道是怎么了,今天休息了一下午,放松一下同时考虑考虑自己的...
用户7521 2007-06-16 19:26
工业抗干扰
工业现场的环境往往存在严重干扰,这些干扰有时会严重影响仪器的硬件或软件,我一般都采取硬件和软件措施来解决。<?xml:namespace prefix = o ns = "urn:schemas...
我要评论
7
8
关闭 站长推荐上一条 /2 下一条