原创 DS18B20测温整理

2008-10-16 09:57 2312 6 6 分类: MCU/ 嵌入式

给大家个DS18B20的资料PDFpdf


DS18B20的编程


在使用DS18B20中,需要经过几个步骤:复位、向1 - WIRE 总线上写1字节、从总线上读取1个字节、读出温度、温度数据处理。在这之后就配合自己的板子的外设以及自己的相关要求编写主函数。


不同的人在编程时有着自己的编程习惯,要一一说明是不太可能的了!我就我自己这段时间的编程来说明下把!


我使用的是51系列单片机、4位共阴数码管、74LS138,程序是根据别人的修改了的,支持负温度,里面的注释比较详细。


https://static.assets-stash.eet-china.com/album/old-resources/2008/10/16/8f7b49d7-fa5a-4ef0-88c1-dd85d037453c.rar


总之就那么句话,上面的几个步骤在使用DS18b20时都要添加在里面,并且各个不同编程的实质是一样的!


下面给自己写个实习笔记把!


DS18B20有3个引脚,分别为VCC、DQ、GND;DQ为1 - WIRE 总线。
在这里定义其引脚:sbit DQ = P1^0;
首先是复位:
Init_DS18B20(void)
{
  unsigned char x="0";
  DQ = 1;          //DQ复位
  delay(4);  //稍做延时
  DQ = 0;          //单片机将DQ拉低
  delay(100); //精确延时 大于 480us
  DQ = 1;          //拉高总线
  delay(40); 
}


写一个字节:
write_byte(unsigned char dat)
{
 unsigned char i="0";
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(10);
  DQ = 1;
  dat>>=1;
 }
}


读一个字节:
read_byte(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;
    delay(10);
  }
  return(dat);
}


读出温度:
read_temp()
{
ow_reset();    //总线复位
write_byte(0xCC);   //发skip ROM 命令(ccH、beH、44H见PDF的22页)
write_byte(0xBE);   //发读命令
temp_data[0]=read_byte();  //温度低8位 
temp_data[1]=read_byte();  //温度高8位
ow_reset();
write_byte(0xCC);   //发skip ROM命令
write_byte(0x44);   //发转换命令
}


温度数据处理:
在读出温度时,我们读出了temp_data[0]、temp_data[1]
在这里,temp_data[1]的低半字节和temp_data[0]的高半字节组成一字节,这个字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩下的temp_data[0]的低半字节转化成十进制后,就是温度值的小数部分
work_temp()
{
uchar n="0";
if(temp_data[1]>0x7f)        //正负数判断
 {
  temp_data[0]=~temp_data[0]+1;    //补码转换,取反加一
  temp_data[1]=~temp_data[1];  
  n=1;
 }       //温度求负,补码
display[4]=temp_data[0]&0x0f;      //取低字节的低4位-小数部分
display[0]=ditab[display[4]];       //存放小数部分
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);   //取整数部分
display[3]=display[4]/100;     //取百位数
display[1]=display[4]%100;
display[2]=display[1]/10;      //取十位数
display[1]=display[1]%10;      //取个位数
/******************符号位显示判断**************************/
if(! display[3])
{
 display[3]=0x0A;      //最高位为0时不显示
 if(! display[2])
 {display[2]=0x0A;}     //次高位为0时不显示
  }   
if(n){display[3]=0x0B;}   //负温度时最高位显示"-"
}


具体的就看程序把!
点击看大图

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条