找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13410|回复: 28
收起左侧

基于51单片机设计的数码管万年历proteus仿真及源码

  [复制链接]
ID:137190 发表于 2016-10-11 00:32 | 显示全部楼层 |阅读模式
0.png
包含:仿真图+C语言程序+功能说明+元器件清单(非实物)

设计说明:
用一片51系列单片机作为主控制器,DS18B20测量实时温度,现实范围为-55到127摄氏度。
用DS1302时钟芯片,具有闰年闰月自动计算。用共阴极数码管进行显示。74hc138和74hc154进行位选驱动数码管,用74hc595进行传送数据。
按键调整说明:
第一次按下调整键,则年的后两位开始闪烁,此时如果按下加或者减进行年的更改,更改之后,如果无需对其他时间更改,直接按下确认键,即可保存更改后的数据,并且返回正常的显示。如果需要对其的更改,则继续按下调整键,第二次按下调整键时,调整对象为月,第三次为日,次为时,第五次为分。这里无需调整星期,星期的调整是调整以后,自动计算星期,并随着确认键的按下进行刷新的。
元器件清单:
STC89C51单片机
1
12MHz晶振
1
22pf电容
2
10uf电解电容
1
10K电阻
1
74HC154
1
74HC138
1
74HC595
2
DS1302
1
DS18B20
1
4位共阴极数码管
2
2位共阴极数码管
5
1位共阴极数码管
1
BUTTON轻触开关
4
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ture  1
  6. #define fault 0

  7. sbit SET=P1^7;

  8. void  delay(uchar  k) ;
  9. uchar monthday(uchar a,uchar b);
  10. void display()        ;

  11. uchar code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
  12. uchar code scan[]={0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
  13.                     0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
  14.                                         0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};
  15.                                         //扫描的译码信号
  16. uchar i;
  17. uchar code table[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0xA7,0xFF,0xEF,0xC0};
  18. uchar  buffer[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  19. uchar  shuju=0;
  20. uchar  state=0;
  21. uchar  qxiang;

  22. typedef  struct  
  23.          {
  24.                  uchar year[2];
  25.                  uchar month;
  26.                  uchar day;
  27.                  uchar week;
  28.                  }date;
  29. typedef  struct  
  30.         {
  31.             uchar hour;
  32.                 uchar minute;
  33.                 uchar second;
  34.                 }time;
  35. uchar  count=0;
  36. date today={{9,20},4,20,1};
  37. time now={11,8,10};
  38. void main()
  39. {
  40. TMOD=0x01;
  41. TL0=(65536-1000)%256;
  42. TH0=(65536-1000)/256;
  43. IE=0x82;          //EA=1;ET0=1总中断允许和定时器中断允许
  44. TCON=0x10;          //定时器启动计数
  45. while(1)
  46.     {
  47.          P1=0xff;

  48.          shuju=P1&0xff;
  49.          qxiang=shuju&0x80;
  50.                 switch(qxiang)
  51.             {
  52.                  case(0x80):switch(shuju)
  53.                               {
  54.                                  case(0xfe) :                           //秒调整
  55.                             {
  56.                                          EA=1;
  57.                                          EX0=1;           //IE=0x83;                        //EA=1;ET0=1;EX0=0总中断允许,定时器中断允许,外中断允许
  58.                                          IT0=1;           //TCON=0x11;                        //TR0=1;IT0=1;定时器启动,外中断为负边沿触发
  59.                                  }break;
  60.                             case(0xfd)        :                         //分调整
  61.                             {
  62.                                          EA=1;
  63.                                          EX0=1;                  // IE=0x83;
  64.                                          IT0=1;                    //TCON=0x11;
  65.                                  }break;
  66.                             case(0xfb) :                        //时调整
  67.                             {
  68.                                         EA=1;
  69.                                          EX0=1;
  70.                                          IT0=1;
  71.                                        
  72.                                  }break;
  73.                  case(0xf7) :                           //星期调整
  74.                             {
  75.                                         EA=1;
  76.                                          EX0=1;
  77.                                          IT0=1;
  78.                              
  79.                                  }break;
  80.                  case(0xef) :                                        //日调整
  81.                              {
  82.                                         EA=1;
  83.                                          EX0=1;
  84.                                          IT0=1;
  85.                                
  86.                                  }break;
  87.                  case(0xdf):                                 //月调整
  88.                              {
  89.                                         EA=1;
  90.                                          EX0=1;
  91.                                          IT0=1;
  92.                                
  93.                                  }break;
  94.                  case(0xbf):                                        //年调整
  95.                             {
  96.                                         EA=1;
  97.                                          EX0=1;
  98.                                          IT0=1;
  99.                                        
  100.                                  }break;
  101.                              default:                                                 //时钟正常计时
  102.                         {
  103.                                         EA=1;
  104.                                         TR0=1;
  105.                                         EX0=0;
  106.                                
  107.                                         }break;
  108.                                 }break;
  109.                  case(0x00) :switch(shuju)
  110.                                              {
  111.                            case(0x7e):
  112.                         {
  113.                                         EA=1;
  114.                                          EX0=1;
  115.                                          IT0=1;
  116.                                        
  117.                                         }break;
  118.                    case(0x7d):
  119.                         {
  120.                                         EA=1;
  121.                                          EX0=1;
  122.                                          IT0=1;
  123.                                
  124.                                         }break;
  125.                    case(0x7b):
  126.                         {
  127.                                         EA=1;
  128.                                          EX0=1;
  129.                                          IT0=1;
  130.                             
  131.                                         }break;
  132.                    case(0x77):
  133.                         {
  134.                                         EA=1;
  135.                                          EX0=1;
  136.                                          IT0=1;
  137.                                
  138.                                         }break;
  139.                    case(0x6f):
  140.                         {
  141.                                         EA=1;
  142.                                          EX0=1;
  143.                                          IT0=1;
  144.                                        
  145.                                         }break;
  146.                    case(0x5f):
  147.                         {
  148.                                          EA=1;
  149.                                          EX0=1;
  150.                                          IT0=1;
  151.                                        
  152.                                         }break;
  153.                    case(0x3f):
  154.                         {
  155.                                         EA=1;
  156.                                          EX0=1;
  157.                                          IT0=1;
  158.                                        
  159.                                         }break;
  160.                    default:                                                 //时钟正常计时
  161.                         {
  162.                                         EA=1;
  163.                                         TR0=1;
  164.                                         EX0=0;
  165.                                                
  166.                                         }break;
  167.                             }break;      
  168.                 }
  169.         }
  170. }

  171. void inter0()  interrupt 0  using 0
  172.   {
  173.   uchar result,z;
  174.   result=shuju;
  175.                switch(qxiang)
  176.             {
  177.                  case(0x80):   switch(result)
  178.                                            {
  179.                                case(0xfe) :                                          // if(result==0xfe)                                   //秒调整        +
  180.                                  {
  181.                                    now.second++;
  182.                                    if(now.second>=60)
  183.                                       {
  184.                                             now.second=0;
  185.                                            }
  186.                                    display();
  187.                                   }break;
  188.    
  189.                          case(0xfd) :                             //if(result==0xfd)                                         //分调整  +
  190.                                  {
  191.                                     now.minute++;
  192.                                     if(now.minute>=60)
  193.                                      {
  194.                                            now.minute=0;
  195.                                           }
  196.                                      display();
  197.                                  }break;
  198.    
  199.                             case(0xfb) :                   //if(result==0xfb)                                   //时调整        +
  200.                                   {
  201.                                      now.hour++;
  202.                                      if(now.hour>=24)
  203.                                         {
  204.                                               now.hour=0;
  205.                                              }
  206.                                         display();
  207.                                   }break;

  208.                              case(0xf7)        :                  // if(result==0xf7)                       //星期调整 +
  209.                                       {                  
  210.                                          today.week++;
  211.                                           if(today.week>=8)
  212.                                               {
  213.                                                     today.week=1;
  214.                                                    }
  215.                                           display();
  216.                                       }break;

  217.                                   case(0xef) :                        //if(result==0xef)                                   //日期调整         +
  218.                                       {
  219.                                          today.day++;
  220.                                          z = monthday( today.year[1]  ,  today.year[0] );
  221.                                          if((z==1)&&(today.month==2))
  222.                                                                             {
  223.                                                                                   if(today.day>=30)
  224.                                                          today.day=1;
  225.                                                                                 }

  226.                                               else if (today.day>dayofmonth[today.month-1])
  227.                                                             today.day=1;
  228.                                            display();
  229.                                         }break;          
  230.           
  231.                                   case(0xdf) :                         //if(result==0xdf)                                        //月调整        +
  232.                
  233.                                             {
  234.                                                 today.month++;
  235.                                                    if(today.month>=13)
  236.                                                    {
  237.                                                          today.month=1;
  238.                                                         }
  239.                                                 display();
  240.                                                } break;
  241.    
  242.             
  243.                                        case(0xbf) :                                         //if(result==0xbf)                                          //年调整 +
  244.                                              {
  245.                                            today.year[0]=today.year[0]+1;
  246.                                                if(today.year[0]>=100)
  247.                                                    {
  248.                                                          today.year[0]=0;
  249.                                                          today.year[1]=today.year[1]+1;
  250.                                                          if(today.year[1]>=100)
  251.                                                             {
  252.                                                                    today.year[1]=0;
  253.                                                                  }
  254.                                                          }
  255.                                                  display();
  256.                                                }break;
  257.                                        default:                                                 //时钟正常计时
  258.                                          {
  259.                                                                          EA=1;
  260.                                                          TR0=1;
  261.                                                          EX0=0;
  262.                                                                                                           
  263.                                                          }break;
  264.                                                  }break;
  265.                                        
  266.   case(0x00): switch(result)
  267.                         {
  268.                           case(0x7e):                                //if(result==0x7f)                                         //秒调整—
  269.                           {
  270.                                   if(now.second>0)
  271.                                   now.second=now.second-1;
  272.                                else  now.second=59;
  273.                                     display();
  274.                           }break;
  275.        
  276.   case(0x7d):                                                //if(result==0x7d)                                          //分调整—
  277.            {
  278.                    if(now.minute>0)
  279.                    now.minute=now.minute-1;
  280.                 else now.minute=59;
  281.                 display();
  282.            }  break;
  283.        
  284.   case(0x7b) :                                          //if(result==0x7b)                                          //  时调整-
  285.           
  286.            {
  287.                    if(now.hour>0)
  288.                    now.hour=now.hour-1;
  289.                 else now.hour=23 ;
  290.                 display();
  291.            }break;
  292.        
  293.         case(0x77) :                                         //if(result==0x77)                                         //         周调整—
  294.            {
  295.             if(today.week>1)
  296.                    today.week=today.week-1;
  297.                 else today.week=7;
  298.                 display();
  299.            }break;

  300.           
  301.         case(0x6f):                                                                   //if(result==0x6f)                                  //         日期调整—
  302.            {
  303.             z = monthday( today.year[1]  ,  today.year[0] );
  304.                    if((z==1)&&(today.month==2))
  305.                    {
  306.                    if(today.day>1)
  307.                       today.day=today.day-1;
  308.                         else today.day=29;
  309.                    }
  310.                 else {
  311.                           if(today.day>1)
  312.                              today.day=today.day-1;
  313.                           else today.day=dayofmonth[today.month-1];
  314.                       }
  315.                 display();
  316.            }break;

  317.          case(0x5f):                                                        //if(result==0x5f)                                        //        月调整—
  318.            {
  319.                    if(today.month>1)
  320.                    today.month=today.month-1;
  321.                 else today.month=12;
  322.                 display();
  323.            }break;
  324.          case(0x3f) :          // 年调整——
  325.            {
  326.                    if(today.year[0]>0)
  327.                    today.year[0]=today.year[0]-1;
  328.                 else
  329.                     {
  330.                          today.year[0]=99;
  331.                          today.year[1]=today.year[1]-1;
  332.                         }
  333.                 display();
  334.            }break;
  335.          default:                                                 //时钟正常计时
  336.                         {
  337.                                     EA=1;
  338.                                         TR0=1;
  339.                                         EX0=0;       
  340.                                         }break;
  341.              }break;
  342.                 }
  343.         }

  344. void  timer0_int() interrupt 1 using 1
  345. {
  346. uchar c;
  347. TL0=(65536-1000)%256;                  //中断时间是10ms
  348. TH0=(65536-1000)/256;
  349. TR0=1;
  350. count++;
  351. if(count==35)
  352.     {
  353.         count=0;
  354.         now.second=now.second+1;
  355.          if(now.second>=60)
  356.             {
  357.                 now.second=0;
  358.                 now.minute++;
  359.                 if(now.minute>=60)
  360.                    {
  361.                    now.minute=0;
  362.                    now.hour++;
  363.                    if(now.hour>=24)
  364.                       {
  365.                           now.hour=0;
  366.                           today.week++;
  367.                           today.day++;
  368.                           if(today.week>=8)
  369.                              {
  370.                                  today.week=1;
  371.                                  }
  372.                           c=monthday( today.year[1], today.year[0]);
  373.                           if((c==1)&&(today.month==2))
  374.                              {
  375.                                  if(today.day>=30)
  376.                                    {
  377.                                     today.day=1;
  378.                                         today.month++;
  379.                                    }
  380.                                   
  381.                                  }
  382.                           else if(today.day>=(dayofmonth[today.month-1]+1))
  383.                                   {
  384.                                           today.day=1;
  385.                                           today.month++;
  386.                            if(today.month>=13)
  387.                               {
  388.                                    today.month=1;
  389.                                    today.year[0]=today.year[0]+1;
  390.                                    if(today.year[0]>=100)
  391.                                       {
  392.                                           today.year[0]=0;
  393.                                           today.year[1]=today.year[1]+1;
  394.                                           if(today.year[1]>=100)
  395.                                              {
  396.                                                  today.year[1]=0;
  397.                                                  }
  398.                                           }
  399.                                   }
  400.                           }
  401.                    }
  402.                   }
  403.                 }
  404.         }
  405.     display();
  406. }
  407. void  delay(uchar  k)
  408.   {
  409.   uchar m,n;
  410.   for(m=0;m<=k;m++)
  411.    for(n=0;n<=40;n++);
  412.   }
  413.   //  计算年份程序
  414. uchar  monthday(uchar a,uchar b)
  415.   {
  416.    uchar x,y;
  417.    x=a*100+b;
  418.    if(x%4!=0)
  419.           y=0;
  420.    else if(x%100!=0)
  421.       y=1;
  422.    else if(x%400!=0)
  423.       y=0;
  424.    else y=1;
  425.    
  426. //if((x%4==0 && x%100!=0)|| (x%400==0))
  427. //   y=1;
  428. // else y=0;
  429.    return(y) ;
  430.   }       
  431. void display()
  432. {
  433.   buffer[0]=now.second%10;
  434.   buffer[1]=now.second/10;
  435.   buffer[2]=10;
  436.   buffer[3]=now.minute%10;
  437.   buffer[4]=now.minute/10;
  438.   buffer[5]=10;
  439.   buffer[6]=now.hour%10;
  440.   buffer[7]=now.hour/10;
  441.   buffer[8]=today.week%10;
  442.   buffer[9]=today.week/10;
  443.   buffer[10]=10;
  444.   buffer[11]=today.day%10;
  445.   buffer[12]=today.day/10;
  446.   buffer[13]=10;
  447.   buffer[14]=today.month%10;
  448.   buffer[15]=today.month/10;
  449.   buffer[16]=10;
  450.   buffer[17]=today.year[0]%10;
  451.   buffer[18]=today.year[0]/10;
  452.   buffer[19]=today.year[1]%10;
  453.   buffer[20]=today.year[1]/10;
  454.   buffer[21]=10;
  455.    for(i=0;i<=21;i++)
  456.     {
  457.         P0=table[buffer[i]];       
  458.         P2=scan[i];
  459.         delay(8);
  460.         P2=0xFF;
  461.         }
  462. }
复制代码
0.png
所有资料下载:
51单片机万年历3个数码管显示.rar (80.18 KB, 下载次数: 339)

评分

参与人数 1黑币 +1 收起 理由
suyuhong11 + 1 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:143767 发表于 2020-11-5 12:35 | 显示全部楼层
和介绍不符啊,哪有DS1302和DS18B20?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:140489 发表于 2016-10-12 10:04 | 显示全部楼层
下载了,学习学习
回复

使用道具 举报

ID:158150 发表于 2016-12-27 20:00 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:77498 发表于 2017-4-30 16:39 | 显示全部楼层
下载了,学习学习
回复

使用道具 举报

ID:210879 发表于 2017-6-13 18:30 | 显示全部楼层
基于51单片机设计的数码管万年历proteus仿真及源码
这个有设计报告嘛
回复

使用道具 举报

ID:1 发表于 2017-6-13 20:24 | 显示全部楼层
jndkugr 发表于 2017-6-13 18:30
基于51单片机设计的数码管万年历proteus仿真及源码
这个有设计报告嘛

没有设计报告
回复

使用道具 举报

ID:211258 发表于 2017-6-15 17:18 | 显示全部楼层
谢谢分享!收藏了!
回复

使用道具 举报

ID:211579 发表于 2018-4-7 19:26 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:324152 发表于 2018-5-7 13:29 | 显示全部楼层
好棒
回复

使用道具 举报

ID:324152 发表于 2018-5-7 17:50 | 显示全部楼层
可以把图给完整吗?没有币无法下载。
回复

使用道具 举报

ID:318135 发表于 2018-5-8 16:40 | 显示全部楼层
为什么我的显示的是09年
回复

使用道具 举报

ID:313328 发表于 2018-5-8 17:47 | 显示全部楼层
非常清晰,认真,感谢!
回复

使用道具 举报

ID:353831 发表于 2018-6-20 11:48 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:354314 发表于 2018-6-21 15:07 来自手机 | 显示全部楼层
这是数码管还是液晶呀
回复

使用道具 举报

ID:269609 发表于 2018-6-28 21:10 | 显示全部楼层
没有DS18B20啊
回复

使用道具 举报

ID:361556 发表于 2018-7-2 14:00 来自手机 | 显示全部楼层
怎么调整日期啊?
回复

使用道具 举报

ID:267269 发表于 2018-7-2 15:05 来自手机 | 显示全部楼层
谢谢分享,收藏了
回复

使用道具 举报

ID:437959 发表于 2018-12-7 21:25 | 显示全部楼层
请问端口地址是怎么看的?
回复

使用道具 举报

ID:235062 发表于 2018-12-11 10:34 | 显示全部楼层
下载了,学习学习
回复

使用道具 举报

ID:532257 发表于 2019-5-10 10:27 | 显示全部楼层
好厉害
回复

使用道具 举报

ID:522682 发表于 2019-6-9 13:37 | 显示全部楼层
学习一下用法
回复

使用道具 举报

ID:147329 发表于 2019-9-19 11:04 | 显示全部楼层
为什么我的刷新就只能是一个一个的显示呀,学习下楼主的思想



回复

使用道具 举报

ID:147329 发表于 2019-9-19 22:50 | 显示全部楼层
你好,请问display()函数中,最后一行(472行)代码,P2=0xFF;是什么作用
回复

使用道具 举报

ID:666942 发表于 2019-12-18 08:54 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:667581 发表于 2019-12-18 17:17 | 显示全部楼层
太强了,帮了大忙
回复

使用道具 举报

ID:27825 发表于 2019-12-18 20:11 来自手机 | 显示全部楼层
一直以来就是想做了
回复

使用道具 举报

ID:116347 发表于 2020-1-23 19:29 | 显示全部楼层
下载了,学习学习,谢谢分享
回复

使用道具 举报

ID:769869 发表于 2020-6-14 22:22 来自手机 | 显示全部楼层
我想下载学习学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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