|
|
節(jié)能時(shí)控器,根據(jù)每日供電波峰,波谷,定時(shí)用電。節(jié)能,降低用電成本。C51-AT89C2051 程序
源碼:
569417381jsnk.rar
(2.29 KB, 下載次數(shù): 15)
2016-4-6 18:24 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
- #include <AT89x051.H> //器件配置文件
- #define uchar unsigned char //變量類(lèi)型的宏定義
- #define uint unsigned int
- uchar DATA_7SEG[10]={0xfc,0x60,0xda,0xf2,0x66,
- 0xb6,0xbe,0xe0,0xfe,0xf6}; /*0~9的數(shù)碼管段碼*/
- uchar x[4]; /* 存放走時(shí)的數(shù)組*/
- uchar y[4]={0,0,0,0}; /* 存放定時(shí)1的數(shù)組*/
- uchar z[4]={0,0,0,0}; /* 存放定時(shí)2的數(shù)組*/
- uchar act[4]={0xfe,0xfd,0xfb,0xf7}; /*四位數(shù)碼管的位選碼*/
- void delay(uint k); //延時(shí)子函數(shù)聲明
- void conv(); //走時(shí)轉(zhuǎn)換子函數(shù)聲明
- void p_out(); //判別定時(shí)到否子函數(shù)聲明
- void p_out1(); //判別定時(shí)到否子函數(shù)1聲明
- void t_adj(); //走時(shí)調(diào)整子函數(shù)聲明
- uchar deda=0; /*100mS計(jì)數(shù)單元清零*/
- bit d_05s=0; /*0.5秒標(biāo)志*/
- bit o_f1=0; /*定時(shí)1啟/停標(biāo)志*/
- bit o_f2=0; /*定時(shí)2啟/停標(biāo)志*/
- uchar set=0; /*功能鍵標(biāo)志*/
- uchar h=0;
- uchar n=0;
- uchar m=0;
- uchar flag;
- uchar left=0;
- uchar sec=0;
- uchar min=0;
- uchar hour=0;
- uchar min1=0;
- uchar hour1=0;
- uchar min2=0;
- uchar hour2=0;
- uchar up=0;
- bit flag1=0;
- bit flag2=0;
- /*顯示走時(shí)*/
- void time()
- {
- for(h=0;h<4;h++)
- {P1=DATA_7SEG[x[h]]; //輸出數(shù)碼管的字形碼
- P3=act[h];p_out(); //輸出數(shù)碼管的位碼。判斷輸出
- if(P3_2==0){if(d_05s==1)P1_0=1;else P1_0=0;} /* 百位數(shù)碼管點(diǎn)亮?xí)r,控制小數(shù)點(diǎn)
- (秒點(diǎn))閃爍*/
- delay(2);} //每位數(shù)碼管點(diǎn)亮2ms
- if(o_f1==1){P1=0x01;P3_3=1;P3_2=1;P3_1=0;P3_0=1;}/* 若定時(shí)1啟動(dòng),
- 點(diǎn)亮十位數(shù)碼管小數(shù)點(diǎn)*/
- else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否則十位數(shù)碼管
- 小數(shù)點(diǎn)不亮*/
- delay(2);
- if(o_f2==1){P1=0x01;P3_3=1;P3_2=1;P3_1=1;P3_0=0;} /* 若定時(shí)2啟動(dòng),
- 點(diǎn)亮個(gè)位數(shù)碼管小數(shù)點(diǎn)*/
- else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否則個(gè)位數(shù)碼管
- 小數(shù)點(diǎn)不亮*/
- delay(2);
- }
- /*定時(shí)器T0初始化*/
- void init_timer0()
- {
- TMOD=0x11;
- TH0=-(50235/256);
- TL0=-(50235%256);
- IE=0x8a;
- TR0=1;
- }
- /*定時(shí)器T1初始化*/
- void init_timer1()
- {
- TH1=-(5000/256);
- TL1=-(5000%256);
- }
- /*延時(shí)k*1ms子函數(shù)*/
- void delay(uint k)
- {
- uint i,j;
- for(i=0;i<k;i++){
- for(j=0;j<60;j++)
- {;}}
- }
- /*100mS定時(shí)中斷服務(wù)子函數(shù)*/
- void zd0(void) interrupt 1
- {
- TH0=-(50235/256); //重裝100ms定時(shí)初值
- TL0=-(50235%256);
- deda++; //100ms計(jì)時(shí)單元遞增
- }
- /*10mS定時(shí)中斷服務(wù)子函數(shù)*/
- void zd1(void) interrupt 3
- {uchar i,j;i=P1;j=P3;
- TH1=-(5000/256);
- TL1=-(5000%256);
- if(m==1)n++;
- if(n>=30){n=0;m=0;}
- P3_7=0;
- P1=0xff;
- if(P1!=0xff)
- {
- if(n==0)m=1;
- {if(n==1)
- {
- if(P1_0==0){set++;left=0;}
- if(set>=4)set=0;
- if(set==1)flag=0x55;
- if(P1_1==0)left++;
- if(left>=4)left=0;
- if(P1_2==0){up++;
- switch(left)
- {
- case 0:{if(up>=10)up=0;}break;
- case 1:{if(up>=6)up=0;}break;
- case 2:{if(up>=10)up=0;}break;
- case 3:{if(up>=3)up=0;}break;
- default:break;
- }
- }
- if(P1_2==0){
- switch(set)
- {case 0:break;
- case 1:x[left]=up;break;
- case 2:{y[left]=up;if(P1_3==0)o_f1=!o_f1;}break;
- case 3:{z[left]=up;if(P1_3==0)o_f2=!o_f2;}break;
- default:break;}
- }
- else {
- switch(set)
- {case 0:break;
- case 1:up=x[left];break;
- case 2:{up=y[left];if(P1_3==0)o_f1=!o_f1;}break;
- case 3:{up=z[left];if(P1_3==0)o_f2=!o_f2;}break;
- default:break;}
- }}
- }}
- P1=i;P3=j;
- }
- /*顯示調(diào)整走時(shí)*/
- void t_adj()
- {p_out1();
- for(h=0;h<4;h++) //四位數(shù)碼管每位點(diǎn)亮3ms
- {if(h==left)P1=0x00;
- else {P1=DATA_7SEG[x[h]];
- P3=act[h];p_out();
- delay(3);}}
- P1=DATA_7SEG[up];P3=act[left];
- hour=x[3]*10+x[2];min=x[1]*10+x[0];
- p_out();
- delay(12); //需調(diào)整的數(shù)碼管點(diǎn)亮12ms
- if(o_f1==1){P1=0x01;P3_3=1;P3_2=1;P3_1=0;P3_0=1;} /*若定時(shí)1啟動(dòng),
- 點(diǎn)亮十位數(shù)碼管小數(shù)點(diǎn)*/
- else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否則十位數(shù)碼管
- 小數(shù)點(diǎn)不亮*/
- delay(12); //需調(diào)整的數(shù)碼管點(diǎn)亮12ms
- if(o_f2==1){P1=0x01;P3_3=1;P3_2=1;P3_1=1;P3_0=0;} /*若定時(shí)2啟動(dòng),
- 點(diǎn)亮個(gè)位數(shù)碼管小數(shù)點(diǎn)*/
- else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否則個(gè)位數(shù)碼管
- 小數(shù)點(diǎn)不亮*/
- delay(12); //需調(diào)整的數(shù)碼管點(diǎn)亮12ms
- }
- /*顯示調(diào)整定時(shí)1*/
- void t1_adj()
- {p_out1();
- for(h=0;h<4;h++) //四位數(shù)碼管每位點(diǎn)亮3ms
- {if(h==left)P1=0x00;
- else {P1=DATA_7SEG[y[h]];
- P3=act[h];p_out();
- delay(3);}}
- P1=DATA_7SEG[up];P3=act[left]; //需調(diào)整的數(shù)碼管點(diǎn)亮18ms
- hour1=y[3]*10+y[2];min1=y[1]*10+y[0];
- p_out();
- delay(18);
- if(o_f1==1){P1=0x01;P3_3=0;P3_2=1;P3_1=0;P3_0=1;} /*若定時(shí)1啟動(dòng),
- 點(diǎn)亮十位數(shù)碼管小數(shù)點(diǎn)*/
- else{P1=0x01;P3_3=0;P3_2=1;P3_1=1;P3_0=1;} /*否則十位數(shù)碼管
- 小數(shù)點(diǎn)不亮*/
- p_out();
- delay(18); //需調(diào)整的數(shù)碼管點(diǎn)亮18ms
- }
- /*顯示調(diào)整定時(shí)2*/
- void t2_adj()
- {p_out1();
- for(h=0;h<4;h++) //四位數(shù)碼管每位點(diǎn)亮3ms
- {if(h==left)P1=0x00;
- else {P1=DATA_7SEG[z[h]]; //需調(diào)整的數(shù)碼管點(diǎn)亮18ms
- P3=act[h];p_out();
- delay(3);}}
- P1=DATA_7SEG[up];P3=act[left];
- hour2=z[3]*10+z[2];min2=z[1]*10+z[0];
- p_out();
- delay(18);
- if(o_f2==1){P1=0x01;P3_3=1;P3_2=0;P3_1=1;P3_0=0;} /*若定時(shí)2啟動(dòng),
- 點(diǎn)亮個(gè)位數(shù)碼管小數(shù)點(diǎn)*/
- else{P1=0x01;P3_3=1;P3_2=0;P3_1=1;P3_0=1;} /*否則個(gè)位數(shù)碼管
- 小數(shù)點(diǎn)不亮*/
- p_out();
- delay(18); //需調(diào)整的數(shù)碼管點(diǎn)亮18ms
- }
- /*時(shí)、分、秒計(jì)時(shí)單元轉(zhuǎn)換*/
- void conv()
- {
- if(deda<=5)d_05s=0; //每500ms,秒點(diǎn)取反
- else d_05s=1;
- if(deda>=10){sec++;deda=0;} //每1000ms,秒單元遞增
- if(sec>=60){min++;sec=0;} //每60s,分單元遞增
- if(min>=60){hour++;min=0;} //每60m,時(shí)單元遞增
- if(hour>=24){hour=0;} //每24h,時(shí)單元清零
- }
- /*判別定時(shí)到否子函數(shù)*/
- void p_out()
- {
- if(o_f1==1) //若定時(shí)1啟動(dòng)
- {if(hour==hour1) //定時(shí)1時(shí)間到
- {if(min==min1)
- {flag1=1;if(d_05s==1)P3_4=0;else P3_4=1;}}} //繼電器輸出標(biāo)志置1,蜂鳴器間斷鳴響
- if(flag1==1) P3_5=0; //若輸出標(biāo)志為1,繼電器吸合
- if(o_f2==1) //若定時(shí)2啟動(dòng)
- {if(hour==hour2) //定時(shí)2時(shí)間到
- {if(min==min2)
- {flag1=0;if(d_05s==1)P3_4=0;else P3_4=1;}}} //繼電器輸出標(biāo)志置0,蜂鳴器間斷鳴響
- if(flag1==0) P3_5=1; //若輸出標(biāo)志為0,繼電器釋放
- }
- /*判別定時(shí)到否子函數(shù)1*/
- void p_out1()
- {
- if(o_f1==1) //若定時(shí)1啟動(dòng)
- {if(hour==hour1) //定時(shí)1時(shí)間到
- {if(min==min1)
- {flag1=1;}}} //繼電器輸出標(biāo)志置1
- if(flag1==1) P3_5=0; //若輸出標(biāo)志為1,繼電器吸合
- if(o_f2==1) //若定時(shí)2啟動(dòng)
- {if(hour==hour2) //定時(shí)2時(shí)間到
- {if(min==min2)
- {flag1=0;}}} //繼電器輸出標(biāo)志置0
- if(flag1==0) P3_5=1; //若輸出標(biāo)志為0,繼電器釋放
- }
- /*主函數(shù)*/
- void main()
- {
- init_timer0(); /*定時(shí)器T0初始化*/
- init_timer1(); /*定時(shí)器T1初始化*/
-
- while(1)
- {
- /*將顯示緩沖數(shù)組內(nèi)容移到時(shí)、分計(jì)時(shí)單元*/
- hour=x[3]*10+x[2];min=x[1]*10+x[0];
- hour1=y[3]*10+y[2];min1=y[1]*10+y[0];
- hour2=z[3]*10+z[2];min2=z[1]*10+z[0];
- conv(); /*時(shí)、分、秒及100mS單元轉(zhuǎn)換*/
- /*將轉(zhuǎn)換后的時(shí)、分計(jì)時(shí)單元內(nèi)容移到顯示緩沖數(shù)組*/
- x[3]=hour/10;x[2]=hour%10;x[1]=min/10;x[0]=min%10;
- y[3]=hour1/10;y[2]=hour1%10;y[1]=min1/10;y[0]=min1%10;
- z[3]=hour2/10;z[2]=hour2%10;z[1]=min2/10;z[0]=min2%10;
- switch(set)
- {
- case 0:time();break;/*顯示走時(shí)*/
- case 1:t_adj();break;/*顯示調(diào)整走時(shí)*/
- case 2:t1_adj();break;/*顯示調(diào)整定時(shí)1*/
- case 3:t2_adj();break;/*顯示調(diào)整定時(shí)2*/
- default:break;
- }
- if(flag!=0x55) /*判斷RAM受干擾標(biāo)志,若受干擾,
- 則顯示器閃爍告警*/
- {uchar i;P3_4=1;P3_5=1;
- for(i=0;i<100;i++) /*點(diǎn)亮顯示器200mS*/
- {
- P1=DATA_7SEG[x[3]];P3=0xf7;delay(1);
- P1=DATA_7SEG[x[2]];P3=0xfb;delay(1);
- P1=DATA_7SEG[x[1]];P3=0xfd;delay(1);
- P1=DATA_7SEG[x[0]];P3=0xfe;delay(1);
- }
-
- P1=0xff;P3=0xff;delay(400); /*熄滅顯示器200mS*/
- P3_7=0;
- /*如有鍵按下達(dá)0.5S則退出閃爍狀態(tài)同時(shí)掉電標(biāo)志置55H。*/
- if(P1!=0xff){
- delay(10);if(P1_0==0)flag=0x55;F0:if(P1!=0xff)goto F0;
- }P3_7=1;
- }
- else TR1=1;/*啟動(dòng)定時(shí)器1*/
- }}
復(fù)制代碼
|
|