温度传感器DS1820

1、初始化时序:

            首先,DSPORT保持低电平480到960微秒之间,然后将其拉高以产生复位脉冲,若产生复位脉冲,则表示初始化成功。
            复位脉冲:产生60~240微秒的低电平后释放总线。
            防止while语句产生死循环,设置当5毫秒后仍然没有产生低电平(复位脉冲)。则跳出while循环,初始化失败。

温度传感器DS1820_第1张图片

2、写时序:

            若写0时序,则DSPORT一直是低电平
            若写1时序,则DSPORT由低电平到高电平
            因此可以看出应该用“与”逻辑。
            综上,思路为先将DSPORT置为低电平,然后写入数据(采用与逻辑),而后需要释放总线(DSPORT为1)

温度传感器DS1820_第2张图片

3、读时序:

            根据写时序,在写入时序之前,DSPORT先低后高,所以在读数据之前,也应将其置为先底后高。
            读取数据之后,需要延时50微秒。

温度传感器DS1820_第3张图片

4、温度的读取过程:

           复位(初始化时序)——发出SKIP ROM(0xcc,具体见ROM指令表)——发出开始转换命令(0x44,具体见RAM指令表)
           复位(初始化时序)——发出SKIP ROM(0xcc,具体见ROM指令表)——发出开始存储命令(0xbe,具体见RAM指令表)
           连续读出两个字节的命令(即温度),先读低8位,后读高8位。

温度传感器DS1820_第4张图片
温度传感器DS1820_第5张图片

5、将温度转换成10进制数,用数码管显示出来

若温度为负数,则将其转换为补码,然后进行转换。

uint change_date(int temp)
{
 float tp;
 if(temp<0)
 {
  disp_num[0] = 0x40;//负数符号数码管的编码
  temp = temp - 1;//转化为补码
  temp = ~temp;
  tp = temp;
  temp = tp*0.0625*100+0.5;//温度扩大100倍,0.5则是提高精度,四舍五入法的应用
 }
 else
 {
  disp_num[0] = 0x00;
  tp = temp;
  temp = tp*0.0625*100+0.5;
 }
 return temp;
}

原代码:

uchar Init()
{
  uchar i;
  DSPORT = 0;
  i= 70;
  while(i--);
  DSPORT = 1;
  i = 0;
  while(DSPORT)
  {
      i++;
    delay1ms(1);
   if(i>5)
       return 0;
  }
  return 1;
}
void write_byte(uchar date)
{
  uchar i,j;
  for(i=0;i<8;i++)
  {
    DSPORT = 0;
   j++;
   DSPORT |= date&0x01;
   j= 6;
   while(j--);
   DSPORT = 1;
   date >>= 1;
  }
}
uchar read_byte()
{
 uchar i,j;
 uchar bi,byte;
 for(i=0;i<8;i++)
 {
   DSPORT = 0;//根据时序图先将总线拉低10微秒左右
   j++; //时序图为最少1微妙,但单片机的一个指令周期最少为10微秒左右
   DSPORT = 1;//释放总线
   j++; //保持数据稳定
   bi = DSPORT;
   byte = (byte>>1)|(bi<<7);
   j=4; //写入数据后,需要延时50微妙左右
   while(j--);
 }
 return byte;
}  
void ChangeTemp()
{
  Init();
  delay1ms(1);
  write_byte(0xcc);//Skip ROM,该命令允许总线64位ROM编码,而直接访问存储空间,从而节约时间,适合用于单点系统
  write_byte(0x44);  //启动温度传感器
}
void ReadTemp_command()
{
 Init();
 delay1ms(1);
 write_byte(0xcc);
 write_byte(0xbe);//读取温度传感器中的温度
}
int ReadTempture()
{
 uchar th,tl;
 uint date;
 ChangeTemp();
 ReadTemp_command();
 tl = read_byte();//选读低8位,后读高8位
 th = read_byte();
 date |= th;
 date<<=8;
 date = tl;
 return date;
}

你可能感兴趣的:(温度传感器DS1820)