找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2744|回复: 2
打印 上一主题 下一主题
收起左侧

单片机数码管万年历Proteus仿真设计

[复制链接]
跳转到指定楼层
楼主
基于51单片机的数码管万年历设计


单片机源程序如下:
  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. uchar i;
  16. uchar code table[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xC0}; //段码表
  17. uchar  buffer[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  18. uchar  shuju=0;
  19. uchar  state=0;
  20. uchar  qxiang;

  21. typedef  struct  
  22.          {
  23.                  uchar year[2];
  24.                  uchar month;
  25.                  uchar day;
  26.                  uchar week;
  27.                  }date;
  28. typedef  struct  
  29.         {
  30.             uchar hour;
  31.                 uchar minute;
  32.                 uchar second;
  33.                 }time;
  34. uchar  count=0;
  35. date today={{18,20},11,14,3};                        //设置日期初值
  36. time now={14,30,00};                                        //设置时间初值
  37. void main()
  38. {
  39. TMOD=0x01;
  40. TL0=(65536-1000)%256;
  41. TH0=(65536-1000)/256;
  42. IE=0x82;            //EA=1;ET0=1总中断允许和定时器中断允许
  43. TR0=1;                //定时器启动计数
  44. display();
  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;           //总中断允许,外中断0允许
  58.                                          IT0=1;           //中断0为负跳变触发
  59.                                  }break;
  60.                             case(0xfd)        :                         //分调整
  61.                             {
  62.                                          EA=1;
  63.                                          EX0=1;                  
  64.                                          IT0=1;                  
  65.                                  }break;
  66.                             case(0xfb) :                        //时调整
  67.                             {
  68.                                          EA=1;
  69.                                          EX0=1;
  70.                                          IT0=1;                                       
  71.                                  }break;
  72.                  case(0xf7) :                         //星期调整
  73.                             {
  74.                                          EA=1;
  75.                                          EX0=1;
  76.                                          IT0=1;
  77.                                  }break;
  78.                  case(0xef) :                         //日调整
  79.                              {
  80.                                          EA=1;
  81.                                          EX0=1;
  82.                                          IT0=1;
  83.                                  }break;
  84.                  case(0xdf):                         //月调整
  85.                              {
  86.                                          EA=1;
  87.                                          EX0=1;
  88.                                          IT0=1;
  89.                                  }break;
  90.                  case(0xbf):                         //年调整
  91.                             {
  92.                                          EA=1;
  93.                                          EX0=1;
  94.                                          IT0=1;
  95.                                  }break;
  96.                              default:                                 //时钟正常计时
  97.                         {
  98.                                         EA=1;
  99.                                         TR0=1;
  100.                                         EX0=0;
  101.                                         }break;
  102.                                 }break;
  103.                  case(0x00) :switch(shuju)
  104.                                              {
  105.                            case(0x7e):
  106.                         {
  107.                                          EA=1;
  108.                                          EX0=1;
  109.                                          IT0=1;
  110.                                         }break;
  111.                    case(0x7d):
  112.                         {
  113.                                          EA=1;
  114.                                          EX0=1;
  115.                                          IT0=1;
  116.                                         }break;
  117.                    case(0x7b):
  118.                         {
  119.                                          EA=1;
  120.                                          EX0=1;
  121.                                          IT0=1;
  122.                                         }break;
  123.                    case(0x77):
  124.                         {
  125.                                             EA=1;
  126.                                          EX0=1;
  127.                                          IT0=1;
  128.                                         }break;
  129.                    case(0x6f):
  130.                         {
  131.                                          EA=1;
  132.                                          EX0=1;
  133.                                          IT0=1;
  134.                                        
  135.                                         }break;
  136.                    case(0x5f):
  137.                         {
  138.                                          EA=1;
  139.                                          EX0=1;
  140.                                          IT0=1;
  141.                                         }break;
  142.                    case(0x3f):
  143.                         {
  144.                                          EA=1;
  145.                                          EX0=1;
  146.                                          IT0=1;
  147.                                         }break;
  148.                    default:                                       
  149.                         {
  150.                                         EA=1;
  151.                                         TR0=1;
  152.                                         EX0=0;
  153.                                         }break;
  154.                             }break;      
  155.                 }
  156.         }
  157. }

  158. void int0()  interrupt 0 using 0   //中断服务程序,调节时间
  159. {
  160.   uchar result,z;
  161.   result=shuju;
  162.                switch(qxiang)
  163.             {
  164.                  case(0x80):   switch(result)
  165.                                            {
  166.                                case(0xfe) :                                          //秒调整        +
  167.                                  {
  168.                                    now.second++;
  169.                                    if(now.second>=60)
  170.                                       {
  171.                                             now.second=0;
  172.                                            }
  173.                                    display();
  174.                                   }break;
  175.                          case(0xfd) :                             //分调整  +
  176.                                  {
  177.                                     now.minute++;
  178.                                     if(now.minute>=60)
  179.                                      {
  180.                                            now.minute=0;
  181.                                           }
  182.                                      display();
  183.                                  }break;
  184.                             case(0xfb) :                   //时调整        +
  185.                                   {
  186.                                      now.hour++;
  187.                                      if(now.hour>=24)
  188.                                         {
  189.                                               now.hour=0;
  190.                                              }
  191.                                         display();
  192.                                   }break;
  193.                              case(0xf7)        :                  //星期调整 +
  194.                                       {                  
  195.                                          today.week++;
  196.                                           if(today.week>=8)
  197.                                               {
  198.                                                     today.week=1;
  199.                                                    }
  200.                                           display();
  201.                                       }break;
  202.                                   case(0xef) :                        //日调整         +
  203.                                       {
  204.                                          today.day++;
  205.                                          z = monthday(today.year[1],today.year[0]);
  206.                                          if((z==1)&&(today.month==2))
  207.                                                                             {
  208.                                                                                   if(today.day>=30)
  209.                                                          today.day=1;
  210.                                                                                 }
  211.                                               else if (today.day>dayofmonth[today.month-1])
  212.                                                             today.day=1;
  213.                                           display();
  214.                                         }break;         
  215.                                              case(0xdf) :                         //月调整        +
  216.                
  217.                                             {
  218.                                                 today.month++;
  219.                                                    if(today.month>=13)
  220.                                                    {
  221.                                                          today.month=1;
  222.                                                         }
  223.                                                 display();
  224.                                                } break;
  225.                                        case(0xbf) :                        //年调整 +
  226.                                              {
  227.                                            today.year[0]=today.year[0]+1;
  228.                                                if(today.year[0]>=100)
  229.                                                    {
  230.                                                          today.year[0]=0;
  231.                                                          today.year[1]=today.year[1]+1;
  232.                                                          if(today.year[1]>=100)
  233.                                                             {
  234.                                                                    today.year[1]=0;
  235.                                                                  }
  236.                                                          }
  237.                                                  display();
  238.                                                }break;
  239.                                        default:                                 //时钟正常计时
  240.                                          {
  241.                                                                          EA=1;
  242.                                                          TR0=1;
  243.                                                          EX0=0;
  244.                                                                          }break;
  245.                                                  }break;
  246.             case(0x00): switch(result)
  247.                         {
  248.                           case(0x7e):                                           //秒调整-
  249.                           {
  250.                                   if(now.second>0)
  251.                                   now.second=now.second-1;
  252.                                else now.second=59;
  253.                                     display();
  254.                           }break;
  255.               case(0x7d):                                                    //分调整-
  256.                           {
  257.                                  if(now.minute>0)
  258.                                  now.minute=now.minute-1;
  259.                               else now.minute=59;
  260.                                    display();
  261.                           }break;
  262.               case(0x7b) :                                               //  时调整-
  263.                           {
  264.                           if(now.hour>0)
  265.                                  now.hour=now.hour-1;
  266.                               else now.hour=23;
  267.                                    display();
  268.                           }break;
  269.                   case(0x77) :                                          //         周调整-
  270.                           {
  271.                           if(today.week>1)
  272.                                  today.week=today.week-1;
  273.                               else today.week=7;
  274.                                    display();
  275.                           }break;
  276.                   case(0x6f):                                                 //           日调整-
  277.                           {
  278.                           z = monthday(today.year[1],today.year[0]);
  279.                                  if((z==1)&&(today.month==2))
  280.                                 {
  281.                                 if(today.day>1)
  282.                                    today.day=today.day-1;
  283.                                     else today.day=29;
  284.                                 }
  285.                                else {
  286.                                         if(today.day>1)
  287.                                            today.day=today.day-1;
  288.                                         else today.day=dayofmonth[today.month-1];
  289.                                     }
  290.                                display();
  291.                            }break;
  292.                    case(0x5f):                                                //        月调整-
  293.                            {
  294.                                   if(today.month>1)
  295.                                   today.month=today.month-1;
  296.                                else today.month=12;
  297.                                display();
  298.                            }break;
  299.                    case(0x3f) :                            // 年调整-
  300.                            {
  301.                                   if(today.year[0]>0)
  302.                                   today.year[0]=today.year[0]-1;
  303.                                else
  304.                                    {
  305.                                        today.year[0]=99;
  306.                                        today.year[1]=today.year[1]-1;
  307.                                        }
  308.                                   display();
  309.                            }break;
  310.                     default:                                                 //时钟正常计时
  311.                            {
  312.                                        EA=1;
  313.                                            TR0=1;
  314.                                            EX0=0;        
  315.                                            }break;
  316.                  }break;
  317.                 }
  318. }
  319. //定时器中断程序
  320. void  timer0_int() interrupt 1 using 1
  321. {
  322. uchar c;
  323. TL0=(65536-1000)%256;                  
  324. TH0=(65536-1000)/256;
  325. TR0=1;
  326. count++;
  327. if(count==35)
  328.     {
  329.         count=0;
  330.         now.second=now.second+1;
  331.          if(now.second>=60)
  332.             {
  333.                 now.second=0;
  334.                 now.minute++;
  335.                 if(now.minute>=60)
  336.                    {
  337.                    now.minute=0;
  338.                    now.hour++;
  339.                    if(now.hour>=24)
  340.                       {
  341.                           now.hour=0;
  342.                           today.week++;
  343.                           today.day++;
  344.                           if(today.week>=8)
  345.                              {
  346.                                  today.week=1;
  347.                                  }
  348.                           c=monthday( today.year[1], today.year[0]);
  349.                           if((c==1)&&(today.month==2))
  350.                              {
  351.                                  if(today.day>=30)
  352.                                    {
  353.                                     today.day=1;
  354.                                         today.month++;
  355.                                    }
  356.                                  }
  357.                           else if(today.day>=(dayofmonth[today.month-1]+1))
  358.                                   {
  359.                                           today.day=1;
  360.                                           today.month++;
  361.                                   if(today.month>=13)
  362.                                     {
  363.                                         today.month=1;
  364.                                         today.year[0]=today.year[0]+1;
  365.                                         if(today.year[0]>=100)
  366.                                           {
  367.                                               today.year[0]=0;
  368.                                               today.year[1]=today.year[1]+1;
  369.                                               if(today.year[1]>=100)
  370.                                                 {
  371.                                                      today.year[1]=0;
  372.                                                     }
  373.                                               }
  374.                                         }
  375.                                   }
  376.                        }
  377.                     }
  378.                  }
  379.          }
  380.      display();
  381. }
  382. //延时程序
  383. void  delay(uchar  k)                          
  384.   {
  385.   uchar m,n;
  386.   for(m=0;m<=k;m++)
  387.    for(n=0;n<=40;n++);
  388.   }
  389. ……………………

  390. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
万年历 51hei设计.rar (1.43 MB, 下载次数: 66)

51hei.png (21.63 KB, 下载次数: 93)

51hei.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:688459 发表于 2021-1-22 12:29 | 只看该作者
请问根据你的电路图和程序,数码管没有显示,锁存器没有高电平输出,是什么原因?
回复

使用道具 举报

板凳
ID:891154 发表于 2021-7-16 16:38 | 只看该作者
dg110 发表于 2021-1-22 12:30
根据你的电路图和程序,数码管没有显示,锁存器没有高电平输出,是什么原因?

搭建电路不行????
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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