欧美视频综合-欧美视频中文字幕-欧美视频在线观在线看-欧美视频在线观看网站-直接观看黄网站免费视频-正在播放久久

機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發
培訓信息
贊助商
分支程序設計
分支程序設計
 更新時間:2008-7-27 16:15:19  點擊數:2
【字體: 字體顏色
 第一部分課程學習了如何建立Keil C的編程環境,并了解了一些C語言的基礎知識,這一部分將通過一個鍵控流水燈程序的分析來學習分支程序設計。

  1 程序功能與實現

  硬件電路描述如下:89S52單片機的P1口接有8個LED,當某一端口輸出為“0”時,相應的LED點亮,P3.2、P3.3、P3.4、P3.5分別接有四個按鈕K1~K4,按下按鈕時,相應引腳被接地。現要求編寫可鍵控的流水燈程序,當K1按下時,開始流動,K2按下時停止流動,全部燈滅,K3使燈由上往下流動,K4使燈由下往上流動。

  下面首先給出程序,然后再進行分析。

例1:鍵控流水燈的程序

#include "reg51.h"

#include "intrins.h"

#define uchar unsigned char

void mDelay(unsigned int DelayTime)

{ unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{ for(j=0;j<125;j++) 

{;} }}

uchar Key()

{ uchar KeyV;

uchar tmp; 

P3=P3|0x3c; //四個按鍵所接位置

KeyV=P3;

if((KeyV|0xc3)==0xff) //無鍵按下

return(0);

mDelay(10); //延時,去鍵抖

KeyV=P3;

if((KeyV|0xc3)==0xff)

return(0);

else

{ for(;;){ tmp=P3;

if((tmp|0xc3)==0xff)

break;}

return(KeyV);}}

void main()

{ unsigned char OutData=0xfe; 

bit UpDown=0;

bit Start=0;

uchar KValue;

for(;;)

{ KValue=Key();

switch (KValue)

{ case 0xfb: //P3.2=0,Start

{ Start=1; 

break; }

case 0xf7: //P3.3=0,Stop

{ Start=0;

break; }

case 0xef: //P3.4=0 Up

{ UpDown=1;

break; }

case 0xdf: //P3.5=0 Down

{ UpDown=0;

break; }

}

if(Start)

{ if(UpDown)

OutData=_crol_(OutData,1); 

else

OutData=_cror_(OutData,1); P1=OutData;

}

else

P1=0xff; //否則燈全滅

mDelay(1000);

}

}


  輸入源程序,保存為exam21.c,建立名為exam21的工程文件,選擇的CPU型號為AT89S52,在Debug頁加入-ddpj6,以便使用單片機實驗仿真板,其他按默認設置。正確編譯、鏈接后進入調試模式,點擊Peripherals->51實驗仿真板,打開實驗仿真板,選擇Run(全速運行),此時實驗仿真板沒有變化,用鼠標點擊上方的K1按鈕,松開后即可看到Led“流動”起來,初始狀態是由下往上流動,點擊K3按鈕,可改變LED的流動方向,改為由上往下流動,點擊K4按鈕,又可將流動方向變換回來。點擊K2按鈕,可使流動停止,所有LED“熄滅”。

   1.1 程序分析

  本程序中運用到了兩種選擇結構的程序:if和switch,if語句最常用的形式是:

   if(關系表達式)語句1 else 語句2

   1.2 關系運算符和關系表達式

  所謂“關系運算”實際上是兩個值作一個比較,判斷其比較的結果是否符合給定的條件。關系運算的結果只有2種可能,即“真”和“假”。例:3>2的結果為真,而3<2的結果為假。

  C語言一共提供了6種關系運算符:“<”(小于)、“<=”(小于等于)、“>”(大于)、“>=(大于等于)”、“==”(等于)和“。健保ú坏扔冢。

  用關系運算符將兩個表達式連接起來的式子,稱為關系表達式。例:

  a>b,a+b>b+c,(a=3)>=(b=5)等都是合法的關系表達式。關系表達式的值只有兩種可能,即“真”和“假”。在C語言中,沒有專門的邏輯型變量,如果運算的結果是“真”,用數值“1”表示,而運算的結果是“假”則用數值“0”表示。

  如式子:x1=3>2的結果是x1等于1,原因是3>2的結果是“真”,即其結果為1,該結果被“=”號賦給了x1,這里須注意,“=”不是等于之意(C語言中等于用“==”表示),而是賦值號,即將該號后面的值賦給該號前面的變量,所以最終結果是x1等于1。

  式子:x2=3<=2的結果是x2=0,請自行分析。

  2 邏輯運算符和邏輯表達式

  用邏輯運算符將關系表達式或邏輯量連接起來的式子就是邏輯表達式。C語言提供了三種邏輯運算符:“&&”(邏輯與)、“||”(邏輯或)和“!”(邏輯非)。

  C語言編譯系統在給出邏輯運算的結果時,用“1”表示真,而用“0”表示假,但是在判斷一個量是否是“真”時,以0代表“假”,而以非0代表“真”,這一點務必要注意。以下是一些例子:

 。1) 若a=10,則!a的值為0,因為10被作為真處理,取反之后為假,系統給出的假的值為0。

 。2) 如果a=--2,結果與上完全相同,原因也同上,初學時常會誤以為負值為假,所以這里特別提醒注意。

  (3) 若a=10,b=20,則a&&b的值為1,a||b的結果也為1,原因為參于邏輯運算時不論a與b的值究竟是多少,只要是非零,就被當作是“真”,“真”與“真”相與或者相或,結果都為真,系統給出的結果是1。

  3 if語句

  if語句是用來判定所給定的條件是否滿足根據判定的結果(真或假)決定執行給出的兩種操作之一。

  C語言提供了三種形式的if語句

  1. if(表達式) 語句 

  如果表達式的結果為真,則執行語句,否則不執行

