本帖最后由 bg4rff 于 2019-8-27 11:16 编辑
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define u_s 49996 //12T模式12MHz@50mS初值
//检查水位低和高做动作的间隔,检查低水位30分钟1次,检查高水位每1分钟1次,但仅在加水状态检查
#define Tm_checkL_set 30
#define Tm_checkH_set 1
/***********I/O口位功能定义*****************************/
//sbit CE=P1^4; //595(引脚12)锁存控制(用于调试时演示参数)
//sbit CLK=P1^3; //CLK
//sbit DAT=P1^2; //DATA
sbit J_no=P1^5;
sbit J_off=P1^3;
unsigned int dda;
unsigned char hs=0;
unsigned char t50ms=0;//50毫秒计数
unsigned char t1s=0;//1秒计数
unsigned char t_h_m=0,t_l_m=0;//1分计数
unsigned char tns_Jon=0,tns_Joff=0;//用于释放继电器的延时
bit tm_h_ar=0,tm_l_ar=0;//时间到
bit waterring=0;//正在加水
static unsigned char needwater=0,notneedwater=0;//需要加水,不需要加水
void InitADC(void)
{
;
}
unsigned int AD_work(unsigned char ch)
{
return 195;
}
//====定时器T0初始化函数(函数由stc_isp软件自动生成)=========
//定时器T0的16位自动重装模式
void T0_Init(void) //50毫秒@12.000MHz
{
AUXR &=0x7F; //定时器时钟12T模式
TMOD=0xF0; //模式0@16位自动重装
TH0=(65536-u_s)/256;
TL0=(65536-u_s)%256;
TF0=0; //清除T0中断标志
ET0=1; //使能定时器T0中断
TR0=1; //启动定时器T0
EA=1;
}
//====定时器T0中断函数=============================
void T0_time() interrupt 1 //using 1
{
if(++t50ms==20)
{t50ms=0;
//每秒检测一次水位
dda= AD_work(0);//检测储水箱水位
needwater<<=1; //记录检测情况
notneedwater<<=1;
if(dda>200){notneedwater++;}
if(dda<190){needwater++;}
if(tns_Jon)
{
if(!(--tns_Jon))
{
//释放打开继电器
J_no=1;
}
}
if(tns_Joff)
{
if(!(--tns_Joff))
{
//释放关闭继电器
J_off=1;
}
}
if(++t1s==60)
{ t1s=0;
if(t_h_m)
{
if(!(--t_h_m))
{
//此处为延时n分单次执行
tm_h_ar=1;
}
}
if(++t_l_m==Tm_checkL_set)//检查低水位时间到
{t_l_m=0;
tm_l_ar=1;
}
}
}
}
//====主函数================
main()
{
T0_Init(); //T0设定初始化
//-----------------------------------------------------------
InitADC();//ADC初始化 //设置P1.0--ADC0通道;测量储水箱水位
J_no=1; //初始化继电器J1驱动输出口
J_off=1;//初始化继电器J2驱动输出口
//----------------------------------------------------------
if(AD_work(0)<190) //初始检测到低水位
{
J_off=1; //防止同时接通
J_no=0; //接通“开通电动阀”继电器
tns_Jon=25; //延时25秒释放
waterring=1;//正在加水
t_h_m=Tm_checkH_set;//延时检查水位是否高
tm_h_ar=0;
}
while(1)
{
if(tm_l_ar)//其实这些都很短,都可以放进定时服务程序,省下标记量
{
tm_l_ar=0;
if((needwater&0x07)==0x07) //连续3次检测到低水位
{
J_off=1; //防止同时接通
J_no=0; //接通开通电动阀继电器
tns_Jon=25; //延时25秒释放
waterring=1;
t_h_m=Tm_checkH_set;//延时检查水位是否高
tm_h_ar=0;
}
}
if(waterring)
{
if(tm_h_ar)
{
tm_h_ar=0;
if((notneedwater&0x07)==0x07) //连续3次检测到高水位
{
J_no=1; //防止同时接通
J_off=0; //接通关闭电动阀继电器
tns_Joff=25;//延时25秒释放
waterring=0;
}
else{//继续延时检查
t_h_m=Tm_checkH_set;//延时检查水位是否高
tm_h_ar=0;
}
}
}
PCON |= 0x01; //将IDL(PCON.0)置1,MCU将进入空闲模式
_nop_(); //此时CPU无时钟,不执行指令
_nop_(); //等待中断终止空闲模式
_nop_();
_nop_();
}
}
没编译,也许有错,欢迎交流