久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8060|回復: 6
打印 上一主題 下一主題
收起左側

2051單片機4位數碼管可以顯示 時分,月日,年份;萬年歷,整點報時

[復制鏈接]
跳轉到指定樓層
樓主
ID:76190 發表于 2015-4-5 18:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. //功能:4位數碼管可以顯示 時分,月日,年份;萬年歷,整點報時,定時自動(或手動)關閉顯示器,空閑模式工作省電
  2. //硬件:2051單片機,P1.6到P1.0分別是 A到G,P1.7=DP,P3.5=D4,P3.4=D3,P3.1=D2,P3.0=D1,P3.7控制直流蜂鳴器(整點報時)。
  3. //       P3.2=0(改時間),P3.3=0(改狀態),6Mhz晶振。
  4. //使用說明:默認時間為 2010年1月1日,0點0分,狀態1顯示時分
  5. //           按P3.2為0,狀態++,狀態功能分別為 1:顯示時間 2:顯示月日 3:顯示年   4:修改分鐘   5:修改時鐘   6:修改年   7:修改月   8:修改日 ;
  6. //           用DP來表示狀態,DP每秒閃爍1次(占空比3:1)。   對應的修改位置,閃爍。
  7. //           在顯示年月日時分的狀態啟動P3.2為0,則進入關閉顯示器模式,或打開顯示器,在關閉顯示器的模式中,按任意鍵打開顯示器。
  8. //           在修改年月日時分的狀態啟動P3.2為0,則對應數字加一,一直按住,則一直加。注:改年份月份的時候為了不與萬年歷沖突,日期自動變為1號,年份范圍是2010到2099年
  9. //注明:該程序不是最終程序,更新程序請聯系中山董豪
  10. //實測參數:數碼管工作時:2mA , 數碼管不工作時:1mA
  11. //建議改進 選用更低頻晶振 , 改用ATtiny2313代替。
  12. #include <reg52.h>              
  13. #include<intrins.h>
  14. #define uint unsigned int        
  15. #define uchar unsigned char     

  16. uchar second,minh,minl,hourh,hourl,hour,i,j,k,l,state,slient,dpi,dps,d2;
  17. uchar day,month,dayh,dayl,monthh,monthl;                                   //1,3,5,7,8,10,12 大 31
  18. uchar year1,year2,year3,year4,year;                                              //4,6,9,11,小30   
  19. //unsigned int d1,d0 ;                                                                    //2月閏年29天         year%4==0&&year%100!=0||year%400==0


  20. uchar code thourh[]={10,10,10,10,10,10,10,10,10,10,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2};
  21. uchar code thourl[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4};
  22. uchar code tmonthh[]={10,10,10,10,10,10,10,10,10,10,1,1,1};
  23. uchar code tmonthl[]={ 0,1, 2, 3, 4, 5, 6, 7, 8, 9 ,0,1,2};
  24. uchar code tdayh[]={10,10,10,10,10,10,10,10,10,10,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3};
  25. uchar code tdayl[]={ 0,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1};
  26. uchar code display[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x00}; //七段譯碼 P1.6=A
  27. sbit DP=P1^7;
  28. sbit int0=P3^2; //改時間
  29. sbit int1=P3^3;
  30. sbit bee=P3^7;
  31. sbit P3_0=P3^0;
  32. sbit P3_1=P3^1;
  33. sbit P3_4=P3^4;
  34. sbit P3_5=P3^5;
  35. void main()
  36. {
  37. TMOD=0x11;
  38. TH0=(65536-50000)/256;
  39. TL0=(65536-50000)%256;         //0.05s一次中斷,時鐘
  40. TH1=(65536-3000)/256;
  41. TL1=(65536-3000)%256;         //0.006s一次中斷,掃描顯示
  42.      IE=0X8A;                      //EA,ET0,ET1=1
  43. IP=0x02;                      //PT0=1;
  44. state=1; //    1:顯示時間 2:顯示月日 3:顯示年   4:修改分鐘   5:修改時鐘   6:修改年   7:修改月   8:修改日 ;
  45. slient=1; // 1:正常顯示    2:關閉顯示
  46. second=0; //2010年0點0分0秒
  47. minl=0;
  48. minh=0;
  49. hour=0;
  50. day=1;
  51.      bee=0;
  52. month=1;
  53. year1=0;
  54. year2=1;
  55. year3=0;
  56. year4=2;
  57. TR1=1;
  58.      TR0=1;
  59. while(1)
  60. { PCON=0X01; //空閑模式}//while
  61. }
  62.    
  63. } //main   設置



  64. void timer0() interrupt 1 using 0 //時鐘 改狀態 改時間
  65. {
  66.      TH0=(65536-50000)/256;   //0.1s
  67. TL0=(65536-50000)%256;
  68. i++;
  69. if(i==10)
  70. {
  71. i=0;
  72.    bee=1;
  73.       if(slient==1)      //自動關閉顯示器,剩電   10s自動關閉
  74. { d2++;
  75.    if(d2==10)
  76.     {d2=0;
  77.      //d3++;
  78.      //if(d3==200) //
  79.     // d3=0;
  80.      slient=0;
  81.    
  82.        }
  83.      }                    //自動關閉顯示器,剩電
  84.    if(second<59)
  85.       second++;
  86.    else
  87.    {    second=0;
  88.    if(minl<9)
  89.       minl++;
  90.    else
  91.    {    minl=0;
  92.       if(minh<5)
  93.          minh++;
  94.       else
  95.       {
  96.         minh=0;
  97.      bee=0;               //整點報時
  98.       if(hour<23)
  99.          hour++;
  100.       else
  101.         { hour=0;

  102.             /////////////////////////////////////// 萬年歷
  103.                                 if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) //1,3,5,7,8,10,12 大 31
  104.               {
  105.              if(day<31)
  106.             day++;
  107.           else
  108.             {day=1;
  109.              if(month<12)
  110.                month++;
  111.              else
  112.               { month=1;
  113.              if(year1<9)
  114.                year1++;
  115.              else
  116.                {year1=0;
  117.             if(year2<9)
  118.               year2++;
  119.             else
  120.               {year1=0;                //最高位2099年
  121.                   year2=1;
  122.                year3=0;
  123.                year4=2;
  124.               }
  125.                                              }
  126.            }
  127.              }
  128.                                    }
  129.            else if(month==4 || month==6 || month==9 || month==11)                                    //4,6,9,11,小30
  130.               {
  131.             if(day<30)
  132.             day++;
  133.           else
  134.             {day=1;
  135.              if(month<12)
  136.                month++;
  137.              else
  138.               { month=1;
  139.             if(year1<9)
  140.                year1++;
  141.              else
  142.                {year1=0;
  143.             if(year2<9)
  144.               year2++;
  145.             else
  146.               {year1=0;                //最高位2099年
  147.                   year2=1;
  148.                year3=0;
  149.                year4=2;
  150.               }
  151.                                              }
  152.            }
  153.             }
  154.             }
  155.            else if(month==2)                                              //2月閏年29天
  156.               { year=year4*1000+year3*100+year1*10+year1;
  157.           if((year%4==0&&year%100!=0)||year%400==0)
  158.            {if(day<29) //閏年
  159.                  day++;
  160.            else
  161.             {day=1;
  162.              if(month<12)
  163.                month++;
  164.              else
  165.               { month=1;
  166.             if(year1<9)
  167.                year1++;
  168.              else
  169.                {year1=0;
  170.             if(year2<9)
  171.               year2++;
  172.             else
  173.               {year1=0;                //最高位2099年
  174.                   year2=1;
  175.                year3=0;
  176.                year4=2;
  177.               }
  178.                                              }
  179.            }
  180.             }}
  181.                                       else
  182.                                        {if(day<28) //非閏年
  183.                  day++;

  184.              else
  185.              {day=1;
  186.              if(month<12)
  187.                month++;
  188.              else
  189.               { month=1;
  190.             if(year1<9)
  191.                year1++;
  192.              else
  193.                {year1=0;
  194.             if(year2<9)
  195.               year2++;
  196.             else
  197.               {year1=0;                //最高位2099年
  198.                   year2=1;
  199.                year3=0;
  200.                year4=2;}
  201.                                        }}}}
  202.            }
  203.                 ////////////////////////////////////////////
  204.                        }
  205.       }
  206.    }
  207.       }
  208. }
  209. /////////////////////////////////////////////////閃爍標志位
  210. dpi++;         //dps=0 的占空比為 3:1
  211. if(dpi==5)
  212. {
  213.     dpi=0;
  214.     dps++;
  215.     if(dps==2)
  216.     {dps=0;}
  217.       }//
  218. //    if(int1==0) //p3.3調狀態 每秒看一次
  219. //       d2=0;
  220. //   }//dpi=5
  221. /////////////////////////////////////////////////////p3.3調狀態
  222.    if(dpi==0 || dpi==2 || dpi==4) //0.2s 掃描一次
  223. { if(int1==0) //p3.3調狀態
  224.        {   d2=0;
  225.          if(slient==1)
  226.      { if(state==8)

  227.      state=1;
  228.       else
  229.     state++;
  230.        }//slient==1
  231.         else
  232.          { slient=1;
  233.     ET1=1;}
  234. //       for(d1=1000000;d1>0;d1--);
  235.        } //調狀態 int1==0
  236. ////////////////////////////////////////////////////////////p3.2改時間
  237. if(int0==0) //P3.2調節
  238.        {    d2=0;
  239.       if(state==1 || state==2 || state==3) //顯示狀態下按P3.2,進入不顯示狀態,按任意鍵退出。
  240.        {
  241.        if(slient==2)
  242.       { slient=1;
  243.     ET1=1;}
  244.     else
  245.        slient++;
  246.     }
  247.       else if(state==4)       //
  248.        {second=0;
  249.    if(minl<9)
  250.       minl++;
  251.    else
  252.    {    minl=0;
  253.       if(minh<5)
  254.          minh++;
  255.       else
  256.       {
  257.          minh=0;
  258.       }
  259.    }
  260.     }
  261.       else if(state==5)   //
  262.    {
  263.    if(hour<23)
  264.      hour++;
  265.    else
  266.      hour=0;
  267.    }
  268.    else if(state==8)   //
  269.      {            ///////////////////////////////////////
  270.                                 if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)              //1,3,5,7,8,10,12 大 31
  271.               {
  272.              if(day<31)
  273.             day++;
  274.           else
  275.             day=1;
  276.                                     }
  277.            else if(month==4 || month==6 || month==9 || month==11)                                    //4,6,9,11,小30
  278.               {
  279.             if(day<30)
  280.             day++;
  281.           else
  282.                                        day=1;
  283.             }
  284.            else if(month==2)                                              //2月閏年29天
  285.               { year=year4*1000+year3*100+year1*10+year1;
  286.               if((year%4==0&&year%100!=0)||year%400==0)
  287.               {if(day<29) //閏年
  288.                  day++;
  289.            else
  290.               day=1;
  291.                                        }
  292.           else
  293.            {if(day<28) //非閏年
  294.                  day++;
  295.            else
  296.               day=1;
  297.            }
  298.            }
  299.                 ////////////////////////////////////////////
  300.      }
  301.    else if(state==7)   //
  302.      {
  303.               day=1;
  304.      if(month<12)
  305.       month++;
  306.      else
  307.      month=1;
  308.      }
  309.    else if(state==6)   // 1:顯示時間 2:顯示月日 3:顯示年   4:修改分鐘   5:修改時鐘   6:修改年   7:修改月   8:修改日 ;
  310.      {     day=1;
  311.      if(year1<9)
  312.      year1++;
  313.      else
  314.     {   year1=0;
  315.       if(year2<9)
  316.        year2++;
  317.          else
  318.      {year1=0;                //最高位2099年
  319.       year2=1;
  320.       year3=0;
  321.       year4=2;
  322.      }
  323.              }
  324.      }//state=6
  325. //      for(d0=600000;d0>0;d0--);
  326.       }    //調時 int0
  327. //}
  328. } //dpi==0 ,2,4

  329. } //timer0 時間   調時   改狀態




  330. void timer1() interrupt 3 using 3    //display
  331. {
  332. TH1=(65536-3000)/256;
  333. TL1=(65536-3000)%256;         //0.006s
  334.       monthl=tmonthl[month];
  335.    monthh=tmonthh[month];
  336.    dayl=tdayl[day];
  337.    dayh=tdayh[day];
  338.    hourl=thourl[hour];
  339.    hourh=thourh[hour];
  340.    if(slient==1)
  341.    {    if(j<4)
  342.        j++;
  343.      else
  344.        j=1;
  345.      if(state==1 || state==4 || state==5) //顯示時間   1:顯示時間 2:顯示月日 3:顯示年   4:修改分鐘   5:修改時鐘   6:修改年   7:修改月   8:修改日 ;
  346.       {
  347.          if(j==1)
  348.        {if(state==4 && dps==0 && int0!=0) // 閃爍,調節時不閃
  349.     P1=0x00;
  350.     else
  351.     {P1=display[minl];      //p3.5,p3.4,p3.1,p3.0 為勢能端
  352.        }}    //11XX10
  353.       else if(j==2)
  354.        {if(state==4 && dps==0 && int0!=0) // 閃爍
  355.     P1=0x00;
  356.     else
  357.     {P1=display[minh];
  358.      }}    //11XX01
  359.           else if(j==3)
  360.        {if(state==5 && dps==0 && int0!=0) // 閃爍
  361.      P1=0x00;
  362.      else
  363.      {P1=display[hourl];
  364.      }}     //10XX11
  365.        else if(j==4)
  366.        {if(state==5 && dps==0 && int0!=0) // 閃爍
  367.      P1=0x00;
  368.      else
  369.      {P1=display[hourh];
  370.             }}        //01XX11
  371.            }
  372.     else if(state==2 || state==7 || state==8)    //顯示月日     1:顯示時間 2:顯示月日 3:顯示年   4:修改分鐘   5:修改時鐘   6:修改年   7:修改月   8:修改日 ;
  373.      {
  374.          if(j==1)
  375.        {if(state==8 && dps==0 && int0!=0) // 閃爍
  376.      P1=0x00;
  377.      else
  378.      {P1=display[dayl];      //p3.5,p3.4,p3.1,p3.0 為勢能端
  379.       }}    //11XX10
  380.       else if(j==2)
  381.        {if(state==8 && dps==0 && int0!=0) // 閃爍
  382.      P1=0x00;
  383.      else
  384.      {P1=display[dayh];
  385.       }}    //11XX01
  386.           else if(j==3)
  387.        {if(state==7 && dps==0 && int0!=0) // 閃爍
  388.      P1=0x00;
  389.      else
  390.      {P1=display[monthl];
  391.       }}     //10XX11
  392.        else if(j==4)
  393.        {if(state==7 && dps==0 && int0!=0) // 閃爍
  394.      P1=0x00;
  395.      else
  396.      {P1=display[monthh];
  397.             }}        //01XX11
  398.      }
  399.    else if(state==3 || state==6)   //顯示年
  400.    {   
  401.    if(state==6 && dps==0 && int0!=0)
  402.    P1=0x00;
  403.    else
  404.         {if(j==1)
  405.        {P1=display[year1];      //p3.5,p3.4,p3.1,p3.0 為勢能端
  406.         }    //11XX10 3e
  407.       else if(j==2)
  408.        {P1=display[year2];
  409.      }    //11XX01 3d
  410.           else if(j==3)
  411.        {P1=display[year3];
  412.      }     //10XX11 2f
  413.        else if(j==4)
  414.        {P1=display[year4];
  415.            }        //01XX11 1f
  416.      }
  417.    }

  418.    if(j==1)
  419.     {P3_0=0;P3_1=1;P3_4=1;P3_5=1;}
  420.    else if(j==2)
  421.     {P3_0=1;P3_1=0;P3_4=1;P3_5=1;}
  422.    else if(j==3)
  423.     {P3_0=1;P3_1=1;P3_4=0;P3_5=1;}
  424.    else if(j==4)
  425.     {P3_0=1;P3_1=1;P3_4=1;P3_5=0;}
  426. /////////////////////////////////////////////////////////// DP
  427. /////////////////////////////////////////////////////////// 1:顯示時間 2:顯示月日 3:顯示年   4:修改分鐘   5:修改時鐘   6:修改年   7:修改月   8:修改日 ;
  428.     if(dps==1)
  429.     {if(state==1 || state==2)
  430.     {    if(j==1)                  //DP,顯示時間,月日
  431.        {DP=0;}   
  432.      else if(j==2)
  433.        {DP=0;}  
  434.           else if(j==3)
  435.        {DP=1;}   
  436.      else if(j==4)
  437.        {DP=0;}        }
  438.    else if(state==3)
  439.     {    if(j==1)                  //DP,顯示年
  440.        {DP=0;}   
  441.      else if(j==2)
  442.        {DP=0;}  
  443.           else if(j==3)
  444.        {DP=0;}   
  445.      else if(j==4)
  446.        {DP=0;}        }
  447.    else if(state==4)
  448. {    if(j==1)                  //DP,改分鐘
  449.        {DP=1;}   
  450.      else if(j==2)
  451.        {DP=1;}  
  452.           else if(j==3)
  453.        {DP=0;}   
  454.      else if(j==4)
  455.        {DP=0;}        }
  456.      else if(state==5)
  457. {    if(j==1)                  //DP,改時鐘
  458.        {DP=0;}   
  459.      else if(j==2)
  460.        {DP=0;}  
  461.           else if(j==3)
  462.        {DP=1;}   

  463.     else if(j==4)
  464.        {DP=1;}        }
  465.     else if(state==8)
  466.     {      if(j==1)                  //DP,改日
  467.        {DP=0;}   
  468.      else if(j==2)
  469.        {DP=1;}  
  470.           else if(j==3)
  471.        {DP=0;}   
  472.      else if(j==4)
  473.        {DP=0;}
  474.     }
  475.        else if(state==7)
  476.     {      if(j==1)                  //DP,改月
  477.        {DP=0;}   
  478.      else if(j==2)
  479.        {DP=0;}  
  480.           else if(j==3)
  481.        {DP=0;}   
  482.      else if(j==4)
  483.        {DP=1;}
  484.     }
  485.       else if(state==6)
  486.     {         DP=0;                //DP, 改年
  487.     }}
  488.     else   //dps==0
  489.     DP=0;
  490.     //////////////////////////////////////////////////////////////////DP
  491.     }
  492.       else //slient==0
  493.      {P1=0x00;ET1=0;}   //省電,關閉顯示器,關閉顯示中斷
  494. } //timer1 顯示
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:83279 發表于 2015-6-17 17:38 | 只看該作者
求大神給編個程序,用89C52系列單片機及六位數碼管顯示時、分、秒,以24小時計時方式運行,能整點提醒(短蜂鳴,次數代表整點時間),使用按鍵開關可以實現時分調整、秒表/時鐘功能轉換、省電(關閉顯示)、定時設定提醒(蜂鳴器)等功能。
回復

