<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        單片機通過串口通信調整時間的程序

        作者:寒竹子   來源:本站原創   點擊數:  更新時間:2014年03月21日   【字體:

        本程序所用的原理圖下載: 點這里 ,單片機芯片使用的stc89c51;找到時鐘部分的原理圖修改為你自己的電路上的io即可.這是一整個單片機開發板的電路圖其他的忽略.


        /**************************通過串口通信調整時間******************************/
        /**
        *功能:單片機開始上電時點陣顯示倒計時3,2,1,0,然后點陣LED關閉顯示
        *    定時器和串口開始工作,定時器開始一秒計時,并在數碼管上顯示時,分,秒
        *    此計時器可以通過串口發送數據調整時間,可調整時與分,當調整分鐘時秒清零
        *    附加功能:當單片機收到數據時有蜂鳴器響一聲作為提示
        *     彩色流水燈以20毫秒的速度向左流動
        *作者:徐冉
        *日期:2013-06-15-09:15 - 12:10
        *備注:程序已經順利通過調試
        */
        /***********51hei開發板************/
        /********AT89C52-RC MCU***********/
        #include <reg52.h>
        typedef unsigned int uint;
        typedef unsigned char uchar;
        sbit wela = P2^7;
        sbit dula = P2^6;
        sbit FM = P2^3;
        sbit din = P2^0;
        sbit cs = P2^1;
        sbit clk = P2^2;
         /************點陣LED顯示取模編碼表***********************/
        uchar code dis[][8] = {
              {0x00,0x3E,0x02,0x02,0x3E,0x02,0x02,0x3E},//'3'
              {0x00,0x3E,0x02,0x02,0x3E,0x20,0x20,0x3E},//'2'
                  {0x00,0x18,0x38,0x08,0x08,0x08,0x08,0x3E},//'1'
              {0x00,0x3C,0x24,0x24,0x24,0x24,0x24,0x3C},//'0'
              {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}//關閉顯示           
               };
         /*****************數碼管顯示編碼表***************************/
        uchar code table[] = {
                        0x3F,  //"0"
                        0x06,  //"1"
                        0x5B,  //"2"
                        0x4F,  //"3"
                        0x66,  //"4"
                        0x6D,  //"5"
                        0x7D,  //"6"
                        0x07,  //"7"
                        0x7F,  //"8"
                        0x6F  //"9"
            };

        uchar shi = 0, fen = 0, miao = 0, counter = 0, flag = 0, j = 0;
        /*************點陣LED-MAX7219***********/
        /***************寫字節************************/
        void write_byte(uchar date)
        {
         uchar i = 0;
         cs = 0;
         for(i = 0; i < 8; i++)
         {
          clk = 0;
          din = date & 0x80;
          date <<= 1;
          clk = 1;
         }
        }
        /*****************寫MAX7219**********************/
        void write_max7219(uchar add, uchar date)
        {
         cs = 0;
         write_byte(add);
         write_byte(date);
         cs = 1;
        }
        /*****************MAX7219初始化**********************/
        void max7219_init()
        {
         write_max7219(0x0c, 0x01);
         write_max7219(0x09, 0x00);
         write_max7219(0x0a, 0x08);
         write_max7219(0x0b, 0x07);
         write_max7219(0x0f, 0x00);
        }
        /*********延時*********/
        void delayms(uint xms)
        {
         uint x, y;
         for(x = xms; x > 0; x--)
           for(y = 110; y > 0; y--);
        }
        /************串口和定時器T0初始化********************/
        void init()
        {
         TMOD = 0x21;//T1工作方式2,T0工作方式1
         TH0 = 0xB8;
         TL0 = 0x00;
         TH1 = 0xFA;
         TL1 = 0xFA;
         TR1 = 1;
         SM0 = 0;
         SM1 = 1;
         REN = 1;
         EA = 1;
         ES = 1;
         ET0 = 1;
        }
        /*************數碼管顯示時間************************/'
        void display(uchar shi, uchar fen, uchar miao)
        {
         uchar shi_s, shi_g;
         uchar fen_s, fen_g;
         uchar miao_s, miao_g;
         
         shi_s = shi / 10 % 10;
         shi_g = shi % 10;
         fen_s = fen / 10 % 10;
         fen_g = fen % 10;
         miao_s = miao / 10 % 10;
         miao_g = miao % 10;
         
         dula = 1;
         P0 = table[shi_s];
         dula = 0;
         P0 = 0xff;
         wela = 1;
         P0 = 0xfe;
         wela = 0;
         P0 = 0x00;
         delayms(1);
         
         dula = 1;
         P0 = table[shi_g];
         dula = 0;
         P0 = 0xff;
         wela = 1;
         P0 = 0xfd;
         wela = 0;
         P0 = 0x00;
         delayms(1);
         
         dula = 1;
         P0 = table[fen_s];
         dula = 0;
         P0 = 0xff;
         wela = 1;
         P0 = 0xfb;
         wela = 0;
         P0 = 0x00;
         delayms(1);
         
         dula = 1;
         P0 = table[fen_g];
         dula = 0;
         P0 = 0xff;
         wela = 1;
         P0 = 0xf7;
         wela = 0;
         P0 = 0x00;
         delayms(1);
         
         dula = 1;
         P0 = table[miao_s];
         dula = 0;
         P0 = 0xff;
         wela = 1;
         P0 = 0xef;
         wela = 0;
         P0 = 0x00;
         delayms(1);
         
         dula = 1;
         P0 = table[miao_g];
         dula = 0;
         P0 = 0xff;
         wela = 1;
         P0 = 0xdf;
         wela = 0;
         P0 = 0x00;
         delayms(1);
        }
        /*****************點陣顯示程序****************/
        void display_max7219()
        {
         uchar m, n;
         for(m = 0; m < 5; m++)
         {
          for(n = 0; n < 8; n++)
          {
           write_max7219(n+1, dis[m][n]);
           delayms(1);
          }
          delayms(1000);
         }
          TR0 = 1;
        }
        /****************主程序********************/
        void main(void)
        {
         init();
         max7219_init();
            display_max7219();
         
         while(1)
         {
          display(shi, fen, miao);
          if(flag == 1)
          {
           flag = 0;
           ES = 0;
           SBUF = shi;
           while(!TI);
           TI = 0;
           SBUF = fen;
           while(!TI);
           TI = 0;
           SBUF = miao;
           while(!TI);
           TI = 0;
           ES = 1;
          }
         }
        }
        /***************定時器T0中斷程序**********************/
        void timer0_int() interrupt 1
        {
         TH0 = 0xB8;
         TL0 = 0x00;
         counter++;
         P1 = ~(1 << j++);
         if(j >= 8)
         {
          j = 0;
         }
         if(counter == 50)
         {
          counter = 0;
          miao++;
          if(miao >= 60)
          {
           miao = 0;
           fen++;
           if(fen >= 60)
           {
            fen = 0;
            shi++;
            if(shi >= 24)
            {
             shi = 0;
            }
           }
          }
         }
        }
        /*************串口中斷服務程序***********************/
        void uart_int() interrupt 4
        {
         RI = 0;
         if(SBUF >= 23 && SBUF <= 59)
         {
          fen = SBUF;
          miao = 0;
          FM = 0;
          delayms(30);
          FM = 1;
         }
         if(SBUF >= 0 && SBUF <= 23)
         {
          shi = SBUF;
          fen = SBUF;
          FM = 0;
          delayms(30);
          FM = 1;
         }
         flag = 1;
        }
         

         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