專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51系列-C語(yǔ)言控制逐級(jí)娛樂(lè)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月19日   【字體:


 

 













 

注意51系列8bit)一個(gè)字節(jié),應(yīng)用匯編語(yǔ)言簡(jiǎn)潔高效。16位的處理器需要用0000 0000H 表示。1632位以上,使用操作系統(tǒng)(WinCELinux等)更有效,可以利用大量的、底層的、專(zhuān)業(yè)化、標(biāo)準(zhǔn)化的面向控制的庫(kù)函數(shù)(如:API等)。高級(jí)語(yǔ)言具有對(duì)底層硬件的無(wú)關(guān)性,則可移植性好、可重用性好;高級(jí)語(yǔ)言描述控制更接近人的自然語(yǔ)言,可描述性好,表達(dá)力好。Linux的代碼與模塊的開(kāi)放性、可剪裁性、自我構(gòu)造等特點(diǎn)使其前景廣闊。

1.單個(gè)LED燈,單個(gè)按鍵

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

//預(yù)處理命令

#include   

#define uchar unsigned char

#define uint unsigned int

//聲明變量

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

    sbit LED2_0=P2^0;

//延時(shí)子程序 這是一個(gè)常用的模塊,可視為標(biāo)準(zhǔn)程序段,

 void  Delayms(uint x)

 {

  uchar  i;

  while(x--)    //X每循環(huán)一次,自動(dòng)減1,直至X1,終止循環(huán)

  {

  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--)

                }

              }

程序說(shuō)明

While(條件語(yǔ)句) for(條件語(yǔ)句) 單獨(dú)使用所表達(dá)的循環(huán),是在句首先執(zhí)行判斷,為真循環(huán),為假轉(zhuǎn)下一句執(zhí)行。其中語(yǔ)句的括號(hào)內(nèi)為判斷條件語(yǔ)句。

Do-while合用,是需要對(duì)do的過(guò)程再進(jìn)行一次判斷。While(條件語(yǔ)句)為真循環(huán),為假跳轉(zhuǎn)。while(1)表示高電平為真循環(huán)do,否則,低電平跳轉(zhuǎn)。由于P1.0 口為高電平結(jié)尾,因此,又回到do再循環(huán),無(wú)限反復(fù)。

 

#include

#include <> //預(yù)處理命令

 void main(void)                //主函數(shù)名,必須有一個(gè)主函數(shù),void為數(shù)據(jù)類(lèi)型

 {

 unsigned int a;           //定義變量,aint類(lèi)型,無(wú)符號(hào)整型。語(yǔ)句必須分號(hào)結(jié)尾

  

  do{                            //do-while 組成的循環(huán)過(guò)程,過(guò)程的開(kāi)始

 for (a=0; a<500; a++);  //這是一個(gè)條件循環(huán),判斷a的值是否小于500,真循環(huán)-耗時(shí),假轉(zhuǎn)下句

P1_0 = 0;         //賦值語(yǔ)句,設(shè) P1.0 口為低電平0,點(diǎn)亮 LED

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

P1_0 = 1;             //設(shè) P1.0 口為高電平,熄滅 LED

   }

 while(1);            //do-while 組成循環(huán)過(guò)程的末尾,需要對(duì)do的過(guò)程進(jìn)行一次判斷

}

 

2.多個(gè)LED燈,單個(gè)按鍵

對(duì)于多個(gè)LED燈(LED數(shù) < 8個(gè))來(lái)說(shuō),在硬件連接方面、軟件編寫(xiě)方面均沒(méi)有大的難點(diǎn)。按照單個(gè)LED的連接方式增加便可?刂瞥绦蚓帉(xiě)基本上也是重復(fù)性工作COPY簡(jiǎn)單修改即可。

對(duì)于LED數(shù)> 8個(gè)且不能被8整除的需要用位操作指令。

