|
學習單片機有一段時間了,除了做幾個時鐘當個擺設好像也沒什么作品了。家里有些電器充電時間不能太長,如現在的手機有閃充功能的一般100分鐘就能充滿電。這樣在晚上睡覺時讓手機滿血復活好像就有了困難(以前用的手機晚上總要充一晚上)。隨想做個定時插座吧,就在做單片機數碼管時鐘的基礎上改進。由于初始功能還不太完善,特意外接了串口下載接口! 本以為有現成裝單片機的電路板能省點焊接功夫,沒想到要改線路造成很多飛線,所以看起來很亂。還不如用洞洞板好!
運行過程:上電顯示12:00---通過調時,調分按鍵設定時間---啟動---開始倒計時,繼電器吸合通電(運行中按鍵失效)---時間到繼電器斷開,數碼管閃爍
1.jpg (276.27 KB, 下載次數: 122)
下載附件
2017-4-23 15:41 上傳
2.jpg (243.49 KB, 下載次數: 102)
下載附件
2017-4-23 15:41 上傳
3.jpg (253.37 KB, 下載次數: 100)
下載附件
2017-4-23 15:41 上傳
4.jpg (202.81 KB, 下載次數: 108)
下載附件
2017-4-23 15:41 上傳
5.jpg (197.79 KB, 下載次數: 106)
下載附件
2017-4-23 15:41 上傳
6.jpg (172.22 KB, 下載次數: 102)
下載附件
2017-4-23 15:41 上傳
單片機源程序:
- /********************************************************
- *********************************************************
- *********** 可編程定時插座 *****************
- *********** 初次完成程序日期:2017、3、28 ******
- 程序:上電-K1,K2按鍵進行時分調整-K3啟動(啟動后按鍵將無效)
- -繼電器閉合通電-開始倒計時- 倒計時結束繼電器斷開-完成周期
- ********************************************************/
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit s1=P3^2;
- sbit s2=P3^3;
- sbit s3=P3^4; // 定義位使用端口 1,2,3,4段
- sbit s4=P3^5;
- sbit jd=P2^0; // 繼電器端口
- sbit k1=P1^1; // 調時
- sbit k2=P1^2; // 調分
- sbit k3=P1^3; // 啟動
- sbit GGD=P1^0; // 按鍵公共端
- uchar code mum[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 段碼0~9
- uchar code display1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf} ;
- uchar code display2[]={0xfe,0xbf,0xf7,0xbf,0xfe,0xbf,0xf7,0xbf} ;
- uchar code display3[]={0xcf,0xf9,0xcf,0xf9,0xcf,0xf9} ;
- uchar code display4[]={0xfe,0xdf,0xef,0xf7,0xfb,0xfd} ;
- char sec=59,min=0,hour=12; // 定義全局變量 有符號字符型
- uint cnt;
- /***************************************************************************
- *************** 函數名:delay ****************************
- *************** 函數功能:延時函數 ****************************
- *************** 輸入: ****************************
- 輸出:
- ***************************************************************************/
- void delay(uchar x) // 延時函數
- {
- uchar i,j;
- for(;x>0;x--)
- for(i=20;i>0;i--)
- for(j=2;j>0;j--);
- }
- void delay1(uint x)
- {
- uchar i,j;
- for(;x>0;x--)
- for(i=20;i>0;i--)
- for(j=200;j>0;j--);
- }
- void shuma()
- {
- uchar a,b,n,m,j,k;
- s1=1;
- s2=1;
- s3=1;
- s4=0;
- while(1)
- {
-
- for(a=0;a<6;a++)
- {
- for(n=0;n<6;n++)
- {
- P0=display1[n];
- delay1(15);
- }
- }
- for(m=0;m<8;m++)
- {
- P0=display2[m];
- delay1(100);
- }
- for(j=0;j<6;j++)
- {
- P0=display3[j];
- delay1(30);
- }
- for(b=0;b<6;b++)
- {
- for(k=0;k<6;k++)
- {
- P0=display4[k];
- delay1(15);
- }
- }
-
-
- }
- }
- /***************************************************************************
- *************** 函數名:timeyx ****************************
- *************** 函數功能:時鐘運行 ****************************
- *************** 輸入: ****************************
- 輸出:
- ***************************************************************************/
- void timeyx() // 時鐘運行
- {
- GGD=1; // 按鍵公共端置高電平,運行中按鍵無效
- sec--;
- if(sec<0)
- {
- sec=59;
- min--;
- if(min<0)
- {
- min=59;
- hour--;
-
- }
- }
- }
- /***************************************************************************
- *************** 函數名:stop ****************************
- *************** 函數功能:繼電器斷開 ****************************
- *************** 輸入: ****************************
- 輸出:
- ***************************************************************************/
- void stop() // 時間到繼電器斷開
- {
- if(hour==0&&min==0) // 判斷時分為0時
- {
- TR0=0; // 定時器停止
-
- jd=1;
- shuma(); // 繼電器斷開
- }
- }
-
- /***************************************************************************
- *************** 函數名:display ****************************
- *************** 函數功能:數碼管顯示 ****************************
- *************** 輸入: ****************************
- 輸出:
- ***************************************************************************/
- void display(uchar zm,uchar zh) // 顯示函數
- {
-
-
-
- P0=mum[zm%10];
- s1=0;
- delay(10);
- s1=1 ;
-
- P0=mum[zm/10];
- s2=0;
- delay(10);
- s2=1;
-
- P0=mum[zh%10];
- if(cnt>2000) // 小數點閃爍
- P0&=0x7f; // 增加小數點顯示
- s3=0;
- delay(10);
- s3=1;
-
- P0=mum[zh/10];
- s4=0;
- delay(10);
- s4=1 ;
- }
- /***************************************************************************
- *************** 函數名:timeset ****************************
- *************** 函數功能:時間設置 ****************************
- *************** 輸入: ****************************
- 輸出:
- ***************************************************************************/
- void timeset() // 時間設置
- {
- if(k1==0)
- {
- delay(50);
- if(k1==0)
- {
- hour--;
- if(hour<0)
- {
- hour=12;
-
- }
- while(k1==0)
- display(min,hour);
- }
- }
- if(k2==0)
- {
- delay(10);
- if(k2==0)
- {
- min--;
-
- if(min<0)
- {
- min=59;
- hour--;
-
- }
-
- while(k2==0)
- display(min,hour);
-
- }
- }
-
- display(min,hour);
-
-
- }
- /***************************************************************************
- *************** 函數名:main ****************************
- *************** 函數功能:主函數 ****************************
- *************** 輸入: ****************************
- 輸出:
- ***************************************************************************/
- void main()
- {
-
- uchar end=1; // 時間預設單次循環
- TMOD=0x02; // 模式2 8位自動重裝定時器
- TH0=0x06;
- TL0=0x06;
- EA=1;
- ET0=1;
- GGD=0; // 按鍵公共端
- jd=1; // 繼電器關閉
- TR0=0;
- P3=0xff;
- while(1)
- {
-
- timeset();
- stop();
-
- while(end) //上電未按K3啟動前一直在循環 達到預設目的
- {
-
- timeset();
- if(k3==0)
- {
- delay(20);
- if(k3==0)
- {
- TR0=1;
- jd=0;
- end=0;
- }
- while(k3==0);
- }
-
-
- }
- }
- }
- …………限于本文篇幅 余下代碼請從51黑電子論壇下載附件…………
復制代碼
下載:
源代碼.rar
(1.9 KB, 下載次數: 101)
2017-4-23 12:12 上傳
點擊文件名下載附件
源代碼 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|