0 前言
??
這兩年開(kāi)始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長(zhǎng)自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過(guò)畢設(shè),學(xué)長(zhǎng)分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
?? 畢業(yè)設(shè)計(jì) 單片機(jī)智能大棚溫濕度控制系統(tǒng)(源碼+硬件+論文)
??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):4分
?? 項(xiàng)目分享:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-475581.html
https://gitee.com/sinonfin/sharing文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-475581.html
1 主要功能
本系統(tǒng)的設(shè)計(jì)的硬件主要包括:主要是單片機(jī)STC89C52,檢測(cè)系統(tǒng),顯示電路,繼電器驅(qū)動(dòng)電路等。利用傳感器測(cè)量大棚內(nèi)的溫濕度經(jīng)過(guò)信號(hào)處理,將傳感器測(cè)得的數(shù)據(jù)送至控制系統(tǒng)(STC89C52),與預(yù)設(shè)的農(nóng)作物最適合生長(zhǎng)的溫濕度值的上下限進(jìn)行對(duì)比,并通過(guò)顯示電路將測(cè)得的溫濕度進(jìn)行實(shí)時(shí)顯示,超過(guò)范圍發(fā)出報(bào)警并且執(zhí)行相應(yīng)的動(dòng)作,此外我們還增加了手機(jī)藍(lán)牙查看溫濕度的功能。如果不同作物的適合生長(zhǎng)的溫度不一樣,可以通過(guò)鍵盤(pán)電路修改預(yù)設(shè)值。
當(dāng)檢測(cè)的濕度低于下限時(shí) =====>進(jìn)行加濕;
當(dāng)檢測(cè)的濕度高于上限時(shí) =====>進(jìn)行除濕;
當(dāng)檢測(cè)的溫度低于下限時(shí) =====>進(jìn)行升溫;
當(dāng)檢測(cè)的溫度高于上限時(shí) =====>進(jìn)行降溫;
這樣就使溫度和濕度一直控制在設(shè)定的上下限之間,這樣就實(shí)現(xiàn)了對(duì)大棚溫濕度的自動(dòng)控制。
本文主要研究?jī)?nèi)容如下:
1.進(jìn)行溫濕度控制系統(tǒng)的整體研究與設(shè)計(jì)。
2.利用鍵盤(pán)設(shè)置溫濕度的上下限值。
3.利用數(shù)字溫濕度傳感器測(cè)量大棚內(nèi)的溫濕度。
4.利用LCD對(duì)溫濕度進(jìn)行實(shí)時(shí)顯示。
5.當(dāng)大棚溫濕度值超出設(shè)定范圍值時(shí),系統(tǒng)會(huì)自動(dòng)驅(qū)動(dòng)信號(hào)控制繼電器對(duì)大棚溫濕度進(jìn)行調(diào)節(jié)。
2 硬件設(shè)計(jì)(原理圖)
3 核心軟件設(shè)計(jì)
主程序流程圖
關(guān)鍵代碼
include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#include <intrins.h>
typedef bit BOOL ;
sbit io = P1^7 ;
sbit FMQ=P2^0; //蜂鳴器
sbit TempH=P1^3; //降溫控制
sbit TempL=P1^2; //加溫控制
sbit HumiH=P1^1; //除濕
sbit HumiL=P1^0; //加濕
sbit rs = P2^5 ;
sbit rw = P2^6 ;
sbit ep = P2^7 ;
bit flag_300ms ;
sbit K1=P3^2;
sbit K2=P3^3;
sbit K3=P3^4;
uchar yemian=0;
uchar flat=1;
uchar data_byte;
uchar RH,RL,TH,TL;
uchar WenDu_H,WenDu_L,ShiDu_H,ShiDu_L;//報(bào)警的溫度和濕度
#include "eeprom52.h"
/****************************延時(shí)程序****************************/
void delay(uchar ms)
{ // 延時(shí)子程序
uchar i ;
while(ms--)
{
for(i = 0 ; i<250;i++) ;
}
}
void delay1()//延時(shí)10us
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void longdelay(uchar s) //長(zhǎng)延時(shí)
{
while(s--)
{
delay(20) ;
}
}
/************************LCD模塊******************************************/
BOOL lcd_bz()//測(cè)試LCD忙碌狀態(tài)
{
BOOL result ;
rs = 0 ;
rw = 1 ;
ep = 1 ;
result = (BOOL)(P0 & 0x80) ;
ep = 0 ;
return result ;
}
void write_cmd(uchar cmd)// 寫(xiě)指令
{
while(lcd_bz()) ;
rs = 0 ;
rw = 0 ;
ep = 0 ;
P0 = cmd ;
ep = 1 ;
ep = 0 ;
}
void write_addr(uchar addr)//寫(xiě)地址
{
write_cmd(addr|0x80) ;
}
uchar receive_byte()//接收一個(gè)字節(jié)
{
uchar i,temp,count;
for(i=0;i<8;i++)
{
count=2;
while((!io)&&count++)//等待50us低電平結(jié)束
temp=0;
delay1();delay1();delay1();delay1();
if(io==1)temp=1;
count=2;
if(count==1)break;
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
void receive()//接收數(shù)據(jù)
{
uchar T_H,T_L,R_H,R_L,check,num_check;
uchar count;
start();//開(kāi)始信號(hào)
io=1;
if(!io)//讀取DHT11響應(yīng)信號(hào)
{
count=2;
while((!io)&&count++);//DHT11高電平80us是否結(jié)束
count=2;
while((io)&&count++);
R_H=receive_byte();
R_L=receive_byte();
io=0;//拉低延時(shí)50us
delay1();delay1();delay1();delay1();delay1();
io=1;
num_check=R_H+R_L+T_H+T_L;
if(num_check=check)
{
TH=T_H;
TL=T_L;
check=num_check;
}
}
}
void showw() // 問(wèn)候語(yǔ)函數(shù)
{
lcd_init(); //初始化
delay(10);
display(0x05,'W');
display(0x06,'e');
display(0x07,'l');
display(0x08,'c');
display(0x09,'o');
display(0x0a,'m');
display(0x0b,'e');
delay(250); //短暫延時(shí)
delay(250);
delay(250);
/*********************************/
/*
display(0x40,' ') ;
display(0x41,'h');
display(0x42,'e');
*/
}
/*************定時(shí)器0初始化程序***************/
void time_init()
{
EA = 1; //開(kāi)總中斷
TMOD = 0X01; //定時(shí)器0、定時(shí)器1工作方式1
ET0 = 1; //開(kāi)定時(shí)器0中斷
TR0 = 1; //允許定時(shí)器0定時(shí)
}
void key() //按鍵程序 選擇菜單模式
{
if(!K1)
{
delay(20);
if(!K1)
{
while(!K1)
;
yemian++;
if(yemian>=5) { yemian=0; }
}
}
}
shezhi() //對(duì)里面的數(shù)值進(jìn)行修改
{
if(!K2)
{
delay(50);
if(!K2)
{
;
if(yemian==1)
{
if(WenDu_H<99 && WenDu_H>=WenDu_L ) { WenDu_H+=1; } //濕度上限加
}
if(yemian==2)
{
if(WenDu_L>=0 && WenDu_L<WenDu_H) { WenDu_L+=1; } //溫度下限加
}
if(yemian==3)
{
if(ShiDu_H<99 && ShiDu_H>=ShiDu_L ) { ShiDu_H+=1; } //濕度上限加
}
if(yemian==4)
{
if(ShiDu_L>=0 && ShiDu_L<ShiDu_H) { ShiDu_L+=1; } //濕度下限加
//=============蜂鳴器==============================
if( TempH==0 || TempL==0 || HumiH==0 || HumiL==0 )
{
FMQ=0; //打開(kāi)蜂鳴器
}
if( TempH==1 && TempL==1 && HumiH==1 && HumiL==1 )
{
FMQ=1; //關(guān)閉蜂鳴器
}
}
write_eeprom(); //保存數(shù)據(jù)
}
}
if(!K3)
{
delay(50);
if(!K3)
{
;
if(yemian==1)
{
if(WenDu_H>0 && WenDu_H>WenDu_L ) { WenDu_H-=1; } //濕度上限減
}
if(yemian==2)
{
if(WenDu_L>0 ) { WenDu_L-=1; } //溫度下限減
}
if(yemian==3)
{
if(ShiDu_H>0 && ShiDu_H>ShiDu_L ) { ShiDu_H-=1; } //濕度上限減
}
if(yemian==4)
{
if(ShiDu_L>0 ) { ShiDu_L-=1; } //濕度下限減
}
write_eeprom(); //保存數(shù)據(jù)
}
}
}
/***************************主程序*********************************/
void main()
{
init_eeprom(); //讀eeprom數(shù)據(jù)
time_init(); //初始化定時(shí)器
showw(); //顯示問(wèn)候語(yǔ) 和名字
while(1)
{
key();
//====================yemian==0時(shí) 進(jìn)入工作狀態(tài)=================================
if(yemian==0)
{
if(flat==1)
{
flat=2;
lcd_init(); //初始化
display(0x00,'T') ; //Temp
display(0x01,':');
display(0x05,0xdf); // 度
display(0x06,'C');
display(0x40,'H') ; //Humi
display(0x41,':');
display(0x44,'%');
display(0x45,'R');
display(0x46,'H');
display(0x09,' ');
display(0x0a,' ');
display(0x0b,WenDu_H/10+0x30); //報(bào)警溫度上限
display(0x0c,WenDu_H%10+0x30);
display(0x0d,'-');
display(0x0e,WenDu_L/10+0x30); //報(bào)警溫度下限
display(0x0f,WenDu_L%10+0x30);
display(0x49,' ');
display(0x4a,' ');
display(0x4b,ShiDu_H/10+0x30); //報(bào)警濕度
display(0x4c,ShiDu_H%10+0x30);
display(0x4d,'-');
display(0x4e,ShiDu_L/10+0x30); //報(bào)警濕度
display(0x4f,ShiDu_L%10+0x30);
}
if(flag_300ms == 1)
{
flag_300ms = 0;
receive();
display(0x02,TH/10+0x30); //溫度顯示
display(0x03,TH%10+0x30);
display(0x42,RH/10+0x30); //濕度顯示
display(0x43,RH%10+0x30);
warn();
}
}
//====================yemian==1 溫度上限設(shè)置===========================
if(yemian==1) //溫度
{
if(flat==2)
{
flat=3;
TempH=1; TempL=1;
HumiH=1; HumiL=1;
lcd_init(); //初始化
display(0x05,'T');
display(0x06,'e');
display(0x07,'m');
display(0x08,'p');
display(0x09,'_');
display(0x0a,'H');
}
shezhi();
display(0x47,WenDu_H/10+0x30); //溫度上限
display(0x48,WenDu_H%10+0x30);
}
//====================yemian==2溫度下限設(shè)置==========================
if(yemian==2) //濕度設(shè)置
{
if(flat==3)
{
flat=4;
lcd_init(); //初始化
display(0x05,'T');
display(0x06,'e');
display(0x07,'m');
display(0x08,'p');
display(0x09,'_');
display(0x0a,'L');
}
shezhi();
display(0x47,WenDu_L/10+0x30); //濕度
display(0x48,WenDu_L%10+0x30);
}
//====================yemian==3溫度下限設(shè)置==========================
if(yemian==3) //濕度設(shè)置
{
if(flat==4)
{
flat=5;
lcd_init(); //初始化
display(0x05,'H');
display(0x06,'u');
display(0x07,'m');
display(0x08,'i');
display(0x09,'_');
display(0x0a,'H');
}
shezhi();
}
//====================yemian==4溫度下限設(shè)置==========================
if(yemian==4) //濕度設(shè)置
{
if(flat==5)
{
flat=1;
lcd_init(); //初始化
display(0x05,'H');
display(0x06,'u');
display(0x07,'m');
display(0x08,'i');
display(0x09,'_');
display(0x0a,'L');
}
shezhi();
}
}
}
/*************定時(shí)器0中斷服務(wù)程序***************/
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 6 == 0)
{
flag_300ms = 1; //300ms
value = 0;
}
}
4 實(shí)現(xiàn)效果
5 最后
包含內(nèi)容
?? 項(xiàng)目分享:
https://gitee.com/sinonfin/sharing
到了這里,關(guān)于畢業(yè)設(shè)計(jì) 單片機(jī)智能大棚溫濕度控制系統(tǒng)(源碼+硬件+論文)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!