1.數(shù)碼管顯示
2.時間和日期每隔5秒自動切換一次
3.數(shù)碼管顯示
4.可設置時間和日期
5.矩陣按鍵控制,可更改
6.自動判斷閏年
1.按下切換按鍵可切換當前顯示時間還是日期
2.按下設置按鍵進入時間和日期的設置,設置哪一項,哪一項下面就會出現(xiàn)兩個點
3.再次按下設置按鍵即可推出設置繼續(xù)運行
4.自動判斷閏年
5.日期更正(比如當前為5月31日,當切換月份時,切換到6月,則天數(shù)自動由31改為30)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
~IRRB}@UJ68L~X`5H79Z[[8.png (64.06 KB, 下載次數(shù): 91)
下載附件
2020-6-29 12:13 上傳
單片機源程序如下:
- #include <reg52.h>
- sbit key0 = P3^0; //年份 時間 切換
- sbit key1 = P3^1; //設置
- sbit key2 = P3^2; //增加
- sbit key3 = P3^3; //減少
- sbit led0 = P3^7; //時間日期設置指示燈
- sbit led1 = P3^6; // 正常運行指示燈
- sbit led2 = P3^5; // 當前為時間指示燈
- sbit led3 = P3^4; // 閏年指示燈
- sbit s1 = P0^0;
- sbit s2 = P0^1;
- sbit s3 = P0^2;
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uint smg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00,
- 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
- uchar time[8],date[8];
- int year = 2020;
- char month=6,day=28,hour=18,min=22,s=0;
- uchar t=0; //日期和時間切換控制變量
- void delay(uint i); //延時函數(shù)
- void smg_show(char num_[]); //數(shù)碼管顯示函數(shù)
- int keyscan(); //矩陣按鍵掃描函數(shù)
- void data_edit(); //數(shù)碼管數(shù)據(jù)編輯函數(shù)
- char year_judge(); //閏年判斷函數(shù)
- void relationship(); //日期時間關系編輯函數(shù)
- void set_time(uchar change); //時間日期設置函數(shù)
- void Timer0Init(); //定時器0初始化函數(shù)
- void main()
- {
- uchar key;
- uchar change=0; //為1,顯示日期 為0,顯示時間
- Timer0Init(); //定時器0初始化
- led1 = 0; //正常運行指示燈
- year_judge();
- //led3 = 0;
- while(1)
- {
- key = keyscan(); //掃描矩陣按鍵
- if(t==5)
- {
- change = ~change;
- t = 0;
- }
-
- if(change)led2 = 1;
- else led2 = 0;
- if(key == 0)
- {
- led1 = 1;
- set_time(change); //時間日期設置函數(shù)
- led1 = 0;
- }
- if(key == 1)
- {
- change = ~change;
- t = 0;
- }
-
-
- relationship(); //時間日期關系控制
- data_edit();//數(shù)碼管參數(shù)編輯函數(shù)
- if(s%2)
- {
- time[2] = 11;
- time[5] = 11;
- }
- if(change)
- smg_show(date); //數(shù)碼管顯示函數(shù)
- else
- smg_show(time); //數(shù)碼管顯示函數(shù)
-
- }
- }
- /*****************************************
- 延時函數(shù)
- *****************************************/
- void delay(uint x)
- {
- uchar y;
- for(x;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*****************************************
- 數(shù)碼管顯示函數(shù)
- *****************************************/
- void smg_show(char num_[])
- {
- char i=0;
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case 0:
- s3 = 0;s2 = 0;s1 = 0;break;
- case 1:
- s3 = 0;s2 = 0;s1 = 1;break;
- case 2:
- s3 = 0;s2 = 1;s1 = 0;break;
- case 3:
- s3 = 0;s2 = 1;s1 = 1;break;
- case 4:
- s3 = 1;s2 = 0;s1 = 0;break;
- case 5:
- s3 = 1;s2 = 0;s1 = 1;break;
- case 6:
- s3 = 1;s2 = 1;s1 = 0;break;
- case 7:
- s3 = 1;s2 = 1;s1 = 1;break;
- }
- P1=~smg[num_[i]];
- delay(10);
- P1=0xff;
- delay(10);
-
- }
- }
- /*****************************************
- 矩陣按鍵函數(shù)
- *****************************************/
- int keyscan()
- {
- uchar i,j=0;
- uchar d = 50;
- uint k = 0xff;
- P2 = 0XF0;
- if((P2&0xf0)==0xf0)
- return k;
- if((P2&0xf0)==0xf0)
- return k;
- for(i=0;i<4;i++)
- {
- P2=~(1<<i);
- k=(P2&0xf0);
- if(k!=0xf0)
- {
- while((k&(1<<(j+4))))
- j++;
- k = i*4+j;
- P2 = 0xf0;
- while(P2!=0xf0);
-
- break;
- }
- }
- return k;
- }
- /*****************************************
- 數(shù)據(jù)編輯函數(shù)函數(shù)
- *****************************************/
- void data_edit()
- {
- time[0] = hour/10;
- time[1] = hour%10;
- time[2] = 10;
- time[3] = min/10;
- time[4] = min%10;
- time[6] = s/10;
- time[7] = s%10;
- time[5] = 10;
- date[0] = year/1000;
- date[1] = year/100%10;
- date[2] = year/10%10;
- date[3] = year%10;
- //date[2] = 10;
- date[4] = month/10;
- date[5] = month%10;
- //date[5] = 10;
- date[6] = day/10;
- date[7] = day%10;
- }
復制代碼 全部資料51hei下載地址:
電子日歷時鐘.zip
(73.82 KB, 下載次數(shù): 238)
2020-7-4 11:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|