基于单片机的温室大棚自动控制系统
i_bai,i_shi,i_ge,ishi,ige;
sbit s1=P1^0; sbit s2=P1^1; sbit s3=P1^2; sbit s4=P1^3; sbit relay1=P1^5; sbit relay2=P1^6; sbit relay3=P1^7; sbit cs1=P3^0; sbit cs2=P3^1; sbit DS=P3^2; sbit lcdrw=P3^3; sbit lcden=P3^4; sbit lcdrs=P3^5; sbit wr=P3^6; sbit rd=P3^7;
/////////////////////////////////////////////////////////////////////// void delay(uint z) //延时函数 { }
void dsreset(void) //send reset and initialization command {
uint i; //DS18B20初始化 DS=0; i=103; while(i>0)i--; DS=1; i=4;
25
uint x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--);
基于单片机的温室大棚自动控制系统
while(i>0)i--; }
bit tmpreadbit(void) //read a bit 读一位 { uint i; bit dat;
DS=0;i++; //i++ for delay 小延时一下 DS=1;i++;i++; dat=DS; i=8; while(i>0)i--; return (dat); }
uchar tmpread(void) //read a byte date 读一个字节 {
uchar i,j,dat; dat=0; for(i=1;i<=8;i++) {
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里 }
return(dat); //将一个字节数据返回 }
void tmpwritebyte(uchar dat) //write a byte to ds18b20 { //写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j<=8;j++) {
26
基于单片机的温室大棚自动控制系统
testb=dat&0x01; dat=dat>>1;
if(testb) //write 1 写1部分 { DS=0; i++;i++; DS=1;
i=8;while(i>0)i--; } else {
DS=0; //write 0 写0部分 i=8;while(i>0)i--; DS=1; i++;i++; } } }
void readtemperature() //读温度函数{
uint y;
uchar T_L=0; uchar T_H=0; uchar k; dsreset(); delay(1);
tmpwritebyte(0xcc); tmpwritebyte(0x44); dsreset();
delay(1);
27
基于单片机的温室大棚自动控制系统
T_H=T_H&0x07;
temp1=(T_H*256+T_L)*T_cont; temp1=temp1*100; t_bai=(uint)temp1/10000; y=(uint)temp1000; t_shi=y/1000; y=(uint)y00; t_ge=y/100; y=(uint)y0; t_feng=y/10; t_miao=(uint)y; }
tmpwritebyte(0xcc); tmpwritebyte(0xbe); T_L=tmpread(); T_H=tmpread(); k=T_H&0x08; if(k==0x08) else
T_sign=0; T_sign=1;
///////////////////////////////////////////////////////////// void inteadc0804() //光照度adc转换子程序与数据处理 {
rd = 1;
wr = 1; //读ADC ReadPort = 0xff; //P1置位 cs1=0; wr = 0;
wr = 1; //启动ADC
28
基于单片机的温室大棚自动控制系统
rd=0; //开始读转换后数据
_nop_(); _nop_(); //稍延时,等待读完数 inte1 = ReadPort; //读出的光照度数据赋与inte1 rd = 1;
cs1 = 1; //读数完毕
i_bai = inte1/100; //百位数 i_shi = (inte10)/10; //十位数 i_ge = (inte1); //个位数 }
void hunadc0804() {
rd = 1;
wr = 1; //读ADC ReadPort = 0xff; //P1置位 cs2=0; wr = 0;
wr = 1; //启动ADC rd=0; //开始读转换后数据
_nop_(); _nop_(); //稍延时,等待读完数 delay(20);
hun2= ReadPort; //读出的湿度数据赋与hun1 rd = 1;
cs2 = 1; //读数完毕 hun1=hun2/2.55;
h_bai = hun1/100; //百位数
//湿度adc转换子程序与数据处理
h_shi = (hun10)/10; //十位数 h_ge = (hun1); //个位数 }
/////////////////////////////////////////////////////////// void write_com(uchar com) //lcd写命令函数
29