對(duì)于LED數(shù)> 8個(gè)的情況,需要解決兩個(gè)方面的問(wèn)題。一個(gè)是硬件的連接方法,一個(gè)是控制程序的編寫(xiě)指令用詞方法。硬件方面可以用單個(gè)或多個(gè)成組的LED多個(gè)或總線接口、單個(gè)接口擴(kuò)展等。程序編寫(xiě)則可以使用重復(fù)性工作、可以使用字節(jié)命令而摒棄位命令,使得程序簡(jiǎn)潔、可讀性好、硬件運(yùn)行效率高。

對(duì)于LED數(shù)= 8個(gè)或是8的倍數(shù)的情況,硬件方面可以用單個(gè)或多個(gè)成組的LED多個(gè)或總線接口、單個(gè)接口擴(kuò)展等。程序編寫(xiě)則可以使用重復(fù)性工作、可以使用字節(jié)操作指令而摒棄位操作指令,使得程序簡(jiǎn)潔、可讀性好、硬件運(yùn)行效率高。

 

#include < reg51.h >

#include <> //預(yù)處理命令

 void main(void)       //主函數(shù)名,必須有一個(gè)主函數(shù),void為數(shù)據(jù)類(lèi)型

 {

 unsigned int a;           //定義變量,aint類(lèi)型,無(wú)符號(hào)整型。語(yǔ)句必須分號(hào)結(jié)尾

    do{                            //do-while 組成的循環(huán)過(guò)程,過(guò)程的開(kāi)始

 for (a=0; a<500; a++);  //這是一個(gè)條件循環(huán),判斷a的值是否小于500,真循環(huán)-耗時(shí),假轉(zhuǎn)下句

P1_0 = 0;         //位賦值語(yǔ)句,設(shè) P1.0 口為低電平0,點(diǎn)亮 LED

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

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

P1_0 = 1;             //設(shè) P1.0 口為高電平,熄滅 LED

P1_1 = 1;

P1_2 = 1;

P1_3 = 1;

   }

 while(1);            //do-while 組成循環(huán)過(guò)程的末尾,需要對(duì)do的過(guò)程進(jìn)行一次判斷

}

 

程序說(shuō)明

每個(gè)口用位賦值指令來(lái)開(kāi)關(guān)P1口的各個(gè)LED。可以用字節(jié)賦值指令一次性的開(kāi)關(guān)8P1LED。

P1=0;     //P18位置低電平,點(diǎn)亮8個(gè)LED

P1=1;      // P18位置低電平,關(guān)閉8個(gè)LED

對(duì)于多燈的情況,可以使用多個(gè)數(shù)據(jù)口來(lái)進(jìn)行系統(tǒng)設(shè)計(jì)(也可單口擴(kuò)展),在圖2系統(tǒng)的基礎(chǔ)上,添加P3口為一個(gè)字節(jié)形式的輸出口。用LED組件的形式顯示輸出要求。

改造結(jié)果如圖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;

 

//延時(shí)子程序

 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;

              }

程序說(shuō)明:

上面的單片機(jī)系統(tǒng)和C語(yǔ)言控制指令,很容易被更改為多口、多位的單鍵控制系統(tǒng)。圖3為多個(gè)LED-單個(gè)按鍵的運(yùn)行結(jié)果與C語(yǔ)言。圖中對(duì)P2.0口采用了雙擲開(kāi)關(guān),實(shí)現(xiàn)P2.0口的兩種電平狀態(tài)。

 

3.LED循環(huán)問(wèn)題(跑馬燈、流水燈):

每個(gè)口用位賦值指令來(lái)開(kāi)關(guān)P1口的各個(gè)LED,用位指令賦值順序開(kāi)關(guān),實(shí)現(xiàn)跑馬燈。

先通過(guò)單個(gè)燈的閃爍來(lái)體驗(yàn)C語(yǔ)言描述單口或多口(位)的高低電平變換。

n  無(wú)開(kāi)關(guān)單燈閃爍

 

n  無(wú)開(kāi)關(guān)多燈閃爍

 

n  用循環(huán)語(yǔ)句實(shí)現(xiàn)跑馬燈,需要使用數(shù)組data。每個(gè)字節(jié)--8位來(lái)表達(dá)P1口各個(gè)位的電平高低,也就是亮與滅。

 

 

 

 

