《单片机实践项目》之《电子DIY》基于51单片机+蓝牙HC-05模块的遥控温控风扇设计与制作(实物制作)

视频教程:

视频演示及讲解

实物:

在这里插入图片描述

程序:

#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;//0101 0000
   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);	//750
	}
	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;
		}	
	}
}

猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/107364400