1.数码管显示
2.时间和日期每隔5秒自动切换一次
3.数码管显示
4.可设置时间和日期
5.矩阵按键控制,可更改
6.自动判断闰年
1.按下切换按键可切换当前显示时间还是日期
2.按下设置按键进入时间和日期的设置,设置哪一项,哪一项下面就会出现两个点
3.再次按下设置按键即可推出设置继续运行
4.自动判断闰年
5.日期更正(比如当前为5月31日,当切换月份时,切换到6月,则天数自动由31改为30)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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); //延时函数
- void smg_show(char num_[]); //数码管显示函数
- int keyscan(); //矩阵按键扫描函数
- void data_edit(); //数码管数据编辑函数
- char year_judge(); //闰年判断函数
- void relationship(); //日期时间关系编辑函数
- void set_time(uchar change); //时间日期设置函数
- void Timer0Init(); //定时器0初始化函数
- 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); //时间日期设置函数
- led1 = 0;
- }
- if(key == 1)
- {
- change = ~change;
- t = 0;
- }
-
-
- relationship(); //时间日期关系控制
- data_edit();//数码管参数编辑函数
- if(s%2)
- {
- time[2] = 11;
- time[5] = 11;
- }
- if(change)
- smg_show(date); //数码管显示函数
- else
- smg_show(time); //数码管显示函数
-
- }
- }
- /*****************************************
- 延时函数
- *****************************************/
- void delay(uint x)
- {
- uchar y;
- for(x;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*****************************************
- 数码管显示函数
- *****************************************/
- 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);
-
- }
- }
- /*****************************************
- 矩阵按键函数
- *****************************************/
- 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;
- }
- /*****************************************
- 数据编辑函数函数
- *****************************************/
- 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, 下载次数: 238)
|