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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機電子時鐘,能顯示時間,星期,日期 帶PCB文件

[復制鏈接]
跳轉到指定樓層
樓主

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


全部資料下載地址:
時鐘電路圖及PCB工程.zip (6.91 MB, 下載次數: 106)

單片機源代碼為
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit lcdrs=P2^4;
  6. sbit lcdrw=P2^5;
  7. sbit lcden=P2^6;
  8. sbit key1=P2^2;
  9. sbit key2=P2^1;
  10. sbit key3=P2^0;
  11. sbit FM=P1^0;


  12. uchar counter,cycle;
  13. uchar key_counter = 0;  //定義光標閃爍以及修改操作數的標記
  14. uchar second0,second1,minute0,minute1,hour0,hour1;
  15. uchar table[][3]={"SUN","MON","TUE","WEN","THU","FRI","SAT"};
  16. uchar year[4],day[2],month[2],date; //日期變量
  17. uchar small_mon,leap_year;
  18. uchar k;


  19. void state() //檢查日期狀態函數(即判斷是否閏年,是否小月的函數)
  20. {
  21.   switch(month[0])     //2,4,6,9,11月是小月
  22.      {
  23.        case 1:
  24.            if(month[1] == 1) //若是11月,則是小月
  25.           small_mon = 1;
  26.        else              //若是1月,則不是小月
  27.        small_mon = 0; break;
  28.            case 2:
  29.        case 4:
  30.        case 6:
  31.        case 9: small_mon = 1; break;
  32.        default:small_mon = 0;break;
  33.      }
  34.          
  35.          k=year[3]*1000+year[2]*100+year[1]*10+year[0];
  36.          if(k%4==0&&k%100!=0||k%400==0)
  37.          leap_year=1;
  38.          else
  39.          leap_year=0;
  40. }


  41. void Dater() //日期函數
  42. {
  43.   state();        
  44.   day[0]++;
  45.   date=(date+1)%7;

  46.   switch(day[0])    //日變化
  47.     {
  48.       case 10:
  49.        {
  50.          if(day[1] == 2 && month[0] == 2 && month[1] == 0) //20日的個位能到10,說明是閏年,把2月30號轉變為3月1號
  51.            {
  52.              day[0] = 1;
  53.              day[1] = 0;
  54.              month[0]++;
  55.             }
  56.          else  //日期個位滿10進1
  57.             {
  58.               day[0] = 0;
  59.               day[1]++;
  60.             }
  61.        }  break;
  62.       case 1:
  63.        {
  64.          if(day[1] == 3 && small_mon) //小月31號時把日期置為1號,月份+1
  65.            {
  66.              day[0] = 1;
  67.              day[1] = 0;
  68.              month[0]++;
  69.            }
  70.        } break;
  71.       case 2:
  72.        {
  73.          if(day[1] == 3)
  74.            {
  75.              day[0] = 1;
  76.              day[1] = 0;
  77.              month[0]++;
  78.            }
  79.         }break;
  80.        case 9:
  81.         {
  82.          if(day[1] == 2 && !leap_year && month[0] == 2 && month[1] == 0)  //平年時,把2月29號變為3月1號
  83.            {
  84.              day[0] = 1;
  85.              day[1] = 0;
  86.              month[0]++;
  87.            }
  88.         } break;
  89.        default: break;
  90.      }


  91.   switch(month[0])   //月變化
  92.     {
  93.       case 10:           //個位逢10進1
  94.        {
  95.          month[0] = 0;
  96.          month[1]++;
  97.        } break;
  98.       case 3:     //當十位是1,個位逢3則年進1
  99.        {
  100.          if(month[1] == 1)
  101.            {
  102.              month[0] = 1;
  103.              month[1] = 0;
  104.              year[0]++;
  105.            }
  106.        } break;
  107.     }


  108.   if(year[0] > 9)     //相應年變化
  109.     {
  110.       year[0] = 0;
  111.       year[1]++;
  112.       if(year[1] > 9)
  113.         {
  114.           year[1] = 0;
  115.           year[2]++;
  116.           if(year[2] > 9)
  117.             {
  118.               year[2] = 0;
  119.               year[3]++;
  120.               if(year[3] > 9)
  121.               year[3] = 0;
  122.             }
  123.          }
  124.       }
  125. }



  126. void clock() //時鐘函數
  127. {
  128.   second0++;
  129.   if(second0 > 9)
  130.     {
  131.       second0 = 0;
  132.       second1++;
  133.       if(second1 > 5)
  134.         {
  135.           second1 = 0;
  136.           minute0++;
  137.           if(minute0 > 9)
  138.             {
  139.               minute0 = 0;
  140.               minute1++;
  141.               if(minute1 > 5)
  142.                 {
  143.                   minute1 = 0;
  144.                   hour0++;
  145.                   if(hour0 == 4 && hour1 == 2)
  146.                     {
  147.                       hour0 = hour1 = 0;
  148.                       Dater();
  149.                      }
  150.                   else if(hour0 > 9)
  151.                          {
  152.                            hour0 = 0;
  153.                            hour1++;
  154.                          }
  155.                  }
  156.              }
  157.         }
  158.      }
  159. }



  160. void delay(uint z) //延時函數ms
  161. {
  162.   uint x,y;
  163.   for(x = z;x > 0;x--)
  164.   for(y = 110;y > 0;y--) ;
  165. }

  166. void write_com(uchar com) //寫指令到LCD液晶顯示
  167. {
  168.   lcdrs = 0;  //選擇指令寄存器
  169.   lcdrw = 0;  //選擇寫
  170.   P0 = com;   //把命令字送入P0口
  171.   delay(1);   //延時,讓1602準備接收數據
  172.   lcden = 1;  //使能線電平變化,命令送入1602的8位數據口

  173.   delay(1);   //等待接收
  174.   lcden = 0;
  175. }

  176. void write_data(uchar data0) //寫數據到LCD液晶顯示
  177. {
  178.   lcdrs = 1;   //選擇數據寄存器
  179.   lcdrw = 0;   //選擇寫
  180.   P0 = data0;  //把數據送入P0口
  181.   delay(1);    //延時,讓1602準備接收數據
  182.   lcden = 1;   //使能線電平變化,數據送入8位數據口

  183.   delay(1);  //等待接收
  184.   lcden = 0;
  185. }

  186. void disp_time() //顯示時間
  187. {
  188.   write_com(0xc4);  //設定顯示地址為下排第5位

  189.   write_data(hour1 + 0x30);  //小時
  190.   write_data(hour0 + 0x30);
  191.   write_data(0x3a);   //顯示冒號

  192.   write_data(minute1 + 0x30);  //分鐘
  193.   write_data(minute0 + 0x30);
  194.   write_data(0x3a);   //冒號

  195.   write_data(second1 + 0x30);//秒
  196.   write_data(second0 + 0x30);

  197.   if(key_counter != 0 )   //按功能鍵key1次數不為0
  198.     {
  199.       switch(key_counter)
  200.         {
  201.           case 1:
  202.            write_com(0x80+0x4b); //定位回光標閃爍位置,第二行第12位
  203.            break;
  204.           case 2:
  205.            write_com(0x80+0x48); //第二行第9位
  206.            break;
  207.           case 3:
  208.            write_com(0x80+0x45); //第二行第6位
  209.            break;
  210.           case 4:
  211.            write_com(0x80+0x0e); //第一行第15位
  212.            break;
  213.           case 5:
  214.            write_com(0x80+0x0b); //第一行第12位
  215.            break;
  216.           case 6:
  217.            write_com(0x80+0x08);  //第一行第9位
  218.            break;
  219.           case 7:
  220.            write_com(0x80+0x03);  //第一行第4位
  221.            break;
  222.          }
  223.        write_com(0x0f);  //關光標
  224.        delay(150);
  225.     }
  226. }

  227. void disp_date() //顯示日期
  228. {
  229.   write_com(0x81);   //定義回第一行第2位

  230.   for(cycle = 0; cycle < 3;cycle++)// 顯示星期
  231.      write_data(table[date][cycle]);

  232.   write_data(0x20);   //顯示空格

  233.   for(cycle = 0;cycle < 4;cycle++)  //顯示年
  234.      write_data(year[3 - cycle]+0x30);

  235.   write_data(0x2d); //顯示'/'

  236.   write_data(month[1]+0x30); //顯示月
  237.   write_data(month[0]+0x30);

  238.   write_data(0x2d);  //顯示'/'

  239.   write_data(day[1]+0x30);  //顯示日
  240.   write_data(day[0]+0x30);
  241. }
  242. void di()            //蜂鳴器發聲函數
  243. {
  244.      FM=0;
  245.          delay(100);
  246.          FM=1;
  247. }

  248. void setting_detect()  //按鍵掃描函數
  249. {

  250.   if(key1==0)
  251.     {
  252.      delay(5);
  253.      if(key1==0) //消除抖動
  254.        {
  255.         while(!key1); //等待松手
  256.         TR0=0;                            //TRO==0
  257.         di();   //蜂鳴器滴
  258.         key_counter++;  //功能鍵按下次數加一
  259.         do
  260.          {
  261.           disp_date();   //顯示星期+日期
  262.           disp_time();   //顯示時間
  263.           if(key1==0) //按鍵“切換”
  264.             {
  265.              delay(5);
  266.              if(key1==0)
  267.                {
  268.                 while(!key1);
  269.                                 di();
  270.                 key_counter++;
  271.                }
  272.             }

  273.            if(key2==0) //按鍵“加”
  274.              {
  275.               delay(5);
  276.               if(key2==0)
  277.                 {
  278.                  while(!key2);
  279.                  di();
  280.                  switch(key_counter)  //判斷功能鍵按下次數
  281.                    {
  282.                     case 1:     //一次則秒加一
  283.                       second0++;
  284.                       if(second0 > 9)
  285.                        {
  286.                         second0 = 0;
  287.                         second1++;
  288.                         if(second1 == 6)
  289.                           second1 = 0;
  290.                        } break;

  291.                     case 2:      //兩次則分加一
  292.                       minute0++;
  293.                       if(minute0 > 9)
  294.                         {
  295.                          minute0 = 0;
  296.                          minute1++;
  297.                          if(minute1 == 6)
  298.                            minute1 = 0;
  299.                         } break;

  300.                     case 3:   //三次則時加一
  301.                       hour0++;
  302.                       if(hour1 == 2 && hour0 > 3)
  303.                         {
  304.                          hour0 = 0;
  305.                          hour1 = 0;
  306.                         }
  307.                       else if(hour0 > 9)
  308.                              {
  309.                               hour0 = 0;
  310.                               hour1++;
  311.                               }
  312.                       break;

  313.                      case 4:   //四次則日加一
  314.                        day[0]++;
  315.                        if(day[0] == 2 && day[1] == 3)
  316.                          {
  317.                           day[0] = 1;
  318.                           day[1] = 0;
  319.                          }
  320.                        if(day[0] == 10)
  321.                          {
  322.                           day[0] = 0;
  323.                           day[1]++;
  324.                          }
  325.                         break;

  326.                      case 5:    //五次則月加一
  327.                        month[0]++;
  328.                        if(month[0] == 3 && month[1] == 1)
  329.                          {
  330.                           month[0] = 1;
  331.                           month[1] = 0;
  332.                          }
  333.                        if(month[0] == 10)
  334.                          {
  335.                           month[0] = 0;
  336.                           month[1] = 1;
  337.                          }
  338.                          break;

  339.                       case 6:    //六次則年加一
  340.                        year[0]++;
  341.                        if(year[0] > 9)
  342.                          {
  343.                           year[0] = 0;
  344.                           year[1]++;
  345.                           if(year[1] > 9)
  346.                             {
  347.                              year[1] = 0;
  348.                              year[2]++;
  349.                              if(year[2] > 9)
  350.                                {
  351.                                 year[2] = 0;
  352.                                 year[3]++;
  353.                                 if(year[3] > 9)
  354.                                   year[3] = 0;
  355.                                 }
  356.                              }
  357.                            }
  358.                            break;

  359.                        case 7:  //七次則星期加一
  360.                          date=(date+1)%7;
  361.                         break;
  362.           }
  363.       }
  364. }
  365.           if(key3==0) //按鍵“減”
  366.             {
  367.              delay(5);
  368.              if(key3==0)
  369.                {
  370.                 while(!key3);
  371.                 di();
  372.                 switch(key_counter)
  373.                   {
  374.                     case 1:
  375.                       if(second0 == 0)
  376.                         {
  377.                          second0 = 9;
  378.                          if(second1 == 0)
  379.                             second1 = 5;
  380.                          else
  381.                             second1--;
  382.                          }
  383.                        else
  384.                          second0--;
  385.                        break;

  386.                      case 2:
  387.                        if(minute0 == 0)
  388.                          {
  389.                           minute0 = 9;
  390.                           if(minute1 == 0)
  391.                              minute1 = 5;
  392.                           else
  393.                              minute1--;
  394.                           }
  395.                         else
  396.                           minute0--;
  397.                         break;

  398.                       case 3:
  399.                          if(hour0 == 0)
  400.                            {
  401.                             if(hour1 == 0)
  402.                               {
  403.                                hour0 = 3;
  404.                                hour1 = 2;
  405.                               }
  406.                             else
  407.                               {
  408.                                hour0 = 9;
  409.                                hour1--;
  410.                               }
  411.                             }
  412.                           else
  413.                             hour0--;
  414.                           break;

  415.                        case 4:
  416.                          if(day[0] == 1 && day[1] == 0)
  417.                             day[1] = 3;
  418.                          if(day[0] == 0)
  419.                            {
  420.                             day[0] = 9;
  421.                             day[1]--;
  422.                            }
  423.                           else
  424.                            day[0]--;
  425.                           break;

  426.                        case 5:
  427.                          if(month[0] == 1 && month[1] == 0)
  428.                            {
  429.                              month[0] = 2;
  430.                              month[1] = 1;
  431.                            }
  432.                          else if(month[0] == 0)
  433.                                 {
  434.                                  month[0] = 9;
  435.                                  month[1]--;
  436.                                 }
  437.                               else
  438.                                  month[0]--;
  439.                                 break;

  440.                    case 6:
  441.                      if(year[0] == 0)
  442.                        {
  443.                         year[0] = 9;
  444.                         if(year[1] == 0)
  445.                            {
  446.                              year[1] = 9;
  447.                              if(year[2] == 0)
  448.                                {
  449.                                 year[2] = 9;
  450.                                 if(year[3] == 0)
  451.                                   year[3] = 9;
  452.                                 else
  453.                                  year[3]--;
  454.                                 }
  455.                              else
  456.                                year[2]--;
  457.                            }
  458.                          else
  459.                            year[1]--;
  460.                         }
  461.                       else
  462.                        year[0]--;
  463.                      break;

  464.                  case 7:
  465.                  date=(date+6)%7;
  466.                  break;
  467.              }
  468.            }
  469.          }
  470.         }
  471.     while(key_counter != 8);
  472.          key_counter = 0; //退出設置時關掉光標顯示
  473.          TR0=1;
  474.      }
  475.   }
  476. }

  477. void Lcd_init()       //顯示屏初始化
  478. {
  479.    lcden = 0;
  480.    write_com(0x01);   //清屏
  481.    write_com(0x02);   //位置復位為左上方
  482.    write_com(0x06); //光標右移
  483.    write_com(0x0e); //顯示開,有光標,閃爍
  484.    write_com(0x38);  //兩行,每行16字符,5*7點陣
  485. }

  486. void timer0() interrupt 1 //定時器
  487. {
  488.    TH0 = (65536-39970)/256;
  489.    TL0 = (65536-39970)%6;
  490.    counter++;
  491.    if(counter == 25)
  492.      {
  493.       counter = 0;
  494.       clock();
  495.      }
  496. }

  497. void Timer_init() //定時器初始化
  498. {
  499.    TMOD = 0x01;
  500.    TH0 = (65536-29995)/256;
  501.    TL0 = (65536-29995)%6;
  502.    EA = 1;
  503.    ET0 = 1;
  504.    TR0 = 1;
  505. }   

  506. void Date_init() //日期初始化
  507. {
  508.    date = 4;

  509.    day[0] = 0;
  510.    day[1] = 2;

  511.    month[0] = 4;
  512.    month[1] = 0;

  513.    year[0] = 7;
  514.    year[1] = 1;
  515.    year[2] = 0;
  516.    year[3] = 2;
  517. }

  518. void Time_init() //時間初始化
  519. {
  520.         second0 = 0;
  521.         second1 = 3;
  522.         
  523.         minute0 = 0;
  524.         minute1 = 3;
  525.         
  526.         hour0 = 2;
  527.         hour1 = 1;
  528.         
  529.         counter = 0;
  530. }

  531. void main() //主函數
  532. {
  533.         Lcd_init();
  534.         Time_init();
  535.         Date_init();
  536.         Timer_init();
  537.         while(1)
  538.         {
  539.                 disp_date();
  540.                 disp_time();
  541.                 setting_detect();
  542.         }
  543. }
