怎样用单片机程序感应温度和湿度从而控制、触发使得一个喷雾器进行喷水,(用于现代农场依环境自动喷水)

怎样用单片机程序感应温度和湿度从而控制、触发使得一个喷雾器进行喷水,(用于现代农场依环境自动喷水),第1张

这个比较简单的 利用单片机以一定采样间隔 采集温湿度传感器的信号 ,可以是数字传感器 也可以是模拟电压输出的模拟传感器 采集到温湿度后,设计一个喷水算法

利用 if( T > xxx ) then 喷水, 或者if( RH <xxx ) then 喷水 这样的简单的阀值控制算法 ,就能实现自动控制

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^7;//ds18b20与单片机连接口

sbit RS=P3^0;

sbit RW=P3^1;

sbit EN=P3^2;

unsigned char code str1[]={"temperature: "};

unsigned char code str2[]={" "};

uchar data disdata[5];

uint tvalue;//温度

uchar tflag;//温度正负标志

/lcd1602程序/

void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)

{unsigned int i,j;

for(i=0;i<ms;i++)

for(j=0;j<100;j++);

}

void wr_com(unsigned char com)//写指令//

{ delay1ms(1);

RS=0;

RW=0;

EN=0;

P2=com;

delay1ms(1);

EN=1;

delay1ms(1);

EN=0;

}

void wr_dat(unsigned char dat)//写数据//

{ delay1ms(1);;

RS=1;

RW=0;

EN=0;

P2=dat;

delay1ms(1);

EN=1;

delay1ms(1);

EN=0;

}

void lcd_init()//初始化设置//

{delay1ms(15);

wr_com(0x38);delay1ms(5);

wr_com(0x08);delay1ms(5);

wr_com(0x01);delay1ms(5);

wr_com(0x06);delay1ms(5);

wr_com(0x0c);delay1ms(5);

}

void display(unsigned char p)//显示//

{

while(p!='\0')

{

wr_dat(p);

p++;

delay1ms(1);

}

}

init_play()//初始化显示

{ lcd_init();

wr_com(0x80);

display(str1);

wr_com(0xc0);

display(str2);

}

/ds1820程序/

void delay_18B20(unsigned int i)//延时1微秒

{

while(i--);

}

void ds1820rst()/ds1820复位/

{ unsigned char x=0;

DQ = 1; //DQ复位

delay_18B20(4); //延时

DQ = 0; //DQ拉低

delay_18B20(100); //精确延时大于480us

DQ = 1; //拉高

delay_18B20(40);

}

uchar ds1820rd()/读数据/

{ unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{ DQ = 0; //给脉冲信号

dat>>=1;

DQ = 1; //给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

void ds1820wr(uchar wdata)/写数据/

{unsigned char i=0;

for (i=8; i>0; i--)

{ DQ = 0;

DQ = wdata&0x01;

delay_18B20(10);

DQ = 1;

wdata>>=1;

}

}

read_temp()/读取温度值并转换/

{uchar a,b;

ds1820rst();

ds1820wr(0xcc);//跳过读序列号/

ds1820wr(0x44);//启动温度转换/

ds1820rst();

ds1820wr(0xcc);//跳过读序列号/

ds1820wr(0xbe);//读取温度/

a=ds1820rd();

b=ds1820rd();

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<0x0fff)

tflag=0;

else

{tvalue=~tvalue+1;

tflag=1;

}

tvalue=tvalue(0625);//温度值扩大10倍,精确到1位小数

return(tvalue);

}

//

void ds1820disp()//温度值显示

{ uchar flagdat;

disdata[0]=tvalue/1000+0x30;//百位数

disdata[1]=tvalue%1000/100+0x30;//十位数

disdata[2]=tvalue%100/10+0x30;//个位数

disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示

}

}

wr_com(0xc0);

wr_dat(flagdat);//显示符号位

wr_com(0xc1);

wr_dat(disdata[0]);//显示百位

