0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

51單片機的控制語句

汽車電子技術(shù) ? 來源:嵌入式悅翔園 ? 作者: JamesBin ? 2023-02-17 14:53 ? 次閱讀

Cx51流程控制共有3種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)以及循環(huán)結(jié)構(gòu)。

一、順序結(jié)構(gòu)

順序結(jié)構(gòu)是最基本、最簡單的編程結(jié)構(gòu),程序按先后順序執(zhí)行指令代碼。

下圖是8051單片機的P0口和P1口上分別連接了8個LED,請分別用P0和P1口顯示加法125+34和減法176-98的運算結(jié)果

圖片

#include
int main(void)  
{ 
 unsigned char a=125,b=34,c=176,d=98;
 P1=a+b; //加法運算結(jié)果送P1端口,P1=159=1001 1111B
 P0=c-d;  //減法運算結(jié)果送P0端口,P0=78=0100 1110B
 while(1); //循環(huán)等待,防止主程序退出后單片機跑飛
 }

二、選擇結(jié)構(gòu)

2.選擇結(jié)構(gòu)

(1)if語句

if語句用于根據(jù)條件判定結(jié)果決定執(zhí)行的語句。if語句有三種基本形式:

if(表達式)
    {語句組}

說明:如果“表達式”為真,則執(zhí)行花括號中的語句組,否則跳過花括號執(zhí)行下面的語句。

if(表達式)
     {語句組1}
    else
     {語句組2}

說明:如果“表達式”真,則執(zhí)行語句組1,否則執(zhí)行語句組2。

if(表達式1)
      {語句1}
     else if(表達式2)
      {語句組2 }
     else if(表達式3)
      {語句組3}
     else if(表達式m)
      {語句組m}
     else
      {語句組n}

說明:如果“表達式1”為真,則執(zhí)行“語句組1”,否則如果“表達式2”為真,則執(zhí)行“語句組2”…,如果所有的表達式都不滿足,則執(zhí)行語句組n。

同圖4-2,用if語句根據(jù)54/18的計算結(jié)果選擇P0口8位LED的狀態(tài)。

圖片

#include  //包含單片機寄存器的頭文件
int main(void)
{ 
   unsigned char a=54,b=18;
   if (a/b==1)P0=0xfe; //第一個LED亮
   else if (a/b==2) P0=0xfd;  //第二個LED亮
   else if (a/b==3) P0=0xfb; //第三個LED亮
   else if (a/b==4) P0=0xf7; //第四個LED亮
   else if (a/b==5) P0=0xef;  //第五個LED亮 
   else if (a/b==6) P0=0xdf;  //第八個LED亮      
   else if (a/b==7) P0=0xbf;  //第七個LED亮          
   else if (a/b==8) P0=0x7f;  //第八個LED亮       
   else P0=0xff;  //缺省值,關(guān)閉所有LED 
   while(1); 
 }

(2)switch/case語句

根據(jù)表達式的值決定要執(zhí)行的語句組,用于實現(xiàn)多中選一,形式如下:

switch(表達式)
 {
case常量表達式1//如果1滿足,則執(zhí)行語句組1
  語句組1;
  break;          //跳出switch結(jié)構(gòu)
case常量表達式2//如果2滿足,則執(zhí)行語句組2
 語句組2;
  break;          //跳出switch結(jié)構(gòu)default:          //條件都不滿足時,執(zhí)行語句組n
 語句組n;
  }

同圖4-2,用swtich語句根據(jù)54/18的計算結(jié)果選擇P0口8位LED的狀態(tài)

圖片

#include  //包含單片機寄存器的頭文件
int main(void)
{ 
  unsigned char a=56,b=18;
  switch(a/b)   //使用多分支選擇語句
 {
     case 1: P0=0xfe; break;   //第一個LED亮
   case 2: P0=0xfd; break;   //第二個LED亮
   case 3: P0=0xfb; break;   //第三個LED亮
   case 4: P0=0xf7; break;   //第四個LED亮
   case 5: P0=0xef; break;   //第五個LED亮      
   case 6:P0=0xdf; break;    //第六個LED亮       
   case 7:P0=0xbf; break;    //第七個LED亮          
   case 8:P0=0x7f; break;    //第八個LED亮       
   default: P0=0xff;  //缺省值,關(guān)閉所有LED 
 }   
 while(1);
}

1、for循環(huán)

for 循環(huán)結(jié)構(gòu)用于按指定的次數(shù)循環(huán)執(zhí)行一組語句,格式如下:

for(表達式1;表達式2;表達式3)
{語句;}

for循環(huán)語句執(zhí)行過程如下:

(1)先執(zhí)行表達式1,一般是對循環(huán)變量賦初值;

