研究?jī)?nèi)容
1)以單片機(jī)為核心設(shè)計(jì)一個(gè)紅外遙控系統(tǒng)并進(jìn)行仿真;
2)用紅外遙控器對(duì)暖風(fēng)機(jī)進(jìn)行控制,實(shí)現(xiàn)暖風(fēng)機(jī)的開(kāi)/關(guān),定時(shí),溫度高低的轉(zhuǎn)換等功能;
3)遙控距離可達(dá)8~9米。單片機(jī)的工作電壓為5V,遙控器為實(shí)驗(yàn)遙控器;
4)利用手機(jī)上位機(jī)實(shí)現(xiàn)智能暖風(fēng)機(jī)的控制;
/******************************************************************************
******************************************************************************
* 文 件 名 : 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);
}
//復(fù)位DS18B20
void DS18B20_Rst(void)
{
DQ=0; //拉低DQ
Delay750us(); //拉低750us
DQ=1; //DQ=1
Delay15us(); //15US
}
//從DS18B20讀取一個(gè)位
//返回值: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讀取一個(gè)字節(jié)
//返回值:讀到的數(shù)據(jù)
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;
}
//寫(xiě)一個(gè)字節(jié)到DS18B20
//dat:要寫(xiě)入的字節(jié)
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的回應(yīng)
//返回1:未檢測(cè)到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;
}
//開(kāi)始溫度轉(zhuǎn)換
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; //溫度為負(fù)
}else temp=1; //溫度為正
tem=TH; //獲得高八位
tem<<=8;
tem+=TL; //獲得底八位
tem=(float)tem*0.625; //轉(zhuǎn)換
if(temp)return tem; //返回溫度值
else return -tem;
}
//void delay(unsigned int count)
//{
// unsigned int i;
// while (count)
// {
// i =200;
// while (i>0) i--;
// count--;
// }
//}
///************************************************************************
//* 函數(shù): void Ds18b20_Init(void)
//* 描述: 初始化DS18B20
//* 參數(shù): none.
//* 返回: none.
//************************************************************************/
//void Ds18b20_Init (void) // 發(fā)送復(fù)位和初始化
//{
// unsigned int i;
// DQ = 0;
// i = 103;
// while (i>0) i--; // 延時(shí)
// DQ = 1;
// i = 4;
// while (i>0) i--;
//}
///************************************************************************
//* 函數(shù): bit Ds18b20_Read_OneBit(void)
//* 描述: 讀DS18B20數(shù)據(jù)的一位
//* 參數(shù): none.
//* 返回: 讀到的一位數(shù)據(jù)
//************************************************************************/
//bit Ds18b20_Read_OneBit(void) // 讀取數(shù)據(jù)的一位
//{
// unsigned int i;
// bit dat;
// DQ = 0; i++;
// DQ = 1; i++; i++; //延時(shí)
// dat =DQ;
// i = 8; while (i>0) i--; // 延時(shí)
// return (dat);
//}
///************************************************************************
//* 函數(shù): unsigned char Ds18b20_Read(void)
//* 描述: 讀DS18B20一個(gè)字節(jié)
//* 參數(shù): none.
//* 返回: value:讀到的數(shù)據(jù)
//************************************************************************/
//unsigned char Ds18b20_Read(void) //讀DS18B20一個(gè)字節(jié)
//{
// unsigned char i,j,dat;
// dat = 0;
// for (i=1;i<=8;i++)
// {
// j = Ds18b20_Read_OneBit ();
// dat = (j << 7) | (dat >> 1);
// }
// return (dat);
//}
///************************************************************************
//* 函數(shù): void Ds18b20_Write(unsigned char dat)
//* 描述: 寫(xiě)DS18B20一個(gè)字節(jié)
//* 參數(shù): 要寫(xiě)的數(shù)據(jù)
//* 返回: 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; // 寫(xiě)0
// i++; i++;
// DQ = 1;
// i = 8; while (i>0) i--;
// }
// else
// {
// DQ = 0; // 寫(xiě)0
// i = 8; while (i>0) i--;
// DQ = 1;
// i++; i++;
// }
// }
//}
///************************************************************************
//* 函數(shù): short Ds18b20_ReadTemp()
//* 描述: 讀取溫度
//* 參數(shù): none.
//* 返回: temp:溫度 -550 1250
//* 備注: 精度:0.1C
//************************************************************************/
//short Ds18b20_ReadTemp() // 讀取溫度
//{
// unsigned char flag; //溫度正負(fù)標(biāo)志位
// unsigned char TL,TH;
// short temp;
// Ds18b20_Init (); // 復(fù)位
// delay (1); // 延時(shí)
// Ds18b20_Write (0xcc); // 跳過(guò)序列號(hào)命令 skip rom命令
// Ds18b20_Write (0x44); // 發(fā)轉(zhuǎn)換命令 44H, ds1820 開(kāi)始轉(zhuǎn)換
// Ds18b20_Init (); // 復(fù)位
// delay (1); // 延時(shí)
// Ds18b20_Write (0xcc); // 跳過(guò)序列號(hào)命令
// Ds18b20_Write (0xbe); // 發(fā)送讀取命令
// TL=Ds18b20_Read(); // LSB 溫度值低位字節(jié)(其中低4位為二進(jìn)制的"小數(shù)"部分)
// TH=Ds18b20_Read(); // MSB 高位值高位字節(jié)(其中高5位為符號(hào)位)
// if(TH>7)
// {
//
// TH=~TH;
// TL=~TL;
// flag = 0; //溫度為負(fù)
// }else
// flag = 1; //溫度為正
//
// temp=TH;
// temp<<=8;
// temp+=TL;
// temp=(float)temp*0.625;
// if(flag) return(temp); //溫度為正
// else return(-temp);
//}
資料借鑒于此紛傳