2. if(表達式) 語句1 else 語句2

 如果表達式的結果為真,則執行語句1,否則執行語句2

3.if(表達式1) 語句1

else if(表達式2) 語句2

else if(表達式3) 語句3



else if(表達式m) 語句m

else 語句n

這條語句執行如圖14所示。

  圖14
    上述程序中的如下語句:

if((KeyV|0xc3)==0xff) //無鍵按下

return(0);

  是第一種if語句的應用。該語句中“|”符號是C語言中的位運算符,按位相或的意思,相當于匯編語言中“ORL”指令,將讀取的P3口的值KeyV與0xc3(即11000011B)按位或,如果結果為0xff(即11111111B)說明沒有鍵被按下,因為中間4位接有按鍵,如果有鍵按下,那么P3口值的中間4位中必然有一位或更多位是“0”。該語句中的“return(0)”是返回之意,相當于匯編語言中的“ret”指令,通過該語句可以帶返回值,即該號中的數值,返回值就是這個函數的值,在這個函數被調用時,用了如下的形式:KValue=Key();因此,返回的結果是該值被賦給Kvalue這個變量。因此,如果沒有鍵被按下,則直接返回,并且Kvalue的值將變為0。如果有鍵被按下,那么return(0)將不會被執行。

  程序其他地方還有這樣的用法,請注意觀察與分析。

程序中:

if(Start)

{… 燈流動顯示的代碼 }

else

P1=0xff; //否則燈全滅

  是if語句的第二種用法,其中Start是一個位變量,該變量在main函數的中被定義,并賦以初值0,該變量在按鍵K1被按下后置為1,而K2按下后被清為0,用來控制燈流動是否開始。這里就是判斷該變量并決定燈流動是否開始的代碼,觀察if后面括號中的寫法,與其他語言中寫法很不一樣,并沒有一個關系表達式,而僅僅只有一個變量名,C根據這個量是0還是1來決定程序的走向,如果為1則執行燈流動顯示的代碼,如果為0,則執行P1=0xff;語句?梢,在C語言中,數據類型的概念比其他很多的編程語言要“弱化”,或者說C更著重從本質的角度去考慮問題,if后面的括號中不僅可以是關系表達式,也可以是算術表達式,還可以就是一個變量,甚至是一個常量,不管怎樣,C總是根據這個表達式的值是零還是非零來決定程序的走向,這個特點是其他中所沒有的,請注意理解。

  if語句的第三種用法在本程序中沒有出現,下面我們舉一例說明。在上述的鍵盤處理函數Key中,如果沒鍵被按下,返回值是0,如果有鍵被按下,經過去鍵抖的處理,將返回鍵值,程序中的“return(KeyV);”即返回鍵值。當K1被按下(P3.2接地)時,返回值是0xfb(11111011B),而K2被按下(P3.3接地)時,返回值是0xf7(11110111B),K3被按下(P3.4接地)時,返回值是0xef(11101111B),K4被按下(P3.5接地)時,返回值是0xdf(11011111B),該值將被賦給主程序中調用鍵盤程序的變量KValue。程序用了另一種選擇結構switch進行處理,關于switch將在稍后介紹。下面用if語句來改寫:

