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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

一款實用的單片機電子鐘制作 附程序原理圖

[復制鏈接]
跳轉到指定樓層
樓主
一、電路圖
二、使用說明:
功能按鍵說明:S1為功能選擇按鍵和移位的作用,S2為確認作用,S3為數值加一作用。
功能調節說明:
1、時鐘功能:
    如果是芯片內部定時器的時鐘,上電后顯示00:00:00(掉電后時間不行走不保存,重新上電時間就歸0);
    如果是外部時鐘DS1302的套件,上電后則顯示芯片的內部時間(這個時間掉電后可以保持行走,從新上電顯示當前的時間);
2、校時功能:按一次S1,數碼管顯示SET1(設置時間),這時按一次S2就進入修改時間,數碼管顯示00:00(秒位不可調)小時的十位閃爍狀態,再次按S1可以移動閃爍的位置,按一次移動一位,按S3時,對應閃爍位置的數據會加1,設置后后再按S2就保存并退出;
3、鬧鐘功能:按兩次S1,數碼管顯示SET2(設置鬧鐘),這時按一次S2就進入修改鬧鐘,數碼管顯示00:00 0(秒位不可調,后面的0代表鬧鐘的狀態,0代表鬧鐘關閉,1表示鬧鐘開啟)小時的十位閃爍狀態,再次按S1可以移動閃爍的位置,按一次移動一位,按S3時,對應閃爍位置的數據會加1,設置后后再按S2就保存并退出;
4、倒計時功能:按三次次S1,數碼管顯示SET3(設置倒計時),這時按一次S2就進入修改倒計時,數碼管顯示00:00:00,小時的十位閃爍狀態,再次按S1可以移動閃爍的位置,按一次移動一位,按S3時,對應閃爍位置的數據會加1,設置后后再按S2后,系統就開始倒計時;
5、秒表功能:按四次S1,數碼管顯示SET4(秒表功能),這時按一次S2就秒表功能,此時S2用來開啟或關閉秒表,S3退出秒表功能;
6、計數器功能:按五次S1,數碼管顯示SET5(計數器功能),這時按一次S2就進入計數器,按S3計數器的值加1,再次按S2退出計數器,系統恢復;

電路原理圖如下:


