⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 water.c

📁 太阳能热水器自动上水控制器
💻 C
字号:
/********************************************************************
            太阳能热水器自动上水控制  V3.4

V3.2   使用中断加定时方式开关阀,增看门狗、空闲模式
V3.3   修正V3.2缺陷,增60min上水总时间控制
V3.4   修正V3.3的错误,经实地安装试用。

   LED 上水开阀时闪烁,开阀完成上水时闪亮(长时间灭,瞬间亮),水满
       后关阀闪烁,结束后灭。
   Beep完成一个操作后鸣叫
********************************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sfr AUXR   = 0x8E;		   //定义AT89S51扩展寄存器
sfr WDTRST = 0xA6;
//sbit  led1=P1^6;
//sbit  K1 =P1^1;           //上水控制键P3.2 INT0	 *ledkeyP3.2
//sbit  YS =P1^0;           //水满后溢水信号P3.3 INT1   *ledkeyP3.3
sbit  LED =P0^7;           //操作批示灯P0.7	 *ledkeyP1.0
sbit  KF=P2^6;             //开阀线P2.6		 *ledkeyP1.2
sbit  GF=P2^7;             //关阀线P2.7		 *ledkeyP1.3
sbit  KFdw=P2^2;           //开阀到位P2.2	 *ledkeyP3.4
sbit  GFdw=P2^3;           //关阀到位P2.3	 *ledkeyP3.5
sbit  Beep =P2^5 ;         //蜂鸣器,开关阀结束时鸣叫提示P2.5	 *ledkeyP1.7
void  Dog();
void  delayms(uchar ms);
void  delayled(uchar ll);
void  MingJiao();
void  TingZhi();
bit FMKGbz=1;             //阀门开关标志位,1可开,0可关
bit led_bz=0;			  //瞬闪LED允许位
bit Nbz=0;
bit KongXianbz=0;		  //进入空闲模式允许位


//sbit  LED =P1^0;           //操作批示灯P0.7
//sbit  KF=P1^2;             //开阀线P2.6
//sbit  GF=P1^3;             //关阀线P2.7
//sbit  KFdw=P3^4;           //开阀到位P2.2
//sbit  GFdw=P3^5;           //关阀到位P2.3
//sbit  Beep =P1^7 ;         //蜂鸣器,开关阀结束时鸣叫提示
//void  Dog();
//void  delayms(uchar ms);
//void  delayled(uchar ll);
//void  MingJiao();
//void  TingZhi();
//bit FMKGbz=1;             //阀门开关标志位,1可开,0可关
//bit led_bz=0;			  //瞬闪LED允许位
//bit Nbz=0;
//bit KongXianbz=0;		  //进入空闲模式允许位


uchar S_timer=0;
uint M_timer=0; 
uint ledoff_timer=20000;//led熄灭时长

void main()
{
	uint N=0;

	AUXR = 0xff;            // 初始化看门狗相关寄存器
	Dog();
	
	LED=1,KF=1,GF=1,Beep=0;
	
	TMOD=0x11;		//赋初值,8M晶振,50ms一次中断,T0初值为7DCB
	TH0=0x7D;		  
	TL0=0xCB;
	TH1=0x15;		//最长允许上水时间定时,90ms一次
	TL1=0xA0;
	ET0=1;          //定时器T0中断允许
	ET1=1;			//定时器T1中断允许
	
	IT0=1;			//下降沿触发
	IT1=1;
	EX0=1;			//打开中断0,响应上水键K1
	EX1=0;			//关闭中断1,不响应溢水信号键
	EA=1;			//总中断允许

	while(1)
	{
		Dog();
		if(led_bz)	//瞬闪LED
		{
			if(Nbz)	//上次的延时计数清零
			{
				Nbz=0;
				N=0;
			}
			N++;
			if(N > ledoff_timer)
			{
				N=0;
				LED=0;
				delayms(50);
				LED=1;
			}
		}
		if(KFdw==0 & FMKGbz==1)  //开阀到位
		{
			TR0=0;
			TH0=0x7D;
			TL0=0xCB;
			S_timer=0;

			TingZhi();
			FMKGbz=0;
			led_bz=1;
			EX1=1;
		}
		if(GFdw==0 & FMKGbz==0)  //关阀到位
		{
			TR0=0;
			TR1=0;
			TH0=0x7D;
			TL0=0xCB;
			S_timer=0;

			TingZhi();
			FMKGbz=1;
			led_bz=0;
			EX0=1;
			KongXianbz=1;
		}
		if(KongXianbz & FMKGbz)
		{
			PCON=0x00;		//只有在关阀完成后才允许进入空闲模式
		}
		//	  led1=0;		//此三句指示是否进入空闲模式,调试用
		//	  //delayms(100);
		//	  led1=1;
	}
}



void Dog(void)
{
	WDTRST=0x1E;
	WDTRST=0xE1;//初始化看门狗/喂狗
}


void  KaiFa(void) interrupt 0 	 /*INT0*******************************************************/
{
	EX0=0;
	EX1=1;
	KongXianbz=0;	//禁止进入空闲模式

	ledoff_timer=0;	//使led灯长亮
	KF=1;
	GF=0;
	FMKGbz=1;

	TH0=0x7D;
	TL0=0xCB;
	TR0=1;

	TH1=0x15;		//90ms中断一次
	TL1=0xA0;
	TR1=1;			//开最长允许上水时间定时器60min
	LED=0;
	led_bz=1;
	Nbz=1;
	M_timer=0;
}


void  GuanFa(void) interrupt 2 	 /*INT1*******************************************************/
{
	//PCON=0;
	EX0=1;
	EX1=0;

	ledoff_timer=0;	//使led灯长亮
	KF=0;
	GF=1;
	FMKGbz=0;
	TR0=1;
	LED=0;
	led_bz=0;
}


void timer0() interrupt 1     /*定时器0中断,4s后停止阀门动作******************/
{
	TH0=0x7D;
	TL0=0xCB;
	S_timer++;
	if(S_timer==80)       //定时4s后停止阀门动作
	{
		TR0=0;
		TingZhi();
		FMKGbz=~FMKGbz;
		S_timer=0;
		KongXianbz=1;	  //允许进入空闲模式,下一步进入空闲模式

		if(FMKGbz) led_bz=0;//关阀状态时关LED灯
	}
}


void timer1() interrupt 3     /*定时器1中断,40000*0.09=3600s后停止阀门动作***最大1小时47分钟*****/
{
	TH1=0x15;			     //90ms中断一次
	TL1=0xA0;
	M_timer++;
	if(M_timer==40000)
	{
	     TR1=0;
		 if(GFdw)
		 {  
			 ledoff_timer=0;	//使led灯长亮
			 KF=0;
		     GF=1;
		     TH0=0x7D;
		     TL0=0xCB;
		     TR0=1;
		     EX0=1;
			 EX1=0;
//		     led_bz=0;
		 }
		 M_timer=0;
	}
}


void delayms(unsigned char ms) 	  /*延时子程序**************************************/
{
	uchar i;
	while(ms--)
	{
		Dog();				  //此处必须喂狗,否则被复位
		for(i = 0 ; i < 120 ; i++);
	}
}


void TingZhi(void)		  /*阀门动作停止***********************/
{
	KF=1;
	GF=1;
	ledoff_timer=20000;	//使led灯长亮

	TR0=0;
	LED=1;
	MingJiao();

}


void MingJiao()			  /*鸣叫子程序*************************/
{
	Beep=1;
	delayms(100);
	Beep=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -