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

📄 b20.c

📁 DS18B20在KEIL uvision2.0下写的源代码!
💻 C
字号:
#include <reg52.h>
 

sbit P00=P0^0;
sbit P01=P0^1;
sbit SCL=P0^2;
sbit SDA=P0^3;
sbit DQ=P0^4;  //DS18B20 DQ线

sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2; 

bit temp;
unsigned int a;
unsigned int tempL,tempH,temp_sign,temperature;


//初始化函数
void init()
{
 P0=0xff;//读前先给置1
 P1=0xff;
 P00=0; //电机断电
 P01=0; 
 P10=0; //关掉LED
}

//延时函数10ms
void mdelay(unsigned char DelayTime)
{ 
  unsigned int n;
  n=0;
  while(n < DelayTime)
   {
    n++;
   }
 return;
}

/*----------------------
函数:DS18B20初始化子函数
----------------------*/
init_DS18B20()
{
 unsigned char x=0;
 DQ=1;
 mdelay(8);
 DQ=0;
 mdelay(90);
 DQ=1;
 mdelay(5);
 x=DQ;
 while(x);
 mdelay(15);
}

//read byte
unsigned int read_byte()
{
 unsigned int i=0;
 unsigned char dat=0;
 for(i=8;i>0;i--)
  {
   DQ=0;
   dat>>=1;
   DQ=1;          //主机数据线从高到低,在拉高产生读信号
   if(DQ)
    {
     dat|=0x80;
	}
   mdelay(5);
  }
  return(dat);
}

//write byte
write_byte(unsigned int dat)
{
 unsigned int i=0;
 for(i=0;i<8;i++)
  {
   DQ=0;         //数据线从高到低,产生写始信号
   DQ=dat&0x01;
   mdelay(6);
   DQ=1;
   dat>>=1;
  }
  mdelay(5);
}

/*----------------------------------
函数功能: DS18B20 read temperature
----------------------------------*/
read_temperature()
{
 
 init_DS18B20();
 write_byte(0xcc);
 write_byte(0x44);

 mdelay(200);
 while(!DQ);

 init_DS18B20();
 write_byte(0xcc);
 write_byte(0xbe);

 tempL=read_byte();
 tempH=read_byte();
 temp_sign=tempH&0xf8;
 tempL>>=4;
 tempH<<=4;
 temperature=tempH|tempL;
 if(temp_sign==0xf8)
  {
   temperature=(~temperature)+0x01;
  }
 mdelay(200);
 return(temperature);
}

//16 conversion 10 (error)
unsigned int conversion(unsigned int a)
{
 unsigned int dat;
 switch(a)
  {
   case 0:dat = 0x00;break;
   case 1:dat = 0x01;break;
   case 2:dat = 0x02;break;
   case 3:dat = 0x03;break;
   case 4:dat = 0x04;break;
   case 5:dat = 0x05;break;
   case 6:dat = 0x06;break;
   case 7:dat = 0x07;break;
   case 8:dat = 0x08;break;
   case 9:dat = 0x09;break;
   case 0x0a: dat =0x10;break;
   case 0x0b: dat =0x11;break;
   case 0x0c: dat =0x12;break;
   case 0x0d: dat =0x13;break;
   case 0x0e: dat =0x14;break;
   case 0x0f: dat =0x15;break;
  }
 return(dat);
}

//two 16 进制
unsigned int con(unsigned int dat)
{
 unsigned int m,n;
 n=conversion(dat&0x0f);
 m=(dat>>4)&0x0f;
 m=conversion(m);
 m=m*16;
 n=m+n;
 return(n);
}
void main(void)
{
 init();
 a=read_temperature();
 ACC=a;

} 

⌨️ 快捷键说明

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