(2)執(zhí)行表達式2,若表達式2結(jié)果為真,則執(zhí)行循環(huán)體語句,并求解表達式

3(一般是改變循環(huán)變量的值);然后再次執(zhí)行表達式2;并判斷結(jié)果真假

(3)若表達式2結(jié)果為假,則退出for循環(huán)。

三、循環(huán)結(jié)構(gòu)

while循環(huán)

while循環(huán)語句先判斷條件真假,若表達式為真,則執(zhí)行花括號內(nèi)的語句組,否則終止循環(huán),格式如下:

while(表達式)
      {語句組}

同圖4-3,用while循環(huán)計算7的階乘并送P1和P0口顯示結(jié)果。

圖片

#include  //包含單片機寄存器的頭文件
int main(void)
{ 
  unsigned char i=1;
  unsigned int s=1;  
  while(i<=7)
  {
     s=s*i;//計算階乘
     i++;  //i自增運算
  }
  P1=s/256;   //高8位送P1顯示
  P0=s%256;   //低8位送P0顯示
  while(1);
}

do while 循環(huán)

先執(zhí)行花括號內(nèi)的語句組,然后執(zhí)行表達式,若結(jié)果為真,則重復(fù)執(zhí)行花括號內(nèi)的語句組,否則終止循環(huán),格式如下:

do
  {語句組}
while(表達式);

根據(jù)下圖用do while循環(huán)計算7的階乘并送P1和P0口顯示結(jié)果。

圖片

#include  //包含單片機寄存器的頭文件
int main(void)
{ 
  unsigned char i=1;
  unsigned int s=1;  
 do
  {
     s=s*i;//計算階乘
     i++;  //i自增運算
    } while(i<=7);
  P1=s/256; //高8位送P1顯示
  P0=s%256; //低8位送P0顯示
  while(1);
}

四、數(shù)組

1.一維數(shù)組

(1)一維數(shù)組的定義方式為:

數(shù)據(jù)類型 數(shù)組名 [常量表達式];

例如定義有3個元素字符型數(shù)組m:

charm[3];

m的3個元素分別是m[0], m[1], m[2]。數(shù)組的類型指數(shù)組元素的取值類型。對于同一個數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。

(2)一維數(shù)組的初始化

數(shù)組初始化是指在數(shù)組定義時給數(shù)組元素賦予初值。

例如:

int m[3]={ 0,1,2};

相當(dāng)于a[0]=0,a[1]=1,a[2]=2。

當(dāng){ }中值的個數(shù)少于元素個數(shù)時,只給前面部分元素賦值,其他元素自動賦0值。

例如:

int m[3]={0,1}

(3)一維數(shù)組元素的引用

數(shù)組必須預(yù)先定義才能使用。數(shù)組只能逐個地使用各元素,而不能一次引用整個數(shù)組。例如,輸出有10個元素的數(shù)組必須使用循環(huán)語句逐個輸出各下標(biāo)變量:

for(i=0;i<3; i++)
   printf("%d",m[i]);

而不能用一個語句輸出整個數(shù)組。因此,下面的寫法是錯誤的:

printf("%d",m);

用一維數(shù)組實現(xiàn)流水點亮P0口的8位LED

圖片

int main(void) //主函數(shù)
{ 
  unsigned char i;
  unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定義無符號字符型數(shù)組 
  while(1)
  {
   for(i=0;i<8;i++)
      {
        P0=Tab[i];//依次引用數(shù)組元素,并將其送P0口顯示
        delay();//調(diào)用延時函數(shù)
     }
  }
}

2.二維數(shù)組

二維數(shù)組是以行列矩陣的形式存儲數(shù)據(jù)。

** (1)二維數(shù)組定義**

數(shù)據(jù)類型 數(shù)組名[下標(biāo)1][下標(biāo)2];

第一個下標(biāo)代表行,第二個下標(biāo)代表列。例如語句 int a[2][3] 定義了二維整形數(shù)組,共有2行3列6個元素。

(2)二維數(shù)組的初始化

可以采用以下兩種方式初始化:

按先行后列的存儲順序整體賦值,例如:

int a[2][3]={0,1,2,3,4,5}

按每行分別賦值,例如:

int a[2][3]={{0,1,2},{3,4,5}};

用二維數(shù)組實現(xiàn)流水點亮P0口的8位LED。

圖片

int main(void)
{ 
  unsigned char i,j;
  unsigned char codeTab[2][4]={{0xfe,0xfd,0xfb,0xf7},{0xef,0xdf,0xbf,0x7f}}; //定義無符  //號字符型數(shù)組 
  while(1)
  {
   for(i=0;i<2;i++)
   for(j=0;j<4;j++)
      {
        P0=Tab[i][j];//依次引用數(shù)組元素,并將其送P0口顯示
        delay();//調(diào)用延時函數(shù)
     }
  }
}

