|
|
電路原理圖如下:
3.png (43.62 KB, 下載次數(shù): 31)
下載附件
2019-10-11 16:07 上傳
制作出來的實(shí)物圖如下:
22.jpg (320.65 KB, 下載次數(shù): 31)
下載附件
2019-10-11 16:07 上傳
1.jpg (86.59 KB, 下載次數(shù): 29)
下載附件
2019-10-11 16:07 上傳
單片機(jī)源程序如下:
#include <REGX51.H>
#include <intrins.h>
#include <math.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DATA=P1^0;
sbit MOTOR_A_1=P2^5; //電機(jī)控制腳
sbit MOTOR_A_2=P2^6; //電機(jī)控制腳
sbit EN_MOTOR_A =P2^7; //電機(jī)控制腳
sbit k1=P3^2; //按鍵
sbit k2=P3^3; //按鍵
sbit k3=P3^4; //按鍵
sbit k4=P3^5; //按鍵
sbit k5=P3^6;
sbit CS = P1^2;
sbit Clk = P1^3;
sbit DATI = P1^4;
sbit DATO = P1^4;
unsigned char dat = 0x00;
unsigned char count = 0x00;
unsigned char CH;
uchar mode=0;
sbit LED0=P2^3;
sbit LED1=P2^4;
uchar temp,humi;
uchar error; //用于檢驗(yàn)是否出現(xiàn)錯(cuò)誤
uchar checksum,nn; //CRC
uchar nn; //蜂鳴器
uchar TEMP_data[6]; //用于記錄實(shí)測(cè)的溫度
uchar CO2_data[6]; //用于記錄實(shí)測(cè)的溫度
uchar U8FLAG,k;
uchar U8count,U8temp;
uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar U8comdata;
uchar count, count_r=0;
/*************************************************************************/
void Delay1(uint );
void Delay_10us(void);
void COM(void);
uchar RH(void);
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0;
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 )
{
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0;
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ )
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++)
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test)
dat = test;
_nop_();
CS = 1;
DATO = 1;
Clk = 1;
return dat;
}
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((!DATA)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DATA)U8temp=1;
U8FLAG=2;
while((DATA)&&U8FLAG++);
if(U8FLAG==1)break;
}
}
//--------------------------------
//-----溫濕度讀取子程序 ------------
//--------------------------------
//----以下變量均為全局變量--------
//----溫度高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();
//--------------------------------
uchar RH(void)
{
DATA=0; //主機(jī)拉低18ms
Delay1(180); //原來為5
DATA=1; //總線由上拉電阻拉高 主機(jī)延時(shí)20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
DATA=1; //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
if(!DATA) //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
{
U8FLAG=2;
while((!DATA)&&U8FLAG++); //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
U8FLAG=2;
while((DATA)&&U8FLAG++); //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
COM(); //數(shù)據(jù)接收狀態(tài)
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;
DATA=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); //數(shù)據(jù)校驗(yàn)
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;
}
return 1;
}
else //傳感器不響應(yīng)
{
return 0;
}
}
void delay(uint z) //延時(shí)函數(shù)z為毫秒數(shù)
{
int a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
void key()
{
if (k1==0) //調(diào)整按鍵檢測(cè)
{
delay(10);
if (k1==0)
{
mode=!mode;
EN_MOTOR_A=0; //電機(jī)啟動(dòng),等于0停止
while(k1==0);
}
}
if (k2==0) //調(diào)整按鍵檢測(cè)
{
delay(10);
if (k2==0)
{
if(mode==0)
{
EN_MOTOR_A=1; //電機(jī)啟動(dòng),等于0停止
MOTOR_A_2 =0; //正轉(zhuǎn)
MOTOR_A_1 =1; //反轉(zhuǎn)停止
}
while(k2==0);
}
}
if (k3==0) //調(diào)整按鍵檢測(cè)
{
delay(10);
if (k3==0)
{
if(mode==0)
{
EN_MOTOR_A=1; //電機(jī)停止
MOTOR_A_1 =0; //反轉(zhuǎn)
MOTOR_A_2 =1; //正轉(zhuǎn)停止
}
while(k3==0);
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
if(MOTOR_A_2==0)
EN_MOTOR_A=0; //電機(jī)停止
}
}
if(k5==0)
{
delay(10);
if(k5==0)
{
if(MOTOR_A_1==0)
EN_MOTOR_A=0; //電機(jī)停止
}
}
}
void main() //主函數(shù)
{
int ch0_temp;
while(1)
{
ch0_temp=adc0832(0)*49/25;
RH(); //測(cè)量溫濕度
temp=U8T_data_H;
humi=U8RH_data_H;
key();
// LED1=0;
//LED0=0;
if(mode==0)
{
LED1=0;
LED0=1;
}
if(mode==1)
{
LED1=1;
LED0=0;
if(k4==0)
{
if(MOTOR_A_2==0)
EN_MOTOR_A=0; //電機(jī)停止
}
else if(k5==0)
{
if(MOTOR_A_1==0)
EN_MOTOR_A=0; //電機(jī)停止
}
else
{
if((ch0_temp>250)&&(humi<75))
{
EN_MOTOR_A=1; //電機(jī)啟動(dòng),等于0停止
MOTOR_A_2 =0; //正轉(zhuǎn)
MOTOR_A_1 =1; //反轉(zhuǎn)停止
}
else if((ch0_temp<250)||(humi>75))//光照不足,濕度大于50
{
EN_MOTOR_A=1; //電機(jī)停止
MOTOR_A_1 =0; //反轉(zhuǎn)
MOTOR_A_2 =1; //正轉(zhuǎn)停止
}
else
{
EN_MOTOR_A=0; //電機(jī)停止
}
}
}
}
}
|
評(píng)分
-
查看全部評(píng)分
|