① 怎樣用單片機程序感應溫度和濕度從而控制、觸發使得一個噴霧器進行噴水,(用於現代農場依環境自動噴水)
這個比較簡單的. 利用單片機以一定采樣間隔 採集溫濕度感測器的信號 ,可以是數字感測器 也可以是模擬電壓輸出的模擬感測器. 採集到溫濕度後,設計一個噴水演算法.
利用 if( T > xxx ) then 噴水, 或者if( RH <xxx ) then 噴水 .這樣的簡單的閥值控制演算法 ,就能實現自動控制.
② 求單片機程序關於溫濕度。感測器採用DHT11,按鍵四個可以設置溫濕度的上下限,顯示用lcd1602,超限報警
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char unint8; //unint8 代替undigned char 提高可移植性
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {" Xh RH: "}; //定義數組
unsigned char code dis2[] = {" DO T: "};
sbit buz=P1^0;
sbit TRH = P1^7;//溫濕度感測器DHT11數據接入
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void initcom()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void send(unsigned char temp)
{
//send biao zi
SBUF=temp;
while(!TI);
TI=0;
}
void sendwd()
{
//send wen
uint w_d ;
w_d=TH_data+128;
SBUF=w_d;
while(!TI);
TI=0;
}
void sendsd()
{
//send shi
SBUF=RH_data;
while(!TI);
TI=0;
}
/*********************************************************************************/
void delayNOP() //延時
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/
/*********************************************************************************/
// 毫秒級延時子程序
/*********************************************************************************/
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************************************/
/*********************************************************************************/
//5us級延時程序
/*********************************************************************************/
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/
/********************************************************************************/
// 測試LCD忙碌狀態
//lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數據。
/********************************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************************/
/*******************************************************************************/
// 寫入指令數據到LCD
/*******************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*****************************************************************************/
/*****************************************************************************/
//寫顯示數據到LCD
//RS=高電平,RW=低電平,E=高脈沖,D0-D7=數據。
/*****************************************************************************/
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/****************************************************************************/
/****************************************************************************/
//LCD初始化設定
/****************************************************************************/
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //顯示開,關游標
delay_ms(5);
lcd_wcmd(0x06); //移動游標
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的顯示內容,如果屏幕過暗,可將這倆句刪除
//delay_ms(5);
}
/****************************************************************************/
/****************************************************************************/
//設定LCD顯示位置
/****************************************************************************/
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //數據指針=80+地址變數
}
/****************************************************************************/
/****************************************************************************/
//收發信號檢測,數據讀取
/****************************************************************************/
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/
/****************************************************************************/
//濕度讀取子程序
//溫度高8位== TL_data
//溫度低8位== TH_data
//濕度高8位== RH_data
//濕度低8位== RH_data
//校驗 8位 == CK_data
//調用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主機拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA匯流排由上拉電阻拉高 主機延時20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主機設為輸入 判斷從機響應信號
TRH=1;
//判斷DHT11是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(!TRH)
{
respond=2;
//判斷DHT11發出 80us 的低電平響應信號是否結束
while((!TRH)&& respond++);
respond=2;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
while(TRH && respond++);
//數據接收狀態
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//數據校驗
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//濕度整數部分
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小數點
//濕度小數部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//溫度整數部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小數點
//溫度小數部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
}
/****************************************************************************/
//冬天適宜溫濕度 夏天適宜溫濕度
//濕度:30%--80% 30%--60%
//溫度:18℃--25℃ 23℃--28℃
/****************************************************************************/
void baoj()//報警函數
{
if(RH_data>=80) //濕度上限80%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(RH_data<=30) //濕度下限30%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data>=25) //溫度上限25℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data<=18) //溫度下限18℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else
{
buz=1;
}
}
/****************************************************************************/
//主函數
//TH,TL,RH,RL分別代表溫濕度的整數和小數部分
/****************************************************************************/
void main()
{
lcd_init();
initcom();
delay_us();
while(1)
{
unsigned char i,n=0x40,m;
read_TRH();
//寫字元
for(i=0;i<=7;i++)
{
lcd_dis_pos(i); //顯示字元
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //顯示字元
lcd_wdata(dis2[i]);
}
//寫濕度數據
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//寫溫度數據
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延時
delay_ms(500);
baoj();//報警
send(0xff);//wsd flags
//delay_ms(10);
sendwd();
//delay_ms(10);
sendsd();
//delay_ms(10);
}
}
③ 跪求基於單片機的溫濕度監控系統代碼
#include <reg51.h>
#include <intrins.h> //Keil library (is used for _nop()_ operation)
#include <math.h> //Keil library
#include <stdio.h> //Keil library
unsigned char Tem,Hum;
unsigned char Set_Tem,Set_Hum;
sbit SS = P1^0; //片選
sbit SCLK = P1^1; //ISD4003 時鍾
sbit MOSI = P1^2; //數據輸入
sbit MISO = P1^3; //數據輸出
sbit LED = P1^7; //指示燈
sbit ISD_INT = P3^2; //中斷
sbit AN = P1^6; //執行
sbit STOP = P1^5; //復位
sbit PR = P1^4; //PR=1 錄音 PR=0 放音
sbit DATA=P2^0;
sbit SCK=P2^1;
sbit SCL=P1^1;
sbit SDA=P1^0;
#define TEMP 0
#define HUMI 1
typedef union
{ unsigned int i;
float f;
} value;
//蔽塌enum {,EMP,HUMI};
//以上所示為系統的主程序結構,其中子程序可根據系統整個具體的要求進行添加代碼,
//刷新LED顯示子程序write_led();硬體採用解碼器;按鍵檢測子嘩仿程序check_key();的執行通過讀單片機I/O口高低電平識別按鍵。
//以下所示代碼為讀溫濕度感測器子程序read_ sensor()的程序內容:
/********************************************************************
工程名 SHTxx demo program (V2.1)
文件名: SHTxx_Sample_Code.c
MCU: 80C51 family
編譯器: Keil Version 6.14
*******************************************************************/亂並纖
//-------------------------------------------------------------------
// mol-var
//-------------------------------------------------------------------
void warning(void);
void Delay(unsigned int time);
#define noACK 0
#define ACK 1
unsigned int *p_value;
#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
//-------------------------------------------------------------------
char s_write_byte(unsigned char value)
//-------------------------------------------------------------------
// 寫一個位元組,檢查應答信號
{
unsigned char idata i,error=0;
for (i=0x80;i>0;i/=2)
{ if (i & value) DATA=1;
else DATA=0;
SCK=1;
_nop_();_nop_();_nop_(); //時鍾脈沖寬度 5 us
SCK=0;
}
DATA=1; //釋放DATA
SCK=1; //9個CLK後應答
error=DATA; //檢查應答信號 (DATA 被拉低)
SCK=0;
return error; // 如果沒有應答則error=1
}//
//-------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//-------------------------------------------------------------------
// 讀一個位元組,檢查應答信號
{
unsigned char i,val=0;
DATA=1; //釋放DATA信號
for (i=0x80;i>0;i/=2)
{ SCK=1;
if (DATA) val=(val | i);
SCK=0;
}
DATA=!ack; //如果 "ack==1" ,拉低DATA
SCK=1; //clk #9 for ack
_nop_();_nop_();_nop_(); //延時5微秒
SCK=0;
DATA=1; //釋放DATA
return val;
}
//-------------------------------------------------------------------
void s_transstart(void)
//-------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
DATA=1; SCK=0; //初始狀態
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}
//-------------------------------------------------------------------
void s_connectionreset(void)
//-------------------------------------------------------------------
//通訊復位: 至少在9 SCK 周期後,DATA=1 傳輸開始
// _____________________________________________________
// DATA: //|_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___|
{
unsigned char i;
DATA=1; SCK=0; //初始狀態
for(i=0;i<9;i++) //9 SCK周期
{ SCK=1;
SCK=0;
}
s_transstart(); //通訊開始
}
//-------------------------------------------------------------------
char s_softreset(void)
// resets the sensor by a softreset
{
unsigned char error=0;
s_connectionreset(); //復位通訊
error+=s_write_byte(RESET); //發送復位命令
return error; //如果感測器沒有響應則error=1
}
//-------------------------------------------------------------------
char s_read_statusreg(unsigned char *p_value,unsigned *p_checksum)
//-------------------------------------------------------------------
//讀效驗寄存器狀態 (8-bit)
{
unsigned char error=0;
s_transstart(); //通訊開始
error=s_write_byte(STATUS_REG_R); //發送命令
*p_value=s_read_byte(ACK); //讀狀態寄存器(8-bit)
*p_checksum=s_read_byte(noACK); //讀效驗和
return error; //如果感測器沒有響應則error=1
}
//-------------------------------------------------------------------
char s_write_statusreg(unsigned char *p_value)
//-------------------------------------------------------------------
// writes the status register with checksum (8-bit)
{
unsigned char error=0;
s_transstart(); //通訊開始
error+=s_write_byte(STATUS_REG_W);// 發送命令
error+=s_write_byte(*p_value); //發送狀態寄存器的值
return error; //如果感測器沒有響應則error=1
}
//-------------------------------------------------------------------
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
//-------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
unsigned char idata error=0;
unsigned int 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); //讀取第一個位元組
*(p_value+1)=s_read_byte(ACK); //讀取第二個位元組
*p_checksum =s_read_byte(noACK); //讀取效驗和
return error;
}
//-------------------------------------------------------------------
//-------------------------------------------------------------------
void calc_sth11(float *p_humidity ,float *p_temperature)
//-------------------------------------------------------------------
// 計算溫度和濕度
// input : humi [Ticks] (12 bit)
// temp [Ticks] (14 bit)
// output: humi [%RH]
// temp
{ const float xdata C1=-4.0;
const float xdata C2=+0.0405;
const float xdata C3=-0.0000028;
const float xdata T1=+0.01;
const float xdata T2=+0.00008;
float rh=*p_humidity; //計算濕度值
float t=*p_temperature; // 計算溫度值
float rh_lin;
float rh_true;
float 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;
}
//-------------------------------------------------------------------
float calc_dewpoint(float h,float t)
//-------------------------------------------------------------------
// calculates dew point
// input: humid,ty , temperature
// output: dew point
{ float dew_point,logEx;
logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
//-------------------------------------------------------------------
void main_measure()
//-------------------------------------------------------------------
// 使用SHT10功能步驟:
// 1.通訊復位
// 2. 測量溫度,濕度
// 3. 計算溫度,濕度
// 45. 顯示溫度,濕度
{ value humi_val,temp_val;
float dew_point,error;
unsigned char checksum;
unsigned int idata i;
s_connectionreset();
while(1)
{ error=0;
error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //測量濕度
error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //測量溫度
if(error!=0) s_connectionreset();
//如果有錯誤就復位
else
{ humi_val.f=(float)humi_val.i; //將整數轉換成浮點數
temp_val.f=(float)temp_val.i;
calc_sth11(&humi_val.f,&temp_val.f);
//計算溫度,濕度
dew_point=calc_dewpoint(humi_val.f,temp_val.f);
//計算dew
//printf("temp:%5.1fC humi:%5.1f%% dew point:%5.1f,\n",temp_v,l.f,humi_v,l.f,dew_point);
}
for (i=0;i<40000;i++);//----------延時0.8s
}
}
//語音功能子程序
//下面代碼為語音晶元使用範例,該功能放在主程序中的warning()子程序中執行。
void delay(unsigned int time) //延遲 n 微秒
{
while(time!=0)
{
time-- ;
}
}
void delayms(unsigned int time) //延遲 n 毫秒
{
TMOD=0x01;
for(time;time>0;time--)
{
TH0 = 0xfc;
TL0 = 0x18;
TR0 = 1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
//************************************
//ISD4002 spi 串列發送子程序,8 位數據
//************************************
void spi_send(unsigned char isdx)
{
unsigned char idata k;
SS=0;//SS=0; //,s=0,打開 spi 通信端
SCLK=0;
for(k=0;k<8;k++) //先發低位再發高位,依發送。 { i
{
if((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);
SCLK=0;
delay(2);
}
}
//*******************************
//發送 stop 指令
//*******************************
void isd_stop(void)
{
delay(10);
spi_send(0x30);
SS=1;
delayms(50);
}
//*******************************
//發送上電指令,並延遲 50ms
//*******************************
void isd_pu(void)
{ delay(10);
SS=0;
spi_send(0x20);
SS=1;
delayms(50);
}
//發送掉電指令,並延遲 50ms
//*******************************
void isd_pd(void)
{
delay(10);
spi_send(0x10);
SS=1;
delayms(50);
}
//*******************************
//發送 play 指令
//*******************************
void isd_play(void)
{
LED=0;
spi_send(0xf0);
SS=1;
}
//*******************************
//發送 rec 指令
//*******************************
void isd_rec(void)
{
LED=0;
spi_send(0xb0);
SS=1;
}
//*******************************
//發送 setplay 指令
//*******************************
void isd_setplay(unsigned char adl,unsigned char adh)
{
spi_send(adl); //發送放音起始地址低位
adh=adh||0xe0;
spi_send(adh); //發送放音起始地址高位
SS=1;
}
//*******************************
//發送 setrec 指令
//*******************************
void isd_setrec(unsigned char adl,unsigned char adh)
{
spi_send(adl); //發送放音起始地址低位
adh=adh||0xa0;
spi_send(adh); //發送放音起始地址高位
SS=1;
}
//************************************
//晶元溢出,LED 閃爍提醒停止錄音
//************************************
void isd_overflow(void)
{
while(AN==0)
{
LED=1;
delayms(300);
LED=0;
delayms(300);
}
}
//************************************
//檢查晶元是否溢出(讀,OVF,並返回 OVF 值)
//************************************
unsigned char chk_isdovf(void)
{
SS=0;
delay(2);
SCLK=0;
delay(2);
SCLK=1;
SCLK=0;
delay(2);
if (MISO==1)
{
SCLK=0;
SS =1; //關閉 spi 通信端
isd_stop(); //發送 stop 指令
return 1; //OVF 為 1,返回 1
}
else
{
SCLK=0;
SS =1; //關閉 spi 通信端
isd_stop(); //發送 stop 指令
return 0; //OVF 為 0,返回 0
}
}
//**********************************************************************
//主程序
//功能:1.錄音時,按住 AN 鍵,LED 點亮開始錄音,松開 AN 即可停止錄音
// 再次按下 AN 鍵,LED 點亮開始錄第二段音,依次類推,直到晶元溢出。
// 按 stop 鍵晶元復位
// 2.放音時,按一下 AN 鍵,即播放一段語音。按 stop 鍵晶元復位。
//************************************************************************
void voice(void)
{
unsigned char ovflog;
while(1)
{
P0=P1=P2=P3=0xff; //初始化
while (AN==1) //等待 AN 鍵按下
{
if (AN==0) //按鍵防抖動
{delayms(20);}
}
isd_pu(); // AN 鍵按下,ISD 上電並延遲 50ms
isd_pd();
isd_pu();
if (PR==1) //如果 PR=1 則轉入錄音部分
{
delayms(500); //延遲錄音
isd_setrec(0x00,0x00); //發送 0x0000h 地址的 setplay 指令
do
{
isd_rec(); //發送 rec 指令
while(AN==0) //等待錄音完畢
{
if (ISD_INT==0)//如果晶元溢出,進行 LED 閃爍提示,
isd_overflow(); //如果取消錄音(松開AN鍵)則停止錄音,晶元復位
}
if (ISD_INT==0)
break;
LED=1; //錄音完畢,LED 熄滅
isd_stop(); //發送停止命令
while(AN==1) //如果 AN 再次按下,開始錄制下一段語音
{
if(STOP==0) //如果按下 STOP 按鍵,則晶元復位
break;
if (AN==0)
delayms(500);
}
}while(AN==0);
}
else //如果 PR==0 則轉入放音部分
{
while(AN==0){;}
isd_setplay(0x00,0x00); //發送 setplay 指令,從 0x0000 地址開始放音
do
{
isd_play(); //發送放音指令
delay(20);
while(ISD_INT==1) //等待放音完畢的 EOM 中斷信號
{;}
LED=1;
isd_stop(); //放音完畢,發送 stop 指令
if (ovflog=chk_isdovf())//檢查晶元是否溢出,如溢出則停止放音,晶元復位
break;
while(AN==1) //等待 AN 鍵再次按下
{
if (STOP==0)
break;
if(AN==0)
delayms(20);
}
}while(AN==0); // AN 鍵再次按下,播放下一段語音
}
isd_stop();
isd_pd();
}
}
#define ZLG7290 0x70
#define RADR 0x01
#define uchar unsigned char
#define uint unsigned int
/************************************/
void I2cStart(void)
{
SDA=1;
SCL=1;
Delay(10);
SDA=0;
Delay(10);
SCL=0;
}
/************************************/
void I2cStop(void)
{
SDA=0;
SCL=1;
Delay(10);
SDA=1;
Delay(10);
SCL=0;
}
/************************************/
void WriteI2cByte(uchar dat)
{
uchar k;
SCL=0;
for (k=0;k<8;k++)
{
SDA=(bit)(dat&0x80);
SCL=1;
Delay(10);
SCL=0;
dat<<=1;
}
SCL=0;
}
/*************************************/
uchar ReadI2cByte(void)
{
uchar dat,k;
for (k=0;k<8;k++)
{
SCL=0;
SDA=1; //一定要將SDA置為高電平,否則不能正常連續取數據
Delay(10);
SCL=1;
dat<<=1;
if (SDA)
dat|=0x01;
SCL=0;
Delay(10);
}
SCL=0;
return dat;
}
/*************************************/
void SendAck(void)
{
SDA=0;
Delay(10);
SCL=1;
Delay(10);
SCL=0;
}
/*************************************/
void SendNoAck(void)
{
SDA=1;
SCL=1;
Delay(10);
SCL=0;
}
/************************************/
void I2cWaitAck(void)
{
uchar ack;
SDA=1;
SCL=1;
Delay(10);
ack=SDA;
SCL=0;
}
/***********************************************************/
void I2cReadSequence(uchar sla,uchar sbua,uchar *s,uchar len)
{
uchar l;
I2cStart();
WriteI2cByte(sla);
I2cWaitAck();
WriteI2cByte(sbua);
I2cWaitAck();
I2cStart();
WriteI2cByte(sla+1);
I2cWaitAck();
for (l=0;l<len-1;l++)
{
*s=ReadI2cByte();
SendAck();
s++;
}
*s=ReadI2cByte();
SendNoAck();
I2cStop();
}
/************************************************************/
void I2cWriteSequence(uchar sla,uchar sbua,uchar *s,uchar len) //wr
{
uchar k;
I2cStart();
WriteI2cByte(sla);
I2cWaitAck();
WriteI2cByte(sbua);
I2cWaitAck();
for (k=0;k<len;k++)
{
WriteI2cByte(*s);
I2cWaitAck();
s++;
}
I2cStop();
}
/**************************************************************/
void I2cWriteByteToSlaver(uchar sla,uchar sbua,uchar dat)
{
I2cStart();
WriteI2cByte(sla);
I2cWaitAck();
WriteI2cByte(sbua);
I2cWaitAck();
WriteI2cByte(dat);
I2cWaitAck();
I2cStop();
Delay(10);
}
/**************************************************************/
uchar I2cReadByteFromSlaver(uchar sla,uchar sbua)
{
uchar dat;
I2cStart();
WriteI2cByte(sla);
I2cWaitAck();
WriteI2cByte(sbua);
I2cWaitAck();
I2cStart();
WriteI2cByte(sla+1);
I2cWaitAck();
dat=ReadI2cByte();
SendAck();
SendNoAck();
I2cStop();
return dat;
}
/**************************************************/
void main()
{
voice();//完成語音晶元的初始化 置入工作狀態
s_softreset();
while(1)//進入程序主循環
{
main_measure();//讀溫濕度感測器 得到溫度值Tem 濕度值Hum
/* if(Tem>Set_Tem && Hum >Set_Hum)//設置報警區間
{
warning();//執行警告 啟動報警
} */
}
}
④ 51鍗曠墖鏈虹┖姘旇川閲忎華鍩烘湰鍘熺悊
51鍗曠墖鏈虹┖姘旇川閲忎華鍩烘湰鍘熺悊濡備笅銆
1銆佹俯婀垮害浼犳劅鍣ㄩ噰鐢―HT11錛岄氳繃鍗曟葷嚎鍗忚涓庡崟鐗囨満閫氫俊錛屽彂閫佹俯搴﹀拰婀垮害鐨勬暟鎹銆
2銆佺矇灝樹紶鎰熷櫒閲囩敤GP2Y1051AU0F錛岀孩澶栫嚎鍙戝厜浜屾瀬綆″拰鍏夌數鏅朵綋綆℃嫻嬬┖姘斾腑綺夊皹棰楃矑鐨勫弽灝勫厜錛岃緭鍑轟竴涓涓庣伆灝樻祿搴︽垚姝f瘮鐨勭數鍘嬩俊鍙鳳紝緇忚繃AD0832杞鎹涓烘暟瀛椾俊鍙峰悗閫氳繃涓插彛鍙戦佺粰鍗曠墖鏈恆
3銆丩CD鏄劇ず妯″潡閲囩敤1602娑叉櫠錛8浣嶅苟琛屾帴鍙d笌鍗曠墖鏈鴻繛鎺ワ紝鏄劇ず娓╁害銆佹箍搴﹀拰PM2.5鐨勬暟鍊煎拰鍗曚綅銆
4銆佽渹楦e櫒鐢佃礬鍜孡ED鎸囩ず鐢佃礬鍒嗗埆鐢ㄤ簬鎶ヨ﹀拰鎻愮ず鍔熻兘錛屽綋娓╁害銆佹箍搴︽垨PM2.5瓚呰繃璁懼畾鐨勯槇鍊兼椂錛岀浉搴旂殑LED鐏浜璧鳳紝騫跺彂鍑鴻渹楦e0銆
5銆佹寜閿鐢佃礬鐢ㄤ簬璁劇疆鍔熻兘錛岄氳繃涓変釜鎸夐敭鍒嗗埆瀹炵幇鈥滆劇疆鈥濄佲滃姞鈥濄佲滃噺鈥濈殑鎿嶄綔錛岃皟鏁存俯搴︺佹箍搴﹀拰PM2.5鐨勬姤璀﹂槇鍊礆紝騫跺皢鍏跺瓨鍌ㄥ湪鍗曠墖鏈哄唴閮ㄧ殑EEPROM涓銆
51鍗曠墖鏈虹┖姘旇川閲忎華鏄涓縐嶅埄鐢51鍗曠墖鏈轟負鎺у埗鏍稿績錛岄厤鍚堟俯婀垮害浼犳劅鍣ㄣ佺矇灝樹紶鎰熷櫒銆丩CD鏄劇ず妯″潡銆佽渹楦e櫒鐢佃礬銆丩ED鎸囩ず鐢佃礬絳夋ā鍧楋紝瀹炵幇瀵圭┖姘斾腑娓╁害銆佹箍搴﹀拰PM2.5嫻撳害鐨勬嫻嬪拰鏄劇ず鐨勭郴緇熴
⑤ 單片機溫濕度感測器
土壤溫濕度感測器 可以用DB171 感測器 可以給您單片機的常式 您在ij去讀取