51单片机控制水泵求源代码
时间:10-02
整理:3721RD
点击:
麻烦各位大侠,有时间的帮写段源代码将感激不尽:
因本人从事多年强电方面的设计,最近刚接触51单片机,为入门级别,想自己写一个先前自己用接触器、热继电器及中间继电器等组成的一个控制电路;但写了好多次,就是达不到控制目的及要求,恳请前辈们指点一二:
具体情况如为,2台水泵互为主备,可手动切换运行,单台过载可自动切换;2台同时过载停机报故障,具备水流检测保护功能。
先前写的源代码如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint tt;
uchar temp;
sbit SW=P2^0;//水位检测
sbit SL=P2^1;//水流检测
sbit ZH=P2^2;//A B水泵运转检测
sbit BJ=P2^3;//报警输出
sbit GZA=P2^4;//水泵A过载
sbit GZB=P2^5;//水泵B过载
sbit QD=P2^6;//机组启动信号触角
sbit BA=P1^0;//水泵A
sbit BB=P1^1;//水泵B
void QH();//AB泵检测
void CSH();//初始化程序
void ys(uint z)//带参延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
CSH();//初始化函数
while(QD==0)//检测是否有启动信号
{
if(SW==0)//开机检测水位,若水位正常,执行if语句内容
{
QH();//开机检测AB泵及过载
// ys(20000);
if(tt==100)//水泵运行10S后检测水流
{
tt=0;
if(SL==0)//水流检测,若有水流则进入if语句
{
QH();//按检测状态进行运行
}
while(SL==1)//若无水流,则AB泵停机及报警打开
{
BA=1;//水泵A关闭
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
}
}
else//开机检测水位,若水位异常,执行else语句内容
{
CSH();//返回初始化
BJ=0;//蜂鸣器打开
}
}
}
void QH()//AB泵检测
{
temp=GZA|GZB;//检测水泵A与水泵B是否同时过载
if(ZH==0)//当ZH等于0时,进入以下程序
{
if(temp==0)//AB泵同时过载检测
{
ys(10);
if(temp==0)
{
BA=1;//水泵A关闭
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
}
else if(GZA==0)//水泵A过载检测
{
BA=1;//水泵A关闭
BB=0;//水泵B打开
BJ=0;//蜂鸣器打开
}
else if(GZB==0)//水泵B过载检测
{
BA=0;//水泵A打开
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
else//以上若均不能满足条件,则说明无过载故障,则执行以下命令;
{
BA=0;//水泵A打开
BB=1;//水泵B关闭
BJ=1;//蜂鸣器关闭
}
}
else//当ZH≠0时则进入以下程序
{
if(temp==0)//AB泵同时过载检测
{
BA=1;//水泵A关闭
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
else if(GZB==0)//水泵B过载检测
{
ys(10);
if(GZB==0)
{
BA=0;//水泵A打开
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
}
else if(GZA==0)//水泵A过载检测
{
BA=1;//水泵A关闭
BB=0;//水泵B打开
BJ=0;//蜂鸣器打开
}
else//以上若均不能满足条件,则说明无过载故障,则执行以下命令;
{
BA=1;//水泵A关闭
BB=0;//水泵B打开
BJ=1;//蜂鸣器关闭
}
}
}
void DS0()interrupt 1//定时器0中断程序,
//特别注意:中断程序不需要声明哦
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}
void CSH()//初始化程序
{
BA=1;
BB=1;
// BJ=1;
TMOD=0X01;//设置定时0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
因本人从事多年强电方面的设计,最近刚接触51单片机,为入门级别,想自己写一个先前自己用接触器、热继电器及中间继电器等组成的一个控制电路;但写了好多次,就是达不到控制目的及要求,恳请前辈们指点一二:
具体情况如为,2台水泵互为主备,可手动切换运行,单台过载可自动切换;2台同时过载停机报故障,具备水流检测保护功能。
先前写的源代码如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint tt;
uchar temp;
sbit SW=P2^0;//水位检测
sbit SL=P2^1;//水流检测
sbit ZH=P2^2;//A B水泵运转检测
sbit BJ=P2^3;//报警输出
sbit GZA=P2^4;//水泵A过载
sbit GZB=P2^5;//水泵B过载
sbit QD=P2^6;//机组启动信号触角
sbit BA=P1^0;//水泵A
sbit BB=P1^1;//水泵B
void QH();//AB泵检测
void CSH();//初始化程序
void ys(uint z)//带参延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
CSH();//初始化函数
while(QD==0)//检测是否有启动信号
{
if(SW==0)//开机检测水位,若水位正常,执行if语句内容
{
QH();//开机检测AB泵及过载
// ys(20000);
if(tt==100)//水泵运行10S后检测水流
{
tt=0;
if(SL==0)//水流检测,若有水流则进入if语句
{
QH();//按检测状态进行运行
}
while(SL==1)//若无水流,则AB泵停机及报警打开
{
BA=1;//水泵A关闭
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
}
}
else//开机检测水位,若水位异常,执行else语句内容
{
CSH();//返回初始化
BJ=0;//蜂鸣器打开
}
}
}
void QH()//AB泵检测
{
temp=GZA|GZB;//检测水泵A与水泵B是否同时过载
if(ZH==0)//当ZH等于0时,进入以下程序
{
if(temp==0)//AB泵同时过载检测
{
ys(10);
if(temp==0)
{
BA=1;//水泵A关闭
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
}
else if(GZA==0)//水泵A过载检测
{
BA=1;//水泵A关闭
BB=0;//水泵B打开
BJ=0;//蜂鸣器打开
}
else if(GZB==0)//水泵B过载检测
{
BA=0;//水泵A打开
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
else//以上若均不能满足条件,则说明无过载故障,则执行以下命令;
{
BA=0;//水泵A打开
BB=1;//水泵B关闭
BJ=1;//蜂鸣器关闭
}
}
else//当ZH≠0时则进入以下程序
{
if(temp==0)//AB泵同时过载检测
{
BA=1;//水泵A关闭
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
else if(GZB==0)//水泵B过载检测
{
ys(10);
if(GZB==0)
{
BA=0;//水泵A打开
BB=1;//水泵B关闭
BJ=0;//蜂鸣器打开
}
}
else if(GZA==0)//水泵A过载检测
{
BA=1;//水泵A关闭
BB=0;//水泵B打开
BJ=0;//蜂鸣器打开
}
else//以上若均不能满足条件,则说明无过载故障,则执行以下命令;
{
BA=1;//水泵A关闭
BB=0;//水泵B打开
BJ=1;//蜂鸣器关闭
}
}
}
void DS0()interrupt 1//定时器0中断程序,
//特别注意:中断程序不需要声明哦
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}
void CSH()//初始化程序
{
BA=1;
BB=1;
// BJ=1;
TMOD=0X01;//设置定时0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
有时间看看咯
看来大虾们真的很忙!
弱势的我没人理啊!
跪求指点!
不错的资料,值得收藏