c语言自动浇花代码.docx
《c语言自动浇花代码.docx》由会员分享,可在线阅读,更多相关《c语言自动浇花代码.docx(19页珍藏版)》请在冰点文库上搜索。
c语言自动浇花代码
/***************************头文件***********************/
#include
/************************数据类型宏定义******************/
#defineucharunsignedchar
#defineuintunsignedint
#definelcdP0//液晶数据口
/***********************声明控制引脚*********************/
sbitrs=P3^0;//LCD1602控制端口
sbiten=P3^1;
sbitjh=P3^2;//继电器控制端
sbitk1=P1^0;//按键
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
/**************************数组定义********************/
ucharcodetable0[]="Modle:
Automatic";//用于LCD1602显示
ucharcodetable1[]="T1=12minT2=20s";
uchartable2[]="Automatic";
uchartable3[]="Manual";
uchartable4[]="00";
uchartable5[]="00";
uchartable6[]="";
/**********************s声明全局变量*******************/
uchar_50ms,t1=15,t2=30;//每50ms加一次的变量;间隔时间min;浇花时间s;
uints,T_s;//1s时间到;总定时时间
ucharflag=0,flag1=0,flag2=0,flag3=0;//时间切换标志。
自动/手动切换标志,时间间隔和浇花时间调节标志,浇花与不浇花标志
/*************************延时程序*********************/
voiddelay(uintcount)//1ms延时
{
uinti,j;
for(i=0;ifor(j=0;j<120;j++);
}
/*************************液晶驱动程序*************************/
voidw_cmd(ucharcom)//lcd1602写命令
{
rs=0;
lcd=com;
en=1;
delay(5);
en=0;
}
voidw_data(uchardat)//lcd1602读数据
{
rs=1;
lcd=dat;
en=1;
delay(5);
en=0;
}
voidw_str(uchar*s)//lcd1602写字符串
{
while(*s)w_data(*s++);
}
voidlcd_int()//lcd1602初始化
{
en=0;
w_cmd(0x38);
w_cmd(0x0c);
w_cmd(0x06);
w_cmd(0x01);
w_cmd(0x80+0x00);
w_str(table0);
w_cmd(0xc0+0x00);
w_str(table1);
}
/*******************定时器0初始化程序******************/
voidTimer0_Init(void)//其中没ET0是为以后控制暂停用的
{
TMOD=TMOD|0X01;//定时方式1
TH0=0X3C;//50ms
TL0=0XB0;
TR0=1;
ET0=1;
_50ms=0;
s=0;
}
/*******************定时器0中断程序********************/
voidTimer0(void)interrupt1
{
TR0=0;//停止计数
TH0=0X3C;//重装定时器值
TL0=0XB0;
TR0=1;
_50ms++;
if(_50ms==20)//1s到
{
_50ms=0;
s++;
//count++;
if(!
flag)//间隔时间内
{
if(s==T_s)//时间间隔到
{
s=0;
flag=1;
jh=0;//开始浇花
}
}
if(flag)//浇花时间内
{
if(s==t2)
{
s=0;
flag=0;
flag3=0;
jh=1;//停止浇花
}
}
}
}
/******************判断模式选择***********************/
voidjudge()
{
if(k1==0)//判断模式
{
delay(10);
if(k1==0)
{
while(!
k1);
flag1=~flag1;
}
}
}
/*****************调节时间****************************/
voidtiaojie()
{
table4[0]=t1/10+48;
table4[1]=t1%10+48;
table5[0]=t2/10+48;
table5[1]=t2%10+48;
w_cmd(0xc0+0x03);
w_str(table4);
w_cmd(0xc0+0x0c);
w_str(table5);//液晶显示
if(k2==0)//判别调节间隔时间还是浇花时间
{
delay(10);
if(k2==0)
{
while(!
k2);
flag2=~flag2;
}
}
if(flag2==0)//调节间隔时间
{
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
t1++;
if(t1>150)t1=150;
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!
k4);
t1--;
if(t1<12)t1=12;
}
}
}
if(flag2)//调节浇花时间
{
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
t2++;
if(t2>120)t2=120;
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!
k4);
t2--;
if(t2<20)t2=20;
}
}
}
}
/*******************主函数**********************************/
voidmain()
{
lcd_int();
Timer0_Init();
while
(1)
{
judge();//判断模式
if(!
flag1)//自动模式
{
w_cmd(0x80+0x07);
w_str(table2);//液晶显示
tiaojie();//调节时间
T_s=t1*60;//自动模式间隔时间,默认12分钟
EA=1;//开定时器
}
if(flag1)//手动模式
{
w_cmd(0x80+0x07);
w_str(table3);//液晶显示
if(k5==0)//判定是否按下浇水开关
{
delay(10);
/***************************头文件***********************/
#include
/************************数据类型宏定义******************/
#defineucharunsignedchar
#defineuintunsignedint
#definelcdP0//液晶数据口
/***********************声明控制引脚*********************/
sbitrs=P3^0;//LCD1602控制端口
sbiten=P3^1;
sbitjh=P3^2;//继电器控制端
sbitk1=P1^0;//按键
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
/**************************数组定义********************/
ucharcodetable0[]="Modle:
Automatic";//用于LCD1602显示
ucharcodetable1[]="T1=12minT2=20s";
uchartable2[]="Automatic";
uchartable3[]="Manual";
uchartable4[]="00";
uchartable5[]="00";
uchartable6[]="";
/**********************s声明全局变量*******************/
uchar_50ms,t1=15,t2=30;//每50ms加一次的变量;间隔时间min;浇花时间s;
uints,T_s;//1s时间到;总定时时间
ucharflag=0,flag1=0,flag2=0,flag3=0;//时间切换标志。
自动/手动切换标志,时间间隔和浇花时间调节标志,浇花与不浇花标志
/*************************延时程序*********************/
voiddelay(uintcount)//1ms延时
{
uinti,j;
for(i=0;ifor(j=0;j<120;j++);
}
/*************************液晶驱动程序*************************/
voidw_cmd(ucharcom)//lcd1602写命令
{
rs=0;
lcd=com;
en=1;
delay(5);
en=0;
}
voidw_data(uchardat)//lcd1602读数据
{
rs=1;
lcd=dat;
en=1;
delay(5);
en=0;
}
voidw_str(uchar*s)//lcd1602写字符串
{
while(*s)w_data(*s++);
}
voidlcd_int()//lcd1602初始化
{
en=0;
w_cmd(0x38);
w_cmd(0x0c);
w_cmd(0x06);
w_cmd(0x01);
w_cmd(0x80+0x00);
w_str(table0);
w_cmd(0xc0+0x00);
w_str(table1);
}
/*******************定时器0初始化程序******************/
voidTimer0_Init(void)//其中没ET0是为以后控制暂停用的
{
TMOD=TMOD|0X01;//定时方式1
TH0=0X3C;//50ms
TL0=0XB0;
TR0=1;
ET0=1;
_50ms=0;
s=0;
}
/*******************定时器0中断程序********************/
voidTimer0(void)interrupt1
{
TR0=0;//停止计数
TH0=0X3C;//重装定时器值
TL0=0XB0;
TR0=1;
_50ms++;
if(_50ms==20)//1s到
{
_50ms=0;
s++;
//count++;
if(!
flag)//间隔时间内
{
if(s==T_s)//时间间隔到
{
s=0;
flag=1;
jh=0;//开始浇花
}
}
if(flag)//浇花时间内
{
if(s==t2)
{
s=0;
flag=0;
flag3=0;
jh=1;//停止浇花
}
}
}
}
/******************判断模式选择***********************/
voidjudge()
{
if(k1==0)//判断模式
{
delay(10);
if(k1==0)
{
while(!
k1);
flag1=~flag1;
}
}
}
/*****************调节时间****************************/
voidtiaojie()
{
table4[0]=t1/10+48;
table4[1]=t1%10+48;
table5[0]=t2/10+48;
table5[1]=t2%10+48;
w_cmd(0xc0+0x03);
w_str(table4);
w_cmd(0xc0+0x0c);
w_str(table5);//液晶显示
if(k2==0)//判别调节间隔时间还是浇花时间
{
delay(10);
if(k2==0)
{
while(!
k2);
flag2=~flag2;
}
}
if(flag2==0)//调节间隔时间
{
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
t1++;
if(t1>150)t1=150;
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!
k4);
t1--;
if(t1<12)t1=12;
}
}
}
if(flag2)//调节浇花时间
{
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
t2++;
if(t2>120)t2=120;
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!
k4);
t2--;
if(t2<20)t2=20;
}
}
}
}
/*******************主函数**********************************/
voidmain()
{
lcd_int();
Timer0_Init();
while
(1)
{
judge();//判断模式
if(!
flag1)//自动模式
{
w_cmd(0x80+0x07);
w_str(table2);//液晶显示
tiaojie();//调节时间
T_s=t1*60;//自动模式间隔时间,默认12分钟
EA=1;//开定时器
}
if(flag1)//手动模式
{
w_cmd(0x80+0x07);
w_str(table3);//液晶显示
if(k5==0)//判定是否按下浇水开关
{
delay(10);
if(k5==0)
{
while(!
k5);
flag3=~flag3;
}
}
if(flag3==0)//不浇花
{
jh=1;
EA=0;//关定时器
}
if(flag3)//浇花
{
jh=0;//开继电器
//count=0;//浇花计时
EA=1;//开定时器
flag=1;//浇花标志
t2=50;//浇花不超过50s
}
}
}
}if(k5==0)
{
while(!
k5);
flag3=~flag3;
}
}
if(flag3==0)//不浇花
{
jh=1;
EA=0;//关定时器
}
if(flag3)//浇花
{
jh=0;//开继电器
//count=0;//浇花计时
EA=1;//开定时器
flag=1;//浇花标志
t2=50;//浇花不超过50s
}
}
}
}