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

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

        51系列-C語言控制逐級娛樂

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月19日   【字體:


         

         













         

        注意51系列8bit)一個字節,應用匯編語言簡潔高效。16位的處理器需要用0000 0000H 表示。1632位以上,使用操作系統(WinCE、Linux等)更有效,可以利用大量的、底層的、專業化、標準化的面向控制的庫函數(如:API等)。高級語言具有對底層硬件的無關性,則可移植性好、可重用性好;高級語言描述控制更接近人的自然語言,可描述性好,表達力好。Linux的代碼與模塊的開放性、可剪裁性、自我構造等特點使其前景廣闊。

        1.單個LED燈,單個按鍵

        //C語言的頭文件    //這是第一種注釋方式;

        //預處理命令

        #include   

        #define uchar unsigned char

        #define uint unsigned int

        //聲明變量

            sbit LED1_0=P1^0;     // #define 頭文件中沒有定義的I/O,在此由用戶定義

            sbit LED2_0=P2^0;

        //延時子程序 這是一個常用的模塊,可視為標準程序段,

         void  Delayms(uint x)

         {

          uchar  i;

          while(x--)    //X每循環一次,自動減1,直至X1,終止循環

          {

          For (i=0;i<120;i++);

            }

         }

         //主程序

                      void main()

                      {

                          while(1)

                        {

                         LED2_0=P2^0;

                         LED1_0=LED2_0;

                         Delayms(200);  //這里的200就是X的值― Delayms(uint x)― while(x--)

                        }

                      }

        程序說明

        While(條件語句) for(條件語句) 單獨使用所表達的循環,是在句首先執行判斷,為真循環,為假轉下一句執行。其中語句的括號內為判斷條件語句。

        Do-while合用,是需要對do的過程再進行一次判斷。While(條件語句)為真循環,為假跳轉。while(1)表示高電平為真循環do,否則,低電平跳轉。由于P1.0 口為高電平結尾,因此,又回到do再循環,無限反復。

         

        #include

        #include <> //預處理命令

         void main(void)                //主函數名,必須有一個主函數,void為數據類型

         {

         unsigned int a;           //定義變量,aint類型,無符號整型。語句必須分號結尾

          

          do{                            //do-while 組成的循環過程,過程的開始

         for (a=0; a<500; a++);  //這是一個條件循環,判斷a的值是否小于500,真循環-耗時,假轉下句

        P1_0 = 0;         //賦值語句,設 P1.0 口為低電平0,點亮 LED

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P1_0 = 1;             // P1.0 口為高電平,熄滅 LED

           }

         while(1);            //do-while 組成循環過程的末尾,需要對do的過程進行一次判斷

        }

         

        2.多個LED燈,單個按鍵

        對于多個LED燈(LED < 8個)來說,在硬件連接方面、軟件編寫方面均沒有大的難點。按照單個LED的連接方式增加便可?刂瞥绦蚓帉懟旧弦彩侵貜托怨ぷCOPY簡單修改即可。

        對于LED> 8個且不能被8整除的需要用位操作指令。

        對于LED> 8個的情況,需要解決兩個方面的問題。一個是硬件的連接方法,一個是控制程序的編寫指令用詞方法。硬件方面可以用單個或多個成組的LED多個或總線接口、單個接口擴展等。程序編寫則可以使用重復性工作、可以使用字節命令而摒棄位命令,使得程序簡潔、可讀性好、硬件運行效率高。

        對于LED= 8個或是8的倍數的情況,硬件方面可以用單個或多個成組的LED多個或總線接口、單個接口擴展等。程序編寫則可以使用重復性工作、可以使用字節操作指令而摒棄位操作指令,使得程序簡潔、可讀性好、硬件運行效率高。

         

        #include < reg51.h >

        #include <> //預處理命令

         void main(void)       //主函數名,必須有一個主函數,void為數據類型

         {

         unsigned int a;           //定義變量,aint類型,無符號整型。語句必須分號結尾

            do{                            //do-while 組成的循環過程,過程的開始

         for (a=0; a<500; a++);  //這是一個條件循環,判斷a的值是否小于500,真循環-耗時,假轉下句

        P1_0 = 0;         //位賦值語句,設 P1.0 口為低電平0,點亮 LED

        P1_1 = 0;

        P1_2 = 0;

        P1_3 = 0;

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P1_0 = 1;             // P1.0 口為高電平,熄滅 LED

        P1_1 = 1;

        P1_2 = 1;

        P1_3 = 1;

           }

         while(1);            //do-while 組成循環過程的末尾,需要對do的過程進行一次判斷

        }

         

        程序說明

        每個口用位賦值指令來開關P1口的各個LED?梢杂米止澷x值指令一次性的開關8P1LED。

        P1=0;     //P18位置低電平,點亮8LED

        P1=1;      // P18位置低電平,關閉8LED

        對于多燈的情況,可以使用多個數據口來進行系統設計(也可單口擴展),在圖2系統的基礎上,添加P3口為一個字節形式的輸出口。用LED組件的形式顯示輸出要求。

        改造結果如圖3所示。

         

        #include

        #define uchar unsigned char

        #define uint unsigned int

        //聲明變量

            sbit LED1_0=P1^0; sbit LED1_1=P1^1; sbit LED1_2=P1^2; sbit LED1_3=P1^3;// sbit LED1_4=P1^4;  sbit LED1_5=P1^0;

            sbit LED2_0=P2^0;

         

        //延時子程序

         void  Delayms(uint x)

         {

          uchar i;

          while(x--)

          {

          for (i=0;i<120;i++);

          }

         }

         //主程序

                      void main()

                      {

                        {

                         if(LED2_0!=1)

                            P3=0xff;

                       else

                            P3=0x00;

                        LED2_0=P2^0;

                         LED1_0=LED2_0;

                         LED1_1=LED2_0;

                         LED1_2=LED2_0;

                         LED1_3=LED2_0;

                         Delayms(100);

                        }

                         return;

                      }

        程序說明:

        上面的單片機系統和C語言控制指令,很容易被更改為多口、多位的單鍵控制系統。圖3為多個LED-單個按鍵的運行結果與C語言。圖中對P2.0口采用了雙擲開關,實現P2.0口的兩種電平狀態。

         

        3.LED循環問題(跑馬燈、流水燈):

        每個口用位賦值指令來開關P1口的各個LED,用位指令賦值順序開關,實現跑馬燈。

        先通過單個燈的閃爍來體驗C語言描述單口或多口(位)的高低電平變換。

        n  無開關單燈閃爍

         

        n  無開關多燈閃爍

         

        n  用循環語句實現跑馬燈,需要使用數組data。每個字節--8位來表達P1口各個位的電平高低,也就是亮與滅。

         

         

         

         

        #include

        #include

        #define uchar unsigned char

        #define uint unsigned int

        //聲明變量 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH

          uchar code LiuSHui[]={0x7F,0xfb,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7F,0xfb,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

               sbit LED2_0=P2^0;                      

        //延時子程序

         void  Delayms(uint x)

         {

          uchar t;                                                               

          while(x--)

          {

          for (t=0;t<120;t++);

          }

         }

         //主程序

                      void main()

                      {

                       uchar i=0;

                        {         

                        if(LED2_0!=1)

                        {

                           loop:

                            P3=~LiuSHui[i];

                               i=(i+1);

                               Delayms(100);

                              goto loop;

                        }

                       else

                              P3=0x00;

                  if(LED2_0=1)

                       {

                             P1=0x00;

                        Delayms(100);

                       }

                          

                        else

                              P1=0xff;

                        }

                        return;

                      }

         

        4.多數碼管

        對于多個數碼管的情形,需要注意通過控制

        #define LEDS 4

        #include"reg51.h"

        //led Tiffl1

        unsigned char code Select[]={0x01,0x02,0x04,0x08,0x10};//,0x20};

        //unsigned char code Select[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,};

        unsigned char code LED_CODES[]=

        { 0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,//0-9

        0x88,0x83,0xC6,0xA1 ,0x86,0x8E,0xFF,0x0C,0x89,0x7F,0xBF//A,...F,空格,P,H,.,-

        };

        void main()

        {

        char i=0;

        long int j;

        long int n;

        while(1)

        {

        P2=0;

         P2=LED_CODES[n];

        //P1=1;

        P1=Select[i];

        for(j=20000;j>0;j--);

        i++;

        if(i>4) i=0;

         

        n++;

        if(n>15) n=0;

        }

        }

         

                                                               

                                                                51系列-C語言逐級深入練習

         

        5.單個LED燈,單個按鍵

        //C語言的頭文件    //這是第一種注釋方式;

        #include

        #include <> //預處理命令

         void main(void)                //主函數名,必須有一個主函數,void為數據類型

         {

         unsigned int a;           //定義變量,aint類型,無符號整型。語句必須分號結尾

          

          do{                            //do-while 組成的循環過程,過程的開始

         for (a=0; a<500; a++);  //這是一個條件循環,判斷a的值是否小于500,真循環-耗時,假轉下句

        P1_0 = 0;         //位賦值語句,設 P1.0 口為低電平0,點亮 LED

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P1_0 = 1;             // P1.0 口為高電平,熄滅 LED

           }

         while(1);            //do-while 組成循環過程的末尾,需要對do的過程進行一次判斷

        }

         

        程序說明

        While(條件語句) for(條件語句) 單獨使用所表達的循環,是在句首先執行判斷,為真循環,為假轉下一句執行。其中語句的括號內為判斷條件語句。

        Do-while合用,是需要對do的過程再進行一次判斷。While(條件語句)為真循環,為假跳轉。while(1)表示高電平為真循環do,否則,低電平跳轉。由于P1.0 口為高電平結尾,因此,又回到do再循環,無限反復。

         

        6.多個LED燈,單個按鍵

        #include

        #include <> //預處理命令

         void main(void)                //主函數名,必須有一個主函數,void為數據類型

         {

         unsigned int a;           //定義變量,aint類型,無符號整型。語句必須分號結尾

            do{                            //do-while 組成的循環過程,過程的開始

         for (a=0; a<500; a++);  //這是一個條件循環,判斷a的值是否小于500,真循環-耗時,假轉下句

        P1_0 = 0;         //位賦值語句,設 P1.0 口為低電平0,點亮 LED

        P1_1 = 0;

        P1_2 = 0;

        P1_3 = 0;

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P1_0 = 1;             // P1.0 口為高電平,熄滅 LED

        P1_1 = 1;

        P1_2 = 1;

        P1_3 = 1;

           }

         while(1);            //do-while 組成循環過程的末尾,需要對do的過程進行一次判斷

        }

         

        程序說明

        每個口用位賦值指令來開關P1口的各個LED?梢杂米止澷x值指令一次性的開關8P1LED。

        P1=0;     //P18位置低電平,點亮8LED

        P1=1;      // P18位置低電平,關閉8LED

         

        #include

        #include <> //預處理命令

         void main(void)                //主函數名,必須有一個主函數,void為數據類型

         {

         unsigned int a;           //定義變量,aint類型,無符號整型。語句必須分號結尾

            do{                            //do-while 組成的循環過程,過程的開始

         for (a=0; a<500; a++);  //這是一個條件循環,判斷a的值是否小于500,真循環-耗時,假轉下句

        P1 = 0;         //字節賦值語句,設 P1 口為低電平0,點亮 8LED

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P = 1;             // P1 口為高電平,熄滅 LED

           }

         while(1);            //do-while 組成循環過程的末尾,需要對do的過程進行一次判斷

        }

         

         

        l  LED循環問題(跑馬燈):

        每個口用位賦值指令來開關P1口的各個LED,用位指令賦值順序開關,實現跑馬燈。

         

        #include

        #include <> //預處理命令

         void main(void)                //主函數名,必須有一個主函數,void為數據類型

         {

         unsigned int a;           //定義變量,aint類型,無符號整型。語句必須分號結尾

            do{                            //do-while 組成的循環過程,過程的開始

         for (a=0; a<500; a++);  //這是一個條件循環,判斷a的值是否小于500,真循環-耗時,假轉下句

        P1_0 = 0;         //位賦值語句,設 P1.0 口為低電平0,點亮 LED

        P1_1 = 1;

        P1_2 = 1;

        P1_3 = 1;

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P1_0 = 1;             // P1.0 口為高電平,熄滅 LED

        P1_1 = 0;

        P1_2 = 1;

        P1_3 = 1;

         

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P1_0 = 1;  

        P1_1 = 1;

        P1_2 = 0;

        P1_3 = 1;

         

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P1_0 = 1;

        P1_1 = 1;

        P1_2 = 1;

        P1_3 = 0;

         

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P1_0 = 1;             // P1.0 口為高電平,熄滅 LED

        P1_1 = 1;

        P1_2 = 1;

        P1_3 = 1;

         

           }

         while(1);            //do-while 組成循環過程的末尾,需要對do的過程進行一次判斷

        }

         

        用循環語句實現跑馬燈,需要使用數組data。每個字節--8位來表達P1口各個位的電平高低,也就是亮與滅。

         

        #include

        #include <> //預處理命令

         void main(void)                //主函數名,必須有一個主函數,void為數據類型

         {

         unsigned int a;           //定義變量,aint類型,無符號整型。語句必須分號結尾

            do{                            //do-while 組成的循環過程,過程的開始

         for (a=0; a<500; a++);  //這是一個條件循環,判斷a的值是否小于500,真循環-耗時,假轉下句

        P1 = 0;         //字節賦值語句,設 P1 口為低電平0,點亮 8LED

        for (a=0; a<500; a++);        //這又是一個判斷循環

        P = 1;             // P1 口為高電平,熄滅 LED

           }

         while(1);            //do-while 組成循環過程的末尾,需要對do的過程進行一次判斷

        }

        關閉窗口

        相關文章

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