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

📄 cewen.c

📁 da18b20 51单片机测温显示 通过检测
💻 C
字号:
#include<at89x52.h>

//延时函数
sbit DQ =P2^3;      //DS18B20数据口




/*
typedef unsigned char byte;
typedef unsigned int word;
byte Te=0;   //温度整数部分
//延时
void delay(word useconds)
{
for(;useconds>0;useconds--);
}

//复位
byte ow_reset(void)
{
byte presence;
DQ = 0; //pull DQ line low
delay(29); // leave it low for 480us
DQ = 1; // allow line to return high
delay(3); // wait for presence
presence = DQ; // get presence signal
delay(25); // wait for end of timeslot
return(presence); // presence signal returned
} // 0=presence, 1 = no part

//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
byte i;
byte value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
DQ = 1; // then return high
delay(1); //for (i=0; i<3; i++); 
if(DQ)value|=0x80;
delay(6); // wait for rest of timeslot
}
return(value);
}

//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
DQ = val&0x01;
delay(5); // hold value for remainder of timeslot
DQ = 1;
val=val/2;
}
delay(5);
}

//读取温度
byte Read_Temperature(void)
{
byte c[2],a=0;
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
c[1]=read_byte();   //低字节
c[0]=read_byte();   //高字节 
ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
c[1]=c[1]>>4;
c[0]=c[0]<<4;
a=c[0]|c[1];
return a;
}

*/

unsigned char Te=0;//温度整数部分
unsigned char Te_D=0;//温度小数部分


void delay(unsigned int i)
{
     while(i--);
    
}
//初始化函数
Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(20);
}
//读一个字节
ReadOneChar(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(4);
 }
 return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
 }
//delay(4);
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
//unsigned char t;
float tt=0;
//unsigned char c,d;

//unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(125);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //读取温度值低位
b=ReadOneChar();   //读取温度值高位

t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
return(t);

//e=a&0x0f;//小数部分
//c=(e*10)/16;
//d=((e*10)%16)*10/16;  
//Te_D=c*10+d;    
//a=a>>4;
//Te=b<<4;
//Te=Te|a;
}



//*************************初始化串口**************************//
//串口初始化
void init_com()
{
  SCON=0X40;     //方式2,不允许接收
  TMOD|=0x20;   //定时器1工作方式2,8位自动重装计数初值
  PCON=0X80;      //波特率加倍
  TH1=TL1=0XFA ;  //波特率为9600
  ES=1;     //允许串行中断
  TR1=1; 
  TI=0;
}

//*********************串口发送程序**********************************//
//********************向串口发送一个字符*****************************//
void send_to_comm(unsigned char ch)
{
   SBUF=ch;
   while(!TI);
   TI=0;
}
//*********************************************************************//


void main()
{ unsigned char i=0;
   init_com();
   while(1)
   {

   send_to_comm(0xff);
    i=ReadTemperature();
   send_to_comm(Te);
//   send_to_comm(Te_D);
 
//      i=Read_Temperature();
//      send_to_comm(i);
    
   } 


}

⌨️ 快捷键说明

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