復制代碼


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

使用道具 舉報

沙發
ID:360045 發表于 2018-6-27 10:34 | 只看該作者
大神,厲害啊
回復

使用道具 舉報

板凳
ID:452039 發表于 2018-12-22 12:31 | 只看該作者
xiexiedashen
回復

使用道具 舉報

地板
ID:452539 發表于 2018-12-23 12:12 | 只看該作者
學習的好資料,我想下載一個
回復

使用道具 舉報

5#
ID:677980 發表于 2019-12-30 22:56 | 只看該作者
可以,不過不知道有沒有串口
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av一二三区| 国产免费一区二区三区 | 久久国产精品一区二区三区 | 日本超碰 | 亚洲福利在线观看 | 欧美精品第一页 | 欧美成人h版在线观看 | 日韩av一二三区 | 国产欧美日韩精品一区二区三区 | 色综合桃花网 | 久热爱 | 亚洲精品福利在线 | 成人精品视频免费 | 国产一区二区a | 精品欧美久久 | 91视频正在播放 | 成人自拍av | 日韩精品免费视频 | 污污的网站在线观看 | 免费国产黄网站在线观看视频 | 久热中文字幕 | 国产偷自视频区视频 | 日韩专区中文字幕 | 亚洲精品在线视频 | 在线区| 欧美做暖暖视频 | a级毛片毛片免费观看久潮喷 | 91麻豆精品国产91久久久久久 | 成人免费视频7777777 | 国产精品久久av | 国产精品夜夜夜一区二区三区尤 | 久久久www成人免费无遮挡大片 | 亚洲一区二区免费 | 久久精品中文 | 精品国产一区二区三区成人影院 | 日韩国产免费 | www.五月天婷婷 | 婷婷狠狠 | 久久亚洲一区二区三区四区 | 欧美日韩专区 | 一本一道久久a久久精品综合 |