變量的指針就是變量的地址。在C語言中,允許用一個變量來存放指針,這種變量稱為指針變量。

指針變量是一種特殊的變量,它也和一般變量一樣,具有變量名、類型和值,但它的值就是變量所存放的地址。

通過指針對變量進行操作是間接操作,比直接操作變量更費時間,且不夠直觀,但可以通過靈活運用指針使程序代碼更為簡潔、有效。

四、指針

1、指針變量的定義

指針變量同普通變量一樣,使用之前要進行定義。指針變量定義的一般形式為:

數(shù)據(jù)類型 *變量名;

其中,數(shù)據(jù)類型表示本指針變量所指向變量的數(shù)據(jù)類型,*表示這是一個指針變量。

例如:定義:int*point,表示point指向一個整型變量,但point具體指向哪一個整型變量,取決于point中所存儲的地址。一個指針變量只能指向同類型的變量,如上述point 只能指向整形變量,不能指向一個字符變量。

2、指針變量的引用

指針變量在使用之前必須賦予具體的地址,使用未經(jīng)賦值的指針變量會引起嚴(yán)重后果。指針變量的引用有兩個重要運算符:

&:取地址運算符;

*:指針運算符(或稱“間接訪問” 運算符)。

在指針變量定義中所出現(xiàn)的“ ”是類型說明符,表示其后的變量是指針類型,而指針運算符“ ”則出現(xiàn)在表達式中,用以表示指針指向的變量值。

地址運算符&用來取出變量的地址。其形式為:

&變量名;

?指針運算符*用來取出指針指向變量的值,其形式為:

*指針變量名;
inti,j;
int *point;
point= &i;
j=*point;

表示取出變量i的值賦予變量j,與語句j=i的效果相同。對*point的任何操作與直接對變量i的操作效果相同。

3、數(shù)組指針

一個變量有一個地址,一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。數(shù)組的指針是指數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。

一個數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的。數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。一個數(shù)組也是由各個數(shù)組元素(下標(biāo)變量)組成的。每個數(shù)組元素按其類型不同占有幾個連續(xù)的內(nèi)存單元。一個數(shù)組元素的首地址也是指它所占有的幾個內(nèi)存單元的首地址。

定義一個指向數(shù)組元素的指針變量,與定義普通變量的指針相同。例如:

intm[]={1,2,3};4int*p;4p=&m[0];

經(jīng)上述定義后,p就是數(shù)組m的指針。因為數(shù)組名代表數(shù)組的首地址,也就是第一個元素的地址,因此下面兩個語句等價:

p=&m[0];
p=m;

p指向數(shù)組m的首地址后,p+i就是數(shù)組的元素m[i]。

例題:用一維數(shù)組實現(xiàn)流水點亮P0口的8位LED。

圖片

int main(void)
{ 
 unsigned char i;
 unsigned char code Tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; /*定義無符號字符型數(shù)組*/ 
 unsigned char *p;
  p=&Tab[0];/*定義指針變量并指向Tab數(shù)組,也可寫為unsigned char   *p=Tab */
 while(1)
 {
   for(i=0;i<8;i++)
   {
        P0=*(p+i);//通過指針變量依次引用數(shù)組元素,并將其送P0口顯示
        delay();//調(diào)用延時函數(shù)
   }
 }
}

指向二維數(shù)組的指針變量的說明形式為

類型說明符 (*指針變量名)[長度];

“長度”是二維數(shù)組的列數(shù)。二維數(shù)組的每一行都代表一個一維數(shù)組,該一維數(shù)組的長度就是二維數(shù)組的列數(shù)。若該指針變量指向二組數(shù)組A[m][n]的首地址,則 (指針變量名+i)就是A[i],而A[i]是一維數(shù)組A[i][n]的首地址, (*(指針變量名+i)+j)就是A[i][j]的值。

例題:用二維數(shù)組實現(xiàn)流水點亮P0口的8位LED。

圖片

