📄 ds18b20.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 + -