#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;                      

//延時(shí)子程序

 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.多數(shù)碼管

對(duì)于多個(gè)數(shù)碼管的情形,需要注意通過(guò)控制

#define LEDS 4

#include"reg51.h"

//led Tiffl1號(hào)

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語(yǔ)言逐級(jí)深入練習(xí)

 

5.單個(gè)LED燈,單個(gè)按鍵

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

#include

#include <> //預(yù)處理命令

 void main(void)                //主函數(shù)名,必須有一個(gè)主函數(shù),void為數(shù)據(jù)類(lèi)型

 {

 unsigned int a;           //定義變量,aint類(lèi)型,無(wú)符號(hào)整型。語(yǔ)句必須分號(hào)結(jié)尾

  

  do{                            //do-while 組成的循環(huán)過(guò)程,過(guò)程的開(kāi)始

 for (a=0; a<500; a++);  //這是一個(gè)條件循環(huán),判斷a的值是否小于500,真循環(huán)-耗時(shí),假轉(zhuǎn)下句

P1_0 = 0;         //位賦值語(yǔ)句,設(shè) P1.0 口為低電平0,點(diǎn)亮 LED

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

P1_0 = 1;             //設(shè) P1.0 口為高電平,熄滅 LED

   }

 while(1);            //do-while 組成循環(huán)過(guò)程的末尾,需要對(duì)do的過(guò)程進(jìn)行一次判斷

}

 

程序說(shuō)明

While(條件語(yǔ)句) for(條件語(yǔ)句) 單獨(dú)使用所表達(dá)的循環(huán),是在句首先執(zhí)行判斷,為真循環(huán),為假轉(zhuǎn)下一句執(zhí)行。其中語(yǔ)句的括號(hào)內(nèi)為判斷條件語(yǔ)句。

Do-while合用,是需要對(duì)do的過(guò)程再進(jìn)行一次判斷。While(條件語(yǔ)句)為真循環(huán),為假跳轉(zhuǎn)。while(1)表示高電平為真循環(huán)do,否則,低電平跳轉(zhuǎn)。由于P1.0 口為高電平結(jié)尾,因此,又回到do再循環(huán),無(wú)限反復(fù)。

 

6.多個(gè)LED燈,單個(gè)按鍵

#include

#include <> //預(yù)處理命令

 void main(void)                //主函數(shù)名,必須有一個(gè)主函數(shù),void為數(shù)據(jù)類(lèi)型

 {

 unsigned int a;           //定義變量,aint類(lèi)型,無(wú)符號(hào)整型。語(yǔ)句必須分號(hào)結(jié)尾

    do{                            //do-while 組成的循環(huán)過(guò)程,過(guò)程的開(kāi)始

 for (a=0; a<500; a++);  //這是一個(gè)條件循環(huán),判斷a的值是否小于500,真循環(huán)-耗時(shí),假轉(zhuǎn)下句

P1_0 = 0;         //位賦值語(yǔ)句,設(shè) P1.0 口為低電平0,點(diǎn)亮 LED

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

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

P1_0 = 1;             //設(shè) P1.0 口為高電平,熄滅 LED

P1_1 = 1;

P1_2 = 1;

P1_3 = 1;

   }

 while(1);            //do-while 組成循環(huán)過(guò)程的末尾,需要對(duì)do的過(guò)程進(jìn)行一次判斷

}

 

程序說(shuō)明

每個(gè)口用位賦值指令來(lái)開(kāi)關(guān)P1口的各個(gè)LED?梢杂米止(jié)賦值指令一次性的開(kāi)關(guān)8P1LED

P1=0;     //P18位置低電平,點(diǎn)亮8個(gè)LED

P1=1;      // P18位置低電平,關(guān)閉8個(gè)LED

 

#include

