找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机万年历仿真与源码

[复制链接]
跳转到指定楼层
楼主
万年历单片机电路及程序


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar code  digit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};       
  6. unsigned char data year,month,day,hour,min,sec,sec100,n;//年、月、日、时、分、秒、百分之一秒
  7. sbit TS = P2^4;    //调整键调时
  8. sbit SS = P2^5;    //调整键上升
  9. sbit XJ = P2^6;           //调整键下降
  10. sbit TW = P2^7;           //调整键调位
  11. void delay1ms( uint x); //延时程序
  12. void pro_timedate();//时间和日期处理程序
  13. bit leap_year();//闰年的计算
  14. void display_Year(year); //显示年
  15. void display_Month(month);//显示月
  16. void display_Day(day);//显示日
  17. void display_Hour(hour);//显示时
  18. void display_Min(min);//显示分
  19. void display_Sec(sec);//显示秒
  20. void dispaly_time();//时间显示
  21. void TSkeypros(); //调时按键扫描
  22. void pro_key(); // 设置按键处理程序
  23. void year_adjust(); // 年调整程序
  24. void month_adjust(); // 月调整程序
  25. void day_adjust(); // 日调整程序
  26. void hour_adjust(); // 时调整程序
  27. void min_adjust(); // 分调整程序
  28.                                   
  29. // 延时程序
  30. void delay1ms( uint x)
  31. {
  32.         uchar i,j;
  33.         for(i=x;i>0;i--)
  34.         for(j=124;j>0;j--);
  35. }
  36. //Timer0中断处理程序,秒的产生
  37. void timer0() interrupt 1
  38. {
  39. TH0=0xdc;   //Timer0置10ms定时初值dc00H(2^16=65536D,dc00H=56320D)
  40. TL0=0x00;   //定时时间=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz)
  41. sec100++;
  42. n++;
  43.          if(n>=2) //1秒时间 (100*10ms=1000ms=1s)
  44.   {n = 0;
  45.    dispaly_time();//调用时间显示程序
  46.   }
  47. if(sec100 >= 100) //1秒时间 (100*10ms=1000ms=1s)
  48.   {sec100 = 0;
  49.    
  50.    pro_timedate();//调用时间和日期处理程序
  51.   }
  52. }
  53. //时间和日期处理程序
  54. void pro_timedate()                                                                                                              
  55. {
  56. sec++;
  57. if(sec > 59)
  58.   {sec = 0;
  59.    min++;
  60.    if(min>59)
  61.    {min=0;
  62.     hour++;
  63.     if(hour>23)
  64.     {hour=0;
  65.      day++;
  66.      if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
  67.       if (day>31) {day=1;month++;}     //大月31天
  68.      if (month==4||month==6||month==9||month==11)  
  69.        if (day>30) {day=1;month++;}     //小月30天
  70.      if (month==2)   
  71.       {if( leap_year())        //闰年的条件
  72.       {if (day>29) {day=1;month++;}}   //闰年2月为29天
  73.       else
  74.       {if (day>28) {day=1;month++;}}   //平年2月为28天
  75.       }   
  76.      if (month>12) {month=1;year++;}
  77.      if (year>99) year=0;
  78.     }
  79.    }
  80.   }
  81. }
  82. //闰年的计算
  83. bit leap_year()
  84. {
  85. bit leap;
  86. if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件
  87.   leap=1;
  88. else
  89.   leap=0;
  90. return leap;
  91. }
  92. //主程序,初始化及初值设定
  93. void main()
  94. {
  95. P0=0;
  96. P1=0;
  97. hour=10;min=30;sec=0;        //开机时的时,分,秒显示
  98. year=11; month=5;day=9;       //开机时的年,月,日,星期显示
  99. IE = 0x8f;       //CPU开中断,INT0,INT1,Timer0,Timer1开中断
  100. IP = 0x04;       //设置INT0为中断最高优先级
  101. IT0=0;IT1=0;      //外部INT0,INT1设置为电平触发方式(注意,触发不要选边沿方式,易误动)
  102. TMOD = 0x11;      //Timer0,Timer1工作于模式1, 16位定时方式
  103. TH0 = 0xdc;TL0 = 0x00;    //Timer0置10ms定时初值  
  104. TH1 = 0xff;TL1 = 0x00;    //Timer1置初值  
  105. TR0 = 1;       //Timer0启动
  106. TR1 = 0;
  107. while(1)
  108.   {
  109.    TSkeypros();       
  110.   }
  111. }
  112. void display_Year(year) //显示年                         
  113. {                                                                                                                                 
  114.         uchar i,j;
  115.         i=year/10;
  116.         j=year%10;
  117.         P0=digit[2];
  118.         P1=0;
  119.         delay1ms(4);
  120.         P0=0;
  121.         P0=digit[0];
  122.         P1=1;
  123.         delay1ms(4);
  124.         P0=0;
  125.         P0=digit[i];
  126.         P1=2;
  127.         delay1ms(4);
  128.         P0=0;
  129.         P0=digit[j];
  130.         P1=3;
  131.         delay1ms(4);
  132.         P0=0;
  133. }
  134. void display_Month(month)        //显示月                  
  135. {
  136.         uchar i,j;
  137.         i=month/10;
  138.         j=month%10;
  139.         P0=digit[i];
  140.         P1=4;
  141.         delay1ms(4);
  142.         P0=0;
  143.         P0=digit[j];
  144.         P1=5;
  145.         delay1ms(4);
  146.     P0=0;
  147. }
  148. void display_Day(day)        //显示日                  
  149. {
  150.         uchar i,j;
  151.         i=day/10;
  152.         j=day%10;
  153.         P0=digit[i];
  154.         P1=6;
  155.         delay1ms(4);
  156.         P0=0;
  157.     P0=digit[j];
  158.         P1=7;
  159.         delay1ms(4);
  160.         P0=0;
  161. }
  162. void display_Hour(hour)  //显示时                          
  163. {
  164.         uchar i,j;
  165.         i=hour/10;
  166.         j=hour%10;
  167.         P0=digit[i];
  168.         P1=8;
  169.         delay1ms(4);
  170.         P0=0;
  171.         P0=digit[j];
  172.         P1=9;
  173.         delay1ms(4);
  174.         P0=0;
  175. }
  176. void display_Min(min) //显示分                            
  177. {
  178.         uchar i,j;
  179.         i=min/10;
  180.         j=min%10;
  181.         P0=digit[i];
  182.         P1=10;
  183.         delay1ms(4);
  184.         P0=0;
  185.         P0=digit[j];
  186.         P1=11;
  187.         delay1ms(4);
  188.         P0=0;
  189. }
  190. void display_Sec(sec) //显示秒                            
  191. {
  192.         uchar i,j;
  193.         i=sec/10;
  194.         j=sec%10;
  195.         P0=digit[i];
  196.         P1=12;
  197.         delay1ms(4);
  198.         P0=0;
  199.         P0=digit[j];
  200.         P1=13;
  201.         delay1ms(4);
  202.         P0=0;
  203. }
  204. void dispaly_time()//时间显示
  205. {
  206.         display_Year(year);
  207.         display_Month(month);
  208.         display_Day(day);
  209.         display_Hour(hour);
  210.         display_Min(min);
  211.         display_Sec(sec);
  212.                 P0=0;
  213. }
  214. void TSkeypros() //调时按键扫描
  215. {
  216. if(TS==0)                  //检测按键TS是否按下
  217.         {       
  218.                 delay1ms(10);   //消除抖动10ms
  219.                 if(TS==0)         //再次判断按键是否按下
  220.                 {
  221.                     while(!TS);         //检测按键是否松开
  222.                 }
  223.                 pro_key();  // 调用设置按键处理程序                                  
  224.         }               
  225. }
  226. void pro_key() // 设置按键处理程序
  227. {
  228.    year_adjust();
  229.    
  230. }
  231. void year_adjust() // 年调整程序
  232. {

  233. if (SS==0)
  234.       {
  235.             delay1ms(10);   //消除抖动10ms
  236.                 if(SS==0)         //再次判断按键是否按下
  237.                    {
  238.                     while(!SS);         //检测按键是否松开                                                            
  239.                    }
  240.           year++;
  241.           if (year> 99) year= 0;
  242.           }
  243.    else
  244.       {if (XJ==0)
  245.               {
  246.                    delay1ms(10);   //消除抖动10ms
  247.                    if(XJ==0)         //再次判断按键是否按下
  248.                      {
  249.                       while(!XJ);         //检测按键是否松开                                                            
  250.                      }
  251.                   year--;
  252.                   if (year>100) year= 99;
  253.                   }
  254.           }
  255. if (TW==0)
  256.    {
  257.         delay1ms(10);   //消除抖动10ms
  258.                 if(TW==0)         //再次判断按键是否按下
  259.                    {
  260.                     while(!TW);         //检测按键是否松开                                                            
  261.                    }                 
  262.         month_adjust();
  263.    }   
  264. year_adjust();                        
  265. }
  266. void month_adjust() // 月调整程序
  267. {
  268. if (SS==0)
  269.       {
  270.             delay1ms(10);   //消除抖动10ms
  271.                 if(SS==0)         //再次判断按键是否按下
  272.                    {
  273.                     while(!SS);         //检测按键是否松开                                                            
  274.                    }
  275.           month++;
  276.           if (month> 12) month= 1;
  277.           }
  278.    else
  279.       {if (XJ==0)
  280.               {
  281.                    delay1ms(10);   //消除抖动10ms
  282.                    if(XJ==0)         //再次判断按键是否按下
  283.                      {
  284.                       while(!XJ);         //检测按键是否松开                                                            
  285.                      }
  286.                   month--;
  287.                   if (month<1) month= 12;
  288.                   }
  289.           }
  290. if (TW==0)
  291.    {
  292.    delay1ms(10);   //消除抖动10ms
  293.    if(TW==0)         //再次判断按键是否按下
  294.      {
  295.            while(!TW);         //检测按键是否松开                                                            
  296.          }                 
  297.     day_adjust();
  298.    }
  299. month_adjust();                       
  300. }
  301. void day_adjust() // 日调整程序
  302. {
  303. if (SS==0)
  304.       {
  305.           delay1ms(10);   //消除抖动10ms
  306.           if(SS==0)         //再次判断按键是否按下
  307.                    {
  308.                     while(!SS);         //检测按键是否松开                                                            
  309.                    }
  310.           day++;
  311.            if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
  312.             if (day>31) day=1;   //大月31
  313.        if (month==4||month==6||month==9||month==11)  
  314.             if (day>30) day=1;   //小月30
  315.        if (month==2)   
  316.            {
  317.                      if(leap_year())    // 闰年条件
  318.                {
  319.                            if (day>29) day=1; // 闰年29
  320.                            }
  321.              else
  322.              {
  323.                          if (day>28) day=1;         //平年28
  324.                          }
  325.                    }  
  326.           }
  327.    else
  328.       {if (XJ==0)
  329.               {
  330.                    delay1ms(10);   //消除抖动10ms
  331.                    if(XJ==0)         //再次判断按键是否按下
  332.                      {
  333.                       while(!XJ);         //检测按键是否松开                                                            
  334.                      }
  335.                   day--;
  336.                   if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
  337.             if (day<1) day=31;   //大月31
  338.           if (month==4||month==6||month==9||month==11)  
  339.             if (day<1) day=30;   //小月30
  340.           if (month==2)   
  341.            {
  342.                      if(leap_year())    // 闰年条件
  343.                {
  344.                            if (day<1) day=29; // 闰年29
  345.                            }
  346.              else
  347.              {
  348.                          if (day<1) day=28;         //平年28
  349.                          }
  350.                    }  
  351.                   }
  352.           }
  353. if (TW==0)
  354. {
  355.    delay1ms(10);   //消除抖动10ms
  356.    if(TW==0)         //再次判断按键是否按下
  357.      {
  358.            while(!TW);         //检测按键是否松开                                                            
  359.          }
  360.    hour_adjust();
  361. }
  362. day_adjust();                    
  363. }

  364. void hour_adjust() // 时调整程序
  365. {
  366. if (SS==0)
  367.       {
  368.           delay1ms(10);   //消除抖动10ms
  369.           if(SS==0)         //再次判断按键是否按下
  370.                    {
  371.                     while(!SS);         //检测按键是否松开                                                            
  372.                    }
  373.           hour++;
  374.           if (hour> 23) hour= 0;
  375.           }
  376.    else
  377.       {if (XJ==0)
  378.               {
  379.                   delay1ms(10);   //消除抖动10ms
  380.               if(XJ==0)         //再次判断按键是否按下
  381.                    {
  382.                     while(!XJ);         //检测按键是否松开                                                            
  383.                    }
  384.                   hour--;
  385.                   if (hour>100) hour= 23;
  386.                   }
  387.           }
  388. if (TW==0)
  389. {
  390. ……………………

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

所有资料51hei提供下载:
wnl.rar (147.53 KB, 下载次数: 49)





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

使用道具 举报

沙发
ID:185269 发表于 2018-5-14 08:28 | 只看该作者
感谢分享
回复

使用道具 举报

板凳
ID:281881 发表于 2018-6-28 05:58 | 只看该作者
无法解压,浪费黑币!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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