#include <reg52.h>  
#include <intrins.h> 
#define uint unsigned int 
#define uchar unsigned char 
#define sled_AD_port P0  
#define sled_WD_port P1  
#define sled_wm_port P2 
wendu,shuiwei;  
sled_dm_port;  
sbit DQ =P3^5;  
sbit ADCS =P3^0; 
sbit ADCLK =P3^7;  
sbit ADDI =P3^6;  
sbit ADDO =P3^6; 
sbit k1=P3^2;  
sbit k2=P3^3; 
uchar code du_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; 
uchar code we_table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  
uchar data sled_data[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};  
uchar data led_lighten_bit=0 ;  
void delay_1ms(uchar z)  
{ 
uchar x,y; 
for(x=z;x>0;x--) 
for(y=110;y>0;y--);  
} 
//////////////////以下是DS18B20驱动程序//////////////// 
void delay(uint i) //延时函数 
{ 
while(i--); 
} 
//初始化函数 
Init_DS18B20(void) //初始化函数 
{ 
uchar x=0; 
DQ = 1; //DQ复位 
delay(8); //稍做延时  
DQ = 0;//单片机将DQ拉低  
delay(80); //精确延时 大于 480us 
DQ = 1; //拉高总线 
delay(14); 
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 
delay(20); 
} 
Read(void) //读一个字节 
{ 
uchar i=0; 
uchar dat = 0; 
for (i=8;i>0;i--){ 
DQ = 0;// 给脉冲信号  
dat>>=1; 
DQ = 1; // 给脉冲信号 
if(DQ) dat|=0x80; 
delay(4); 
} 
return(dat); 
} 
Write(uchar dat) //写一个字节 
{ 
uchar i=0; 
for (i=8; i>0; i--){ 
DQ = 0; 
DQ = dat&0x01; 
delay(5); 
DQ = 1; 
dat>>=1; 
} 
} 
ReadTemperature(void) //读取温度 
{ 
uchar a=0; 
uchar b=0; 
uint t=0; 
float tt=0; 
Init_DS18B20(); 
Write(0xCC);// 跳过读序号列号的操作  
Write(0x44);// 启动温度转换  
Init_DS18B20(); 
Write(0xCC);//跳过读序号列号的操作  
Write(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 
a=Read(); 
b=Read(); 
t=b; 
t<<=8; 
t=t|a; 
tt=t*0.0625; //将温度的高位与低位合并 
t= tt*10+0.5; //对结果进行4舍5入 
return(t); 
} 
//////////////////以上是DS18B20驱动程序//////////////// 
//采集数据  
unsigned int Adc0832(unsigned char channel) 
{ 
uchar i=0; 
uchar j; 
uint dat=0; 
uchar ndat=0; 
 
 
if(channel==0)channel=2; 
if(channel==1)channel=3; 
ADDI=1; 
_nop_(); 
_nop_(); 
ADCS=0;//拉低CS端  
_nop_(); 
_nop_(); 
ADCLK=1; //拉高CLK端 
_nop_(); 
_nop_(); 
ADCLK=0;//拉低CLK端,形成下降沿1 
_nop_(); 
_nop_(); 
ADCLK=1; //拉高CLK端 
ADDI=channel&0x1; 
_nop_(); 
_nop_(); 
ADCLK=0;//拉低CLK端,形成下降沿2 
_nop_(); 
_nop_(); 
ADCLK=1; //拉高CLK端 
ADDI=(channel>>1)&0x1; 
_nop_(); 
_nop_(); 
ADCLK=0;//拉低CLK端,形成下降沿3 
ADDI=1; //控制命令结束  
_nop_(); 
_nop_(); 
dat=0; 
for(i=0;i<8;i++) 
{ 
dat|=ADDO; //收数据 
ADCLK=1; 
_nop_(); 
_nop_(); 
ADCLK=0;//形成一次时钟脉冲  
_nop_(); 
_nop_(); 
dat<<=1; 
if(i==7)dat|=ADDO; 
}  
for(i=0;i<8;i++) 
{ 
j=0; 
j=j|ADDO;//收数据  
ADCLK=1; 
_nop_(); 
_nop_(); 
ADCLK=0;//形成一次时钟脉冲  
_nop_(); 
_nop_(); 
j=j<<7; 
ndat=ndat|j; 
if(i<7)ndat>>=1; 
} 
ADCS=1;//拉低CS端 
ADCLK=0;//拉低CLK端 
ADDO=1;//拉高数据端,回到初始状态 
dat<<=8; 
dat|=ndat; 
return(dat); //返回数据 
} 
xianshiTemperature() 
{ 
uint wendu; 
uchar c; 
sled_WD_port=0; 
{ 
wendu=ReadTemperature(); 
sled_data[4] = du_char[wendu/100]; 
sled_data[5] = du_char[wendu%100/10]; 
for(c=0;c<6;c++) 
{ 
sled_wm_port = 0x00;  
sled_WD_port = sled_data[c];  
sled_wm_port = we_table[c];  
delay_1ms(20); 
} 
} 
} 
xianshishuiwei() 
{ 
uint shuiwei; 
uchar uu,d; 
sled_AD_port=0; 
{ 
uu=Adc0832(0); 
shuiwei=(uu/2.56); 
sled_data[0] = du_char[shuiwei%100/10]; 
sled_data[1] = du_char[shuiwei%10]; 
for(d=0;d<3;d++) 
{ 
sled_wm_port = 0x00;  
sled_AD_port = sled_data[d];  
sled_wm_port = we_table[d];  
delay_1ms(1); 
} 
} 
} 
 
 
void main() 
{ 
while(1) 
{ 
xianshiTemperature(); 
xianshishuiwei(); 
if( shuiwei%100<20) 
k1=0; 
if(shuiwei%100>90) 
k1=5; 
if(wendu%100<35) 
k2=0; 
if(wendu%100>40) 
k2=1;  
} 
} 
这是程序,
 
 
如何能实现那继电器能左右摆动,就是当数值到达某个时能使继电器实现打开或闭合。  这是protues仿真图,谁能帮我实现温度高于40时继电器断开(往右闭合),低于35时继电器闭合(往左闭合),水位高于90时继电器断开(往右闭合),低于20时继电器闭合(往左闭合),可增加多一个继电器部分电路。 
 
 |   
     
  
 |