#include <> //預(yù)處理命令

 void main(void)                //主函數(shù)名,必須有一個(gè)主函數(shù),void為數(shù)據(jù)類(lèi)型

 {

 unsigned int a;           //定義變量,aint類(lèi)型,無(wú)符號(hào)整型。語(yǔ)句必須分號(hào)結(jié)尾

    do{                            //do-while 組成的循環(huán)過(guò)程,過(guò)程的開(kāi)始

 for (a=0; a<500; a++);  //這是一個(gè)條件循環(huán),判斷a的值是否小于500,真循環(huán)-耗時(shí),假轉(zhuǎn)下句

P1 = 0;         //字節(jié)賦值語(yǔ)句,設(shè) P1 口為低電平0,點(diǎn)亮 8個(gè)LED

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

P = 1;             //設(shè) P1 口為高電平,熄滅 LED

   }

 while(1);            //do-while 組成循環(huán)過(guò)程的末尾,需要對(duì)do的過(guò)程進(jìn)行一次判斷

}

 

 

l  LED循環(huán)問(wèn)題(跑馬燈):

每個(gè)口用位賦值指令來(lái)開(kāi)關(guān)P1口的各個(gè)LED,用位指令賦值順序開(kāi)關(guān),實(shí)現(xiàn)跑馬燈。

 

#include

#include <> //預(yù)處理命令

 void main(void)                //主函數(shù)名,必須有一個(gè)主函數(shù),void為數(shù)據(jù)類(lèi)型

 {

 unsigned int a;           //定義變量,aint類(lèi)型,無(wú)符號(hào)整型。語(yǔ)句必須分號(hào)結(jié)尾

    do{                            //do-while 組成的循環(huán)過(guò)程,過(guò)程的開(kāi)始

 for (a=0; a<500; a++);  //這是一個(gè)條件循環(huán),判斷a的值是否小于500,真循環(huán)-耗時(shí),假轉(zhuǎn)下句

P1_0 = 0;         //位賦值語(yǔ)句,設(shè) P1.0 口為低電平0,點(diǎn)亮 LED

P1_1 = 1;

P1_2 = 1;

P1_3 = 1;

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

P1_0 = 1;             //設(shè) P1.0 口為高電平,熄滅 LED

P1_1 = 0;

P1_2 = 1;

P1_3 = 1;

 

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

P1_0 = 1;  

P1_1 = 1;

P1_2 = 0;

P1_3 = 1;

 

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

P1_0 = 1;

P1_1 = 1;

P1_2 = 1;

P1_3 = 0;

 

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

P1_0 = 1;             //設(shè) P1.0 口為高電平,熄滅 LED

P1_1 = 1;

P1_2 = 1;

P1_3 = 1;

 

   }

 while(1);            //do-while 組成循環(huán)過(guò)程的末尾,需要對(duì)do的過(guò)程進(jìn)行一次判斷

}

 

用循環(huán)語(yǔ)句實(shí)現(xiàn)跑馬燈,需要使用數(shù)組data。每個(gè)字節(jié)--8位來(lái)表達(dá)P1口各個(gè)位的電平高低,也就是亮與滅。

 

#include

#include <> //預(yù)處理命令

 void main(void)                //主函數(shù)名,必須有一個(gè)主函數(shù),void為數(shù)據(jù)類(lèi)型

 {

 unsigned int a;           //定義變量,aint類(lèi)型,無(wú)符號(hào)整型。語(yǔ)句必須分號(hào)結(jié)尾

    do{                            //do-while 組成的循環(huán)過(guò)程,過(guò)程的開(kāi)始

 for (a=0; a<500; a++);  //這是一個(gè)條件循環(huán),判斷a的值是否小于500,真循環(huán)-耗時(shí),假轉(zhuǎn)下句

P1 = 0;         //字節(jié)賦值語(yǔ)句,設(shè) P1 口為低電平0,點(diǎn)亮 8個(gè)LED

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

P = 1;             //設(shè) P1 口為高電平,熄滅 LED

   }

 while(1);            //do-while 組成循環(huán)過(guò)程的末尾,需要對(duì)do的過(guò)程進(jìn)行一次判斷

}

關(guān)閉窗口

相關(guān)文章