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