欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
STC單片機(jī)溫濕度自動(dòng)檢測(cè)系統(tǒng)
[打印本頁(yè)]
作者:
Mieko
時(shí)間:
2018-6-6 16:54
標(biāo)題:
STC單片機(jī)溫濕度自動(dòng)檢測(cè)系統(tǒng)
單片機(jī)源程序如下:
//程序頭函數(shù)
#include <reg52.h>
//顯示函數(shù)
#include "intrins.h"
//宏定義
#define uint unsigned int
#define uchar unsigned char
//宏定義
#define uint unsigned int
#define uchar unsigned char
//管腳聲明
sbit LED_wendu = P2^5; //溫度上限值操作端口,報(bào)警燈吸合繼電器;
sbit LED_wendu_L = P2^4; //溫度下限報(bào)警燈
sbit LED_humi = P2^2; //濕度上限報(bào)警燈
sbit LED_humi_L = P2^0; //濕度下限報(bào)警燈
sbit baojing = P3^2; //蜂鳴器接口
//按鍵
sbit Key1=P1^1; //設(shè)置鍵
sbit Key2=P1^5; //加按鍵
sbit Key3=P1^6; //減按鍵
sbit DHT11=P1^0; //DHT11
signed char w; //溫度值全局變量
uint c; //溫度值全局變量
uchar temp; //用于讀取ADC數(shù)據(jù)
uchar yushe_wendu=60; //溫度預(yù)設(shè)值
uchar yushe_humi=80; //濕度預(yù)設(shè)值
uchar yushe_wendu_L=05; //溫度預(yù)設(shè)值
uchar yushe_humi_L=10; //濕度預(yù)設(shè)值
//按鈕模式|
uchar Mode=0;
uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar U8FLAG,U8comdata;
uchar U8count,U8temp;
uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
//軟件延時(shí)函數(shù)
void delay(uint z) //延時(shí)函數(shù)大約延時(shí)z ms
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}
void Delay_Ms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=112;j>0;j--);
}
/*******************************************************************************************************
LCD1602相關(guān)命令
********************************************************************************************************/
//LCD管腳聲明 (RW引腳實(shí)物直接接地,因?yàn)楸驹O(shè)計(jì)只用到液晶的寫(xiě)操作,RW引腳一直是低電平)
sbit LCDRS = P2^7;
sbit LCDEN = P2^6;
//初始畫(huà)時(shí)顯示的內(nèi)容
uchar code Init1[]="TA= L H ";
uchar code Init2[]="RH= % L % H %";
//LCD延時(shí)
void LCDdelay(uint z) //該延時(shí)大約100us(不精確,液晶操作的延時(shí)不要求很精確)
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
//寫(xiě)命令
void write_com(uchar com)
{
LCDRS=0;
P0=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//寫(xiě)數(shù)據(jù)
void write_data(uchar date)
{
LCDRS=1;
P0=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//1602初始化
void Init1602()
{
uchar i=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打開(kāi)顯示 無(wú)光標(biāo) 無(wú)光標(biāo)閃爍
write_com(0x06);//當(dāng)讀或?qū)懸粋(gè)字符是指針后一一位
write_com(0x01);//清屏
write_com(0x80);//設(shè)置位置
for(i=0;i<16;i++)
{
write_data(Init1[i]); //顯示數(shù)組1的數(shù)據(jù)
}
write_com(0x80+5);
write_data(0xdf);//°
write_com(0x80+10);
write_data(0xdf);//°
write_com(0x80+15);
write_data(0xdf);//°
write_com(0x80+0x40);//設(shè)置位置
for(i=0;i<16;i++)
{
write_data(Init2[i]); //顯示數(shù)組2的數(shù)據(jù)
}
}
void Display_1602(yushe_wendu,yushe_yanwu,yushe_wendu_L,yushe_yanwu_L,c,temp)
{
//設(shè)置最高溫度值
write_com(0x80+13);
write_data(0x30+yushe_wendu/10);
write_data(0x30+yushe_wendu%10);
//設(shè)置最低溫度值
write_com(0x80+8);
write_data(0x30+yushe_wendu_L/10);
write_data(0x30+yushe_wendu_L%10);
//設(shè)置最高濕度值
write_com(0x80+0x40+13);
write_data(0x30+yushe_yanwu%100/10);
write_data(0x30+yushe_yanwu%10);
//設(shè)置最低濕度值
write_com(0x80+0x40+8);
write_data(0x30+yushe_yanwu_L%100/10);
write_data(0x30+yushe_yanwu_L%10);
//時(shí)時(shí)溫度
write_com(0x80+3);
write_data(0x30+c%100/10);
write_data(0x30+c%10);
//時(shí)時(shí)濕度
write_com(0x80+0x40+3);
write_data(0x30+temp%100/10);
write_data(0x30+temp%10);
}
//按鍵處理函數(shù)
void Key()
{
//模式選擇
if(Key1==0) //設(shè)置按鍵
{
while(Key1==0);
if(Mode>=5) Mode=0;
else
{
Mode++; //模式加一
switch(Mode) //判斷模式的值
{
case 1://調(diào)溫度上限值模式
{
write_com(0x80+12);//為1時(shí) 溫度閥值的位置閃爍
write_data('-');
write_com(0x80+0x40+12);//為2時(shí) 濕度閥值的位置閃爍
write_data('H');
write_com(0x80+7);//為1時(shí) 溫度閥值的位置閃爍
write_data('L');
write_com(0x80+0x40+7);//為2時(shí) 濕度閥值的位置閃爍
write_data('L');
break; //執(zhí)行后跳出switch
}
case 2://調(diào)濕度上限值模式
{
write_com(0x80+0x40+12);//為2時(shí) 濕度閥值的位置閃爍
write_data('-');
write_com(0x80+12);//為1時(shí) 溫度閥值的位置閃爍
write_data('H');
write_com(0x80+7);//為1時(shí) 溫度閥值的位置閃爍
write_data('L');
write_com(0x80+0x40+7);//為2時(shí) 濕度閥值的位置閃爍
write_data('L');
break;
}
case 3://調(diào)溫度下限值模式
{
write_com(0x80+7);//為1時(shí) 溫度閥值的位置閃爍
write_data('-');
write_com(0x80+12);//為1時(shí) 溫度閥值的位置閃爍
write_data('H');
write_com(0x80+0x40+12);//為2時(shí) 濕度閥值的位置閃爍
write_data('H');
write_com(0x80+0x40+7);//為2時(shí) 濕度閥值的位置閃爍
write_data('L');
break; //執(zhí)行后跳出switch
}
case 4://調(diào)濕度下限值模式
{
write_com(0x80+0x40+7);//為2時(shí) 濕度閥值的位置閃爍
write_data('-');
write_com(0x80+12);//為1時(shí) 溫度閥值的位置閃爍
write_data('H');
write_com(0x80+0x40+12);//為2時(shí) 濕度閥值的位置閃爍
write_data('H');
write_com(0x80+7);//為1時(shí) 溫度閥值的位置閃爍
write_data('L');
break;
}
case 5: //當(dāng)模式加到3時(shí)
{
write_com(0x38);//屏幕初始化
write_com(0x0c);//打開(kāi)顯示 無(wú)光標(biāo) 無(wú)光標(biāo)閃爍
write_com(0x80+12);//為1時(shí) 溫度閥值的位置閃爍
write_data('H');
write_com(0x80+0x40+12);//為2時(shí) 濕度閥值的位置閃爍
write_data('H');
write_com(0x80+7);//為1時(shí) 溫度閥值的位置閃爍
write_data('L');
write_com(0x80+0x40+7);//為2時(shí) 濕度閥值的位置閃爍
write_data('L');
Mode=0; //模式清零
break;
}
}
}
}
if(Key2==0&&Mode!=0) //加按鍵只有在模式不等于0時(shí)有效
{
while(Key2==0);
switch(Mode) //加按鍵按下時(shí) 判斷當(dāng)前模式
{
case 1: //模式為1時(shí)
{
yushe_wendu++; //預(yù)設(shè)溫度上限值(閥值)加1
if(yushe_wendu>=99) //加到大于等于99時(shí)
yushe_wendu=99; //固定為99
write_com(0x80+13); //選1602上顯示的位置
write_data(0x30+yushe_wendu/10); //將溫度上限值數(shù)據(jù)分解開(kāi)送入液晶顯示
write_data(0x30+yushe_wendu%10);
break;
}
case 2:
{
yushe_humi++; //濕度上限值,同溫度上限值設(shè)置
if(yushe_humi>=100)
yushe_humi=100;
write_com(0x80+0x40+13);
write_data(0x30+yushe_humi%100/10);
write_data(0x30+yushe_humi%10);
break;
}
case 3: //模式為3時(shí)
{
yushe_wendu_L++; //溫度下限值,同溫度上限值設(shè)置
if(yushe_wendu_L>=95)
yushe_wendu_L=95;
write_com(0x80+8);
write_data(0x30+yushe_wendu_L/10);
write_data(0x30+yushe_wendu_L%10);
break;
}
case 4:
{
yushe_humi_L++; //濕度下限值,同溫度上限值設(shè)置
if(yushe_humi_L>=90)
yushe_humi_L=90;
write_com(0x80+0x40+8);
write_data(0x30+yushe_humi_L%100/10);
write_data(0x30+yushe_humi_L%10);
break;
}
}
}
if(Key3==0&&Mode!=0)
{
while(Key3==0);
switch(Mode)
{
case 1:
{
if(yushe_wendu<=1) //當(dāng)溫度上限值減小到1時(shí)
yushe_wendu=1; //固定為1
yushe_wendu--; //預(yù)設(shè)溫度值減一
write_com(0x80+13); //選1602上顯示的位置
write_data(0x30+yushe_wendu/10); //將溫度上限值數(shù)據(jù)分解開(kāi)送入液晶顯示
write_data(0x30+yushe_wendu%10);
break;
}
case 2:
{
if(yushe_humi<=1) //濕度上限值,同溫度上限值設(shè)置
yushe_humi=1;
yushe_humi--;
write_com(0x80+0x40+13);
write_data(0x30+yushe_humi%100/10);
write_data(0x30+yushe_humi%10);
break;
}
case 3: //模式為3時(shí)
{
if(yushe_wendu_L<=1) //溫度下限值,同溫度上限值設(shè)置
yushe_wendu_L=1;
yushe_wendu_L--;
write_com(0x80+8);
write_data(0x30+yushe_wendu_L/10);
write_data(0x30+yushe_wendu_L%10);
break;
}
case 4:
{
if(yushe_humi_L<=1) //濕度下限值,同溫度上限值設(shè)置
yushe_humi_L=1;
yushe_humi_L--;
write_com(0x80+0x40+8);
write_data(0x30+yushe_humi_L%100/10);
write_data(0x30+yushe_humi_L%10);
break;
} }
}
delay(10); //延時(shí)去抖動(dòng)
write_com(0x38);//屏幕初始化
write_com(0x0c);//打開(kāi)顯示 無(wú)光標(biāo) 無(wú)光標(biāo)閃爍
}
/*******************************************************************************************************
DHT11相關(guān)命令
********************************************************************************************************/
void Delay1(uint j)
{
uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
uchar i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DHT11)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DHT11)U8temp=1;
U8FLAG=2;
while((DHT11)&&U8FLAG++);
//超時(shí)則跳出for循環(huán)
if(U8FLAG==1)break;
//判斷數(shù)據(jù)位是0還是1
// 如果高電平高過(guò)預(yù)定0高電平值則數(shù)據(jù)位為 1
U8comdata<<=1;
U8comdata|=U8temp; //
}
}
//--------------------------------
//-----濕度讀取子程序 ------------
//--------------------------------
//----以下變量均為全局變量--------
//----溫度高8位== U8T_data_H------
//----溫度低8位== U8T_data_L------
//----濕度高8位== U8RH_data_H-----
//----濕度低8位== U8RH_data_L-----
//----校驗(yàn) 8位 == U8checkdata-----
//----調(diào)用相關(guān)子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH(void)
{
//主機(jī)拉低18ms
DHT11=0;
Delay1(180);
ET0 = 0;//關(guān)閉定時(shí)器0中斷
DHT11=1;
//總線由上拉電阻拉高 主機(jī)延時(shí)20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
DHT11=1;
//判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
if(!DHT11) //T !
{
U8FLAG=2;
//判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
while((!DHT11)&&U8FLAG++);
U8FLAG=2;
//判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
while((DHT11)&&U8FLAG++);
//數(shù)據(jù)接收狀態(tài)
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DHT11=1;
ET0 = 1;//開(kāi)啟定時(shí)器0中斷
//數(shù)據(jù)校驗(yàn)
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//
}//
}
/*****主函數(shù)*****/
void main()
{
uint i=0;
Delay_Ms(100);//上電延時(shí)100ms,等待DHT11啟動(dòng)
Init1602(); //調(diào)用初始化顯示函數(shù)
U8T_data_H=30;
U8RH_data_H=60;
while(1) //進(jìn)入循環(huán)
{
Key(); //調(diào)用按鍵函數(shù) 掃描按鍵
if(Mode==0) //只有當(dāng)模式為0時(shí)才會(huì)執(zhí)行以下的閥值判斷部分
{
if(i<1)
{
i=10;
RH();//溫濕度檢測(cè)
}
i--;
Display_1602(yushe_wendu,yushe_humi,yushe_wendu_L,yushe_humi_L,U8T_data_H,U8RH_data_H);
//顯示預(yù)設(shè)溫度上限值,預(yù)設(shè)濕度上限值,預(yù)設(shè)溫度下限值,預(yù)設(shè)濕度下限值,當(dāng)前溫度值,當(dāng)前濕度值
if(U8RH_data_H>=yushe_humi) //濕度值大于等于預(yù)設(shè)上限值時(shí)
{
LED_humi=0; //濕度上限繼電器
baojing=0; //蜂鳴器報(bào)警
}
else if(U8RH_data_H<=yushe_humi_L) //濕度值小于等于預(yù)設(shè)值下限值時(shí)
{
LED_humi_L=0; //濕度下限繼電器
baojing=0; //蜂鳴器報(bào)警
}
else //濕度值處于上限界限之間時(shí)
{
LED_humi=1; //關(guān)掉濕度上限繼電器
LED_humi_L=1; //關(guān)掉濕度下限繼電器
}
if(U8T_data_H>=(yushe_wendu)) //溫度值大于等于預(yù)設(shè)上限值時(shí)
{
baojing=0; //打開(kāi)蜂鳴器報(bào)警
LED_wendu=0; //打開(kāi)溫度上限繼電器
}
else if(U8T_data_H<=yushe_wendu_L) //溫度值小于等于預(yù)設(shè)值下限值時(shí)
{
LED_wendu_L=0; //溫度下限繼電器
baojing=0; //蜂鳴器報(bào)警
}
else //溫度值處于上限界限之間時(shí)
{
LED_wendu=1; //關(guān)閉溫度上限繼電器
LED_wendu_L=1; //關(guān)閉溫度下限繼電器
}
if(yushe_humi_L<U8RH_data_H&&U8RH_data_H<yushe_humi&&yushe_wendu_L<U8T_data_H&&U8T_data_H<yushe_wendu)
//當(dāng)濕度和溫度都處于正常值時(shí) (&&:邏輯與,左右兩邊的表達(dá)式都成立(都為真,也就是1)時(shí),該if語(yǔ)句才成立)
{
baojing=1; //停止報(bào)警
}
}
else
{
ET0 = 1;//開(kāi)啟定時(shí)器0中斷
}
}
}
復(fù)制代碼
作者:
admin
時(shí)間:
2018-6-6 18:39
樓主能分享原理圖嗎?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1