wr_com(0xc2);

wr_dat(disdata[1]);//显示十位

wr_com(0xc3);

wr_dat(disdata[2]);//显示个位

wr_com(0xc4);

wr_dat(0x2e);//显示小数点

wr_com(0xc5);

wr_dat(disdata[3]);//显示小数位

}

/主程序/

void main()

{ init_play();//初始化显示

while(1)

{read_temp();//读取温度

ds1820disp();//显示

}

}

这个是测温度的(18b20),你可以参考一下啊!!!!

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uint hum,temp,i; //定义湿度、温度(全局)

uchar hum_h,hum_l,temp_h,temp_l,check,cnt=0; //湿度高、低8位,温度高、低8位,校验位

uchar bai,shi,ge,bai1,shi1,ge1; //数码管 ,cnt=0

uchar code table[]={0xfb,0xfd,0xfe};//位选数组

uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //无小数点

uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小数点

sbit dht=P2^4;

/

邮保╱s级)函数

/

void delay_us(uint i)

{

while(i--);

}

/

延时(ms级)函数

/

void delay(uint z)

{

uint x,y;

for (x=z;x>0;x--)

for(y=100;y>0;y--);

}

/

温湿度初始化(准备传送数据)函数

/

void dht_init()

{

dht=0;

delay_us(50); //拉低延时500微秒,发送开始信号

dht=1; //释放总线,延时30微秒

delay_us(4);

while(!dht); //拉低等待

while(dht); // 拉高等待,即将传送数据

}

/

读取字节函数

/

uchar read_byte()

{

uchar n,byte=0,dat;

for(n=0;n<8;n++)

{

while(!dht);

delay_us(4); //理论上28us<延时<70us,此处写2--6都可以

dat=0;

if(dht)

dat=1;

while(dht);

byte<<=1;

byte|=dat;

}

return byte;

}

/

读40位数据函数

/

void read_hum_temp()

{

dht_init();

hum_h=read_byte(); //读湿度

hum_l=read_byte();

temp_h=read_byte(); //读温度

temp_l=read_byte();

check=read_byte(); //读校验

while(!dht);// 等待低电平结束

dht=1; //最后拉高总线

}

/

数据转化函数

提取各位数字

/

void zhuanhuan()

{

uchar a;

a=hum_h+hum_l+temp_h+temp_l;

if(a==check)

{

hum=temp=0;

hum=((hum|hum_h)<<8)|hum_l;

temp=((temp|temp_h)<<8)|temp_l;

bai=temp/100;

shi=temp%100/10;

ge=temp%10;

bai1=hum/100;

shi1=hum%100/10;

ge1=hum%10;

}

else bai=shi=ge=bai1=shi1=ge1=0;

}

void saomiao1()//温度

{

P2=table[0];

P0=table1[ge];

delay(1);

P0=0X00;

P2=table[1];

P0=table2[shi];

delay(1);

P0=0X00;

P2=table[2];

P0=table1[bai];

delay(1);

P0=0X00;

}

void saomiao2()//湿度

{

P2=table[0];

P0=table1[ge1];

delay(1);

P2=table[1];

P0=table2[shi1];

delay(1);

P2=table[2];

P0=table1[bai1];

delay(1);

}

//===================================================

void main()

{

delay(200);

while(1)

{

read_hum_temp();

zhuanhuan();

for(i=0;i<1500;i++)

{

saomiao1() ;

}

delay(500);

}

}

以上就是关于怎样用单片机程序感应温度和湿度从而控制、触发使得一个喷雾器进行喷水,(用于现代农场依环境自动喷水)全部的内容,包括:怎样用单片机程序感应温度和湿度从而控制、触发使得一个喷雾器进行喷水,(用于现代农场依环境自动喷水)、基于51单片机,ADC0804,光敏电阻,湿度传感器,求程序!!!!、stc90c51单片机开发板和sht11温湿度传感器连接测量温湿度的具体程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9319041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存