研究内容
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);
//}
资料借鉴于此纷传
阅读全文