找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2791|回复: 0
收起左侧

基于8051单片机的万年历仿真

[复制链接]
ID:252542 发表于 2017-11-28 19:22 | 显示全部楼层 |阅读模式
仿真,程序都在。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

2

2

1

1
0.png

单片机源程序如下:
  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. ……………………

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

所有资料51hei提供下载:
万年历.zip (44.86 KB, 下载次数: 9)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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