基于51单片机的智能红外遥控暖风机设计

研究内容

1)以单片机为核心设计一个红外遥控系统并进行仿真;

2)用红外遥控器对暖风机进行控制,实现暖风机的开/关,定时,温度高低的转换等功能;

3)遥控距离可达8~9米。单片机的工作电压为5V,遥控器为实验遥控器;

4)利用手机上位机实现智能暖风机的控制;

/******************************************************************************

 ******************************************************************************
*  文 件 名   : ds18b20.c
ds18b20子程序
******************************************************************************/

#include "reg52.h"
#include "ds18b20.h"
#include "delay.h"

#include "intrins.h"

	
sbit DQ=P2^0;
void Delay750us()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 84;
	do
	{
		while (--j);
	} while (--i);
}
void Delay15us()		//@11.0592MHz
{
	unsigned char i;

	i = 4;
	while (--i);
}
void Delay2us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
}
void Delay12us()		//@11.0592MHz
{
	unsigned char i;

	i = 3;
	while (--i);
}
void Delay60us()		//@11.0592MHz
{
	unsigned char i;

	i = 25;
	while (--i);
}

void Delay50us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 20;
	while (--i);
}

//复位DS18B20
void DS18B20_Rst(void)	   
{                 
	
    DQ=0; 				//拉低DQ
    Delay750us();    	//拉低750us
    DQ=1; 				//DQ=1 
	Delay15us();     	//15US
}
//从DS18B20读取一个位
//返回值:1/0
unsigned char DS18B20_Read_Bit(void) 	 
{
    unsigned char dat;
	
    DQ=0; 
	Delay2us();
    DQ=1; 
	
	Delay12us();
	if(DQ)dat=1;
    else dat=0;	 
    Delay50us();           
    return dat;
}
//从DS18B20读取一个字节
//返回值:读到的数据
unsigned char DS18B20_Read_Byte(void)     
{        
    unsigned char i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }						    
    return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(unsigned char dat)     
 {             
    unsigned char j;
    unsigned char testb;
    for (j=1;j<=8;j++) 
	{
        testb=dat&0x01;
        dat=dat>>1;
        if (testb) 
        {
            DQ=0;	// Write 1
            Delay2us();                      
            DQ=1;
			Delay60us();             
        }
        else 
        {
            DQ=0;	// Write 0
            Delay60us();             
            DQ=1;
            Delay2us();                        
        }
    }
}
 //等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
