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

📄 ds18b20.c

📁 ds18b20 programmable digital thermometer initialization write read functions also converting temper
💻 C
字号:
#include <t89c51rd2.h>
#include <stdio.h>

//-----------------------------------------------------------//
//---------------- PORT MAPPING DEFINITION ------------------//
//-----------------------------------------------------------//

sbit DQ = P1^1; // Data In/Out for 1-wire interface

signed char T;
unsigned char Rdata,count,count2,temp;
unsigned char SPAD[8];
unsigned int i,Tf;
bit FSerial,presence;

void Delay(unsigned int time) // Delay(1)~delay 10us
{
 for (i=0;i<time;i++);
}
Init_1W() // Reset Pulse
{
 DQ=0;
 Delay(50);
 DQ=1;
 Delay(4);
 if (DQ==0)
 {
  presence=1;
  printf("Initial Complete\n");
 }
 else
 {
  presence=0;
  printf("Initial Fail\n");
 }
}
void Write_1W(unsigned char Data)
{
 bit outbit;
 for (count=1;count<=8;count++)
 {
  outbit=Data & 0x01;
  Data=Data>>1;
  if (outbit==1) // Writing 1	
  {
   DQ=0; // Pulling DQ low 
   DQ=1; // Release DQ
   Delay(5); // Keep DQ in logic 1 for DS18B20 Sampling
  } 
  else // Writing 0
  {
   DQ=0; // Pulling DQ low
   Delay(5); // Keep pulling DQ low for DS18B20 Sampling
   DQ=1; // Release DQ
  } 
 }
}
Read_1W()
{
 bit Ibit;
 Rdata=0;
 EA=0;
 for (count=1;count<=8;count++)
 {
  Rdata=Rdata>>1;
  DQ=0; // Pulling DQ low
  DQ=1; // Release DQ
  Ibit=DQ; // Sampling Data from DQ
  if (Ibit==1)
   Rdata=Rdata|=0x80;
  Delay(6);
  EA=1;
 }
}
Read_DS18B20()
{
 Init_1W();
 if (presence==1)
 {
  Write_1W(0x33); // Read ROM
  Read_1W();
  printf("Family Code = %bx\n",Rdata);
  printf("Serial Number = ");
  for (count2=0;count2<6;count2++)
  {
   Read_1W();
   printf("%bx ",Rdata);
  }
  printf("\n");
  Read_1W();
  printf("CRC = %bx\n",Rdata);
 }
}
Get_Temperature()
{
 Init_1W();
 if (presence==1)
 {
  Write_1W(0xCC); // Skip ROM command
  Write_1W(0x44); // Convert Temperature
  printf("Converting Temperature\n");
  while (Rdata!=0xFF) {
   printf(".");
   Read_1W();
   Delay(1000);
  }
  printf("\nConvert Complete!\n");
  Init_1W();
  Write_1W(0xCC); // Skip ROM command
  Write_1W(0XBE); // Read Scratchpad
  for (count2=0;count2<9;count2++)  {
   Read_1W();
   SPAD[count2]=Rdata;
  }
  T=SPAD[0]>>4;
  T=T|(SPAD[1]<<4);
  if (SPAD[1]>=248)
   T=T|0x80;
  Tf=0;
  if (SPAD[0]&0x01)
   Tf=Tf+625;
  if (SPAD[0]&0x02)
   Tf=Tf+1250;
  if (SPAD[0]&0x04)
   Tf=Tf+2500;
  if (SPAD[0]&0x08)
   Tf=Tf+5000;
  printf("Current Temperature: %bd.%u C\n",T,Tf);
 }
}
Init_Serial()
{
 IE=0x90; // Set EA = 1, ES = 1
 SCON=0x52; // Serial Port working in mode 1  
 PCON=0; // Serial port working in normal mode
 T2MOD=0x00; // 
 RCAP2H=0xFF; // Set Baud rate to 9600 bps
 RCAP2L=0xC4; // Set Baud rate to 9600 bps
 T2CON=0x34; // Enable Timer2 TR2 = '1' and use overflow of Timer 2 to generate clock signal for both Tx & Rx of serial
}
void receive_serial()interrupt 4
{
 if (RI==1)
 {
  temp=SBUF;
  RI=0;
  FSerial=1;
 }
}
Show_menu()
{
 printf ("\nTEST DS18B20 with 1-wire interface\n");
 printf ("Press r to Read DS18B20 ID\n");
 printf ("Press s to Show current temperature\n");
}
Check_Serial()
{
 if (FSerial==1)
  {
   if (temp=='r')
   {
    printf("r\n");
    Read_DS18B20();
    Show_menu();
   }
   else if (temp=='s')
   {
    printf("s\n");
    Get_Temperature();
	Show_menu();
   }
   FSerial=0;
  }
}
void main()
{
 i=0;
 TMOD=0x01;
 DQ=1;
 Init_Serial();
 Show_menu();
 while(1)
 {
  Check_Serial();
 }
}

⌨️ 快捷键说明

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