void display() //8位数码管显示函数
{
second_SW=second/10;
second_GW=second%10;
minute_SW=minute/10;
minute_GW=minute%10;
hour_SW=hour/10;
hour_GW=hour%10;
P2=position[0]; //秒钟位选
P0=paragraph[second_GW];
delay_us(150); //150时显示比较稳定
P2=position[1];
P0=paragraph[second_SW];
delay_us(150);
P2=position[2];
P0=0x40;
delay_us(150);
P2=position[3]; //分钟位选
P0=paragraph[minute_GW];
delay_us(150);
P2=position[4];
P0=paragraph[minute_SW];
delay_us(150);
P2=position[5];
P0=0x40;
delay_us(150);
P2=position[6]; //时钟位选
P0=paragraph[hour_GW];
delay_us(150);
P2=position[7];
P0=paragraph[hour_SW];
}
void timer_1() interrupt 1 //定时器中断函数,定时器0、中断1
{
TH0=(65536-50000)/256; //每次进入中断程序时重新装初值。计时50ms
TL0=(65536-50000)%256;
temporary++;
if(temporary==20)
{
temporary=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
day++;
}
}
}
}
}
void initialize() //初始化函数
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-50000)/256; //(16位的最大值-需要定时的长度)/256; 此计算将求得的整数部份放到
//高8位,意思为求模。
TL0=(65536-50000)%256; //(16位的最大值-需要定时的长度)/256; 此计算将求得的余数部份放到
//低8位,意思为求余。
EA=1; //开总中断。
ET0=1; //开定时器0中断。
TR0=1; //启动定时器0
hour=0; hour_SW=0; hour_GW=0;
minute=0; minute_SW=0; minute_GW=0;
second=0; second_SW=0; second_GW=0;
temporary=0;
}
void delay_ms(unsigned char time) //当i=X时为Xms的延时程序。
{
unsigned char a,b;
for(time;time>0;time--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void delay_us(unsigned char time) //数码管扫描延时程序。
{
unsigned char a,b;
for(time;time>0;time--)
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void key_scan() //独立键盘扫描函数
{
unsigned char keyboard;
keyboard=P1;
if(keyboard!=0xff)
{
delay_ms(10);
if(keyboard!=0xff)
{
switch(keyboard)
{
case 0xfe:hour++; //K1按键,用于小时校正 加加
if(hour==24)
{
hour=0;
day++;
}
break;
case 0xef:hour--; //K5按键,用于小时校正 减减
if(hour==0)
{
hour=23;
day--;
if(day<=0) day=0;
}
break;
case 0xfd:minute++; //K2按键,用于分钟校正 加加
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
day++;
}
}
break;
case 0xdf:minute--; //K6按键,用于分钟校正 减减
if(minute==0)
{
minute=59;
hour--;
if(hour==0)
{
hour=23;
day--;
if(day<=0) day=0;
}
}
break;
case 0xfb:second++; //K3按键,用于秒钟校正 加加
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
day++;
}
}
}
break;
case 0xbf:second--; //K7按键,用于秒钟校正 减减
if(second==0)
{
second=59;
minute--;
if(minute==0)
{
minute=59;
hour--;
if(hour==0)
{
hour=23;
day--;
if(day<=0) day=0;
}
}
}
break;
case 0xf7: TR0=0; break; //K4按键,用于在校正时间时停止定时器中断
case 0x7f: TR0=1; break; //K8按键,用于在校正时间后激活启动定时器中断
default:P1=0xff;
}
}
}
keyboard=P1 ;
while(!keyboard);
delay_ms(10);
while(!keyboard);
}
void relay_out() //断电器输出控制水泵抽水浇花,当前设定为每隔5天浇水30秒。
{
if(day==5)
{
if(hour==6)
{
if(minute==30)
{
relay=0;
if(second==30)
{
relay=1;
day=0;
}
}
}
}
}
相关知识
基于51单片机的自动浇花灌溉系统设计
基于51单片机土壤湿度检测及自动浇花系统
基于51单片机的智能浇花系统设计
基于单片机原理的可定时自动浇花器
毕业设计 基于51单片机自动智能浇花系统设计
基于51单片机的智能浇花系统
基于51单片机控制的自动浇水系统设计
(毕业设计资料)基于51单片机控制的自动浇水系统设计
【51毕业设计案例】【015】智能浇花灌溉系统
基于单片机士壤湿度检测及自动浇花系统
网址: 基于51单片机自动定时浇花程序 https://m.huajiangbk.com/newsview403465.html
上一篇: 一种自动定时植物浇水装置的制作方 |
下一篇: 用5个塑料瓶自制自动浇水系统 |