unsigned char DS18B20_Check(void) 	   
{   
	unsigned int retry=0;
	 
    while (DQ&&retry<200)
	{
		retry++;
		//delay_us(1);
		_nop_();
	};	 
	if(retry>=200)return 1;
	else retry=0;
    while (!DQ&&retry<240)
	{
		retry++;
		_nop_();
		//delay_us(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}
 //开始温度转换
void DS18B20_Start(void) 
{   						               
    DS18B20_Rst();	   
	delay_ms(100);
    DS18B20_Write_Byte(0xcc);	// skip rom
    DS18B20_Write_Byte(0x44);	// convert
} 
unsigned char DS18B20_Init(void)
{
	DQ = 1;
	DS18B20_Rst();

	return DS18B20_Check();
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
    unsigned char temp;
    unsigned char TL,TH;
	short tem;
    DS18B20_Start ();  			// ds1820 start convert
	delay_ms(100);
	
    DS18B20_Rst();
    DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);	// skip rom
    DS18B20_Write_Byte(0xbe);	// convert	    
    TL=DS18B20_Read_Byte(); 	// LSB   
    TH=DS18B20_Read_Byte(); 	// MSB  
	    	  
    if(TH>7)
    {
        TH=~TH;
        TL=~TL; 
        temp=0;					//温度为负  
    }else temp=1;				//温度为正	  	  
    tem=TH; 					//获得高八位
    tem<<=8;    
    tem+=TL;					//获得底八位
    tem=(float)tem*0.625;		//转换     
	if(temp)return tem; 		//返回温度值
	else return -tem;    
}

//void delay(unsigned int count)
//{									
//	unsigned int i;	
//	while (count)	
//	{
//		i =200;
//		while (i>0) i--;
//		count--;
//    }
//}
///************************************************************************
//* 函数: void Ds18b20_Init(void)
//* 描述: 初始化DS18B20
//* 参数: none.
//* 返回: none.
//************************************************************************/
//void Ds18b20_Init (void)			 // 发送复位和初始化
//{
//	unsigned int i;
//	DQ = 0;	
//	i = 103;
//	while (i>0) i--;         		 // 延时
//	DQ = 1;	
//	i = 4;	
//	while (i>0) i--;	
//}
///************************************************************************
//* 函数: bit Ds18b20_Read_OneBit(void)
//* 描述: 读DS18B20数据的一位
//* 参数: none.
//* 返回: 读到的一位数据
//************************************************************************/
//bit Ds18b20_Read_OneBit(void)		// 读取数据的一位
//{ 	
//	unsigned int i;
//	bit dat;
//	DQ = 0; i++;	
//	DQ = 1; i++; i++;				//延时	
//	dat =DQ;	
//	i = 8; while (i>0) i--;			// 延时
//	return (dat);
//}	
///************************************************************************
//* 函数: unsigned char Ds18b20_Read(void)
//* 描述: 读DS18B20一个字节
//* 参数: none.
//* 返回: value:读到的数据
//************************************************************************/
//unsigned char Ds18b20_Read(void)	 //读DS18B20一个字节
//{
//	unsigned char i,j,dat;	
//	dat = 0;	
//	for (i=1;i<=8;i++)
//	{
//		j = Ds18b20_Read_OneBit ();	
//		dat = (j << 7) | (dat >> 1);	
//	}
//	return (dat);
//}	
///************************************************************************
//* 函数: void Ds18b20_Write(unsigned char dat)
//* 描述: 写DS18B20一个字节
//* 参数: 要写的数据
//* 返回: none.
//************************************************************************/
//void Ds18b20_Write(unsigned char dat)
//{   
//	unsigned int i;
//	unsigned char j;
//	bit testb;	
//	for (j=1;j<=8;j++)
//	{	
//		testb = dat & 0x01;
//		dat = dat >> 1;	
//		if (testb)
//		{	
//			DQ = 0; 						// 写0 
//			i++; i++;  
//			DQ = 1;	
//			i = 8; while (i>0) i--; 
//		}
//		else	
//		{
//			DQ = 0; 						// 写0 
//			i = 8; while (i>0) i--; 
//			DQ = 1;
//			i++; i++;  
//		}
//	}
//}
///************************************************************************
//* 函数: short Ds18b20_ReadTemp()
//* 描述: 读取温度
//* 参数: none.
//* 返回: temp:温度   -550  1250
//* 备注: 精度:0.1C   
//************************************************************************/
//short Ds18b20_ReadTemp()			// 读取温度
//{ 
//	unsigned char flag;        		//温度正负标志位             
//	unsigned char TL,TH;
//	short temp;
//	Ds18b20_Init ();				// 复位
//	delay (1);						// 延时
//	Ds18b20_Write (0xcc);			// 跳过序列号命令   skip rom命令
//	Ds18b20_Write (0x44); 			// 发转换命令 44H,  ds1820 开始转换
//	Ds18b20_Init ();				// 复位
//	delay (1);						// 延时
//	Ds18b20_Write (0xcc); 			// 跳过序列号命令
//	Ds18b20_Write (0xbe);			// 发送读取命令
//	TL=Ds18b20_Read();				// LSB  温度值低位字节(其中低4位为二进制的"小数"部分)
//	TH=Ds18b20_Read(); 				// MSB  高位值高位字节(其中高5位为符号位)

//	if(TH>7)
//	{
//		
//		TH=~TH;
//		TL=~TL;
//		flag = 0;					//温度为负
//	}else
//		flag = 1;					//温度为正
//	
//	temp=TH;
//	temp<<=8;
//	temp+=TL;
//	temp=(float)temp*0.625;
//	if(flag)	return(temp);		//温度为正
//	else 		return(-temp);
//}

资料借鉴于此纷传

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值