#include<AT89x52.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char BYTE;
#define OPEN 0
#define CLOSE 1
sbit DS=P1^1; //DS18B20
sbit lcdrw=P2^6; //lcd引脚
sbit lcdrs=P2^7;
sbit lcden=P2^5;
sbit high_jia=P3^4; //温度高低设置键
sbit high_jian=P3^5;
sbit JDQ1=P1^0; //继电器
sbit ENA=P3^0; //电机驱动芯片
sbit IN1=P3^1;
sbit IN2=P3^3;
sbit jia_key=P1^6; //电机转速加减按键
sbit jian_key=P1^7;
sbit low_jia=P3^6;
sbit low_jian=P3^7;
sbit KeyOpen=P2^0;
sbit KeyClose=P2^1;
sbit Cchange=P2^2;
sbit state_led=P2^3;
int Curtain_flag=1; //手/自动控制标志位
uchar number,num_gao,num_di;
uchar high,low;
uint temp; //测得的温度
uchar flag1;
uchar code a[]="temp:"; //显示测得的温度
uchar code b[]="set:"; //显示设置的温度
uchar code w[]="warm+";
uchar code c1[]="cool1";
uchar code c2[]="cool2";
sbit Light_Flag = P1^5; //光强传感器控制P0.0口
sbit dir=P1^3;
sbit clk=P1^4;
BYTE state;
//uchar code c[]=">"
/*void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}*/
void delay(uint a)//设置延时函数
{ uint i,j;
for(i=0;i<a;i++)
for(j=0;j<110;j++);
}
void write_data(uchar date) //lcd写数据
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_com(uchar com) //lcd写命令
{
lcdrs=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //lcd显示屏初始化
{
write_com(0x38);
write_com(0x0c);
write_com(0x04);
write_com(0x80);
write_com(0x01);
}
/*void key() //检测控制电机转速的加减键的按下
{
if(jia_key==0)
{
delay(10);
if(jia_key==0)
{
number++;
if(number==5)
number=4;
while(jia_key==0);
}
}
if(jian_key==0)
{
delay(10);
if(jian_key==0)
{
if(number!=0)
number--;
else
number=0;
while(jian_key==0);
}
}
}*/
void dispose()
{
switch(number) //周期为4,通过调节高低比来调节转速,case相当于转速
{
case 0: ENA=0;break;
case 1: num_gao=10;num_di=10;break;
case 2: num_gao=20;num_di=0;break;
}
}
void qudong() //实现不同的占空比的矩形波
{
uchar x;
if(num_di!=0)
{
for(x=0;x<num_di;x++)
{
IN1=0;
IN2=0;
delay(25);
}
for(x=0;x<num_gao;x++)
{
IN1=1;
IN2=0;
delay(25);
}
}
}
void dsreset(void) //显示模块
{
uint i;
DS=0;
i=103;
while(i>0)
i--;
DS=1;
i=4;
while(i>0)
i--;
}
bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
void set_wendu() //设置温度
{
if(high_jia==0)
{
delay(10);
if(high_jia==0)
{
high=high+1;
/*if(num>60)
{
num=60;
}*/
while(high_jia==0);
}
}
if(high_jian==0)
{
delay(10);
if(high_jian==0)
{
high=high-1;
/*if(num<40)
{
num=40;
}*/
while(high_jian==0);
}
}
if(low_jia==0)
{
delay(10);
if(low_jia==0)
{
low=low+1;
/*if(num>60)
{
num=60;
}*/
while(low_jia==0);
}
}
if(low_jian==0)
{
delay(10);
if(low_jian==0)
{
low=low-1;
/*if(num<40)
{
num=40;
}*/
while(low_jian==0);
}
}
}
void display(uint te) //测得的温度显示
{
uint A1,A2,A2t,ser,i;
ser=te/10;
SBUF=ser;
A1=te/100;
A2t=te%100;
A2=A2t/10;
write_com(0x80);
for(i=0;i<5;i++)
write_data(a[i]);
write_data(0x30+A1);
write_data(0x30+A2);
}
void set_display(uint high,uint low) //设值的温度显示
{
uint shi,ge,i;
shi=low/10;
ge=low%10;
write_com(0x80+0x40);
for(i=0;i<4;i++)
write_data(b[i]);
write_com(0x80+0x44);
write_data(0x30+shi);
write_data(0x30+ge);
shi=high/10;
ge=high%10;
write_com(0x80+0x47);
write_data(0x30+shi);
write_data(0x30+ge);
write_com(0x80+0x46);
write_data(0x7E);
}
//void choice()
//{
// uint level;
// level=(high-low)/4;
// if(temp<low+level&&temp>=low)
// number=1;
// if(temp>low+level&&temp<=low+2*level)
// number=2;
// if(temp>low+2*level&&temp<=low+3*level)
// number=3;
// if(temp>low+3*level)
// number=4;
//}
void MotorUp()//窗帘电机正转
{
int n=100;
dir=0;
for(n;n>0;n--)
{
clk=1;
delay(20);
clk=0;
delay(20);
}
}
void MotorDown()//窗帘电机正转
{
int n=100;
dir=1;
for(n;n>0;n--)
{
clk=1;
delay(20);
clk=0;
delay(20);
}
}
void CurtainControl()
{
if((state==CLOSE)&&(KeyOpen==0)) //窗帘是关闭状态并且手动按下打开窗帘按钮
{
MotorUp();//电机正转一个周期
state = OPEN; //转好后,窗帘状态变为开状态
}
else if((state==OPEN)&&(KeyClose==0)) //光强高于标准值并且窗帘是打开状态
{
MotorDown();//电机反转一个周期
state = CLOSE; //转好后,窗帘状态变为关闭状态
}
}
void INT0Init()
{
//PX1;
IT0=1;
//IT1=1;
EX0=1;
//EX1=1;
EA=1;
}
void ser() interrupt 0
{
Cchange=!Cchange;//手/自动控制切换
Curtain_flag=!Curtain_flag;//切换标志位
}
void main()
{ //BYTE i,j;
//flag1=1;
int n=0;
Cchange=0;
Curtain_flag=0;
INT0Init();
init();
//number=2; //初始的电机的档位
//num=34; //设置的初始温度
high=27;
low=24;
state = CLOSE;//窗帘为关闭状态
state_led=state;
while(1)
{
//do
//{
IN1=1;
IN2=0;
//ENA=1;
tmpchange();
display(tmp());
set_wendu();
set_display(high,low);
temp=temp/10;
if(high>=temp&&temp>=low)
{ JDQ1=0;
ENA=1;
number=1;
write_com(0x88);
for(n=0;n<5;n++)
write_data(c1[n]);
}
if(temp>high)
{
JDQ1=0;
ENA=1;
number=2;
write_com(0x88);
for(n=0;n<6;n++)
write_data(c2[n]);
}
if(temp<low)
{
JDQ1=1;
ENA=0;
number=0;
write_com(0x88);
for(n=0;n<5;n++)
write_data(w[n]);
}
//key(); //调节电机的转速
// choice();
dispose();
qudong();
//}
if((Curtain_flag==1)&&(Light_Flag==0)&&(state==CLOSE)) //光强低于标准值并且窗帘是关闭状态
{
MotorUp();//电机正转一个周期
state = OPEN; //转好后,窗帘状态变为开状态
}
else if((Curtain_flag==1)&&(Light_Flag==1)&&(state==OPEN)) //光强高于标准值并且窗帘是打开状态
{
MotorDown();//电机反转一个周期
state = CLOSE; //转好后,窗帘状态变为关闭状态
}
else if(Curtain_flag==0)
{
CurtainControl();
}
state_led=state;
}
}