打印
[开发工具]

关于at89c52的太阳能热水温度控制系统设计

[复制链接]
1000|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#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时继电器闭合(往左闭合),可增加多一个继电器部分电路。

沙发
want19903|  楼主 | 2015-4-22 17:37 | 只看该作者

这是一个通过滑动变阻器通过ADC0832来实现AD转换来在二位数码管上显示出来,温度是通过DS18B20的数值来调节温度,在左边的二位数码管上显示,现在想帮我改成水位高于90时,继电器向右闭合,低于20时继电器向左闭合;温度大于40时,继电器向右闭合,低于35时,继电器向左闭合。求大神们帮忙解决。

使用特权

评论回复
板凳
want19903|  楼主 | 2015-4-22 17:38 | 只看该作者
求大神,求高手

使用特权

评论回复
地板
周董| | 2015-4-22 22:34 | 只看该作者
水位高于90时继电器断开???如何实现的呀?、

使用特权

评论回复
5
want19903|  楼主 | 2015-4-23 08:16 | 只看该作者
求高手来看看是我的图错了还是程序错了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