有proteus的仿真,還有源程序。
有興趣的朋友可以一起學習!!
0.png (23.66 KB, 下載次數: 119)
下載附件
2017-8-17 18:03 上傳
0.png (55.36 KB, 下載次數: 114)
下載附件
2017-8-17 18:03 上傳
單片機源程序如下:
- #include <reg52.h>
- #include "ds1302.h"
- #include "key.h"
- #define uchar unsigned char
- #define uint unsigned int
- bit WATCH_TIME=1; //數碼管顯示時間標志位,默認情況下顯示時間
- bit WATCH_DATE=0; //數碼管顯示日期標志位
- bit SET_TIME=0; //數碼管顯示調時時的在調時間
- bit SET_DATE=0; //數碼管顯示在調日期
- bit SET_CLOK=0; //數碼管顯示在調鬧鐘的數值
- bit CLK; //開鬧鐘標志位
- sbit led=P2^1;
- sbit wela=P2^2;
- sbit dula=P2^3;
- sbit beef=P2^4;
- sbit tom=P2^0;
- //uchar tab_date[14]="2012-11-06 TUE";//表示年月日星期
- //uchar tab_time[8]="00:00:00";//表示時分秒
- uchar tab_t[6],tab_c[6],tab_d[6],date[6],time[6]; //用來顯示調節時間、鬧鐘、日期時顯示相應數據
- uchar tiao,second;//調時或設置鬧鐘時,相應的時分秒跳動
- uchar code tabdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*共陰極數*/
- uchar code tabwe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
- uchar keyval,tiao=2;
- uchar hour,min,sec;
- uchar year,month,day;
- uchar clkh,clkm,clks;
- void delay(uint t)
- {
- uint x,y;
- for(x=0;x<t;x++)
- for(y=0;y<40;y++);
- }
- //------------------------------------------
- // 數據轉換
- //------------------------------------------
- void trans()
- {
- date[0]=tab_1302[6]/10; //年十位
- date[1]=tab_1302[6]%10; //年個位
- date[2]=tab_1302[4]/10; //月十位
- date[3]=tab_1302[4]%10; //月個位
- date[4]=tab_1302[3]/10; //日十位
- date[5]=tab_1302[3]%10; //日個位
-
- time[0]=tab_1302[2]/10; //小時十位
- time[1]=tab_1302[2]%10; //小時個位
- time[2]=tab_1302[1]/10; //分十位
- time[3]=tab_1302[1]%10; //分個位
- time[4]=tab_1302[0]/10; //秒十位
- time[5]=tab_1302[0]%10; //秒個位
- }
- void Getval(uchar hour1,uchar min1,uchar sec1)
- {
- tab_t[0]=hour1/10;
- tab_t[1]=hour1%10;
- tab_t[2]=min1/10;
- tab_t[3]=min1%10;
- tab_t[4]=sec1/10;
- tab_t[5]=sec1%10;
- }
- void Getdate(uchar year1,uchar month1,uchar day1)
- {
- tab_d[0]=year1/10;
- tab_d[1]=year1%10;
- tab_d[2]=month1/10;
- tab_d[3]=month1%10;
- tab_d[4]=day1/10;
- tab_d[5]=day1%10;
- }
- void clkinit()
- {
- tab_c[0]=2;
- tab_c[1]=4;
- tab_c[2]=0;
- tab_c[3]=0;
- tab_c[4]=0;
- tab_c[5]=0;
- }
- void Getclok()
- {
- tab_c[0]=clkh/10;
- tab_c[1]=clkh%10;
- tab_c[2]=clkm/10;
- tab_c[3]=clkm%10;
- tab_c[4]=clks/10;
- tab_c[5]=clks%10;
- }
- void dsptime() //顯示實時時間
- {
- uchar i;
- led=0;
- for(i=0;i<6;i++)
- {
- P3=tabwe[i];
- P0=tabdu[time[i]];
- delay(5);
- }
- }
- void dspdate() //顯示日期
- {
- uchar i;
- led=1;
- for(i=0;i<6;i++)
- {
- P3=tabwe[i];
- P0=tabdu[date[i]];
- delay(5);
- }
- }
- void setdisp(uchar tab_set[]) //數碼管顯示當前設置相應的數值并跳動
- {
- uchar i;
- for(i=0;i<6;i++)
- {
- switch(tiao)
- {
- case 0:if(i==0||i==1)
- {
- if(second<8)
- {
- P3=tabwe[i];
- P0=tabdu[tab_set[i]];
-
- }
- }
- else
- {
- P3=tabwe[i];
- P0=tabdu[tab_set[i]];
-
- }break;
- case 1:if(i==2||i==3)
- {
- if(second<8)
- {
- P3=tabwe[i];
- P0=tabdu[tab_set[i]];
- }
- }
- else
- {
- P3=tabwe[i];
- P0=tabdu[tab_set[i]];
- }break;
- case 2:if(i==4||i==5)
- {
- if(second<8)
- {
- P3=tabwe[i];
- P0=tabdu[tab_set[i]];
-
- }
- }
- else
- {
- P3=tabwe[i];
- P0=tabdu[tab_set[i]];
-
- }break;
- }
- delay(5);
- }
- }
- void settime() //設置時間
- {
- SET_TIME=1;
- SET_DATE=0;
- WATCH_TIME=0;
- hour=time[0]*10+time[1];
- min=time[2]*10+time[3];
- sec=time[4]*10+time[5];
- while(1)
- {
- keyval=Getkey();
- switch(keyval)
- {
- case KEY_MU:tiao++;tiao=tiao%3;break; //調時
- case KEY_UP:if(tiao==0){hour++;if(hour==24) hour=0;}
- if(tiao==1){min++;if(min==60) min=0;}
- if(tiao==2){sec++;if(sec==60) sec=0;};
- break;
- case KEY_DN:if(tiao==0){hour--;if(hour==255) hour=23;}
- if(tiao==1){min--;if(min==255) min=59;}
- if(tiao==2){sec--;if(sec==255) sec=59;};
- break;
- case KEY_OK:tab1_1302[2]=hour;tab1_1302[1]=min;tab1_1302[0]=sec;ds1302_init();SET_TIME=0;WATCH_TIME=1;tiao=1;return;break;
- case KEY_BK:SET_TIME=0;WATCH_TIME=1;tiao=1;return;
-
- }
- }
- }
- void setdate() //設置日期
- {
- uchar keyval;
- SET_TIME=0;
- SET_DATE=1;
- WATCH_DATE=0;
- year=date[0]*10+date[1];
- month=date[2]*10+date[3];
- day=date[4]*10+date[5];
- while(1)
- {
- keyval=Getkey();
- switch(keyval)
- {
- case KEY_MU:tiao++;tiao=tiao%3;break;
- case KEY_UP:if(tiao==0){year++;if(year==100) year=0;}
- if(tiao==1){month++;if(month==13) month=0;}
- if(tiao==2){day++;if(day==32) day=0;};
- break;
- case KEY_DN:if(tiao==0){year--;if(year==255) year=99;}
- if(tiao==1){month--;if(month==0) month=12;}
- if(tiao==2){day--;if(day==0) day=31;};
- break;
- case KEY_OK:tab1_1302[6]=year;tab1_1302[4]=month;tab1_1302[3]=day;
- ds1302_init();SET_DATE=0;WATCH_TIME=1;tiao=2;led=0;return;
- break;
- case KEY_BK:SET_DATE=0;WATCH_TIME=1;tiao=2;led=0;return;
-
- }
- }
- }
- void setclok() //設置鬧鐘
- {
- clkh=tab_c[0]*10+tab_c[1];
- clkm=tab_c[2]*10+tab_c[3];
- clks=tab_c[4]*10+tab_c[5];
- SET_CLOK=1;
- tiao=0;
- while(1)
- {
- keyval=Getkey();
- switch(keyval)
- {
- case KEY_MU:tiao++;tiao=tiao%2;break;
- case KEY_UP:if(tiao==0){clkh++;if(clkh>=24) clkh=0;}
- if(tiao==1){clkm++;if(clkm==60) clkm=0;};
- break;
- case KEY_DN:if(tiao==0){clkh--;if(clkh==255) clkh=23;}
- if(tiao==1){clkm--;if(clkm==255) clkm=59;};
- break;
- case KEY_OK:SET_CLOK=0;WATCH_TIME=1;CLK=1;tiao=1;return;break;
- case KEY_BK:clkh=24;clkm=0;clks=0;SET_CLOK=0;CLK=0;WATCH_TIME=1;tiao=1;return;
-
- }
- }
- }
- void smg()
- {
- if(WATCH_TIME)
- dsptime(); //顯示時間
- else if(WATCH_DATE)
- dspdate(); //顯示日期
- else if(SET_TIME)
- {
- Getval(hour,min,sec);
- setdisp(tab_t); //顯示在調時間
- }
- else if(SET_DATE)
- {
- Getdate(year,month,day);
- setdisp(tab_d); //顯示在調日期
- }
- else if(SET_CLOK)
- {
- Getclok();
- setdisp(tab_c); //顯示在調鬧鐘
- }
- }
- void dealkey(uchar key)
- {
- switch(key)
- {
- case KEY_MU:if(WATCH_DATE)
- {
- led=1;
- setdate();
- }
- else
- settime();
- break;
- case KEY_CK:WATCH_TIME=0;WATCH_DATE=0;setclok();break;
- case KEY_TD:WATCH_TIME=~WATCH_TIME;WATCH_DATE=~WATCH_DATE;break;//時間與日期的切換
- }
- }
- void feng()//鬧鐘
- {
- if(clkh==tab_1302[2]&&clkm==tab_1302[1])
- tom=0;
- if(KEY_CK==Getkey())
- {
- tom=1;
- CLK=0;
- }
- }
- void main()
- {
- uchar num;
- TMOD=0X01; //T0工作方式1
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256; //10毫秒中斷一次
- EA=1;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于單片機的電子時鐘仿真.7z
(43.07 KB, 下載次數: 71)
2017-8-17 16:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|