找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 8598|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

Proteus仿真51單片機(jī)電子日歷時(shí)鐘萬年歷+矩陣按鍵+數(shù)碼管+設(shè)置時(shí)間

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:598540 發(fā)表于 2020-6-29 12:15 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1.數(shù)碼管顯示
2.時(shí)間和日期每隔5秒自動(dòng)切換一次
3.數(shù)碼管顯示
4.可設(shè)置時(shí)間和日期
5.矩陣按鍵控制,可更改
6.自動(dòng)判斷閏年

1.按下切換按鍵可切換當(dāng)前顯示時(shí)間還是日期
2.按下設(shè)置按鍵進(jìn)入時(shí)間和日期的設(shè)置,設(shè)置哪一項(xiàng),哪一項(xiàng)下面就會(huì)出現(xiàn)兩個(gè)點(diǎn)
3.再次按下設(shè)置按鍵即可推出設(shè)置繼續(xù)運(yùn)行
4.自動(dòng)判斷閏年
5.日期更正(比如當(dāng)前為5月31日,當(dāng)切換月份時(shí),切換到6月,則天數(shù)自動(dòng)由31改為30)

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


單片機(jī)源程序如下:
  1. #include <reg52.h>

  2. sbit key0 = P3^0; //年份 時(shí)間 切換
  3. sbit key1 = P3^1; //設(shè)置
  4. sbit key2 = P3^2; //增加
  5. sbit key3 = P3^3; //減少

  6. sbit led0 = P3^7;  //時(shí)間日期設(shè)置指示燈
  7. sbit led1 = P3^6; // 正常運(yùn)行指示燈
  8. sbit led2 = P3^5; // 當(dāng)前為時(shí)間指示燈
  9. sbit led3 = P3^4; // 閏年指示燈

  10. sbit s1 = P0^0;
  11. sbit s2 = P0^1;
  12. sbit s3 = P0^2;

  13. typedef unsigned char uchar;
  14. typedef unsigned int uint;

  15. uint smg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00,
  16.                           0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
  17. uchar time[8],date[8];
  18. int year = 2020;
  19. char month=6,day=28,hour=18,min=22,s=0;
  20. uchar t=0; //日期和時(shí)間切換控制變量

  21. void delay(uint i);                         //延時(shí)函數(shù)
  22. void smg_show(char num_[]);         //數(shù)碼管顯示函數(shù)
  23. int keyscan();                                 //矩陣按鍵掃描函數(shù)
  24. void data_edit();                         //數(shù)碼管數(shù)據(jù)編輯函數(shù)
  25. char year_judge();                         //閏年判斷函數(shù)
  26. void relationship();                 //日期時(shí)間關(guān)系編輯函數(shù)
  27. void set_time(uchar change); //時(shí)間日期設(shè)置函數(shù)
  28. void Timer0Init();                         //定時(shí)器0初始化函數(shù)

  29. void main()
  30. {        
  31.         uchar key;
  32.         uchar change=0; //為1,顯示日期   為0,顯示時(shí)間
  33.         Timer0Init();   //定時(shí)器0初始化
  34.         led1 = 0;                //正常運(yùn)行指示燈
  35.         year_judge();
  36.         //led3 = 0;
  37.         while(1)
  38.         {        
  39.                 key = keyscan();         //掃描矩陣按鍵

  40.                 if(t==5)
  41.                 {
  42.                    change = ~change;
  43.                    t = 0;
  44.                 }
  45.                
  46.                 if(change)led2 = 1;
  47.                 else led2 = 0;        

  48.                 if(key == 0)
  49.                 {
  50.                         led1 = 1;
  51.                         set_time(change); //時(shí)間日期設(shè)置函數(shù)
  52.                         led1 = 0;
  53.                 }

  54.                 if(key == 1)
  55.                 {
  56.                         change = ~change;
  57.                         t = 0;        
  58.                 }               

  59.                
  60.                  
  61.                 relationship();        //時(shí)間日期關(guān)系控制
  62.                 data_edit();//數(shù)碼管參數(shù)編輯函數(shù)
  63.                 if(s%2)
  64.                 {
  65.                         time[2] = 11;
  66.                         time[5] = 11;
  67.                 }
  68.                 if(change)
  69.                         smg_show(date);           //數(shù)碼管顯示函數(shù)
  70.                 else
  71.                         smg_show(time);           //數(shù)碼管顯示函數(shù)
  72.            
  73.         }


  74. }


  75. /*****************************************
  76.            延時(shí)函數(shù)
  77. *****************************************/
  78. void delay(uint x)
  79. {
  80.         uchar y;
  81.         for(x;x>0;x--)
  82.                 for(y=110;y>0;y--);        
  83. }


  84. /*****************************************
  85.            數(shù)碼管顯示函數(shù)
  86. *****************************************/
  87. void smg_show(char num_[])
  88. {
  89.         char i=0;                                
  90.         for(i=0;i<8;i++)
  91.         {
  92.                 switch(i)
  93.                 {
  94.                         case 0:
  95.                                         s3 = 0;s2 = 0;s1 = 0;break;
  96.                         case 1:
  97.                                         s3 = 0;s2 = 0;s1 = 1;break;
  98.                         case 2:
  99.                                         s3 = 0;s2 = 1;s1 = 0;break;
  100.                         case 3:
  101.                                         s3 = 0;s2 = 1;s1 = 1;break;
  102.                         case 4:
  103.                                         s3 = 1;s2 = 0;s1 = 0;break;
  104.                         case 5:
  105.                                         s3 = 1;s2 = 0;s1 = 1;break;
  106.                         case 6:
  107.                                         s3 = 1;s2 = 1;s1 = 0;break;
  108.                         case 7:
  109.                                         s3 = 1;s2 = 1;s1 = 1;break;
  110.                 }
  111.                 P1=~smg[num_[i]];
  112.                 delay(10);
  113.                 P1=0xff;
  114.                 delay(10);
  115.                
  116.         }

  117. }

  118. /*****************************************
  119.            矩陣按鍵函數(shù)
  120. *****************************************/
  121. int keyscan()
  122. {
  123.         uchar i,j=0;
  124.         uchar d = 50;
  125.         uint k = 0xff;
  126.         P2 = 0XF0;
  127.         if((P2&0xf0)==0xf0)
  128.                 return k;
  129.         if((P2&0xf0)==0xf0)
  130.                 return k;
  131.         for(i=0;i<4;i++)
  132.         {
  133.                 P2=~(1<<i);
  134.                 k=(P2&0xf0);
  135.                 if(k!=0xf0)
  136.                 {
  137.                         while((k&(1<<(j+4))))
  138.                         j++;
  139.                         k = i*4+j;
  140.                         P2 = 0xf0;
  141.                         while(P2!=0xf0);
  142.                
  143.                         break;
  144.                 }
  145.         }
  146.                 return k;
  147. }

  148. /*****************************************
  149.            數(shù)據(jù)編輯函數(shù)函數(shù)
  150. *****************************************/
  151. void data_edit()
  152. {
  153.          time[0] = hour/10;
  154.          time[1] = hour%10;
  155.          time[2] = 10;
  156.          time[3] = min/10;
  157.          time[4] = min%10;
  158.          time[6] = s/10;
  159.          time[7] = s%10;
  160.          time[5] = 10;         

  161.          date[0] = year/1000;
  162.          date[1] = year/100%10;
  163.          date[2] = year/10%10;
  164.          date[3] = year%10;
  165.          //date[2] = 10;
  166.          date[4] = month/10;
  167.          date[5] = month%10;
  168.          //date[5] = 10;
  169.          date[6] = day/10;
  170.          date[7] = day%10;
  171. }

復(fù)制代碼
全部資料51hei下載地址:
電子日歷時(shí)鐘.zip (73.82 KB, 下載次數(shù): 238)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:515926 發(fā)表于 2020-7-3 14:41 | 只看該作者
感謝樓主提供的全面素材,為我等初學(xué)者帶來福音。
回復(fù)

使用道具 舉報(bào)

板凳
ID:819173 發(fā)表于 2020-9-15 21:50 | 只看該作者
請問下,keyscan函數(shù)里,
if((P2&0xf0)==0xf0)
       return k;
寫了兩遍,是寫錯(cuò)了嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:852300 發(fā)表于 2020-12-4 11:24 | 只看該作者
早幾年這類產(chǎn)品銷量不錯(cuò)!
回復(fù)

使用道具 舉報(bào)

5#
ID:858511 發(fā)表于 2020-12-11 09:32 | 只看該作者
感謝樓主的分享,對我有許多的幫助
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表