if(KValue==0xfb)

{Start=1;}

else if(KValue==0xf7)

{Start=0;}

else if(KValue==0xef)

{UpDown=1;}

else if(KValue==0xdf)

{UpDown=0;}

else

{//意外處理}

……

  程序中第一條語句判斷Kvalue是否等于0xfb,如果是就執行Start=1;執行完畢即退出if語句,執行if語句下面的程序,如果Kvalue不等于0xfb就轉去下一個else if即判斷Kvalue是否等于0xf7,如果等于則執行Start=0;,并退出if語句…這樣一直到最后一個else if后面的條件判斷完畢為止,如果所有的條件都不滿足,那么就去執行else后面的語句(通常這意味著出現了異常,在這里來統一處理這種異常情況)。

4 if語句的嵌套

  在if語句中又包含一個或多個語句稱為if語句的嵌套。一般形式如下

if()

if() 語句1

else 語句2

else

if() 語句3

else 語句4

應當注意if與else的配對關系,else總是與它上面的最近的if配對。如果寫成

if()

if()語句1

else

語句2

  編程者的本意是外層的if與else配對,縮進的if語句為內嵌的if語句,但實際上else將與縮進的那個if配對,因為兩者最近,從而造邁岐義。為避免這種情況,建議編程時使用大括號將內嵌的if語句括起來,這樣可以避免出現這樣的問題。

5 swich語句

  當程序中有多個分支時,可以使用if嵌套實現,但是當分支較多時,則嵌套的if語層數多,程序冗長而且可讀性降低。C語言提供了switch語句直接處理多分支選擇。Switch的一般形式如下:

switch(表達式)

{case 常量表達式1:語句1

case 常量表達式2:語句2

……

case 常量表達式n:語句n

default:語句n+1

}

  說明:switch后面括號內的“表達式”,ANSI標準允許它為任何類型;當表達式的值與某一個case后面的常量表達式相等時,就執行此case后面的語句,若所有的case中的常量表達式的值都沒有與表達式值匹配的,就執行default后面的語句;每一個case的常量表達式的值必須不相同;各個case和default的出現次序不影響執行結果。

  另外特別需要說明的是,執行完一個case后面的語句后,并不會自動跳出switch,轉而去執行其后面的語句,如上述例子中如果這么寫

switch (KValue)

{ case 0xfb: Start=1; 

case 0xf7: Start=0;

case 0xef: UpDown=1;

case 0xdf: UpDown=0;

}

if(Start)

{ ……}

  假如KValue的值是0xfb,則在轉到此處執行“Start=1;”后,并不是轉去執行switch語句下面的if語句,而是將從這一行開始,依次執行下面的語句即“Start=0;”、“UpDown=1;”“UpDown=0;”,顯然,這樣不能滿足要求,因此,通常在每一段case的結束加入“break;”語句,使流程序退出switch結構,即終止switch語句的執行。
  • 上一篇: 循環程序設計
  • 下一篇: 分支程序設計
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發消息66821730(技術支持)點擊這里給我發消息66821730(廣告投放) 點擊這里給我發消息41031197(編輯) 點擊這里給我發消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業自行提供,該企業負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(濱江)機電一體化學會
    中國行業電子商務100強網站

    網站經營許可證:浙B2-20080178-1