單片機源程序如下:
  1. /*====================================================================
  2.   調試要求:
  3.   1.MCU:AT89S52芯片或AT89C52
  4.   2.晶振:12MHz
  5.   功能:啟動芯片內部計時
  6. ====================================================================*/
  7. #include <reg52.h>
  8. #include <intrins.h>

  9. #define uchar unsigned char
  10. #define uint  unsigned int

  11. sbit    dis_bit1=P2^7;//定義數碼管控制口
  12. sbit    dis_bit2=P2^6;//定義數碼管控制口
  13. sbit    dis_bit3=P2^4;//定義數碼管控制口
  14. sbit    dis_bit4=P2^3;//定義數碼管控制口
  15. sbit    dis_bit5=P2^1;//定義數碼管控制口
  16. sbit    dis_bit6=P2^0;//定義數碼管控制口
  17. sbit    led1_bit=P2^2;//定時LED的控制口
  18. sbit    led2_bit=P2^5;//定時LED的控制口
  19. sbit    s1_bit=P1^0;  //定義S1控制口
  20. sbit    s2_bit=P1^1;  //定義S2控制口
  21. sbit    s3_bit=P1^2;  //定義S3控制口
  22. sbit    speak=P3^7;   //定義蜂鳴器控制口
  23. #define smg_data    P0//定義數碼管數據口


  24. void  delay_50us(uint t);//延時50*T微妙函數的聲明
  25. void  display1(uchar dis_data);//數碼管1顯示子程序
  26. void  display2(uchar dis_data);//數碼管2顯示子程序
  27. void  display3(uchar dis_data);//數碼管3顯示子程序
  28. void  display4(uchar dis_data);//數碼管4顯示子程序
  29. void  display5(uchar dis_data);//數碼管5顯示子程序
  30. void  display6(uchar dis_data);//數碼管6顯示子程序
  31. void  init_t0();//定時器0初始化函數
  32. void  dis_led();//LED處理函數
  33. void  judge_s1();//S1按鍵處理函數
  34. void  judge_s2();//S2按鍵處理函數
  35. void  judge_s3();//S3按鍵處理函數
  36. void  dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//顯示子程序
  37. void  dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);//閃爍顯示子程序
  38. void  judge_dis();//顯示處理函數
  39. void  judge_clock();//顯示處理函數
  40. //共陽數碼管斷碼表
  41. const unsigned char tabl1[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  42.                                // 0  1    2    3    4    5
  43.                                0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
  44.                               //6   7     8    9     E    T   B
  45.                                     0xc6,0xa1,0x8e,0xb6};
  46.                               //    C     D    F    三

  47. uchar t0_crycle;
  48. uchar hour_count,minute_count,second_count,msecond_count;
  49. uchar clock_hour,clock_minute;
  50. uchar clock_en;//鬧鐘關閉和開啟的標志,1開啟,0關閉
  51. uchar flag1,zancun1,zancun2,zancun3;//,flag2;
  52. uchar clock_flag;
  53. uint  speak_count;
  54. //主程序
  55. void main()
  56. {
  57.     P3=0x00;
  58.     flag1=0;   
  59.     zancun3=0;
  60.     speak=1;//關閉蜂鳴器
  61.     speak_count=0;
  62.     clock_hour=0;
  63.     clock_minute=0;
  64.     clock_flag=0;
  65.    
  66.     clock_en=0;//開機時默認關閉鬧鐘
  67.     init_t0();
  68.     TR0=1;//
  69.    //接下來開始編寫讓數碼管顯示的程序
  70.     while(1)
  71.     {
  72.       judge_dis();//顯示處理
  73.       judge_s1();
  74.       judge_s2();
  75.       judge_s3();
  76.       judge_clock();//鬧鐘處理程序
  77.     }
  78. }
  79. void timer0() interrupt 1
  80. {
  81.         TH0=(65536-50000)/256;
  82.         TL0=(65536-50000)%256;
  83.         t0_crycle++;
  84.         if(t0_crycle==2)// 0.1秒
  85.         {
  86.           t0_crycle=0;
  87.           msecond_count++;
  88.       if(msecond_count==10)//1秒
  89.       {
  90.         msecond_count=0;
  91.         second_count++;
  92.         if(second_count==60)
  93.         {
  94.           second_count=0;
  95.           minute_count++;
  96.           if(minute_count==60)
  97.           {
  98.             minute_count=0;
  99.             hour_count++;
  100.             if(hour_count==24)
  101.             {
  102.               hour_count=0;
  103.             }
  104.           }
  105.         }
  106.       }   
  107.         }
  108. }
  109. //**************************************************
  110. //顯示處理函數
  111. void  judge_dis()
  112. {     
  113.     if(flag1==0)
  114.     {
  115.       dis(hour_count/10,hour_count%10,minute_count/10,minute_count%10,second_count/10,second_count%10);
  116.       dis_led();
  117.     }
  118.     if(flag1!=0)
  119.     {
  120.        switch(flag1)
  121.        {
  122.            case 1:
  123.                 dis(5,10,11,1,12,12);//顯示SET1
  124.                 led1_bit=1;
  125.                 led2_bit=1;
  126.                 break;
  127.            case 2:
  128.                 dis(5,10,11,2,12,12);//顯示SET2
  129.                 break;
  130.            case 3:
  131.                 dis(5,10,11,3,12,12);//顯示SET3
  132.                 break;
  133.            case 4:
  134.                 dis(5,10,11,4,12,12);//顯示SET4
  135.                 break;
  136.            case 5:
  137.                 dis(5,10,11,5,12,12);//顯示SET5
  138.                 break;
  139.            case 6:
  140.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,1);
  141.                 break;
  142.            case 7:
  143.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,2);
  144.                 break;
  145.            case 8:
  146.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,3);
  147.                 break;
  148.            case 9://進入修改時間,時間分位個位閃爍
  149.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,4);
  150.                 break;
  151.            case 10://進入修改鬧鐘,鬧鐘小時十位閃爍
  152.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,1);
  153.                 break;
  154.            case 11://進入修改鬧鐘,鬧鐘小時個位閃爍
  155.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,2);
  156.                 break;
  157.            case 12://進入修改鬧鐘,鬧鐘小時十位閃爍
  158.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,3);
  159.                 break;
  160.            case 13://進入修改鬧鐘,鬧鐘小時個位閃爍
  161.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,4);
  162.                 break;
  163.            case 14://進入修改鬧鐘的開關
  164.                 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,6);
  165.                 break;
  166.            default:
  167.                 break;
  168.         }
  169.     }
  170. }
  171. //**************************************************
  172. //S1按鍵處理函數
  173. void  judge_s1()
  174. {
  175.     s1_bit=1;//置IO為1,準備讀入收據
  176.     if(s1_bit==0)//判斷是否有按鍵按下
  177.     {
  178.         delay_50us(1);// 延時,去除機械抖動
  179.         if(s1_bit==0)
  180.         {
  181.            switch(flag1)
  182.            {
  183.                case 0:
  184.                     flag1=1;
  185.                     break;
  186.                case 1:
  187.                     flag1=2;
  188.                     break;
  189.                case 2:
  190.                     flag1=3;
  191.                     break;
  192.                case 3:
  193.                     flag1=4;
  194.                     break;
  195.                case 4:
  196.                     flag1=5;
  197.                     break;
  198.                case 5:
  199.                     flag1=0;
  200.                     break;
  201.                case 6://在修改時間小時十位下按S1鍵
  202.                     flag1=7;
  203.                     break;
  204.                case 7:
  205.                     flag1=8;
  206.                     break;
  207.                case 8:
  208.                     flag1=9;
  209.                     break;
  210.                case 9:
  211.                     flag1=6;
  212.                     break;
  213.                case 10:
  214.                     flag1=11;
  215.                     break;
  216.                case 11:
  217.                     flag1=12;
  218.                     break;
  219.                case 12:
  220.                     flag1=13;
  221.                     break;
  222.                case 13:
  223.                     flag1=14;
  224.                     break;
  225.                case 14:
  226.                     flag1=10;
  227.                     break;
  228.                default:
  229.                     break;
  230.            }           
  231.            while(s1_bit==0)
  232.            {
  233.               judge_dis();
  234.            }//等待按鍵釋放
  235.         }
  236.     }
  237. }
  238. //**************************************************
  239. //S2按鍵處理函數
  240. void  judge_s2()
  241. {
  242.     s2_bit=1;//置IO為1,準備讀入收據
  243.     if(s2_bit==0)//判斷是否有按鍵按下
  244.     {
  245.         delay_50us(1);// 延時,去除機械抖動
  246.         if(s2_bit==0)
  247.         {
  248.            switch (flag1)
  249.            {
  250.               case 1: //在顯示SET1狀態下按S2件,進入修改時間
  251.                  flag1=6;
  252.                  zancun1=hour_count;
  253.                  zancun2=minute_count;
  254.                  break;
  255.               case 2://在顯示SET2狀態下按S2,進入設置鬧鐘
  256.                  zancun1=clock_hour;
  257.                  zancun2=clock_minute;
  258.                  flag1=10;
  259.                  break;
  260.               case 6://修改時鐘小時十位狀態下按S2件
  261.                  hour_count=zancun1;
  262.                  minute_count=zancun2;
  263.                  second_count=0;
  264.                  flag1=0;
  265.                  break;
  266.               case 7://修改時鐘小時個位狀態下按S2件
  267.                  hour_count=zancun1;
  268.                  minute_count=zancun2;
  269.                  second_count=0;
  270.                  flag1=0;
  271.                  break;
  272.               case 8://修改時鐘分鐘十位狀態下按S2件
  273.                  hour_count=zancun1;
  274.                  minute_count=zancun2;
  275.                  second_count=0;
  276.                  flag1=0;
  277.                  break;
  278.               case 9://修改時鐘分鐘個位狀態下按S2件
  279.                  hour_count=zancun1;
  280.                  minute_count=zancun2;
  281.                  second_count=0;
  282.                  flag1=0;
  283.                  break;
  284.               case 10:
  285.                  clock_hour=zancun1;
  286.                  clock_minute=zancun2;
  287.                  clock_en=zancun3;
  288.                  flag1=0;
  289.                  break;
  290.               case 11:
  291.                  clock_hour=zancun1;
  292.                  clock_minute=zancun2;
  293.                  clock_en=zancun3;
  294.                  flag1=0;
  295.                  break;
  296.               case 12:
  297.                  clock_hour=zancun1;
  298.                  clock_minute=zancun2;
  299.                  clock_en=zancun3;
  300.                  flag1=0;
  301.                  break;
  302.               case 13:
  303.                  clock_hour=zancun1;
  304.                  clock_minute=zancun2;
  305.                  clock_en=zancun3;
  306.                  flag1=0;
  307.                  break;
  308.               case 14:
  309.                  clock_hour=zancun1;
  310.                  clock_minute=zancun2;
  311.                  clock_en=zancun3;
  312.                  flag1=0;
  313.                  break;
  314.               default:
  315.                  break;
  316.                  
  317.            }   
  318.            while(s2_bit==0)
  319.            {
  320.               judge_dis();
  321.            }//等待按鍵釋放
  322.         }
  323.     }
  324. }
  325. //**************************************************
  326. //S3按鍵處理函數
  327. void  judge_s3()
  328. {
  329.     s3_bit=1;//置IO為1,準備讀入收據
  330.     if(s3_bit==0)//判斷是否有按鍵按下
  331.     {
  332.         delay_50us(1);// 延時,去除機械抖動
  333.         if(s3_bit==0)
  334.         {
  335.            switch (flag1)
  336.            {
  337.             
  338.               case 6://修改時間小時的十位數
  339.                  zancun1+=10;
  340.                  if(zancun1>=24)zancun1=zancun1%10;
  341.                  break;
  342.               case 7://修改時間小時的個位數
  343.                  zancun1=zancun1/10*10+(zancun1%10+1)%10;
  344.                  if(zancun1>=24)zancun1=20;
  345.                  break;
  346.               case 8://修改時間分鐘的十位數
  347.                  zancun2+=10;
  348.                  if(zancun2>=60)zancun2-=60;
  349.                  break;
  350.               case 9://修改時間分鐘的個位數
  351.                  zancun2=zancun2/10*10+(zancun2%10+1)%10;
  352.                  break;
  353.               case 10://修改鬧鐘小時的十位數
  354.                  zancun1+=10;
  355.                  if(zancun1>=24)zancun1=zancun1%10;
  356.                  break;
  357.               case 11://修改鬧鐘小時的個位數
  358.                  zancun1=zancun1/10*10+(zancun1%10+1)%10;
  359.                  if(zancun1>=24)zancun1=20;
  360.                  break;
  361.               case 12://修改鬧鐘分鐘的十位數
  362.                  zancun2+=10;
  363.                  if(zancun2>=60)zancun2-=60;
  364.                  break;
  365.               case 13://修改鬧鐘分鐘的個位數
  366.                  zancun2=zancun2/10*10+(zancun2%10+1)%10;
  367.                  break;
  368.               case 14:
  369.                  zancun3^=1;
  370.                  break;
  371.               default:
  372.                  break;
  373.                  
  374.            }   
  375.            while(s3_bit==0)
  376.            {
  377.               judge_dis();
  378.            }//等待按鍵釋放
  379.         }
  380.     }
  381. }
  382. //****************************************
  383. //顯示處理函數
  384. void  judge_clock()
  385. {
  386.     if(clock_hour==hour_count && clock_minute==minute_count)
  387.     {
  388.          if(clock_en==1 && clock_flag==0)
  389.          {         
  390.               speak_count=0;//開啟蜂鳴器
  391.               clock_flag=1;
  392.               speak_count=0;
  393.          }
  394.     }
  395.     else
  396.     {
  397.      clock_flag=0;
  398.     }
  399.     if(clock_flag==1 && speak_count<400)
  400.     {
  401.       
  402.         if(msecond_count<=5)
  403.         {
  404.            speak=0;
  405.            speak_count++;
  406.         }
  407.         else
  408.         {
  409.           speak=1;
  410.    
  411.         }
  412.     }
  413.     else
  414.     {
  415.         speak=1;
  416.     }
  417. }
  418. //****************************************
  419. ////閃爍顯示子程序
  420. void  dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san)
  421. {   
  422.      if(san==1)
  423.      {
  424.         if(msecond_count<5)
  425.         {
  426.            display1(s6);
  427.         }
  428.      }
  429.      else
  430.      {
  431.          display1(s6);
  432.      }
  433.      if(san==2)
  434.      {
  435.         if(msecond_count<5)
  436.         {
  437.            display2(s5);
  438.         }
  439.      }
  440.      else
  441.      {
  442.          display2(s5);
  443.      }
  444.      if(san==3)
  445.      {
  446.         if(msecond_count<5)
  447.         {
  448.            display3(s4);
  449.         }
  450.      }
  451.      else
  452.      {
  453.          display3(s4);
  454.      }
  455.      if(san==4)
  456.      {
  457.         if(msecond_count<5)
  458.         {
  459.            display4(s3);
  460.         }
  461.      }
  462.      else
  463.      {
  464.          display4(s3);
  465.      }
  466.      if(san==6)
  467.      {
  468.         if(msecond_count<5)
  469.         {
  470.            display6(s1);
  471.         }
  472.      }
  473.      else
  474.      {
  475.          display6(s1);
  476.      }
  477.      display5(s2);
  478.     // display6(s1);
  479. }
  480. //****************************************
  481. //時鐘顯示程序
  482. void  dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1)
  483. {
  484.      display1(s6);
  485.      display2(s5);
  486.      display3(s4);
  487.      display4(s3);
  488.      display5(s2);
  489.      display6(s1);
  490. }
  491. //********************************************************************************************
  492. void init_t0()
  493. {
  494.            TMOD=0x01;//設定定時器工作方式1,定時器定時50毫秒
  495.         TH0=(65536-50000)/256;
  496.         TL0=(65536-50000)%256;
  497.         EA=1;//開總中斷
  498.         ET0=1;//允許定時器0中斷
  499.         t0_crycle=0;//定時器中斷次數計數單元
  500. }
  501. //**************************************************
  502. //LED處理函數
  503. void  dis_led()
  504. {
  505.      if(msecond_count<5)
  506.      {
  507.          led1_bit=1;
  508.          led2_bit=1;
  509.      }
  510.      else
  511.      {
  512.          led1_bit=0;
  513.          led2_bit=0;
  514.      }
  515. }
  516. //***************************************************************
  517. //功能:把數據1顯示在數碼管1上
  518. void display6(uchar dis_data)
  519. {  
  520.    smg_data=tabl1[dis_data];//送顯示斷碼
  521.    dis_bit6=0;//鎖存數據
  522.    delay_50us(40);
  523.    dis_bit6=1;
  524. }
  525. //***************************************************************
  526. //功能:把數據1顯示在數碼管1上
  527. void display5(uchar dis_data)
  528. {  
  529.    smg_data=tabl1[dis_data];//送顯示斷碼
  530.    dis_bit5=0;//鎖存數據
  531.    delay_50us(40);
  532.    dis_bit5=1;
  533. }
  534. //***************************************************************
  535. //功能:把數據1顯示在數碼管1上
  536. void display4(uchar dis_data)
  537. {  
  538.    smg_data=tabl1[dis_data];//送顯示斷碼
  539.    dis_bit4=0;//鎖存數據
  540.    delay_50us(40);
  541.    dis_bit4=1;
  542. }//***************************************************************
  543. //功能:把數據1顯示在數碼管1上
  544. void display3(uchar dis_data)
  545. {  
  546.    smg_data=tabl1[dis_data];//送顯示斷碼
  547.    dis_bit3=0;//鎖存數據
  548.    delay_50us(40);
  549.    dis_bit3=1;
  550. }
  551. //***************************************************************
  552. //功能:把數據1顯示在數碼管1上
  553. void display1(uchar dis_data)
  554. {  
  555.    smg_data=tabl1[dis_data];//送顯示斷碼
  556.    dis_bit1=0;//鎖存數據
  557.    delay_50us(40);
  558.    dis_bit1=1;
  559. }
  560. //***************************************************************
  561. //功能:把數據1顯示在數碼管1上
  562. void display2(uchar dis_data)
  563. {  
  564.    smg_data=tabl1[dis_data];//送顯示斷碼
  565.    dis_bit2=0;//鎖存數據
  566.    delay_50us(40);
  567.    dis_bit2=1;
  568. }
  569. //**************************************************************************************************
  570. //函數名稱:void delay_50US(unsigned int t)
  571. //功能: 延時50*t(us)
  572. void delay_50us(uint t)
  573. {
  574.   unsigned char j;
  575.   for(;t>0;t--)
  576.   {
  577.     for(j=19;j>0;j--);
  578.   }
  579. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:638376 發表于 2022-9-15 16:19 | 只看該作者
實用參考下程序寫法
回復

使用道具 舉報

板凳
ID:253767 發表于 2022-9-16 07:41 | 只看該作者
這單片機是什么類型
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费的av网站 | 亚洲成人精品国产 | 欧美精品在线免费观看 | 日韩电影中文字幕在线观看 | 亚洲精品久久久久avwww潮水 | 天天操天天射天天舔 | 国产一区二区三区在线视频 | 成人高清视频在线观看 | 九九视频在线观看视频6 | 国产成人精品一区二区三区在线观看 | 久久久av中文字幕 | 刘亦菲国产毛片bd | 羞羞视频免费在线观看 | 天天曰夜夜操 | 国产视频精品在线观看 | www中文字幕 | 欧美成人精品 | 国产精品亚洲视频 | 2018国产大陆天天弄 | 国产精品高潮呻吟久久 | 国产成人一区二区三区电影 | 日韩在线欧美 | 在线免费观看视频黄 | 福利社午夜影院 | 91视频一区| www.se91| 罗宾被扒开腿做同人网站 | 国产情侣一区 | 精品一区二区av | 欧美综合国产精品久久丁香 | 91国内产香蕉 | 日韩精品一区二区三区四区视频 | 欧美不卡一区二区三区 | 久久久久久91香蕉国产 | 日韩欧美中文在线 | 免费视频二区 | 色综合久久天天综合网 | 亚洲天堂成人在线视频 | 亚洲国产一区二区三区在线观看 | 国产福利一区二区 | 国产精品美女久久久 |