2018年的春節是一個很特別的一段時光,留在外地沒有回老家過年。其實一開始也過得很是無聊,天天睡到自然醒——看看電視、玩玩游戲——隨便無規律的吃點。呵呵……就這樣任性的墮落。
俗話說得好啊!就是有龍肉,天天讓你吃也會膩。看來賤命一條,沒幾天就實在過不了這種孤單寂寞冷的日子。出門走走逛逛花市打發打發無聊的時光。真是江湖之大各有各的特色,在老家親朋好友相互走訪熱鬧非凡;在花市五彩繽紛花香飄逸,熙熙攘攘、人流如潮。其實我很清楚我此行上目的,就是走走散散心別無他求。此情此景渲染,蠢蠢欲動實在按耐不住開心剁手的節奏購買幾盤心儀的盤栽。
沖動是魔鬼啊!怎么剁手前沒想到自個兒的工作性質呢!!時常浪蕩周游不定的去處不定的歸期,這些需要悉心料理的盤栽看來只能面對不久將來缺水遭殃的杯具。忽然靈光一動,怎么不想個辦法制作一自動澆花的系統呢?阿三一言不合就開掛,對理工男來說像是忽然抓到了一根救命的稻草,心動不如行動,翻箱倒柜的找出塵封已久的單片機開發板及電子元件和工具。重新給電腦安裝開發工具和各種硬件驅動。最苦的是沒有水泵啊!!!此時此刻各位快遞小哥都已歡度春節,奈何求助寶寶網、東東網、當當網……都不是明智之舉吖!事實再次證明男人成功的背后一定有位強大女人,此時我背后有位美貌與智慧并存女朋友拉著說要去買金魚,不說魚好不好看,哈哈……反正沒興趣。開心的是我在此處卻意外的發現了讓我剛才還揪心物拾,真的沒想到這里會有微型水泵哞!一切準備就緒了,只差后面東風吹又生了。準備買好魚回去發力吧!
無聊墮落的時光不復存在,將來迎來激情滿滿的充實有意思的快樂時光。畢業后放手已久對單片機的操作已打得林丁破碎,還好就是激情尚在,通過數天的編寫調試,最終將設想的目標達成。
通過8位數碼管來顯示時鐘的時分秒信息,再通過8位獨立按鍵來實現時分秒的校正,然后通過1位繼電器的隔離輸出去控制水泵抽水噴淋花花草草。
完整的程序代碼如下,僅供參考學習,也歡迎各位大神指點完善。感謝、感謝、十分感謝!
/*
1、在HC6800EM3實驗板上實現數碼管的動太掃描顯示24小時時鐘;采用獨立鍵盤來修改校正時鐘,K1為小時加,K5為小時減,
K2為分鐘加,K6為分鐘減,K3為秒鐘加,K7為秒鐘減,K4為定時器中斷停止,K8為定時器中斷啟動。
2、接線為P0口接到J12,P2口接到J16,P1口接到JP5,P3.0口接繼電器輸出,再通過觸點控制水泵工作;
3、主要功能之一是時鐘顯示;第二功能是跟據花卉的澆水需求,將澆水時間設定為每隔五天的早上6:30:00開始澆水6:30:30停止澆水;
4、實驗時間:2018年2月22日;
*/
#include<reg52.h>
sbit relay=P3^0;
unsigned char code position[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //數碼管位選
unsigned char code paragraph[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極數碼管段選
// 0 1 2 3 4 5 6 7 8 9
void display(); //顯示函數申明
void initialize(); //初始化函數申明
void delay_ms(unsigned char time); //延時函數申明
void delay_us(unsigned char time); //延時函數申明
void key_scan(); //鍵盤掃描函數申明
void relay_out(); //繼電器控制輸出函數申明
unsigned char day,hour,minute,second,temporary,hour_SW,hour_GW, //定義全局變量
minute_SW,minute_GW,second_SW,second_GW;
void main() //主程序
{
initialize();
while(1)
{
key_scan();
relay_out();
display();
}
}
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;
}
}
}
}
}
|