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

📄 ds18b20.c

📁 用51单片机制作测温系统
💻 C
字号:
#include<DS18B20.h>
#define  uchar  unsigned char
int tt;

void delay10us(int n);  
void reset(void);
uchar readbyte(void);
void writebyte(unsigned char dat);
void readtemp(void);  //主函数调用
uchar  temper[2];

void delay10us(int n)
{
	tt=0;
	TR0=1;
	while(tt<n);
	tt=0;
	TR0=0;
}

void timer0int() interrupt 1
{
	tt++;
 	TH0=0xff;
    TL0=0xf5;
}
/*****************************延时函数**************************/

void reset(void)   //复位
{
  uchar x=0;
  while(1)
  {
  DQ = 1;
  delay10us(1);   //稍做延时
  DQ = 0;
  delay10us(60);   //精确延时 大于 480us
  DQ = 1;   //拉高总线
  delay10us(2);
  x=DQ;
  delay10us(50);
  if(x==0)break;
  }
}
/**********************从DS18B20读一字节***************/
uchar readbyte(void) //读1字节
{
  uchar i=0;
  uchar dat=0;
  for (i=8;i>0;i--)
  {
    DQ = 0;
    dat>>=1;
    DQ = 1;
    if(DQ)
    dat|=0x80;
    delay10us(1);
   }
  return(dat);
 }
/***********************向DS18B20写一字节***********************/
void writebyte(unsigned char dat) //写1字节
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
   DQ = 0;
   DQ = dat&0x01;
   delay10us(3);
   DQ = 1;
   dat>>=1;
   }
 //delay10us(2);
}
/***********************CPU读取温度值***************************/
void readtemp(void) //读取温度
{
  uchar a=0,b=0;
  reset();
  //P1=0x00;

  //seg_scan();
 // display(0x06,dispbuf);

  writebyte(0xCC); // 跳过序列号
  writebyte(0x44); // 启动温度转换
  reset();
 
 // seg_scan();
// display(0x06,dispbuf);
  writebyte(0xCC);
  writebyte(0xBE); //读9个寄存器,前两个为温度

  //seg_scan(); 
 // display(0x06,dispbuf);
  a=readbyte();   //低位
  b=readbyte();   //高位

 // seg_scan();
 // display(0x06,dispbuf);
  temper[0]=a&0x0f;
  a=a>>4;         //低位右移4位,舍弃小数部分
  temper[1]=b<<4;         //高位左移4位,舍弃符号位
  temper[1]=temper[1]|a;
  }

⌨️ 快捷键说明

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