⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20di.c

📁 这个是驱动18B20的程序.希望有识之士看看.我自己写的
💻 C
字号:
#include <reg51.H>
#include <INTRINS.h>



unsigned char timecount;
unsigned char readdata[2];

sbit RE_DE=P1^0;   //485使能控制端
sbit DQ=P1^2;
bit sflag;              //负号显示


bit resetpulse(void)    //复位函数
{
  unsigned char i;

  DQ=0;
  for(i=255;i>0;i--);
  DQ=1;
  for(i=60;i>0;i--);
  return(DQ);           //判断复位是否成功,DQ为1,说明复位成功,否则,复位失败
  for(i=200;i>0;i--);
}




//18B20写函数//
void writecommandtods18b20(unsigned char command)  //按位写函数
{
  unsigned char i;
  unsigned char j;

  for(i=0;i<8;i++)          //将一个字节八位命令分八次写入18B20
    {
      if((command & 0x01)==0)           //写0时序
        {
          DQ=0;
          for(j=35;j>0;j--);
          DQ=1;
        }
        else
          {
            DQ=0;                       //写1时序
            for(j=2;j>0;j--);
            DQ=1;
            for(j=33;j>0;j--);
          }
      command=_cror_(command,1);       //右移命令,共移八次
    }
}




//18B20读函数//
unsigned char readdatafromds18b20(void) //按位读函数
{
  unsigned char i;
  unsigned char j;
  unsigned char temp;

  temp=0;
  for(i=0;i<8;i++)
    {
      temp=_cror_(temp,1);       //temp向右循环移位1位
      DQ=0;                     //把温度数据传到总路线上
      _nop_();
      _nop_();
      DQ=1;
      for(j=10;j>0;j--);
      if(DQ==1)
        {
          temp=temp | 0x80;
        }
        else
          {
            temp=temp | 0x00;
          }
      for(j=200;j>0;j--);
    }
  return(temp);
}

void main(void)
{ SCON=0x50;
  TMOD=0x21;  //定时器1工作方式1
  TH1=0xF3;
  TL1=0xF3;
  TH0=(65536-4000)/256;
  TL0=(65536-4000)%256;
  ET0=1;
  ET1=1;
  TR1=1;
  EA=1;
  RE_DE=1;
  while(resetpulse());              //等待复位
  writecommandtods18b20(0xcc);      //允许总线控制器不用提供64位ROM编码就使用储存器操作命令(跳过读序列号的操作)
  writecommandtods18b20(0x44);      //启动18B20转换,结果存入内部9字节ROM(前两个为温度)
  TR0=1;
  while(1);
}

void t0(void) interrupt 1 using 0
{
  unsigned char x;
  unsigned int result;
   TR0=0;
  TH0=(65536-4000)/256;
  TL0=(65536-4000)%256;

  ///////////////////////////////////////////////////////////////////////
  ////////////下面是用来处理数据,从18B20读得数据后进行处理//////////////
  ///////////////////////////////////////////////////////////////////////
  timecount++;
  if(timecount==150)                       //每600MS温度值更新一次
    {
      timecount=0;
      while(resetpulse());                 //18B20复位
      writecommandtods18b20(0xcc);         //允许总线控制器不用提供64位ROM编码就使用储存器操作命令
      writecommandtods18b20(0xbe);         //读内部ROM九字节ROM内容(前两个为温度)
      readdata[0]=readdatafromds18b20();   //读低八位
      readdata[1]=readdatafromds18b20();   //读高八位
      sflag=0;
      if((readdata[1] & 0xf8)!=0x00)
        {
          sflag=1;
          readdata[1]=~readdata[1];
          readdata[0]=~readdata[0];
          result=readdata[0]+1;
          readdata[0]=result;
          if(result>255)
            {
              readdata[1]++;
            }
        }
      readdata[1]=readdata[1]<<4;
      readdata[1]=readdata[1] & 0x70;
      x=readdata[0];
      x=x>>4;
      x=x & 0x0f;
      readdata[1]=readdata[1] | x;
      result=readdata[1];
      {SBUF=readdata[1];
   while(TI==0);
   TI=0;
   }
      while(resetpulse());
      writecommandtods18b20(0xcc);
      writecommandtods18b20(0x44);
    }
    TR0=1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -