/*************************************/
/*功能:溫度檢測,溫度調(diào)節(jié),自動(dòng)控溫*/
/***********************************/
/********* IR_T.c ***********/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS = P1^0; //1602數(shù)據(jù),命令端
sbit RW = P1^1; //讀寫端
sbit E = P1^2; //使能端
sbit DS = P1^4; //DS18B20
sbit Hot = P2^0; //加熱
sbit Feng = P2^7; //風(fēng)扇降溫
sbit Light = P3^1;
sbit IR = P3^2; //紅外
sbit Alarm = P1^3; //報(bào)警
uchar table[4]; //存儲(chǔ)解碼數(shù)據(jù)
uchar flag = 0;
uchar n = 1;
uchar t = 0;
#include "DS18B20.h" //DS18B20溫度轉(zhuǎn)化
#include "1602_display.h" //1602顯示
#include "IR.h" //紅外線
void Init()
{
TMOD = 0x11;
TH1 = (65536 - 1500) / 256;
TL1 = (65536 - 1500) % 256;
TR1 = 0;
ET1 = 1;
TH0 = 0x00;
TL0 = 0x00;
TR0 = 0;
ET0 = 1;
EA = 1;
Hot = 0;
Init_1602(); //1602初始化
}
void main ()
{
Init();
while (1)
{
Decode(); //紅外線解碼
Light = 1;
}
}
void time1() interrupt 3
{
TH1 = (65536 - 1500) / 256;
TL1 = (65536 - 1500) % 256;
t++;
if (t >= 10)
{
t = 0;
Write_tem(DS_average());//溫度顯示
Control();
}
}
/*************************************/
/******功能:1602液晶控制函數(shù)*********/
/******* 1602_display.h ************/
/*************************************/
uchar code table0[] = {"Range:25.0-090.0"};
uchar code table1[] = {"tempe:"};
void delay(uchar z)
{
uchar x = 0;
uchar y = 0;
for (x=z; x>0; x--)
for (y=110; y>0; y--);
}
bit Test() //檢忙
{
bit STA7 = 0;
RS = 0;
RW = 1;
E = 1;
STA7 = (bit)(P0&0x80);
delay(5);
E = 0;
return STA7;
}
void Write_order(uchar order) //寫指令
{
while (Test()); //不忙檢測
RS = 0;
RW = 0;
P0 = order;
delay(5);
E = 1;
delay(5);
E = 0;
}
void Write_data(uchar dat) //寫數(shù)據(jù)
{
while (Test()); //不忙檢測
RS = 1;
RW = 0;
P0 = dat;
delay(5);
E = 1;
delay(5);
E = 0;
}
uchar Read_order() //讀指令
{
uchar order = 0;
while (Test()); //不忙檢測
P0 = 0xff;
RS = 0;
RW = 1;
delay(5);
E = 1;
delay(5);
order = P0;
E = 0;
return order;
}
uchar Read_data() //讀數(shù)據(jù)
{
uchar dat = 0;
while (Test()); //不忙檢測
RS = 1;
RW = 1;
delay(5);
E = 1;
delay(5);
dat = P0;
E = 0;
return dat;
}
void Init_1602()
{
uchar i = 0;
Write_order(0x38);
Write_order(0x0f);
Write_order(0x80); //地址
i = 0;
while (table0 != '\0')
{
Write_data(table0);
i++;
}
Write_order(0x80 + 0x40); //地址
i = 0;
while (table1 != '\0')
{
Write_data(table1);
i++;
}
}
void Write_tem(float tem) //寫溫度
{
Write_order(0x80 + 0x46);
Write_data(0x30 + (uint)tem / 100);
Write_data(0x30 + (uint)tem / 10 % 10);
Write_data(0x30 + (uint)tem % 10);
Write_data('.');
Write_data(0x30 + (uint)(tem * 10) % 10);
Write_data(0x30 + (uint)(tem * 100) % 10);
Write_data(0xdf);//.
Write_data('C');
Write_order(0x0c);
}
float Read_rang_low() //讀最小溫度范圍
{
uchar num0 = 0;
uchar num1 = 0;
uchar num2 = 0;
Write_order(0x80 + 6);
Read_order();
num0 = Read_data() % 16;
Write_order(0x80 + 7);
Read_order();
num1 = Read_data() % 16;
Write_order(0x80 + 9);
Read_order();
num2 = Read_data() % 16;
return (num0 * 10 + num1 + num2 * 0.1);
}
float Read_rang_high() //讀最大溫度范圍
{
uchar num0 = 0;
uchar num1 = 0;
uchar num2 = 0;
uchar num3 = 0;
Write_order(0x80 + 11);
Read_order();
num0 = Read_data() % 16;
Write_order(0x80 + 12);
Read_order();
num1 = Read_data() % 16;
Write_order(0x80 + 13);
Read_order();
num2 = Read_data() % 16;
Write_order(0x80 + 15);
Read_order();
num3 = Read_data() % 16;
return (num0 * 100 + num1 * 10 + num2 + num3 * 0.1);
}
void Control() //對溫度做相應(yīng)處理
{
if (Get_DS() <= Read_rang_high()
&& Get_DS() >= Read_rang_low())
{
Hot = 0;
Feng = 1;
Alarm = 1;
}
if (Get_DS() >= Read_rang_high())//溫度高,開降溫
{
Feng = 0;
Hot = 0;
Alarm = 0;
delay(100);
Alarm = 1;
delay(100);
}
if (Get_DS() <= Read_rang_low())//溫度低,開加熱
{
Feng = 1;
Hot = 1;
Alarm = 0;
delay(100);
Alarm = 1;
delay(100);
}
}
/*************************************/
/*******功能:DS128B20溫度讀取*******/
/******** DS18B20.h ***********/
/**********************************/
void delayms(uchar x)
{
while (x--); //x=0,14.11us,x=1,20.62us,x=n,14.11+6.51n us
}
uchar Init_DS()
{
uchar x = 0;
DS = 1;
delayms(0);
DS = 0;
delayms(110); //730us
DS = 1;
delayms(6); //50us
x = DS;
delayms(67); //480us
DS = 1;
return x;
}
void Write_data_DS(uchar dat)
{
uchar i = 0;
for (i=0; i<8; i++)
{
DS = 0;
DS = dat&0x01; //送低位
delayms(5); //45us
DS = 1;
dat >>= 1;
}
}
uchar Read_data_DS()
{
uchar i = 0;
uchar dat = 0;
for (i=0;i<8;i++)
{
DS = 0;
dat >>= 1;
DS = 1;
delayms(0); //4us
if (DS)
dat=dat|0x80;
delayms(1);
}
return dat;
}
float Get_DS()
{
float temp = 0;
while (Init_DS());
Write_data_DS(0xcc);
Write_data_DS(0x44);
delayms(120); //800us
while (Init_DS());
Write_data_DS(0xcc);
Write_data_DS(0xbe);
temp = Read_data_DS();
temp = (Read_data_DS() << 8)|(uint)temp;
temp = temp * 0.0625 + 0.005;
return temp;
}
float DS_average() //十次平均溫度值
{
uchar i = 0;
float temp = 0;
for (i=10; i>0; i--)
{
temp = temp + Get_DS();
}
temp = temp / 10.0;
return temp;
}
/*************************************/
/******功能:紅外控制解碼************/
/******* IR.h *************/
/**********************************/
void Function(uchar num) //紅外控制
{
switch (num)
{
case 11:EA = 0; //設(shè)定范圍
Alarm = 1; //關(guān)警報(bào)
n = 1; //游標(biāo)定位
Write_order(0x86);
Write_order(0x0f);
flag = 1;
break;
case 12:Write_order(0x0c); //確定
flag = 0;
EA=1;
break;
}
if (flag == 1)
{
switch (num)
{
case 15:Write_order(0x86+n);//光標(biāo)右移
n++;
if (n == 2)
n = 3;
if (n == 4)
n = 5;
if (n == 8)
n = 9;
if (n == 10)
n = 0;
break;
case 14:if (n <= 1) //光標(biāo)左移
n = 11;
if(n == 10)
n = 9;
if (n == 6)
n = 5;
if (n == 4)
n = 3;
Write_order(0x86+n-2);
n--;
break;
case 0: case 1: case 2: //數(shù)字0—9
case 3: case 4: case 5:
case 6: case 7: case 8:
case 9:
Write_data(0x30+num);
Write_order(0x86+n);
n++;
if (n == 2)
n = 3;
if (n == 4)
n = 5;
if (n == 8)
n = 9;
if (n == 10)
n = 0;
break;
}
}
}
void Decode() //解碼
{
uchar i = 0;
uchar j = 0;
uchar temp = 0;
uint hightime = 0;
uint lowtime = 0;
uchar num = 0;
TH0 = 0x00;
TL0 = 0x00;
TR0 = 1;
while (IR == 0);
TR0 = 0;
lowtime = TH0 * 256 + TL0;
TH0 = 0x00;
TL0 = 0x00;
TR0 = 1;
while (IR == 1);
TR0 = 0;
hightime = TH0 * 256 + TL0;
if (hightime > 3600 && hightime < 4600
&& lowtime > 7800 && lowtime < 8800)//引導(dǎo)嗎
{
for (i=0; i<4; i++)
{
for (j=0; j<8; j++)
{
temp >>= 1;
TH0 = 0;
TL0 = 0;
TR0 = 1;
while (IR == 0);
TR0 = 0;
lowtime = TH0 * 256 + TL0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
while (IR == 1);
TR0 = 0;
hightime = TH0 * 256 + TL0;
if (lowtime > 370 && lowtime < 640)
{
if (hightime > 420 && hightime < 640)//0
{
temp = temp&0x7f;
}
if (hightime > 1250 && hightime < 1850)//1
{
temp = temp|0x80;
}
}
}
table = temp;
}
if (table[2] ==~table[3])
{
switch (table[2]) //用戶碼編碼
{
case 22:num = 0;break;
case 12:num = 1;break;
case 24:num = 2;break;
case 94:num = 3;break;
case 8:num = 4;break;
case 28:num = 5;break;
case 90:num = 6;break;
case 66:num = 7;break;
case 82:num = 8;break;
case 74:num = 9;break;
case 69:num = 10;break;
case 70:num = 11;break;
case 71:num = 12;break;
case 68:num = 13;break;
case 64:num = 14;break;
case 67:num = 15;break;
case 7:num = 16;break;
case 21:num = 17;break;
case 9:num = 18;break;
case 25:num = 19;break;
case 13:num = 20;break;
}
}
Light = 0;
Function(num); //調(diào)用功能函數(shù)
}
}
你能幫我解釋一下關(guān)于定時(shí)計(jì)數(shù)器的意義嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |