这个比较简单的 利用单片机以一定采样间隔 采集温湿度传感器的信号 ,可以是数字传感器 也可以是模拟电压输出的模拟传感器 采集到温湿度后,设计一个喷水算法
利用 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温湿度传感器连接测量温湿度的具体程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)