烟台大学毕业论文(设计)
TIME_2 =0;
SEG =WateringTime_temp/100; //百位
WateringTime_temp=WateringTime_temp0; //得到没有百位的数,只含有十个
delayus(1); TIME_2 =1;
TIME_3 =0;
SEG =WateringTime_temp/10; //十位 delayus(1); TIME_3 =1;
TIME_4 =0;
SEG =WateringTime_temp; //个位 delayus(1); TIME_4 =1;
TIME_5 =0;
SEG =SysDay; //天 delayus(1); TIME_5 =1; }
//-------------------------------------- // 浇水控制
//-------------------------------------- void Watering(uchar SysDay) {
uint temp=WateringTime; //不能修改全局变量WateringTime,WateringTime只能在按键AN1 AN2 和 AN4 联合作用下才可被修改,所以需要保存 WateringTimeFlag=1; //Timer0 中断倒计时显示控制标志位
//开启第一路浇水装置的电磁阀开始浇水 LED=0x01;
while(WateringTime>0) { showcountering(WateringTime,SysDay); }
//开启第二路浇水装置的电磁阀开始浇水 WateringTime= temp; LED=0x02;
while(WateringTime>0) {
29
烟台大学毕业论文(设计)
showcountering(WateringTime,SysDay); }
//开启第三路浇水装置的电磁阀开始浇水 WateringTime= temp; LED=0x04;
while(WateringTime>0) { showcountering(WateringTime,SysDay); }
//开启第四路浇水装置的电磁阀开始浇水 WateringTime= temp; LED=0x08;
while(WateringTime>0) { showcountering(WateringTime,SysDay); }
//开启第五路浇水装置的电磁阀开始浇水 WateringTime= temp; LED=0x10;
while(WateringTime>0) { showcountering(WateringTime,SysDay); }
//开启第六路浇水装置的电磁阀开始浇水 WateringTime= temp; LED=0x20;
while(WateringTime>0) { showcountering(WateringTime,SysDay); }
//开启第七路浇水装置的电磁阀开始浇水 WateringTime= temp; LED=0x40;
while(WateringTime>0) { showcountering(WateringTime,SysDay); }
30
烟台大学毕业论文(设计)
//开启第八路浇水装置的电磁阀开始浇水 WateringTime= temp; LED=0x80;
while(WateringTime>0) { showcountering(WateringTime,SysDay); }
WateringTimeFlag=0; //关闭浇水标志 WateringTime= temp; //还原WateringTime, LED=0x00; //熄灭所有的LED //结束浇水,回到正常模式 }
//-------------------------------------- //定时器T0初始化
//当为定时工作方式1时,定时时间的计算公式为: //(2^16-计数初值)x晶振周期x12 //12M晶振 50MS定时
//--------------------------------------- void Init_T0(void) {
TMOD = 0x01; //定时器工作在定时方式下。工作方式1 TH0 = (65536-TIME) /256; //赋初值 TL0 = (65536-TIME) %6; EA = 1; //使能全局中断 ET0 = 1; //定时器0使能 TR0 = 1; //定时器0工作 }
//===================================================== //=====================主函数=========================== //===================================================== void main(void) {
uchar thistime,key,lasttime=KEY_NULL; //按键识别 uchar AN4_CNT; //AN4 按键次数判断 // uchar AN5_CNT;
LED=0x00; //LED全灭
//------------------------------和时间相关的初始设置--------------------------------------------
Startwatering_HOUR =7; //默认每天浇水开始时间 小时
31
烟台大学毕业论文(设计)
Startwatering_minute =0; //默认每天浇水开始时间 分钟 WateringTime =10; WateringTime_H =0; WateringTime_L =10;
SysSecond =0; //上电后系统时间 秒 SysHour =0; //上电后系统时间 时 SysMinute =0; //上电后系统时间 分 SysDay =1; //上电后系统时间 周
SECOND_FLAG =1; //显示秒 9 10 LED 闪烁
MON_FLAG =1; //初始每天都会浇水 TUE_FLAG =1; //初始每天都会浇水 WEN_FLAG =1; //初始每天都会浇水 THIR_FLAG =1; //初始每天都会浇水 FRI_FLAG =1; //初始每天都会浇水 SAT_FLAG =1; //初始每天都会浇水 SUN_FLAG =1; //初始每天都会浇水
//--------------------------------------按键的初始设置------------------------------------------- AN4_CNT=0; //记录AN4 的按键次数,1次是进入时间校对,2次是设置浇水秒数,3次退出时间校对 // AN5_CNT=0; //记录AN5 的按键次数,1次是进入浇水天数,2次退出
Init_T0(); //初始化定时器0,定时50Ms while(1) {
//-------------------------按键控制模式---------------------------- //按键完成模式的选择和控制 //delayus(100);//去按键抖动 lasttime=thistime; thistime=KEY_DATA; key=thistime; if(thistime==lasttime) //连续两次按键一样,认为没有按键 key=KEY_NULL; if(key!=KEY_NULL) //如果有按键,读取值,并作相应的控制 {
32
烟台大学毕业论文(设计)
switch(key|0xC1) //提取中间五位作为按键 { case 0xfd://AN1被按下:AN4=0 小时校对 AN4=1 浇水小时校对 AN4=2 浇水秒数高位校对 { if(AN4_CNT==0) //如果AN4没有按下,则是正常的小时校对 { SysHour++; if(SysHour==24) //24小时时候,转化为0点 SysHour=0; } else if(AN4_CNT==1) //如果AN4被按下一次,则是浇水开始时间设置 { Startwatering_HOUR++; if(Startwatering_HOUR==24) //24小时时候,转化为0点 Startwatering_HOUR=0; } else if(AN4_CNT==2) //如果AN4被按下两次,则是浇水时长的高位设置 { WateringTime_H++; if(WateringTime_H==100) //最大是99 WateringTime_H=0; } break; } case 0xfb://AN2:AN4=0 分钟校对 AN4=1 浇水分钟校对 AN4=2 浇水秒数低位校对 { if(AN4_CNT==0) //如果AN4没有按下,则是正常的分钟校对 { SysMinute++; if(SysMinute==60) //分钟达到60,转化为0 SysMinute=0; } else if(AN4_CNT==1) //如果AN4被按下一次,则是浇水分钟设置 { Startwatering_minute++; if(Startwatering_minute==60) //分钟达到60,转化为0 Startwatering_minute=0;
33