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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

分享一個單片機萬年歷的程序(6個數碼管顯示)

[復制鏈接]
跳轉到指定樓層
樓主
ID:323712 發表于 2018-5-6 21:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
網上找的大多數都是用液晶顯示的,這是用6個數碼管顯示

單片機源程序如下:
  1.   #include <reg51.h>
  2.   #include <intrins.h>
  3.   #define uchar unsigned char
  4.   #define uchar unsigned char
  5.   #define uint unsigned int
  6.   sbit DS1302_CLK=P3^2;
  7.   sbit DS1302_IO=P3^3;
  8.   sbit DS1302_RST=P3^4;
  9.   sbit ACC0=ACC^0;
  10.   sbit ACC7=ACC^7;
  11.   sbit Tiaoshi=P3^7;  //調試按鍵
  12.   sbit Inck=P3^6;        //升序按鍵
  13.   uchar count=0;        //記錄按鍵次數
  14.   uchar temp;
  15.    sfr Wei=0xa0;
  16.    sfr Duan=0x90;
  17.   bit Inck_flag=0x20;        //升序調試標志
  18.   bit flag=0x21;
  19.   char hide_sec;
  20.   char hide_min;
  21.   char hide_hour;
  22.   char hide_day;
  23.   char hide_month;
  24.   char hide_year;
  25.   typedef struct _SYSTEMTIME_
  26. {
  27.     uchar Second;
  28.         uchar Minute;
  29.         uchar Hour;
  30.         uchar Day;
  31.         uchar Month;
  32.         uchar Year;
  33.         uchar TimeStr[12];
  34.   }SYSTEMTIME;                         //定義的時間類型
  35.   SYSTEMTIME CurrentTime;  //結構體名稱CurrentTime
  36.   #define AM(X) X
  37.   #define PM(X) (X+12)         //轉成24小時制
  38.   #define DS1302_SECOND 0x80  //秒寄存器地址
  39.   #define DS1302_MINUTE 0x82  //分寄存器地址
  40.   #define DS1302_HOUR 0x84         //小時寄存器地址
  41.   #define DS1302_DAY 0x86
  42.    #define DS1302_MONTH 0x88
  43.   #define DS1302_YEAR 0x8c
  44.   void mdelay(unsigned int count)         //延時函數
  45.   {
  46.     uchar i,j;
  47.         for(i=0;i<count;i++)
  48.         {
  49.           for(j=0;j<120;j++)
  50.           ;
  51.         }
  52.   }
  53.   void DS1302InputByte(uchar d)          //向1302中通過ACC輸入數值d
  54.   {
  55.     uchar i;
  56.         ACC=d;
  57.         for(i=8;i>0;i--)
  58.         {
  59.           DS1302_IO=ACC0;
  60.           DS1302_CLK=1;          //一個時鐘的上升沿輸出
  61.           DS1302_CLK=0;
  62.           ACC=ACC>>1;
  63.         }
  64.   }
  65. uchar DS1302OutputByte(void)           //ds1302向單片機發送數據返回值為ACC
  66. {
  67.    uchar i;
  68.    for(i=8;i>0;i--)
  69.    {
  70.      ACC=ACC>>1;
  71.          ACC7=DS1302_IO;
  72.          DS1302_CLK=1;
  73.          DS1302_CLK=0;
  74.         }
  75.         return(ACC);
  76. }
  77. void Write1302(uchar ucAddr,uchar ucDa)   //向ds1302中寫入數據地址為Addar,數據為ucDa
  78. {
  79.    DS1302_RST=0;
  80.    DS1302_CLK=0;
  81.    DS1302_RST=1;
  82.    DS1302InputByte(ucAddr);           //先發送地址,命令
  83.    DS1302InputByte(ucDa);           //然后寫1Byte數據
  84.    DS1302_CLK=1;
  85.    DS1302_RST=0;
  86.   }
  87.   uchar Read1302(uchar ucAddr)        //讀取DS1302某地址的數據
  88.   {
  89.     uchar ucData;
  90.         DS1302_RST=0;
  91.         DS1302_CLK=0;
  92.         DS1302_RST=1;
  93.         DS1302InputByte(ucAddr|0x01);                //輸入地址,命令
  94.         ucData=DS1302OutputByte();                        //讀1Byte數據
  95.         DS1302_CLK=1;
  96.         DS1302_RST=0;
  97.         return(ucData);
  98.   }
  99.   void DS1302_SetProtect(bit flag1)                //           是否寫保護
  100.   {
  101.     if(flag1)
  102.             Write1302(0x8E,0x10);
  103.         else
  104.             Write1302(0x8E,0x00);
  105.   }
  106.   void DS1302_SetTime(uchar Address,uchar Value)     //設置時間函數
  107.   {
  108.       DS1302_SetProtect(0);
  109.           Write1302(Address,((Value/10)<<4|(Value%10)));
  110.   }
  111.   void DS1302_GetTime(SYSTEMTIME *Time)           //將ds1302中讀取的數據存入結構體
  112.   {
  113.     uchar ReadValue;
  114.         ReadValue=Read1302(DS1302_SECOND);        //將秒位的數據賦值給ReadValue變量
  115.         Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //結構體中的數變為十進制數
  116.         ReadValue=Read1302(DS1302_MINUTE); //分位
  117.         Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
  118.         ReadValue=Read1302(DS1302_HOUR);
  119.         Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);


  120.         ReadValue=Read1302(DS1302_DAY);        //將的數據賦值給ReadValue變量
  121.         Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //結構體中的數變為十進制數
  122.         ReadValue=Read1302(DS1302_MONTH); //
  123.         Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
  124.         ReadValue=Read1302(DS1302_YEAR);
  125.         Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
  126.   }
  127.   void TimeToStr(SYSTEMTIME *Time)           //數據緩存區
  128.   {
  129.      Time->TimeStr[0]=Time->Hour/10;   //將小時的十位存入TimeStr[0]
  130.          Time->TimeStr[1]=Time->Hour%10;

  131.          Time->TimeStr[2]=Time->Minute/10;
  132.          Time->TimeStr[3]=Time->Minute%10;

  133.          Time->TimeStr[4]=Time->Second/10;
  134.          Time->TimeStr[5]=Time->Second%10;


  135.          Time->TimeStr[6]=Time->Year/10;   //將小時的十位存入TimeStr[0]
  136.          Time->TimeStr[7]=Time->Year%10;

  137.          Time->TimeStr[8]=Time->Month/10;
  138.          Time->TimeStr[9]=Time->Month%10;

  139.          Time->TimeStr[10]=Time->Day/10;
  140.          Time->TimeStr[11]=Time->Day%10;
  141.   }
  142.   void Delay1ms(uint count1)        //延時函數
  143.   {
  144.     uint i,j;
  145.         for(i=0;i<count1;i++)
  146.         for(j=0;j<120;j++);
  147.   }
  148.   void Dis(SYSTEMTIME *Time)  //顯示函數
  149.   {
  150.     uchar disbit,shitfb;
  151.         DS1302_GetTime(Time);        //從1302中獲取時間并存入結構體Time中
  152.         TimeToStr(Time);          //將結構體中數據緩存至TimeStr[0]
  153.         disbit=1;          //0xfe;        最后一位打開
  154.         for(shitfb=0;shitfb<6;shitfb++)
  155.         {_nop_();     _nop_();          //延時
  156.          Duan=Time->TimeStr[shitfb]; //段選依次輸入         TimeStr[0]到TimeStr[5];
  157.          Wei=_crol_(disbit,shitfb);         //位選依次亮起
  158.           Delay1ms(2);
  159.           Wei=0;
  160.          }
  161.    }

  162.     void Dis2(SYSTEMTIME *Time)  //顯示函數
  163.   {
  164.     uchar disbit,shitfb;
  165.         DS1302_GetTime(Time);        //從1302中獲取時間并存入結構體Time中
  166.         TimeToStr(Time);          //將結構體中數據緩存至TimeStr[0]
  167.         disbit=1;          //0xfe;        最后一位打開
  168.         for(shitfb=6;shitfb<12;shitfb++)
  169.         {_nop_();     _nop_();          //延時
  170.          Duan=Time->TimeStr[shitfb]; //段選依次輸入         TimeStr[6]到TimeStr[11];
  171.          Wei=_crol_(disbit,shitfb-6);         //位選依次亮起
  172.           Delay1ms(2);
  173.           Wei=0;
  174.          }
  175.    }

  176.    void Setkey()        //模式選擇按鍵
  177.    {
  178.        Tiaoshi=1;
  179.            if(Tiaoshi==0)         //調試按鍵按下
  180.            {
  181.               mdelay(8);
  182.                   count=count+1;  //count從0開始計數
  183.                   if(count==7)count=0;
  184.                   while(Tiaoshi==0); //按鍵松開跳出循環
  185.                 }
  186.         }
  187.    void Inckey()         //升序按鍵
  188.    {
  189.       Inck=1;
  190.           if(Inck==0)        //升序按鍵按下
  191.           {   mdelay(8);
  192.               switch(count)         //選擇調時模式
  193.                   {case 1:        //調整小時
  194.                    temp=Read1302(DS1302_HOUR);   //讀取小時數 將返回的ACC存入temp
  195.                    temp=((temp&0x70)>>4)*10+(temp&0x0f);   //將ACC化為十進制數
  196.                    temp=temp+1;                                         //小時數加1
  197.                    if(temp>=24)temp=0;
  198.                    Inck_flag=1;
  199.                    break;
  200.                    case 2:
  201.                     temp=Read1302(DS1302_MINUTE); //讀取分數
  202.                         temp=((temp&0x70)>>4)*10+(temp&0x0f);
  203.                         temp=temp+1;                 //分數加1
  204.                         Inck_flag=1;
  205.                         if(temp>=60)temp=0;
  206.                         break;
  207.                         case 3:
  208.                          temp=Read1302(DS1302_SECOND);         //讀取秒數
  209.                          temp=((temp&0x70)>>4)*10+(temp&0x0f);
  210.                          temp=temp+1;                  //秒數加1
  211.                          Inck_flag=1;                   //數據調整后更新標志
  212.                          if(temp>=60)temp=0;
  213.                          break;

  214.                          case 4:        //調整年
  215.                    temp=Read1302(DS1302_YEAR);   //讀取年 將返回的ACC存入temp
  216.                    temp=((temp&0x70)>>4)*10+(temp&0x0f);   //將ACC化為十進制數
  217.                    temp=temp+1;                                         //小時數加1
  218.                    if(temp>=99)temp=0;
  219.                    Inck_flag=1;
  220.                    break;
  221.                    case 5:
  222.                     temp=Read1302(DS1302_MONTH); //讀取
  223.                         temp=((temp&0x70)>>4)*10+(temp&0x0f);
  224.                         temp=temp+1;                 //
  225.                         Inck_flag=1;
  226.                         if(temp>=12)temp=0;
  227.                         break;
  228.                         case 6:
  229.                          temp=Read1302(DS1302_DAY);         //讀取秒數
  230.                          temp=((temp&0x70)>>4)*10+(temp&0x0f);
  231.                          temp=temp+1;                  //秒數加1
  232.                          Inck_flag=1;                   //數據調整后更新標志
  233.                          if(temp>=32)temp=0;
  234.                          break;


  235.                          default: Inck_flag=0;break;
  236.                          }
  237.                          while(Inck==0); //檢測松開按鍵
  238.                         }
  239.         }
  240.    void Keydone()               //按鍵功能執行
  241.    {   
  242.                   Setkey();                           //掃描模式切換按鍵
  243.                   switch(count)
  244.                   {case 1:do                                 //count=1,調整時
  245.                        {  Inckey();
  246.                               if(Inck_flag==1)
  247.                                   { temp=(temp/10)<<4|temp%10;
  248.                                     Write1302(0x8e,0x00);   //寫入允許
  249.                                         Write1302(0x84,temp);   //寫入新的小時數temp
  250.                                         Write1302(0x8e,0x80);   //禁止寫入
  251.                                         Inck_flag=0;
  252.                                         }
  253.                                         hide_hour++;
  254.                                         if(hide_hour>3)
  255.                                         hide_hour=0;
  256.                                         Dis(&CurrentTime) ;
  257.                                         }while(count==2);break;
  258.                         case 2:do                                  //count=2,調整分
  259.                           {   hide_hour=0;
  260.                               Inckey();
  261.                                   if(Inck_flag==1)
  262.                                   {   temp=(temp/10)<<4|temp%10;
  263.                                       Write1302(0x8e,0x00); //寫入允許
  264.                                           Write1302(0x82,temp); //寫入新的分數
  265.                                           Write1302(0x8e,0x80); //禁止寫入
  266.                                           Inck_flag=0;
  267.                                           }
  268.                                           hide_min++;
  269.                                           if(hide_min>3)
  270.                                           hide_min=0;
  271.                                           Dis(&CurrentTime);  //程序每循環三次顯示一下
  272.                                           }while(count==3);break;
  273.                         case 3:do                                         //調整秒
  274.                                {  hide_min=0;
  275.                                       Inckey();                 //掃描加按鈕
  276.                                           if(Inck_flag==1)                 //數據更新,重新寫入新的數據
  277.                                           {   temp=(temp/10)<<4|temp%10;
  278.                                               Write1302(0x8e,0x00);             //寫入允許
  279.                                                   Write1302(0x80,temp&0x7f);  //寫入新的秒數
  280.                                                   Write1302(0x8e,0x80);       //禁止寫入
  281.                                                   Inck_flag=0;
  282.                                                 }
  283.                                                 hide_sec++;      //位閃計時
  284.                                                 if(hide_sec>3)
  285.                                                 hide_sec=0;
  286.                                                 Dis(&CurrentTime);
  287.                                                 }while(count==4);break;


  288.                                                 case 4:do                                 //count=1,調整
  289.                        {  Inckey();
  290.                               if(Inck_flag==1)
  291.                                   { temp=(temp/10)<<4|temp%10;
  292.                                     Write1302(0x8e,0x00);   //寫入允許
  293.                                         Write1302(0x8c,temp);   //寫入新的
  294.                                         Write1302(0x8e,0x80);   //禁止寫入
  295.                                         Inck_flag=0;
  296.                                         }
  297.                                         hide_year++;
  298.                                         if(hide_year>3)
  299.                                         hide_year=0;
  300.                                         Dis2(&CurrentTime) ;
  301.                                         }while(count==5);break;
  302.                         case 5:do                                  //count=5
  303.                           {   hide_year=0;
  304.                               Inckey();
  305.                                   if(Inck_flag==1)
  306.                                   {   temp=(temp/10)<<4|temp%10;
  307.                                       Write1302(0x8e,0x00); //寫入允許
  308.                                           Write1302(0x88,temp); //寫入新的
  309.                                           Write1302(0x8e,0x80); //禁止寫入
  310.                                           Inck_flag=0;
  311.                                           }
  312.                                           hide_month++;
  313.                                           if(hide_month>3)
  314.                                           hide_month=0;
  315.                                           Dis2(&CurrentTime);  //程序每循環三次顯示一下
  316.                                           }while(count==6);break;
  317.                         case 6:do                                         //調整
  318.                                {  hide_month=0;
  319.                                       Inckey();                 //掃描加按鈕
  320.                                           if(Inck_flag==1)                 //數據更新,重新寫入新的數據
  321.                                           {   temp=(temp/10)<<4|temp%10;
  322.                                               Write1302(0x8e,0x00);             //寫入允許
  323.                                                   Write1302(0x86,temp);  //寫入新的
  324.                                                   Write1302(0x8e,0x80);       //禁止寫入
  325.                                                   Inck_flag=0;
  326.                                                 }
  327.                                                 hide_day++;      //位閃計時
  328.                                                 if(hide_day>3)
  329.                                                 hide_day=0;
  330.                                                 Dis2(&CurrentTime);
  331.                                                 }while(count==7);break;

  332.                         case 7:
  333.                         count=0;hide_sec=0;        hide_day=0;
  334.                         break;
  335.                         default: break;
  336.                         }
  337.                 }
  338.                 main()
  339.                 {   Inck_flag=0;
  340.                     while(1)
  341.                         {
  342.                                 if(count<4)
  343.                                 {
  344.                                 Dis(&CurrentTime);
  345.                            Setkey();
  346.                            if(count!=0)//(F0==1)
  347.                            Keydone();
  348.                            } //進入調整模式

  349.                                    if(count>=4)
  350.                                 {
  351.                                 Dis2(&CurrentTime);
  352.                            Setkey();
  353.                            if(count!=0)//(F0==1)
  354.                            Keydone();
  355.                            } //進入調整模式

  356.                            }
  357.                         }
