1.设计任务
利用AT89C51单片机为核心控制元件,设计一个简易温湿度控制系统,设计的系统实用性强、操作简单,实现了智能化、数字化。
2. 设计要求
2.1系统方案论证
根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。
2.2系统硬件电路设计
根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。
主函数:
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
sbit SCK=P1^6;
sbit DATA=P1^7;
sbit k1=P2^0; //ÎÂʪ¶ÈÉ趨
sbit k2=P2^1; //¼Ó
sbit k3=P2^2; //¼õ
sbit k4=P2^3; //Í˳öÉ趨
sbit beep=P2^4;//·äÃùÆ÷
sbit led=P3^0; //ledָʾµÆ
sbit relay1=P3^5; // ¼Óʪ
sbit relay2=P3^6; //¼ÓÈÈ
//µØÖ· ÃüÁî ¶Á/д
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
#define ACK 1
#define noACK 0
u8 code d1[]="Temp: ";
u8 code d2[]="Humi: ";
u8 code d3[]="TempH:";
u8 code d4[]="TempL:";
u8 code d5[]="HumiH:";
u8 code d6[]="HumiL:";
u16 temp,humi;
u8 wendu[5],shidu[5];
u8 mode,shedingok;
int wdh=30,wdl=20,sdh=30,sdl=20;
u8 sbuf[4];
enum {TEMP,HUMI};
void delay(u16 i)
{
while(i--);
}
void wrc(u8 c) //дÃüÁî
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(10);
e=0;
}
void wrd(u8 dat) //дÊý¾Ý
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(10);
e=0;
rs=0;
}
void init()
{
delay(1000);
wrc(0x38);
wrc(0x38);
wrc(0x38);
wrc(0x06);
wrc(0x0c);
wrc(0x01);
}
void s_transstart() //Æô¶¯´«Êä
{
DATA=1;
SCK=0;
delay(1);
SCK=1;
delay(1);
DATA=0;
delay(1);
SCK=0;
delay(1);
SCK=1;
delay(1);
DATA=1;
delay(1);
SCK=0;
delay(1);
}
void s_connectionreset() //ͨѶ¸´Î»
{
u8 i;
DATA=1;
for(i=0;i<9;i++)
{
SCK=0;
delay(1);
SCK=1;
delay(1);
}
s_transstart(); //Æô¶¯´«Êä
}
u8 s_write_byte(u8 dat) //sht11дÊý¾Ý
{
u8 i,error=0;;
SCK=0;
delay(1);
for(i=0;i<8;i++)
{
if((dat&0x80)==0x80) //ÏÈ´«¸ßλÔÚ´«µÍλ
DATA=1;
else
DATA=0;
dat<<=1;
SCK=1;
delay(1);
SCK=0;
delay(1);
}
DATA=1; //ÊÍ·ÅÊý¾ÝÏß
error=DATA; //¼ì²éÓ¦´ðÐźţ¬È·ÈÏͨѶÕý³£
delay(1);
SCK=1;
delay(1);
SCK=0;
delay(1);
DATA=1;
return error; //error=1 ͨѶ´íÎó
}
u8 s_read_byte(u8 ack) //sht11дÊý¾Ý
{
u8 i,val=0;
DATA=1;
SCK=0;
delay(1);
for(i=0;i<8;i++)
{
val<<=1;
if(DATA==1)
{
val|=0x01;
}
SCK=1;
delay(1);
SCK=0;
delay(1);
}
DATA=!ack; //ACKλ
SCK=1;
delay(1);
SCK=0;
delay(1);
DATA=1; //ÊÍ·ÅÊý¾ÝÏß
return val;
}
u8 s_measure(u8 *p_value, u8 *p_checksum, u8 mode) //ÎÂʪ¶È²âÁ¿
{
u8 error=0;
u16 i;
s_transstart(); //Æô¶¯´«Êä
switch(mode) //Ñ¡Ôñ·¢ËÍÃüÁî
{
case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //²âÁ¿Î¶È
case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //²âÁ¿Êª¶È
default : break;
}
for (i=0;i<65535;i++) if(DATA==0) break; //µÈ´ý²âÁ¿½áÊø
if(DATA) error+=1; // Èç¹û³¤Ê±¼äÊý¾ÝÏßûÓÐÀµÍ£¬ËµÃ÷²âÁ¿´íÎó
*(p_value) =s_read_byte(ACK); //¶ÁµÚÒ»¸ö×Ö½Ú£¬¸ß×Ö½Ú (MSB)
*(p_value+1)=s_read_byte(ACK); //¶ÁµÚ¶þ¸ö×Ö½Ú£¬µÍ×Ö½Ú (LSB)
*p_checksum =s_read_byte(noACK); //read CRCУÑéÂë
return error; // error=1 ͨѶ´íÎó
}
//ÎÂʪ¶ÈÖµ±ê¶È±ä»»¼°Î¶Ȳ¹³¥
void calc_sth10(float *p_humidity ,float *p_temperature)
{
const float C1=-4.0; // 12λʪ¶È¾«¶È ÐÞÕý¹«Ê½
const float C2=+0.0405; // 12λʪ¶È¾«¶È ÐÞÕý¹«Ê½
const float C3=-0.0000028; // 12λʪ¶È¾«¶È ÐÞÕý¹«Ê½
const float T1=+0.01; // 14λζȾ«¶È 5VÌõ¼þ ÐÞÕý¹«Ê½
const float T2=+0.00008; // 14λζȾ«¶È 5VÌõ¼þ ÐÞÕý¹«Ê½
float rh=*p_humidity; // rh: 12λ ʪ¶È
float t=*p_temperature; // t: 14λ ζÈ
float rh_lin; // rh_lin: ʪ¶È linearÖµ
float rh_true; // rh_true: ʪ¶È tureÖµ
float t_C; // t_C : ÎÂ¶È ¡æ
t_C=t*0.01 - 40; //²¹³¥Î¶È
rh_lin=C3*rh*rh + C2*rh + C1; //Ïà¶Ôʪ¶È·ÇÏßÐÔ²¹³¥
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //Ïà¶Ôʪ¶È¶ÔÓÚζÈÒÀÀµÐÔ²¹³¥
if(rh_true>100)rh_true=100; //ʪ¶È×î´óÐÞÕý
if(rh_true<0.1)rh_true=0.1; //ʪ¶È×îСÐÞÕý
*p_temperature=t_C; //·µ»ØζȽá¹û
*p_humidity=rh_true; //·µ»Øʪ¶È½á¹û
}
typedef struct //¶¨Òå½á¹¹ÌåÀàÐÍ
{
u16 i;
float f;
} value;
value humi_val,temp_val; //¶¨ÒåÁ½¸ö¹²Í¬Ì壬һ¸öÓÃÓÚʪ¶È£¬Ò»¸öÓÃÓÚζÈ
void sound() //Éù¹â±¨¾¯
{
u8 i=100;
while(i--)
{
beep=~beep;
delay(300);
led=~led;
}
}
void time0init() //¶¨Ê±Æ÷0 ³õʼ»¯
{
TMOD=0X01;
TH0=0Xfc;
TL0=0X18; //É趨1ms¶¨Ê±
TR0=1;
EA=1;
ET0=1;
}
void keypros() //°´¼ü´¦Àíº¯Êý
{
if(k1==0) //ÎÂʪ¶ÈÉ趨
{
delay(1000);
if(k1==0)
{
mode++;
shedingok=0;
if(mode==5)mode=0;
if(mode==1)wrc(0x01);
if(mode==3)wrc(0x01);
}
while(!k1);
}
if(mode==1) // ζÈÉÏÏÞÉ趨
{
if(k2==0) //ζȼÓ
{
delay(1000);
if(k2==0)
{
wdh+=5;
if(wdh>80)wdh=80;
}
while(!k2);
}
if(k3==0) //ζȼõ
{
delay(1000);
if(k3==0)
{
wdh-=5;
if(wdh<0)wdh=0;
}
while(!k3);
}
}
if(mode==2) // ζÈÏÂÏÞÉ趨
{
if(k2==0) //ζȼÓ
{
delay(1000);
if(k2==0)
{
wdl+=5;
if(wdh>80)wdh=80;
}
while(!k2);
}
if(k3==0) //ζȼõ
{
delay(1000);
if(k3==0)
{
wdl-=5;
if(wdh<0)wdh=0;
}
while(!k3);
}
}
if(mode==3) // ʪ¶ÈÉÏÏÞÉ趨
{
if(k2==0) //ʪ¶È¼Ó
{
delay(1000);
if(k2==0)
{
sdh+=5;
if(sdh>80)sdh=80;
}
while(!k2);
}
if(k3==0) //ʪ¶È¼õ
{
delay(1000);
if(k3==0)
{
sdh-=5;
if(sdh<0)wdh=0;
}
while(!k3);
}
}
if(mode==4) // ʪ¶ÈÏÂÏÞÉ趨
{
if(k2==0) //ʪ¶È¼Ó
{
delay(1000);
if(k2==0)
{
sdl+=5;
if(sdh>80)sdh=80;
}
while(!k2);
}
if(k3==0) //ʪ¶È¼õ
{
delay(1000);
if(k3==0)
{
sdl-=5;
if(sdh<0)wdh=0;
}
while(!k3);
}
}
if(k4==0) //Í˳öÉ趨
{
delay(1000);
if(k4==0)
{
mode=0;
shedingok=1;
}
while(!k4);
}
sbuf[0]=wdh; //½«É趨ºÃµÄÎÂʪ¶ÈÉÏÏÂÏÞÖµ±£´æÔÚÊý×ésbufÄÚ
sbuf[1]=wdl;
sbuf[2]=sdh;
sbuf[3]=sdl;
// wrbytes(7,sbuf);
}
void datapros() //Êý¾Ý´¦Àí ÏÔʾ
{
u8 i;
if(mode==1) //ζÈÉÏÏÞÊý¾Ý´¦Àí
{
wendu[0]=wdh/100+'0'; //ζȰÙλ
wendu[1]=wdh%100/10+'0'; //ζÈʮλ
wendu[2]=wdh%10+'0'; //ζȸöλ
wendu[3]=0x2E; //СÊýµã
temp=temp_val.f*10;
wendu[4]=temp%10+'0'; //ζÈСÊýµãºóµÚһλ
wrc(0x80);
for(i=0;i<6;i++)
{
wrd(d3[i]);
}
for(i=0;i<5;i++)
{
wrd(wendu[i]);
}
wrd(0xdf);
wrd('C');
}
if(mode==2) //ζÈÏÂÏÞÊý¾Ý´¦Àí
{
wendu[0]=wdl/100+'0'; //ζȰÙλ
wendu[1]=wdl%100/10+'0'; //ζÈʮλ
wendu[2]=wdl%10+'0'; //ζȸöλ
wendu[3]=0x2E; //СÊýµã
temp=temp_val.f*10;
wendu[4]=temp%10+'0'; //ζÈСÊýµãºóµÚһλ
wrc(0x80+0x40);
for(i=0;i<6;i++)
{
wrd(d4[i]);
}
for(i=0;i<5;i++)
{
wrd(wendu[i]);
}
wrd(0xdf);
wrd('C');
}
if(mode==3) //ʪ¶ÈÉÏÏÞÊý¾Ý´¦Àí
{
shidu[0]=sdh/100+'0'; //ʪ¶È°Ùλ
shidu[1]=sdh%100/10+'0'; //ʪ¶Èʮλ
shidu[2]=sdh%10+'0'; //ʪ¶È¸öλ
shidu[3]=0x2E;
humi=humi_val.f*10; //СÊýµã
shidu[4]=humi%10+'0'; //ʪ¶ÈСÊýµãºóµÚһλ
wrc(0x80);
for(i=0;i<6;i++)
{
wrd(d5[i]);
}
for(i=0;i<5;i++)
{
wrd(shidu[i]);
}
wrd('%');
wrd('R');
wrd('H');
}
if(mode==4) //ʪ¶ÈÏÂÏÞÊý¾Ý´¦Àí
{
shidu[0]=sdl/100+'0'; //ʪ¶È°Ùλ
shidu[1]=sdl%100/10+'0'; //ʪ¶Èʮλ
shidu[2]=sdl%10+'0'; //ʪ¶È¸öλ
shidu[3]=0x2E;
humi=humi_val.f*10; //СÊýµã
shidu[4]=humi%10+'0'; //ʪ¶ÈСÊýµãºóµÚһλ
wrc(0x80+0x40);
for(i=0;i<6;i++)
{
wrd(d6[i]);
}
for(i=0;i<5;i++)
{
wrd(shidu[i]);
}
wrd('%');
wrd('R');
wrd('H');
}
}
void data_change() //Êý¾Ý±È½Ïº¯Êý
{
if((temp>wdh)&&shedingok==1)//Èç¹û¼ì²âζȴóÓÚÉ趨ÉÏÏÞ ¼ÓÈȹرգ¬
{
sound(); //Éù¹â±¨¾¯
relay2=1;
}
if((temp<wdl)&&shedingok==1)//Èç¹û¼ì²âζȵÍÓÚÉ趨ÏÂÏÞ ¼ÓÈÈ´ò¿ª£¬
{
sound(); //Éù¹â±¨¾¯
relay2=0;
}
if((humi>sdh)&&shedingok==1)//Èç¹û¼ì²âʪ¶È´óÓÚÉ趨ÉÏÏÞ ¼Óʪ¹Ø±Õ£¬
{
sound(); //Éù¹â±¨¾¯
relay1=1;
}
if((humi<sdl)&&shedingok==1)//Èç¹û¼ì²âʪ¶ÈµÍÓÚÉ趨ÏÂÏÞ ¼Óʪ´ò¿ª£¬
{
sound(); //Éù¹â±¨¾¯
relay1=0;
}
}
void kai_display() //¿ª»ú½çÃæÏÔʾ
{
u8 i;
wrc(0x00+0x80);
for(i=0;i<6;i++)
{
wrd(d1[i]);
}
wrc(0x40+0x80);
for(i=0;i<6;i++)
{
wrd(d2[i]);
}
}
void display() //ÎÂʪ¶ÈÏÔʾº¯Êý
{
u8 i;
if(mode==0)
{
kai_display(); //¿ª»ú½çÃæÏÔʾ
wrc(0x06+0x80);
wendu[0]=temp/100+'0'; //ζȰÙλ
wendu[1]=temp%100/10+'0'; //ζÈʮλ
wendu[2]=temp%10+'0'; //ζȸöλ
wendu[3]=0x2E; //СÊýµã
temp=temp_val.f*10;
wendu[4]=temp%10+'0'; //ζÈСÊýµãºóµÚһλ
for(i=0;i<5;i++)
{
wrd(wendu[i]);
}
wrd(0xdf);
wrd('C');
wrc(0x46+0x80);
shidu[0]=humi/100+'0'; //ʪ¶È°Ùλ
shidu[1]=humi%100/10+'0'; //ʪ¶Èʮλ
shidu[2]=humi%10+'0'; //ʪ¶È¸öλ
shidu[3]=0x2E;
humi=humi_val.f*10; //СÊýµã
shidu[4]=humi%10+'0'; //ʪ¶ÈСÊýµãºóµÚһλ
for(i=0;i<5;i++)
{
wrd(shidu[i]);
}
wrd('%');
wrd('R');
wrd('H');
}
datapros(); //Êý¾Ý´¦Àí ÏÔʾ
}
void main()
{
u8 error; //ÓÃÓÚ¼ìÑéÊÇ·ñ³öÏÖ´íÎó
u8 checksum; //CRC
led=0;
init();
kai_display(); //¿ª»ú½çÃæÏÔʾ
s_connectionreset(); //ͨѶ¸´Î»
time0init(); //¶¨Ê±Æ÷0 ³õʼ»¯
while(1)
{
error=0;
error+=s_measure((u8*)&temp_val.i,&checksum,TEMP); //ζȲâÁ¿
error+=s_measure((u8*)&humi_val.i,&checksum,HUMI); //ʪ¶È²âÁ¿
if(error!=0) s_connectionreset();
else
{
humi_val.f=(float)humi_val.i; //ת»»Îª¸¡µãÊý
temp_val.f=(float)temp_val.i; //ת»»Îª¸¡µãÊý
calc_sth10(&humi_val.f,&temp_val.f); //ÐÞÕýÏà¶Ôʪ¶È¼°Î¶È
temp=temp_val.f;
humi=humi_val.f-5;
}
data_change(); //Êý¾Ý±È½Ï
display(); //ÎÂʪ¶ÈÏÔʾº¯Êý
//µÈ´ý×ã¹»³¤µÄʱ¼ä£¬ÒÔÏÖÐÐÏÂÒ»´Îת»»
delay(100);
}
}
void time0() interrupt 1 //¶¨Ê±Æ÷0ÖжϺ¯Êý
{
// static u16 j;
TH0=0Xfc;
TL0=0X18; //É趨1ms¶¨Ê±
keypros();
}
Proteus 仿真
完整代码点开链接私信 免费 获取。
【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa