📄 water.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 + -