復制代碼

所有資料51hei提供下載:
wanniali.rar (39.63 KB, 下載次數: 32)


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

使用道具 舉報

沙發
ID:455189 發表于 2018-12-26 10:49 | 只看該作者
謝謝樓主,lznb
回復

使用道具 舉報

板凳
ID:542652 發表于 2019-5-20 11:42 | 只看該作者
我想問怎么接線
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费黄色的视频 | 免费看a | 久久久成人网 | 99re在线视频| 第一av | 中文字幕日韩欧美 | 一二三四av| 日韩在线视频一区 | 操射视频| 午夜影院在线观看 | 国产成人99久久亚洲综合精品 | 国产99久久精品一区二区永久免费 | 一区二区在线看 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 一区二区中文 | 日韩精品极品视频在线观看免费 | 狠狠综合久久av一区二区小说 | 一区二区三区在线观看免费视频 | 九一国产精品 | 欧美日韩一卡二卡 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 2018天天干天天操 | 99这里只有精品视频 | 久久精品亚洲精品 | 国产精品久久久久久久午夜片 | 婷婷丁香在线视频 | 国产一级在线 | 国产一区在线视频 | 日韩欧美一区二区三区在线播放 | 青娱乐一区二区 | 日韩精品在线播放 | 午夜影院视频 | 日本在线视频一区二区 | 亚洲一区二区三区久久久 | 黄色片网站国产 | 激情三区 | 午夜在线免费观看视频 | 日本久久视频 | 日本亚洲一区二区 | 视频一二三区 | 天堂视频中文在线 |