找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7477|回复: 4
收起左侧

Proteus仿真51单片机电子日历时钟万年历+矩阵按键+数码管+设置时间

  [复制链接]
ID:598540 发表于 2020-6-29 12:15 | 显示全部楼层 |阅读模式
1.数码管显示
2.时间和日期每隔5秒自动切换一次
3.数码管显示
4.可设置时间和日期
5.矩阵按键控制,可更改
6.自动判断闰年

1.按下切换按键可切换当前显示时间还是日期
2.按下设置按键进入时间和日期的设置,设置哪一项,哪一项下面就会出现两个点
3.再次按下设置按键即可推出设置继续运行
4.自动判断闰年
5.日期更正(比如当前为5月31日,当切换月份时,切换到6月,则天数自动由31改为30)

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
~IRRB}@UJ68L~X`5H79Z[[8.png

单片机源程序如下:
  1. #include <reg52.h>

  2. sbit key0 = P3^0; //年份 时间 切换
  3. sbit key1 = P3^1; //设置
  4. sbit key2 = P3^2; //增加
  5. sbit key3 = P3^3; //减少

  6. sbit led0 = P3^7;  //时间日期设置指示灯
  7. sbit led1 = P3^6; // 正常运行指示灯
  8. sbit led2 = P3^5; // 当前为时间指示灯
  9. sbit led3 = P3^4; // 闰年指示灯

  10. sbit s1 = P0^0;
  11. sbit s2 = P0^1;
  12. sbit s3 = P0^2;

  13. typedef unsigned char uchar;
  14. typedef unsigned int uint;

  15. uint smg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00,
  16.                           0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
  17. uchar time[8],date[8];
  18. int year = 2020;
  19. char month=6,day=28,hour=18,min=22,s=0;
  20. uchar t=0; //日期和时间切换控制变量

  21. void delay(uint i);                         //延时函数
  22. void smg_show(char num_[]);         //数码管显示函数
  23. int keyscan();                                 //矩阵按键扫描函数
  24. void data_edit();                         //数码管数据编辑函数
  25. char year_judge();                         //闰年判断函数
  26. void relationship();                 //日期时间关系编辑函数
  27. void set_time(uchar change); //时间日期设置函数
  28. void Timer0Init();                         //定时器0初始化函数

  29. void main()
  30. {        
  31.         uchar key;
  32.         uchar change=0; //为1,显示日期   为0,显示时间
  33.         Timer0Init();   //定时器0初始化
  34.         led1 = 0;                //正常运行指示灯
  35.         year_judge();
  36.         //led3 = 0;
  37.         while(1)
  38.         {        
  39.                 key = keyscan();         //扫描矩阵按键

  40.                 if(t==5)
  41.                 {
  42.                    change = ~change;
  43.                    t = 0;
  44.                 }
  45.                
  46.                 if(change)led2 = 1;
  47.                 else led2 = 0;        

  48.                 if(key == 0)
  49.                 {
  50.                         led1 = 1;
  51.                         set_time(change); //时间日期设置函数
  52.                         led1 = 0;
  53.                 }

  54.                 if(key == 1)
  55.                 {
  56.                         change = ~change;
  57.                         t = 0;        
  58.                 }               

  59.                
  60.                  
  61.                 relationship();        //时间日期关系控制
  62.                 data_edit();//数码管参数编辑函数
  63.                 if(s%2)
  64.                 {
  65.                         time[2] = 11;
  66.                         time[5] = 11;
  67.                 }
  68.                 if(change)
  69.                         smg_show(date);           //数码管显示函数
  70.                 else
  71.                         smg_show(time);           //数码管显示函数
  72.            
  73.         }


  74. }


  75. /*****************************************
  76.            延时函数
  77. *****************************************/
  78. void delay(uint x)
  79. {
  80.         uchar y;
  81.         for(x;x>0;x--)
  82.                 for(y=110;y>0;y--);        
  83. }


  84. /*****************************************
  85.            数码管显示函数
  86. *****************************************/
  87. void smg_show(char num_[])
  88. {
  89.         char i=0;                                
  90.         for(i=0;i<8;i++)
  91.         {
  92.                 switch(i)
  93.                 {
  94.                         case 0:
  95.                                         s3 = 0;s2 = 0;s1 = 0;break;
  96.                         case 1:
  97.                                         s3 = 0;s2 = 0;s1 = 1;break;
  98.                         case 2:
  99.                                         s3 = 0;s2 = 1;s1 = 0;break;
  100.                         case 3:
  101.                                         s3 = 0;s2 = 1;s1 = 1;break;
  102.                         case 4:
  103.                                         s3 = 1;s2 = 0;s1 = 0;break;
  104.                         case 5:
  105.                                         s3 = 1;s2 = 0;s1 = 1;break;
  106.                         case 6:
  107.                                         s3 = 1;s2 = 1;s1 = 0;break;
  108.                         case 7:
  109.                                         s3 = 1;s2 = 1;s1 = 1;break;
  110.                 }
  111.                 P1=~smg[num_[i]];
  112.                 delay(10);
  113.                 P1=0xff;
  114.                 delay(10);
  115.                
  116.         }

  117. }

  118. /*****************************************
  119.            矩阵按键函数
  120. *****************************************/
  121. int keyscan()
  122. {
  123.         uchar i,j=0;
  124.         uchar d = 50;
  125.         uint k = 0xff;
  126.         P2 = 0XF0;
  127.         if((P2&0xf0)==0xf0)
  128.                 return k;
  129.         if((P2&0xf0)==0xf0)
  130.                 return k;
  131.         for(i=0;i<4;i++)
  132.         {
  133.                 P2=~(1<<i);
  134.                 k=(P2&0xf0);
  135.                 if(k!=0xf0)
  136.                 {
  137.                         while((k&(1<<(j+4))))
  138.                         j++;
  139.                         k = i*4+j;
  140.                         P2 = 0xf0;
  141.                         while(P2!=0xf0);
  142.                
  143.                         break;
  144.                 }
  145.         }
  146.                 return k;
  147. }

  148. /*****************************************
  149.            数据编辑函数函数
  150. *****************************************/
  151. void data_edit()
  152. {
  153.          time[0] = hour/10;
  154.          time[1] = hour%10;
  155.          time[2] = 10;
  156.          time[3] = min/10;
  157.          time[4] = min%10;
  158.          time[6] = s/10;
  159.          time[7] = s%10;
  160.          time[5] = 10;         

  161.          date[0] = year/1000;
  162.          date[1] = year/100%10;
  163.          date[2] = year/10%10;
  164.          date[3] = year%10;
  165.          //date[2] = 10;
  166.          date[4] = month/10;
  167.          date[5] = month%10;
  168.          //date[5] = 10;
  169.          date[6] = day/10;
  170.          date[7] = day%10;
  171. }

复制代码
全部资料51hei下载地址:
电子日历时钟.zip (73.82 KB, 下载次数: 235)
回复

使用道具 举报

ID:515926 发表于 2020-7-3 14:41 | 显示全部楼层
感谢楼主提供的全面素材,为我等初学者带来福音。
回复

使用道具 举报

ID:819173 发表于 2020-9-15 21:50 | 显示全部楼层
请问下,keyscan函数里,
if((P2&0xf0)==0xf0)
       return k;
写了两遍,是写错了吗
回复

使用道具 举报

ID:852300 发表于 2020-12-4 11:24 | 显示全部楼层
早几年这类产品销量不错!
回复

使用道具 举报

ID:858511 发表于 2020-12-11 09:32 | 显示全部楼层
感谢楼主的分享,对我有许多的帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表