视频教程:
视频演示及讲解
实物:
程序:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define _r 0X0A
#define _d 0X0D
#define T1VALUE 0XFd
sbit DS18B20_DQ=P2^0;
sbit control=P1^1;
int cnt=0;
typedef struct __DS18B20
{
uint temperature;
float temDat;
uchar signFlag;
uchar temp[6];
}DS18B20;
DS18B20 ds18b20={
0,0.0,0,0,0,0};
uchar code display[]="Temperature:";
uchar mode=0,flag=0;
void displayTemperature(void);
void delay_ms(uint x);
void delay_us(uint x);
void Ds1820Rst(void);
uchar Ds1820Read(void);
void Ds1820Write(uchar dat);
void ReadTemperature(void);
void UartInit(void);
void Send_Char(uchar chr);
void Send_Str(uchar *str);
void ReadTemperature(void)
{
uchar TH,TL;
ds18b20.temperature=0;
ds18b20.temp[0]=0;
ds18b20.temp[1]=0;
ds18b20.temp[2]=0;
ds18b20.temp[3]=0;
Ds1820Rst();
Ds1820Write(0xcc);
Ds1820Write(0x44);
Ds1820Rst();
Ds1820Write(0xcc);
Ds1820Write(0xbe);
TL=Ds1820Read();
TH=Ds1820Read();
ds18b20.temperature=TH;
ds18b20.temperature<<=8;
ds18b20.temperature=ds18b20.temperature|TL;
if(ds18b20.temperature<0x0fff)
ds18b20.signFlag=0;
else
{
ds18b20.temperature=~ds18b20.temperature+1;
ds18b20.signFlag=1;
}
ds18b20.temperature=ds18b20.temperature*(0.625);
}
void UartInit(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1=T1VALUE;
TL1=T1VALUE;
ES=1;
EA=1;
TR1=1;
}
void Send_Char(uchar chr)
{
ES=0;
SBUF=chr;
while(!TI);
SCON&=~(1<<1);
ES=1;
}
void Send_Str(uchar *str)
{
ES=0;
while(*str!='\0')
{
SBUF=*str;
while(!TI);
TI=0;
str++;
}
SCON&=~(1<<1);
ES=1;
}
uchar Ds1820Read(void)
{
uchar j=0,dat=0;
for(j=0;j<8;j++)
{
DS18B20_DQ=0;
dat>>=1;
DS18B20_DQ=1;
if(DS18B20_DQ)
dat|=0x80;
delay_us(10);
}
return dat;
}
void Ds1820Write(uchar dat)
{
uchar j=0;
for (j=0;j<8;j++)
{
DS18B20_DQ=0;
DS18B20_DQ=dat&0x01;
delay_us(10);
DS18B20_DQ=1;
dat>>=1;
}
}
void displayTemperature(void)
{
ds18b20.temp[0]=ds18b20.temperature/1000+'0';
ds18b20.temp[1]=ds18b20.temperature%1000/100+'0';
ds18b20.temp[2]=ds18b20.temperature%100/10+'0';
ds18b20.temp[3]=ds18b20.temperature%10+'0';
Send_Str(display);
if(ds18b20.temp[0]!='0')
{
Send_Char(ds18b20.temp[0]);
}
Send_Char(ds18b20.temp[1]);
Send_Char(ds18b20.temp[2]);
Send_Char('.');
Send_Char(ds18b20.temp[3]);
SBUF=_r;
SBUF=_d;
while(!TI);
SCON&=~(1<<1);
}
int main(void)
{
UartInit();
control=1;
while(1)
{
ReadTemperature();
if(mode)
{
if(ds18b20.temperature>=25)
control=0;
else
control=1;
}
else
{
if(flag)
{
control=0;
}
else
{
control=1;
}
}
cnt++;
if(cnt==20)
{
cnt=0;
displayTemperature();
}
delay_ms(1000);
}
return 0;
}
void delay_ms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void delay_us(uint x)
{
while(x--);
}
void Ds1820Rst(void)
{
DS18B20_DQ = 1;
delay_us(4);
DS18B20_DQ = 0;
delay_us(100);
DS18B20_DQ = 1;
delay_us(40);
}
sbit led=P1^0;
void uart_Handler(void)interrupt 4
{
uchar dat=0;
if(RI)
{
RI=0;
dat=SBUF;
if(dat=='1')
{
flag=1;
}
else if(dat=='z')
{
mode=1;
led=0;
}
else if(dat=='2')
{
flag=0;
}
else if(dat=='s')
{
mode=0;
}
}
}