int main(void)
{ 
 unsigned char i,j;
 unsigned char codeTab[2][4]={{0xfe,0xfd,0xfb,0xf7},{0xef,0xdf,0xbf,0x7f}}; //定
                                           //義無符號字符型數(shù)組
 unsigned char (*p)[4]; //定義二維數(shù)組指針
 p=Tab;//指向二維數(shù)組首地址
 while(1)
 {
   for(i=0;i<2;i++)
    for(j=0;j<4;j++)
   {
        P0=*(*(p+i)+j);//依次引用數(shù)組元素,并將其送P0口顯示
        delay();//調(diào)用延時函數(shù) 
   }
 }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    單片機c語言教程第十三章--C51循環(huán)語句

    單片機c語言教程第十三課 C51循環(huán)語句 循環(huán)語句是幾乎每個程序都會用到的,它的作用就是用來實現(xiàn)需要反復(fù)進行多次的操 作。如一個 12M 的 51
    發(fā)表于 04-15 09:42 ?1681次閱讀

    51單片機控制舵機

    利用簡單的51單片機的PWM的脈沖控制信號來很方便的控制舵機
    發(fā)表于 11-10 15:25 ?103次下載

    51單片機教程第3講-控制引腳

    51單片機教程第1講中,我已經(jīng)說過,學(xué)單片機就是兩個內(nèi)容,一個是學(xué)習(xí)控制單片機引腳,一個是學(xué)習(xí)單片機內(nèi)部寄存器的配置。這一講,來學(xué)習(xí)如何
    發(fā)表于 12-13 13:35 ?3484次閱讀

    51單片機教程之80C51單片機的C語言程序設(shè)計資料概述

    本文檔的主要內(nèi)容詳細介紹的是51單片機教程之80C51單片機的C語言程序設(shè)計資料概述主要內(nèi)容包括了: 單片機C語言概述 C
    發(fā)表于 12-05 11:53 ?298次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>教程之80C<b class='flag-5'>51</b><b class='flag-5'>單片機</b>的C語言程序設(shè)計資料概述

    什么是51單片機?又該如何自學(xué)51單片機

    51 單片機是目前使用最多的單片機之一,那么什么是 51 單片機呢?作為新手,又該如何自學(xué) 51
    的頭像 發(fā)表于 11-03 21:14 ?6582次閱讀

    51單片機是什么?應(yīng)該如何學(xué)習(xí)51單片機

    51 單片機是目前使用最多的單片機之一,那么什么是 51 單片機呢?作為新手,又該如何自學(xué) 51
    發(fā)表于 12-23 07:57 ?73次下載

    基于51單片機的自動尋跡小車控制的設(shè)計

    基于51單片機的自動尋跡小車控制的設(shè)計(語音單片機)-該文檔為基于51單片機的自動尋跡小車
    發(fā)表于 07-22 10:46 ?50次下載
    基于<b class='flag-5'>51</b><b class='flag-5'>單片機</b>的自動尋跡小車<b class='flag-5'>控制</b>的設(shè)計

    51單片機(一)—— 51單片機簡介

    一、51單片機標(biāo)識信息 通常我們所說的51單片機是指以51內(nèi)核擴展出的單片機。生產(chǎn)
    發(fā)表于 11-11 18:06 ?245次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>(一)—— <b class='flag-5'>51</b><b class='flag-5'>單片機</b>簡介

    51單片機如何跳出wile循環(huán)_51單片機(九)匯編指令

    設(shè)計數(shù)碼管Chenglin Li:51單片機(四)匯編語言設(shè)計定時器Chenglin Li:51單片機(五)利用定時器實現(xiàn)流水燈的控制Che
    發(fā)表于 11-22 20:21 ?73次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>如何跳出wile循環(huán)_<b class='flag-5'>51</b><b class='flag-5'>單片機</b>(九)匯編指令

    基于51單片機的電機控制設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機的電機控制設(shè)計.rar》資料免費下載
    發(fā)表于 01-03 11:19 ?4次下載

    單片機中for語句的運用

    單片機中的for語句是一種常見的循環(huán)控制結(jié)構(gòu),用于重復(fù)執(zhí)行一段代碼塊,可以簡化程序的編寫和減少代碼量。本文將詳細介紹單片機中for語句的運用
    的頭像 發(fā)表于 01-05 14:02 ?1514次閱讀

    單片機if是什么語句

    單片機中的if語句是一種條件語句,用于根據(jù)不同的條件執(zhí)行不同的代碼塊。在程序執(zhí)行過程中,條件語句用來決定是否執(zhí)行特定的代碼段。在單片機編程中
    的頭像 發(fā)表于 01-05 14:04 ?1256次閱讀

    基于51單片機的鍋爐控制設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機的鍋爐控制設(shè)計.rar》資料免費下載
    發(fā)表于 01-07 09:32 ?1次下載

    基于51單片機的鍋爐控制設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機的鍋爐控制設(shè)計.rar》資料免費下載
    發(fā)表于 01-12 10:22 ?3次下載

    51單片機流水燈制作

    ?流水燈是學(xué)習(xí)51單片機的一個基本項目,是我們對單片機IO口輸出認(rèn)識的基本項目。當(dāng)然學(xué)會了花樣流水燈也很好玩。 下面就分享一種51單片機流水
    的頭像 發(fā)表于 02-26 10:06 ?1156次閱讀
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>流水燈制作