使用道具 舉報

板凳
ID:99341 發表于 2016-5-11 21:15 | 只看該作者
樓主,電路圖發一個
回復

使用道具 舉報

地板
ID:79094 發表于 2024-3-26 22:56 | 只看該作者
是啊  大神  給個圖紙 手殘黨 對著做個
回復

使用道具 舉報

5#
ID:1064915 發表于 2024-3-27 17:20 | 只看該作者
樓主都是2015年的,快十年了
回復

使用道具 舉報

6#
ID:961114 發表于 2024-3-28 09:10 | 只看該作者
joyb 發表于 2024-3-27 17:20
樓主都是2015年的,快十年了

是啊 現在芯片的RTC都是標配了,支持年、月、日、時、分、秒、次秒(1/128秒),并支持時鐘中斷和一組鬧鐘而且價格還美麗
回復

使用道具 舉報

7#
ID:127678 發表于 2024-4-1 10:51 | 只看該作者
都2024年了,帖子馬上都十年了,我才開始接觸單片機
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕av在线一二三区 | 日本在线一区二区 | 久草欧美 | 日本五月婷婷 | 午夜久草| 久久久久91| 日韩一级 | 欧美精品一区二区三 | 亚洲国产区 | 国产精品久久久久久久久久久久冷 | 国产精品一区二区三级 | 午夜电影一区二区 | 亚洲美女天堂网 | 亚洲精品大片 | 特一级毛片 | 综合久久99| 久久精品一区 | av在线一区二区三区 | 国产一区二区三区色淫影院 | 久久国产精品免费一区二区三区 | 亚洲欧美在线视频 | www.奇米| 久久高清 | 狠狠干在线 | 91国产精品 | 欧美中文字幕 | 成人在线h| 国产精品久久久久久久免费观看 | 精品96久久久久久中文字幕无 | 91久久| 欧美天堂在线观看 | 成人1区| 欧美国产日韩一区二区三区 | 精品国产乱码久久久久久影片 | 亚洲一区国产精品 | 日韩欧美视频 | 久久久久久国模大尺度人体 | 人操人人 | 日韩电影免费观看中文字幕 | 久久久久一区二区三区 | 国产福利在线 |