單片機(jī)編程實(shí)例_led等重要_第1頁
單片機(jī)編程實(shí)例_led等重要_第2頁
單片機(jī)編程實(shí)例_led等重要_第3頁
單片機(jī)編程實(shí)例_led等重要_第4頁
單片機(jī)編程實(shí)例_led等重要_第5頁
已閱讀5頁,還剩133頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、3.1 單片機(jī)系統(tǒng)開發(fā)過程單片機(jī)系統(tǒng)開發(fā)過程簡(jiǎn)單的例子:讓一個(gè)發(fā)光二極管閃爍簡(jiǎn)單的例子:讓一個(gè)發(fā)光二極管閃爍5次。次。1、明確系統(tǒng)功能:讓一個(gè)發(fā)光二極管閃爍、明確系統(tǒng)功能:讓一個(gè)發(fā)光二極管閃爍5次。次。系統(tǒng)啟動(dòng)后,一支發(fā)光二極管閃爍系統(tǒng)啟動(dòng)后,一支發(fā)光二極管閃爍5次后熄滅,次后熄滅,當(dāng)按下一個(gè)按鈕開關(guān)后再閃爍當(dāng)按下一個(gè)按鈕開關(guān)后再閃爍5次后熄滅。次后熄滅。以后每次按下按鈕開關(guān),發(fā)光二極管都會(huì)閃爍以后每次按下按鈕開關(guān),發(fā)光二極管都會(huì)閃爍5次次。第三章第三章 單片機(jī)系統(tǒng)開發(fā)過程單片機(jī)系統(tǒng)開發(fā)過程 51單片機(jī)指令系統(tǒng)簡(jiǎn)介單片機(jī)指令系統(tǒng)簡(jiǎn)介 2、硬件設(shè)計(jì)、硬件設(shè)計(jì)(單片機(jī)單片機(jī)+外圍器件外圍器件)外圍

2、器件:外圍器件:一個(gè)發(fā)一個(gè)發(fā)光二極光二極管、三管、三個(gè)電阻、個(gè)電阻、三個(gè)電三個(gè)電容容一個(gè)按一個(gè)按鈕開關(guān)鈕開關(guān)3、 搭建硬件平臺(tái)搭建硬件平臺(tái)在面包板上插入器件,用導(dǎo)線完成電氣連接。在面包板上插入器件,用導(dǎo)線完成電氣連接。 4、 軟件設(shè)計(jì)軟件設(shè)計(jì) ORG 00H ; 設(shè)置起始地址設(shè)置起始地址START: MOV R0, #5 ; 循環(huán)閃爍循環(huán)閃爍5次,次,R0為計(jì)數(shù)器為計(jì)數(shù)器LOOP: MOV P1,#00H ; P1口輸出全口輸出全0,點(diǎn)亮二極管點(diǎn)亮二極管 CALL DELAY ; 調(diào)用延時(shí)子程序調(diào)用延時(shí)子程序 MOV P1,#0FFH ; P1口輸出全口輸出全1,熄滅二極管,熄滅二極管 CAL

3、L DELAY ; 調(diào)用延時(shí)子程序調(diào)用延時(shí)子程序 DJNZ R0, LOOP ; R0減減1,若不為,若不為0轉(zhuǎn)轉(zhuǎn)LOOP處處 JB P2.0, $ ; 測(cè)測(cè)P2.0為高電平為高電平(無按鍵無按鍵)則執(zhí)行本行則執(zhí)行本行 JMP START ; 否則否則,有鍵按下有鍵按下,跳到跳到START處重新開處重新開 始執(zhí)行始執(zhí)行DELAY: ; 延時(shí)子程序(延時(shí)子程序(500ms) RET ; 返回主程序返回主程序 END ; 匯編程序結(jié)束匯編程序結(jié)束5 、下載程序到單片機(jī)并調(diào)試、下載程序到單片機(jī)并調(diào)試(1) 在在Vision中把目標(biāo)程序編輯好,中把目標(biāo)程序編輯好,(2)編譯、連接無錯(cuò)后生成單片機(jī)可執(zhí)行

4、的代碼文件,編譯、連接無錯(cuò)后生成單片機(jī)可執(zhí)行的代碼文件,(3) 用下載線下載到單片機(jī)系統(tǒng)板中,用下載線下載到單片機(jī)系統(tǒng)板中,(4)運(yùn)行程序運(yùn)行程序(5)根據(jù)運(yùn)行結(jié)果)根據(jù)運(yùn)行結(jié)果檢查功能實(shí)現(xiàn)情況檢查功能實(shí)現(xiàn)情況,若未達(dá)系統(tǒng)要求若未達(dá)系統(tǒng)要求,則則在在Vision中修改程中修改程序,然后重復(fù)步驟序,然后重復(fù)步驟 (2)(5),直至達(dá)到系直至達(dá)到系統(tǒng)要求統(tǒng)要求.在程序反復(fù)檢查無在程序反復(fù)檢查無邏輯錯(cuò)誤時(shí)邏輯錯(cuò)誤時(shí),應(yīng)檢查應(yīng)檢查硬件電路是否有問硬件電路是否有問題題. 3.2 Vision Vision軟件的使用1、新建一個(gè)工程、新建一個(gè)工程(項(xiàng)目項(xiàng)目),并為該項(xiàng)目選定合適的并為該項(xiàng)目選定合適的CPU

5、然然后保存該工程。后保存該工程。具體步驟:具體步驟:選Project New Project保保存工程存工程在彈出窗口中選所需在彈出窗口中選所需CPU(如選(如選ATMEL),雙擊該雙擊該.CPU.選選AT89S51, 并確定。并確定。2、設(shè)置工程,使編譯、連接后能生成可執(zhí)行代碼文件、設(shè)置工程,使編譯、連接后能生成可執(zhí)行代碼文件右擊右擊Options for Target 1選擇Create HEX 在彈出的窗口選在彈出的窗口選3、新建源文件新建源文件選選FileNewFileNew輸入源程序輸入源程序保存保存(匯編程序:文件名(匯編程序:文件名.asm; C.asm; C程序:文件名程序:文

6、件名.c.c( (存在工程文件夾存在工程文件夾) )4、為工程中添加源程序文件、為工程中添加源程序文件在右邊在右邊Project窗口單擊窗口單擊 Source Group 1,在下拉菜單,在下拉菜單中選中選 Add Files to GroupSource Group 1選項(xiàng),選項(xiàng),在彈出的框中選擇你的源文件和文件類型,然后點(diǎn)擊在彈出的框中選擇你的源文件和文件類型,然后點(diǎn)擊ADD,再點(diǎn)擊,再點(diǎn)擊close。 5、編譯工程中的源程序,生成、編譯工程中的源程序,生成 .HEX(可執(zhí)行可執(zhí)行)文件文件 在在Project窗口中窗口中選選 Target 1Build Target F7, (點(diǎn)點(diǎn)擊擊

7、)對(duì)源程序編譯連接。對(duì)源程序編譯連接。(或點(diǎn)擊或點(diǎn)擊 RBuild Target ) 程序有語法錯(cuò)誤時(shí)程序有語法錯(cuò)誤時(shí),會(huì)在輸出窗口會(huì)在輸出窗口(Output Windows)中中顯示錯(cuò)誤信息和警告信息顯示錯(cuò)誤信息和警告信息,修改編譯成功后生成修改編譯成功后生成 HEX文件文件生成生成.HEX文件后文件后,可利可利用專門的下載程序用專門的下載程序,將將此可執(zhí)行程序下載到單此可執(zhí)行程序下載到單片機(jī)內(nèi)的片機(jī)內(nèi)的ROM中運(yùn)行中運(yùn)行 3 3、在窗口中點(diǎn)、在窗口中點(diǎn)擊擊 , , 打開你系統(tǒng)打開你系統(tǒng)的的.hex文件文件 3.3 STC-ISP V3.91 軟件的使用1、雙擊、雙擊 , 打開在線燒錄程序打

8、開在線燒錄程序 2 2、在窗口的、在窗口的“MCU TYPE MCU TYPE ”下拉菜單中選擇下拉菜單中選擇(STC89C51RC)(STC89C51RC)4 4、在、在COMCOM欄選下載端口欄選下載端口( (一般是一般是COM1COM1)5、關(guān)、關(guān)電路板上的電源電路板上的電源6 6、點(diǎn)擊、點(diǎn)擊Download,Download,打開電路板上的電源打開電路板上的電源, ,燒錄程序燒錄程序,若若燒錄出現(xiàn)問燒錄出現(xiàn)問題題, ,點(diǎn)擊點(diǎn)擊stopstop。注意:注意: 5、6 兩步驟的兩步驟的順序不能顛倒!即在點(diǎn)順序不能顛倒!即在點(diǎn)擊擊Download之前要先之前要先關(guān)掉板上的電源關(guān)掉板上的電源。

9、7、打開電路、打開電路板上的電源板上的電源 ,程序即開始運(yùn)程序即開始運(yùn)行。行。 3.4 單片機(jī)應(yīng)用系統(tǒng)單片機(jī)應(yīng)用系統(tǒng)C語言程序設(shè)計(jì)語言程序設(shè)計(jì) 單片機(jī)應(yīng)用系統(tǒng)的程序設(shè)計(jì)有兩種方法:一種單片機(jī)應(yīng)用系統(tǒng)的程序設(shè)計(jì)有兩種方法:一種是基于匯編語言的,另一種是基于是基于匯編語言的,另一種是基于C語言的。語言的。 匯編語言程序的機(jī)器代碼生成效率高,但可匯編語言程序的機(jī)器代碼生成效率高,但可讀性較差,而讀性較差,而C語言程序的可讀性和可移植性遠(yuǎn)超語言程序的可讀性和可移植性遠(yuǎn)超過匯編語言。過匯編語言。 C51是一種專門為是一種專門為51單片機(jī)設(shè)計(jì)的高級(jí)語言單片機(jī)設(shè)計(jì)的高級(jí)語言C編譯器,支持符合編譯器,支持符合

10、ANSI標(biāo)準(zhǔn)的標(biāo)準(zhǔn)的C語言,同時(shí)針語言,同時(shí)針對(duì)對(duì)51單片機(jī)的特點(diǎn)做了一些特殊擴(kuò)展。單片機(jī)的特點(diǎn)做了一些特殊擴(kuò)展。 C語言的主要特點(diǎn):語言的主要特點(diǎn): 語言簡(jiǎn)潔,使用方便靈活。它是程序設(shè)計(jì)語語言簡(jiǎn)潔,使用方便靈活。它是程序設(shè)計(jì)語言中規(guī)模最小的語言之一。言中規(guī)模最小的語言之一。 ANSI標(biāo)準(zhǔn)標(biāo)準(zhǔn)C語言只有語言只有32個(gè)關(guān)鍵字,個(gè)關(guān)鍵字,9種流程種流程控制語句??刂普Z句。程序可移植性好。程序可移植性好。所設(shè)計(jì)的程序不依賴機(jī)器硬件。所設(shè)計(jì)的程序不依賴機(jī)器硬件。表達(dá)方式靈活。表達(dá)方式靈活。 利用利用 C語言的多種運(yùn)算符可組成各種表達(dá)式,語言的多種運(yùn)算符可組成各種表達(dá)式,還可采用多種方法來獲得表達(dá)式的值

11、,使程序設(shè)計(jì)還可采用多種方法來獲得表達(dá)式的值,使程序設(shè)計(jì)具有更大的靈活性。具有更大的靈活性。表達(dá)能力強(qiáng)。表達(dá)能力強(qiáng)。 具有豐富的數(shù)據(jù)結(jié)構(gòu)類型和多種運(yùn)算符。用戶具有豐富的數(shù)據(jù)結(jié)構(gòu)類型和多種運(yùn)算符。用戶可靈活采用多種數(shù)據(jù)類型和使用各種運(yùn)算符,實(shí)現(xiàn)可靈活采用多種數(shù)據(jù)類型和使用各種運(yùn)算符,實(shí)現(xiàn)復(fù)雜運(yùn)算。復(fù)雜運(yùn)算??芍苯硬僮饔?jì)算機(jī)硬件??芍苯硬僮饔?jì)算機(jī)硬件。 C語言具有直接訪問機(jī)器物理地址的能力,語言具有直接訪問機(jī)器物理地址的能力,C51的編譯器都的編譯器都可直接對(duì)單片機(jī)內(nèi)部的可直接對(duì)單片機(jī)內(nèi)部的SFR和和I/O端口進(jìn)端口進(jìn)行操作,可以直接訪問片內(nèi)、片外存儲(chǔ)器,還可以行操作,可以直接訪問片內(nèi)、片外存儲(chǔ)器

12、,還可以進(jìn)行各種為操作進(jìn)行各種為操作。生成的目標(biāo)代碼質(zhì)量較高。生成的目標(biāo)代碼質(zhì)量較高??蛇M(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)??蛇M(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)。 C語言以函數(shù)作為程序設(shè)計(jì)的基本單位,非常適語言以函數(shù)作為程序設(shè)計(jì)的基本單位,非常適合結(jié)構(gòu)化程序設(shè)計(jì)。合結(jié)構(gòu)化程序設(shè)計(jì)。 用用C51語言編寫單片機(jī)應(yīng)用程序,不用具體組語言編寫單片機(jī)應(yīng)用程序,不用具體組織、分配存儲(chǔ)器資源和處理端口數(shù)據(jù),但織、分配存儲(chǔ)器資源和處理端口數(shù)據(jù),但對(duì)數(shù)據(jù)類對(duì)數(shù)據(jù)類型與變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)型與變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。聯(lián),否則編譯器不能正確地映射定位。 與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C語言相比,

13、語言相比,C51包含的數(shù)據(jù)類型、變量包含的數(shù)據(jù)類型、變量存儲(chǔ)模式、輸入輸出處理、函數(shù)等方面有一定差存儲(chǔ)模式、輸入輸出處理、函數(shù)等方面有一定差異,異,需根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源來定義相應(yīng)的數(shù)需根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源來定義相應(yīng)的數(shù)據(jù)類型和變量,據(jù)類型和變量,而其它語法規(guī)則、程序結(jié)構(gòu)及設(shè)計(jì)而其它語法規(guī)則、程序結(jié)構(gòu)及設(shè)計(jì)方法等與標(biāo)準(zhǔn)方法等與標(biāo)準(zhǔn)C語言相同。語言相同。 3.4.1 C51的程序結(jié)構(gòu)的程序結(jié)構(gòu) 一、一、 C51語言概述語言概述 C語言程序語言程序由若干函數(shù)組成,其中有且僅有一由若干函數(shù)組成,其中有且僅有一個(gè)主函數(shù)個(gè)主函數(shù),每個(gè)函數(shù)都是完成某個(gè)特殊任務(wù)的子程,每個(gè)函數(shù)都是完成某個(gè)特

14、殊任務(wù)的子程序段。序段。 組成程序的若干函數(shù)可保存在一個(gè)源程序文件組成程序的若干函數(shù)可保存在一個(gè)源程序文件中,也可保存在幾個(gè)源程序文件中,最后將它們連中,也可保存在幾個(gè)源程序文件中,最后將它們連接在一起。接在一起。 函數(shù)之間可以互相調(diào)用,但主函數(shù)只能調(diào)用函數(shù)之間可以互相調(diào)用,但主函數(shù)只能調(diào)用其它函數(shù)而不能被其它函數(shù)調(diào)用。其它函數(shù)而不能被其它函數(shù)調(diào)用。 主函數(shù)是程序的入口,主函數(shù)中的所有語句執(zhí)行主函數(shù)是程序的入口,主函數(shù)中的所有語句執(zhí)行完畢,則程序結(jié)束。完畢,則程序結(jié)束。二二. 、C51語言程序結(jié)構(gòu)語言程序結(jié)構(gòu) 可實(shí)現(xiàn)一個(gè)可實(shí)現(xiàn)一個(gè)LED閃爍控制功能的閃爍控制功能的C51源程序源程序C51語言程

15、序的基本結(jié)構(gòu):語言程序的基本結(jié)構(gòu): 式中:式中: func1()()funcN()()代代表用戶定義的函數(shù),表用戶定義的函數(shù),程序體指程序體指C51提供的提供的任何庫函數(shù)調(diào)用語句、任何庫函數(shù)調(diào)用語句、控制流程語句或其它控制流程語句或其它函數(shù)調(diào)用語句。函數(shù)調(diào)用語句。3.4.2 C51的數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu) 1. C51的變量的變量 變量的基本屬性是變量的基本屬性是變量名變量名和和變量值變量值。在程序中定義。在程序中定義了變量,了變量,C51編譯器就會(huì)給這個(gè)變量分配相應(yīng)的存儲(chǔ)單編譯器就會(huì)給這個(gè)變量分配相應(yīng)的存儲(chǔ)單元。此后變量名就與存儲(chǔ)單元地址相對(duì)應(yīng)元。此后變量名就與存儲(chǔ)單元地址相對(duì)應(yīng),變量值就與,變

16、量值就與存儲(chǔ)單元的內(nèi)容相對(duì)應(yīng)。存儲(chǔ)單元的內(nèi)容相對(duì)應(yīng)。 定義一個(gè)變量的格式如下:定義一個(gè)變量的格式如下:存儲(chǔ)種類存儲(chǔ)種類數(shù)據(jù)類型數(shù)據(jù)類型存儲(chǔ)類型存儲(chǔ)類型變量名變量名C51的變量概念示意圖的變量概念示意圖 圖中引用變量圖中引用變量a實(shí)現(xiàn)了對(duì)分配內(nèi)存實(shí)現(xiàn)了對(duì)分配內(nèi)存20H單元的數(shù)據(jù)操作單元的數(shù)據(jù)操作 (1)存儲(chǔ)種類)存儲(chǔ)種類 存儲(chǔ)種類存儲(chǔ)種類是指變量在程序執(zhí)行過程中的作用范圍。是指變量在程序執(zhí)行過程中的作用范圍。變量的存儲(chǔ)種類有四種:變量的存儲(chǔ)種類有四種:自動(dòng)(自動(dòng)(auto) 用存儲(chǔ)種類說明符用存儲(chǔ)種類說明符auto定義的變量定義的變量外部(外部(extern) 用外部種類存儲(chǔ)符用外部種類存儲(chǔ)符e

17、xtern定義的變量定義的變量靜態(tài)(靜態(tài)(static) 用存儲(chǔ)種類說明符用存儲(chǔ)種類說明符static定義的變量定義的變量寄存器(寄存器(register)用存儲(chǔ)種類說明符用存儲(chǔ)種類說明符register定義的定義的 變量變量自動(dòng)變量:自動(dòng)變量: 自動(dòng)變量作用范圍在定義它的函數(shù)體或復(fù)合語句內(nèi)自動(dòng)變量作用范圍在定義它的函數(shù)體或復(fù)合語句內(nèi)部部,在定義它的,在定義它的函數(shù)體或復(fù)合語句被執(zhí)行時(shí),函數(shù)體或復(fù)合語句被執(zhí)行時(shí),C51才為該變量分配內(nèi)存空間,當(dāng)函數(shù)調(diào)用結(jié)束或復(fù)合才為該變量分配內(nèi)存空間,當(dāng)函數(shù)調(diào)用結(jié)束或復(fù)合語句執(zhí)行結(jié)束時(shí),自動(dòng)變量占用的內(nèi)存空間被釋放語句執(zhí)行結(jié)束時(shí),自動(dòng)變量占用的內(nèi)存空間被釋放。

18、 定義變量時(shí)若省略存儲(chǔ)種類,則變量默認(rèn)為自定義變量時(shí)若省略存儲(chǔ)種類,則變量默認(rèn)為自動(dòng)變量。通常將函數(shù)體內(nèi)和復(fù)合語句中使用頻繁的動(dòng)變量。通常將函數(shù)體內(nèi)和復(fù)合語句中使用頻繁的變量放在片內(nèi)變量放在片內(nèi)RAM中,且定義為自動(dòng)變量,可有效中,且定義為自動(dòng)變量,可有效利用片內(nèi)利用片內(nèi)RAM資源。資源。外部變量:外部變量: 在一個(gè)函數(shù)內(nèi),在一個(gè)函數(shù)內(nèi),要使用已在本函數(shù)外或別的程序要使用已在本函數(shù)外或別的程序模塊文件中定義過的外部變量時(shí),在本函數(shù)體內(nèi)模塊文件中定義過的外部變量時(shí),在本函數(shù)體內(nèi)要用要用extern說明該變量說明該變量。 通常將多個(gè)函數(shù)或模塊共享的變量定義為外通常將多個(gè)函數(shù)或模塊共享的變量定義為外

19、部變量。部變量。 外部變量是全局變量,在程序執(zhí)行期間一直外部變量是全局變量,在程序執(zhí)行期間一直占有固定的內(nèi)存空間。占有固定的內(nèi)存空間。當(dāng)片內(nèi)當(dāng)片內(nèi)RAM資源緊張時(shí),資源緊張時(shí),不建議將外部變量放在片內(nèi)不建議將外部變量放在片內(nèi)RAM。 外部變量被定義后,即分配了固定的內(nèi)存空間,外部變量被定義后,即分配了固定的內(nèi)存空間,在程序的整個(gè)執(zhí)行時(shí)間內(nèi)都是有效的。在程序的整個(gè)執(zhí)行時(shí)間內(nèi)都是有效的。 靜態(tài)變量:靜態(tài)變量: 靜態(tài)變量又分為靜態(tài)變量又分為內(nèi)部靜態(tài)變量?jī)?nèi)部靜態(tài)變量和和外部靜態(tài)變量外部靜態(tài)變量。 在函數(shù)體內(nèi)定義的靜態(tài)變量為在函數(shù)體內(nèi)定義的靜態(tài)變量為內(nèi)部靜態(tài)變量?jī)?nèi)部靜態(tài)變量,它在該函數(shù)體內(nèi)有效,它在該函

20、數(shù)體內(nèi)有效,但在該函數(shù)體外不可見,但在該函數(shù)體外不可見,這這使變量在定義它的函數(shù)體外被保護(hù)使變量在定義它的函數(shù)體外被保護(hù),實(shí)現(xiàn)了離,實(shí)現(xiàn)了離開函數(shù)時(shí)值不會(huì)被改變。開函數(shù)時(shí)值不會(huì)被改變。 寄存器變量:寄存器變量: 通常將使用頻率最高的那些變量定義為寄存器通常將使用頻率最高的那些變量定義為寄存器變量,但目前已不推薦使用這種方式。變量,但目前已不推薦使用這種方式。 外部靜態(tài)變量外部靜態(tài)變量是在函數(shù)外部定義的靜態(tài)變量。是在函數(shù)外部定義的靜態(tài)變量。它在程序中一直可見,但在定義的范圍之外是不它在程序中一直可見,但在定義的范圍之外是不可見的??梢姷?。 在多文件或多模塊處理中,外部靜態(tài)變量只在在多文件或多模塊

21、處理中,外部靜態(tài)變量只在定義其的文件內(nèi)部或模塊內(nèi)部有效定義其的文件內(nèi)部或模塊內(nèi)部有效。(2)數(shù)據(jù)類型)數(shù)據(jù)類型 數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型 有符號(hào)數(shù)據(jù)類型可以忽略有符號(hào)數(shù)據(jù)類型可以忽略signed標(biāo)識(shí)符,如標(biāo)識(shí)符,如int 等等價(jià)于價(jià)于signed int , char 等價(jià)于等價(jià)于signed char等。等。 為了更有效地利用為了更有效地利用51單片機(jī)的內(nèi)部結(jié)構(gòu),單片機(jī)的內(nèi)部結(jié)構(gòu), C51還還增加了一些特殊的數(shù)據(jù)類型增加了一些特殊的數(shù)據(jù)類型,它們分別對(duì)應(yīng)于,它們分別對(duì)應(yīng)于bit、sfr、sfr16和和sbit四個(gè)關(guān)鍵字。四個(gè)關(guān)鍵字。bit 位型位型 利用利用bit

22、 位型,可定義一個(gè)位變量或位函數(shù),位型,可定義一個(gè)位變量或位函數(shù),但不能定義位指針,也不能定義位數(shù)組。它的值但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是是一個(gè)二進(jìn)制位,不是0 就是就是1。C51增加的特殊數(shù)據(jù)類型增加的特殊數(shù)據(jù)類型sfr特殊功能寄存器型特殊功能寄存器型 51系列單片機(jī)內(nèi)的系列單片機(jī)內(nèi)的21個(gè)特殊功能寄存器個(gè)特殊功能寄存器(SFR),分散在片內(nèi)分散在片內(nèi)RAM區(qū)的高區(qū)的高128字節(jié),地址為字節(jié),地址為80HFFH。為了能直接訪問這些為了能直接訪問這些SFR,需要通過關(guān)鍵字,需要通過關(guān)鍵字“sfr”對(duì)對(duì)其進(jìn)行定義其進(jìn)行定義,語法如下:語法如下: sfr sfr_n

23、ame = 地址常數(shù)地址常數(shù); sfr_name是一個(gè)特殊功能寄存器名,是一個(gè)特殊功能寄存器名,“=”后面必須后面必須是常數(shù),其數(shù)值范圍必須在特殊功能寄存器地址范圍是常數(shù),其數(shù)值范圍必須在特殊功能寄存器地址范圍內(nèi),即位于內(nèi),即位于0 x80-0 xFF之間。之間。例如,例如, sfr P1 = 0 x90; /定義定義P1口地址口地址90H sfr PSW = 0 xD0; /定義定義PSW地址地址D0H 對(duì)于對(duì)于16位位SFR,要使用關(guān)鍵字,要使用關(guān)鍵字“sfr16”,定義的地定義的地址必須是址必須是16位位SFR的低端地址。的低端地址。 sfr16 DPTR = 0 x82;/定義定義DP

24、TR,其,其DPL = 82H DPH=83H 注意:不能用注意:不能用sfr16定義定時(shí)器定義定時(shí)器/計(jì)數(shù)器計(jì)數(shù)器0和和1。 sbit可尋址位可尋址位 在單片機(jī)應(yīng)用中,經(jīng)常要訪問特殊功能寄存器在單片機(jī)應(yīng)用中,經(jīng)常要訪問特殊功能寄存器中的某些位,中的某些位,用關(guān)鍵字用關(guān)鍵字sbit定義可位尋址的特殊功定義可位尋址的特殊功能寄存器的位尋址對(duì)象能寄存器的位尋址對(duì)象。定義方法有如下三種:。定義方法有如下三種:sbit 位變量名位變量名 = 位地址位地址 將位的絕對(duì)地址賦給位變量名,位地址必須位于將位的絕對(duì)地址賦給位變量名,位地址必須位于0 x80H0 xFF之間。之間。 例:例:sbit CY=0

25、xD7; /將位的絕對(duì)地址賦給變量將位的絕對(duì)地址賦給變量sbit 位變量名位變量名 = SFR名稱名稱 位位置位位置 當(dāng)可尋址位位于特殊功能寄存器中時(shí),可采用這種當(dāng)可尋址位位于特殊功能寄存器中時(shí),可采用這種方法。其中方法。其中SFR名稱必須是已定義的名稱必須是已定義的SFR的名字,位位的名字,位位置是一個(gè)置是一個(gè)07之間的常數(shù)。之間的常數(shù)。例:例: sfr PSW = 0 xD0; sbit CY=PSW7; /定義定義CY位為位為PSW.7,位地址為,位地址為 0 xD7sbit 位變量名位變量名 = 字節(jié)地址字節(jié)地址 位位置位位置 這種方法是以一個(gè)字節(jié)地址作為基地址,該地址必這種方法是以一

26、個(gè)字節(jié)地址作為基地址,該地址必須在須在0 x80H0 xFF之間。之間。例如,例如,sbit CY = 0 xD07; /將位的相對(duì)地址賦給變量將位的相對(duì)地址賦給變量 注:注:C51編譯器把編譯器把51單片機(jī)常用特殊功能寄存器和特殊位進(jìn)行單片機(jī)常用特殊功能寄存器和特殊位進(jìn)行了統(tǒng)一定義,并存放在了統(tǒng)一定義,并存放在 “reg51.h”或或“reg52.h” 頭文件中,只須在頭文件中,只須在使用前用預(yù)處理命令使用前用預(yù)處理命令#include 把這頭文件包含到程序中,把這頭文件包含到程序中,就可使用殊功能寄存器名和特殊位名稱。就可使用殊功能寄存器名和特殊位名稱。(3)存儲(chǔ)類型)存儲(chǔ)類型 51系列單

27、片機(jī)有三個(gè)邏輯存儲(chǔ)空間:片內(nèi)低系列單片機(jī)有三個(gè)邏輯存儲(chǔ)空間:片內(nèi)低128B RAM,片外,片外64KB RAM和片內(nèi)外統(tǒng)一編址的和片內(nèi)外統(tǒng)一編址的64KB ROM。51系列單片機(jī)邏輯存儲(chǔ)空間示意圖 C51的存儲(chǔ)類型與存儲(chǔ)空間對(duì)應(yīng)關(guān)系表的存儲(chǔ)類型與存儲(chǔ)空間對(duì)應(yīng)關(guān)系表 注:注:一個(gè)變量除了與存儲(chǔ)單元相對(duì)應(yīng)外,還與它所在一個(gè)變量除了與存儲(chǔ)單元相對(duì)應(yīng)外,還與它所在的存儲(chǔ)空間有關(guān),即還需要指出其存儲(chǔ)類型。的存儲(chǔ)空間有關(guān),即還需要指出其存儲(chǔ)類型。 如果在如果在定義變量時(shí)省略了存儲(chǔ)類型標(biāo)識(shí)符,定義變量時(shí)省略了存儲(chǔ)類型標(biāo)識(shí)符,C51編譯器會(huì)根據(jù)當(dāng)前編譯模式自動(dòng)認(rèn)定默認(rèn)的存儲(chǔ)類編譯器會(huì)根據(jù)當(dāng)前編譯模式自動(dòng)認(rèn)定默

28、認(rèn)的存儲(chǔ)類型。型。編譯模式共分為:小編譯模式(編譯模式共分為:小編譯模式(SMALL)、緊)、緊湊編譯模式(湊編譯模式(COMPACT)和大編譯模式()和大編譯模式(LARGE)三種模式三種模式 編譯模式與存儲(chǔ)類型編譯模式與存儲(chǔ)類型(4)變量名)變量名 C51對(duì)變量名的規(guī)定與標(biāo)準(zhǔn)對(duì)變量名的規(guī)定與標(biāo)準(zhǔn)C類似,由字母、類似,由字母、數(shù)字和下劃線三種字符組成,且第一個(gè)字符必須數(shù)字和下劃線三種字符組成,且第一個(gè)字符必須為字母或下劃線,變量名長(zhǎng)度無統(tǒng)一規(guī)定,隨編為字母或下劃線,變量名長(zhǎng)度無統(tǒng)一規(guī)定,隨編譯系統(tǒng)而定。譯系統(tǒng)而定。 注意注意:大寫和小寫字母是兩個(gè)不同的標(biāo)識(shí)符,習(xí):大寫和小寫字母是兩個(gè)不同的標(biāo)

29、識(shí)符,習(xí)慣上變量用小寫表示。變量名除了不可使用標(biāo)準(zhǔn)慣上變量用小寫表示。變量名除了不可使用標(biāo)準(zhǔn)C語言的語言的32個(gè)關(guān)鍵字外,還要不可使用個(gè)關(guān)鍵字外,還要不可使用C51擴(kuò)展擴(kuò)展的新關(guān)鍵字。的新關(guān)鍵字。 C51擴(kuò)展的擴(kuò)展的21個(gè)關(guān)鍵字一覽表個(gè)關(guān)鍵字一覽表 C51擴(kuò)展的擴(kuò)展的21個(gè)關(guān)鍵字一覽表(續(xù))個(gè)關(guān)鍵字一覽表(續(xù)) 注:注: 所有變量在使用前必須說明,即必須所有變量在使用前必須說明,即必須“先定先定義,后使用義,后使用”,凡未被定義的,不作為變量名。,凡未被定義的,不作為變量名。unsigned char data system_status=0; /定義定義system_status為無符號(hào)字符

30、型自動(dòng)變量,該變量位為無符號(hào)字符型自動(dòng)變量,該變量位于于data區(qū)中且初值為區(qū)中且初值為0。 unsigned char bdata status_byte; /定義定義status_byte為為無符號(hào)字符型自動(dòng)變量,該變量位于無符號(hào)字符型自動(dòng)變量,該變量位于bdata區(qū)中。區(qū)中。unsigned int code unit_id2=0 x1234, 0 x89ab; /定義定義unit_id2為無符號(hào)整型自動(dòng)變量,該變量位于為無符號(hào)整型自動(dòng)變量,該變量位于code區(qū)區(qū)中,為長(zhǎng)度為中,為長(zhǎng)度為2的數(shù)組,初值為的數(shù)組,初值為0 x1234和和0 x89ab。static char m, n; /

31、定義定義m和和n為為2個(gè)位于個(gè)位于data區(qū)中的區(qū)中的有符號(hào)字符型靜態(tài)變量。有符號(hào)字符型靜態(tài)變量。extern float xdata var4; /在片外在片外RAM 空間定義空間定義外部實(shí)型變量外部實(shí)型變量var4。 C51的指針與標(biāo)準(zhǔn)的指針與標(biāo)準(zhǔn)C的指針幾乎是一樣的,都的指針幾乎是一樣的,都可以簡(jiǎn)單理解為可以簡(jiǎn)單理解為“存儲(chǔ)某個(gè)地址的變量存儲(chǔ)某個(gè)地址的變量”。 2. C51的指針的指針 例如要存取變量例如要存取變量a中的值時(shí),可以先將變量中的值時(shí),可以先將變量a的的地址放在另一個(gè)變量地址放在另一個(gè)變量b中,訪問時(shí)先找到變量中,訪問時(shí)先找到變量b,從,從中取出變量中取出變量a的地址,然后根

32、據(jù)這個(gè)地址從內(nèi)存單的地址,然后根據(jù)這個(gè)地址從內(nèi)存單元中取出變量元中取出變量a的值。在這里,變量的值。在這里,變量b稱為指針變量。稱為指針變量。上述說法相當(dāng)于上述說法相當(dāng)于 int a=AA; int *b=&a在在C51里定義指針,還需要額外指明兩個(gè)問題:里定義指針,還需要額外指明兩個(gè)問題: 1)指針變量自身位于哪個(gè)存儲(chǔ)區(qū)域;)指針變量自身位于哪個(gè)存儲(chǔ)區(qū)域; 2)該指針的值代表的是哪個(gè)存儲(chǔ)區(qū)域里的地址。)該指針的值代表的是哪個(gè)存儲(chǔ)區(qū)域里的地址。在在SMALL編譯模式下的例子編譯模式下的例子例例1 char xdata a = A; char * ptr = &a; ptr是一個(gè)是一個(gè)char型

33、的指針變量型的指針變量,它本身位于默它本身位于默認(rèn)的認(rèn)的data存儲(chǔ)區(qū)存儲(chǔ)區(qū)(因?yàn)樗÷粤耍ㄒ驗(yàn)樗÷粤舜鎯?chǔ)類型)存儲(chǔ)類型),它它的值是的值是xdata存儲(chǔ)區(qū)里變量存儲(chǔ)區(qū)里變量a的地址的地址。 例例2 char xdata a = A; char * ptr = &a; char idata b = B; * ptr = &b; 變量變量b位于位于idata存儲(chǔ)區(qū)中,執(zhí)行完存儲(chǔ)區(qū)中,執(zhí)行完*ptr=&b之后,之后,ptr里的值就是里的值就是idata空間里的空間里的b變量的地址。變量的地址。 例例3 char idata a = A; 變量變量a是是idata區(qū)域里的變量;區(qū)域里的變量; ch

34、ar idata * ptr = &a; 定義指針時(shí)就限定它只能指向某一個(gè)區(qū)域,例如定義指針時(shí)就限定它只能指向某一個(gè)區(qū)域,例如idata 例例4 若若例例3中的中的ptr指針自身位于指針自身位于xdata存儲(chǔ)區(qū),由于存儲(chǔ)區(qū),由于指針變量本質(zhì)上也是變量,所以,可在例指針變量本質(zhì)上也是變量,所以,可在例3的的“char idata * ptr”里,為里,為ptr加上指明所在區(qū)域的加上指明所在區(qū)域的xdata即可即可 char idata a = A; char idata * xdata ptr = &a; xdata指明了指明了ptr本身是在本身是在xdata存儲(chǔ)區(qū)里的存儲(chǔ)區(qū)里的,而它是一個(gè)而它

35、是一個(gè)(char idata *)類型的變量類型的變量,即指向即指向idata區(qū)域的一個(gè)區(qū)域的一個(gè)char類型的指針。類型的指針。 3. 4. 3 C51的運(yùn)算符的運(yùn)算符說明說明 : (1)關(guān)于關(guān)于/ (除除)運(yùn)算的結(jié)果運(yùn)算的結(jié)果, 若若: 兩個(gè)整數(shù)相除兩個(gè)整數(shù)相除 ,運(yùn)算結(jié)果的值為整數(shù)運(yùn)算結(jié)果的值為整數(shù)(如如 5 / 3,結(jié)果為結(jié)果為1) 兩數(shù)中有一個(gè)為負(fù)值時(shí)兩數(shù)中有一個(gè)為負(fù)值時(shí),結(jié)果向零取整結(jié)果向零取整。(如如-5/3為為 -1 兩數(shù)中有一個(gè)為實(shí)數(shù)時(shí)兩數(shù)中有一個(gè)為實(shí)數(shù)時(shí),結(jié),結(jié)果為果為 double 型型1 C51的基本算術(shù)運(yùn)算符的基本算術(shù)運(yùn)算符基本算術(shù)運(yùn)算符有基本算術(shù)運(yùn)算符有5種:,種:

36、,* (乘乘),/ (除除), (模運(yùn)算符,又稱求余模運(yùn)算符,又稱求余)。-7 % 4 ,7 % -4 ,-7 % -4的值為多少?(2)參加參加/(模模)運(yùn)算的兩數(shù)為運(yùn)算的兩數(shù)為整型數(shù)據(jù)整型數(shù)據(jù)結(jié)果結(jié)果, 結(jié)果為結(jié)果為整型數(shù)整型數(shù)如 7 % 4 的值為 3(-3,3,-3) 關(guān)系運(yùn)算符有關(guān)系運(yùn)算符有6種:種:(小于小于)、(大于大于)、(小于或等于小于或等于)、(大于或等于大于或等于)(相等相等),!(不等于不等于)。2 C51的關(guān)系運(yùn)算符的關(guān)系運(yùn)算符前前4種運(yùn)算符的優(yōu)先級(jí)別高種運(yùn)算符的優(yōu)先級(jí)別高(彼此間優(yōu)先級(jí)相同彼此間優(yōu)先級(jí)相同),后兩種運(yùn)算符的優(yōu)先級(jí)較低后兩種運(yùn)算符的優(yōu)先級(jí)較低(彼此間優(yōu)

37、先級(jí)相同彼此間優(yōu)先級(jí)相同)。關(guān)系運(yùn)算的結(jié)果只有兩種:關(guān)系運(yùn)算的結(jié)果只有兩種:“真真”(1)和和“假假”(0)。例:設(shè)例:設(shè)a5,b4,c3,則則ab的值為的值為“真真”,表達(dá)式的值為,表達(dá)式的值為1若有賦值語句若有賦值語句 d(ab)c按優(yōu)先級(jí),先算按優(yōu)先級(jí),先算ab,表達(dá)式的值為,表達(dá)式的值為1;再算;再算1c,表達(dá)式的值為表達(dá)式的值為0,所以,所以d0。邏輯運(yùn)算符有邏輯運(yùn)算符有3種:種:&(邏輯與邏輯與),(邏輯或邏輯或),!,!(邏邏輯非輯非)。邏輯運(yùn)算結(jié)果只有兩個(gè):邏輯運(yùn)算結(jié)果只有兩個(gè):“真真”(1)和和“假假”(0)。3 C51的邏輯運(yùn)算符的邏輯運(yùn)算符C51的算術(shù)、關(guān)系、的算術(shù)、關(guān)系

38、、邏輯運(yùn)算符的優(yōu)先級(jí)邏輯運(yùn)算符的優(yōu)先級(jí)別見右圖。別見右圖。西安電子科技大學(xué)出版社西安電子科技大學(xué)出版社西安電子科技大學(xué)出版社( ) 括號(hào)! (非運(yùn)算)關(guān)系運(yùn)算賦值運(yùn)算()高優(yōu)先級(jí)算術(shù)運(yùn)算符(先乘除后加減)&(與)和| |(或)低優(yōu)先級(jí)位操作運(yùn)算符有位操作運(yùn)算符有6種:種:&(按位與按位與), (按位或按位或),(按位異或按位異或), (位取反位取反),(位右移,當(dāng)位右移,當(dāng)操作數(shù)為無符號(hào)數(shù)時(shí)操作數(shù)為無符號(hào)數(shù)時(shí),高位補(bǔ)零高位補(bǔ)零,為有符號(hào)為有符號(hào)數(shù)數(shù),則則高位保持原狀態(tài)高位保持原狀態(tài))。【例例3-4】 設(shè)設(shè)X1001 1110B,Y1010 0101B,則,則XY的運(yùn)算過程為:的運(yùn)算過程為:XY

39、的值為的值為0011 1011B。4 C51位操作運(yùn)算符位操作運(yùn)算符自增減運(yùn)算符有自增減運(yùn)算符有4種:種:+i(先將先將i加加1,再使用,再使用i),-i (先先將將i減減1,再使用,再使用i),i+(使用使用i后,再將后,再將i加加1),i-(使用使用i后,后,再將再將i減減1)。【例例3-6】 設(shè)設(shè)i值為值為8,則,則j+i,使用前,使用前i為為8,加,加1后為后為9,則,則i、j值都是值都是9;ji+,使用前,使用前i為為8,先將,先將8賦給賦給j,使用后使,使用后使i加加1,所以所以i9,j8。5C51自增、減運(yùn)算符自增、減運(yùn)算符復(fù)合賦值運(yùn)算符有復(fù)合賦值運(yùn)算符有10種:,種:,* ,/

40、,。6C51賦值運(yùn)算符賦值運(yùn)算符7C51復(fù)合賦值運(yùn)算符復(fù)合賦值運(yùn)算符用賦值運(yùn)算符將變量與表達(dá)式連接起來,就用賦值運(yùn)算符將變量與表達(dá)式連接起來,就構(gòu)成了賦值表達(dá)式,在賦值表達(dá)式構(gòu)成了賦值表達(dá)式,在賦值表達(dá)式 之后加上分號(hào)之后加上分號(hào)“;”便構(gòu)成了賦值語句。便構(gòu)成了賦值語句。X=Y=8;復(fù)合賦值運(yùn)算復(fù)合賦值運(yùn)算首先對(duì)變量進(jìn)行某種運(yùn)算,然后首先對(duì)變量進(jìn)行某種運(yùn)算,然后將運(yùn)算結(jié)果再賦給變量將運(yùn)算結(jié)果再賦給變量。采用復(fù)合賦值運(yùn)算符,可。采用復(fù)合賦值運(yùn)算符,可使程序簡(jiǎn)化和提高程序編譯效率。使程序簡(jiǎn)化和提高程序編譯效率。例如,例如, x*y+8 等價(jià)于等價(jià)于x x *( y+8 )8C51的條件運(yùn)算符的條件

41、運(yùn)算符條件運(yùn)算符條件運(yùn)算符 ? :它是它是C語言中唯一一個(gè)三目運(yùn)算符語言中唯一一個(gè)三目運(yùn)算符邏輯表達(dá)式邏輯表達(dá)式 ?表達(dá)式?表達(dá)式1 :表達(dá)式:表達(dá)式2邏輯表達(dá)式結(jié)果為真時(shí),表達(dá)式的值等于表達(dá)式邏輯表達(dá)式結(jié)果為真時(shí),表達(dá)式的值等于表達(dá)式1的值的值 ,否則,等于表達(dá)式,否則,等于表達(dá)式2的值的值 。此外,還有逗號(hào)運(yùn)算符、指針和地址運(yùn)算符、強(qiáng)制類此外,還有逗號(hào)運(yùn)算符、指針和地址運(yùn)算符、強(qiáng)制類型轉(zhuǎn)換運(yùn)算符、取數(shù)據(jù)類型運(yùn)算符。型轉(zhuǎn)換運(yùn)算符、取數(shù)據(jù)類型運(yùn)算符。 一個(gè)表達(dá)式后加上一個(gè)表達(dá)式后加上“;”就構(gòu)成了表達(dá)式語句,如算術(shù)表達(dá)就構(gòu)成了表達(dá)式語句,如算術(shù)表達(dá)式、關(guān)系表達(dá)式等。最典型的是用賦值表達(dá)式組成的

42、賦值語式、關(guān)系表達(dá)式等。最典型的是用賦值表達(dá)式組成的賦值語句。句。例如:例如: i = 1; i+;1、表達(dá)式語句、表達(dá)式語句C 語言所有的操作都是通過表達(dá)式來實(shí)現(xiàn)的。語言所有的操作都是通過表達(dá)式來實(shí)現(xiàn)的。表達(dá)式語句:表達(dá)式語句: 表達(dá)式表達(dá)式 ; 2、函數(shù)調(diào)用語句、函數(shù)調(diào)用語句函數(shù)調(diào)用語句由函數(shù)名、括號(hào)、實(shí)際參數(shù)加上分號(hào)函數(shù)調(diào)用語句由函數(shù)名、括號(hào)、實(shí)際參數(shù)加上分號(hào)“;”組組成成。其一般形式為:。其一般形式為: 函數(shù)名函數(shù)名( 實(shí)際參數(shù)表實(shí)際參數(shù)表 ); 例:例: printf (Hello , worldn);“函數(shù)調(diào)用語句函數(shù)調(diào)用語句”也可以看成是表達(dá)式語句,也可以看成是表達(dá)式語句,C語言

43、稱為語言稱為“表表達(dá)式語言達(dá)式語言”。 3.4.4 C語句概述3、控制語句、控制語句 控制語句用于控制程序流程,以實(shí)現(xiàn)程序的各種控制語句用于控制程序流程,以實(shí)現(xiàn)程序的各種基本結(jié)構(gòu)。共有基本結(jié)構(gòu)。共有9種控制語句,分成三類:種控制語句,分成三類:選擇語句選擇語句 、循環(huán)語句循環(huán)語句 和和轉(zhuǎn)移語句轉(zhuǎn)移語句 。C 使用控制語句控制程序的執(zhí)行,常用的控制語句有:使用控制語句控制程序的執(zhí)行,常用的控制語句有:if else switch 選擇控制選擇控制for while do while 循環(huán)控制循環(huán)控制continue break return goto 轉(zhuǎn)移控制轉(zhuǎn)移控制條件語句有三種格式:條件語句

44、有三種格式:格式格式1: If (條件表達(dá)式)(條件表達(dá)式) 語句語句1格式格式2: If (條件表達(dá)式)(條件表達(dá)式) 語句語句1 else 語句語句2格式格式3: If (條件表達(dá)式(條件表達(dá)式1) 語句語句1 else if (條件表達(dá)式(條件表達(dá)式2)語句)語句2 else if (條件表達(dá)式(條件表達(dá)式3)語句)語句3 . else if (條件表達(dá)式(條件表達(dá)式m)語句)語句m else 語句語句 n注意注意: 1) 當(dāng)條件后面的語句多于一句時(shí),要用一對(duì)當(dāng)條件后面的語句多于一句時(shí),要用一對(duì) “ ”把這些語句括起來。把這些語句括起來。 2)用格式用格式3實(shí)現(xiàn)多重實(shí)現(xiàn)多重if else

45、 嵌套時(shí)嵌套時(shí), 注意注意if-else的配對(duì),的配對(duì),else總是和其前面最近的總是和其前面最近的if相配。此相配。此外,嵌套層數(shù)會(huì)增加程序閱讀難度。外,嵌套層數(shù)會(huì)增加程序閱讀難度。開關(guān)語句開關(guān)語句Switch(表達(dá)式)(表達(dá)式) case 常量表達(dá)式常量表達(dá)式1:語句:語句1 break; case 常量表達(dá)式常量表達(dá)式2:語句:語句2 break; . case 常量表達(dá)式常量表達(dá)式n:語句:語句n break; Default: 語句語句d循環(huán)語句循環(huán)語句while (表達(dá)式表達(dá)式)其含義是:當(dāng)條件成立時(shí)反復(fù)執(zhí)行循環(huán)體中的其含義是:當(dāng)條件成立時(shí)反復(fù)執(zhí)行循環(huán)體中的語句,直到條件不成立時(shí)為

46、止。語句,直到條件不成立時(shí)為止。do while (條件條件)for(; ; )break語句語句作用:跳出當(dāng)前的作用:跳出當(dāng)前的switch語句或循環(huán)語句語句或循環(huán)語句流程控制語句流程控制語句continue語句語句作用:結(jié)束當(dāng)前這一輪循環(huán),即跳過循環(huán)語句中尚未作用:結(jié)束當(dāng)前這一輪循環(huán),即跳過循環(huán)語句中尚未執(zhí)行的語句,開始下一輪循環(huán)執(zhí)行的語句,開始下一輪循環(huán),而不是結(jié)束整個(gè)循環(huán)。而不是結(jié)束整個(gè)循環(huán)。注:注:continue只用在只用在for、while、do-while等循環(huán)等循環(huán)語句中,一般與語句中,一般與if語句一起使用,可以加速循環(huán)。語句一起使用,可以加速循環(huán)。返回語句返回語句retu

47、rn return (表達(dá)式表達(dá)式) return 表達(dá)式表達(dá)式 作用:作用:使程序控制從被調(diào)用函數(shù)返回到調(diào)用使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)。 跳轉(zhuǎn)語句跳轉(zhuǎn)語句goto 語句標(biāo)號(hào)語句標(biāo)號(hào) 作用:作用: 無條件轉(zhuǎn)移到指定標(biāo)號(hào)處無條件轉(zhuǎn)移到指定標(biāo)號(hào)處注:最好不使用注:最好不使用goto語句語句4、復(fù)合語句、復(fù)合語句例:例:while ( i 1) sum = sum + i; i = i + 1;說明:說明: 復(fù)合語句的復(fù)合語句的 之后不能有之后不能有 “;” 允許一行寫幾個(gè)語句,或者一條語句寫幾允許一行寫幾個(gè)語句,或者一條語句寫幾

48、行行 復(fù)合語句中還復(fù)合語句中還可以包含復(fù)合語句可以包含復(fù)合語句由括在由括在 內(nèi)的若干內(nèi)的若干C語句組成語句組成5、空語句、空語句 只有一個(gè)分號(hào)的語句,不產(chǎn)生任何操作只有一個(gè)分號(hào)的語句,不產(chǎn)生任何操作例:例:for ( i=1; i 100 ; i +) ;空語句什么也不做,可用來做被轉(zhuǎn)向點(diǎn),或循環(huán)語空語句什么也不做,可用來做被轉(zhuǎn)向點(diǎn),或循環(huán)語句中的循環(huán)體(循環(huán)體是空語句,表示循環(huán)體什么句中的循環(huán)體(循環(huán)體是空語句,表示循環(huán)體什么也不做)。也不做)。 當(dāng)程序中出現(xiàn)連續(xù)的兩個(gè)分號(hào)當(dāng)程序中出現(xiàn)連續(xù)的兩個(gè)分號(hào)“;”時(shí),一般時(shí),一般可把后面的分號(hào)看作空語句。可把后面的分號(hào)看作空語句。 rept: ; .

49、 goto rept; #include char _getkey() char c; while (!RI) ; /*用空語句等待串口接收結(jié)束用空語句等待串口接收結(jié)束 C=SBUF; RI=0; return(c); 一個(gè)讀取串口數(shù)據(jù)的函數(shù)一個(gè)讀取串口數(shù)據(jù)的函數(shù)不要濫用空語句,以免引起程序誤操作或語法錯(cuò)誤不要濫用空語句,以免引起程序誤操作或語法錯(cuò)誤 賦值語句是由賦值表達(dá)式加上一個(gè)分號(hào)構(gòu)成的,是用賦值語句是由賦值表達(dá)式加上一個(gè)分號(hào)構(gòu)成的,是用于實(shí)現(xiàn)計(jì)算和賦值的一類最基本的語句。于實(shí)現(xiàn)計(jì)算和賦值的一類最基本的語句。其一般形式如下:其一般形式如下:可賦值對(duì)象可賦值對(duì)象v = 表達(dá)式表達(dá)式e; 注意

50、:注意:(1)如果賦值運(yùn)算符兩邊的類型不一致,則系統(tǒng)在算出表)如果賦值運(yùn)算符兩邊的類型不一致,則系統(tǒng)在算出表達(dá)式的值之后,先將該值轉(zhuǎn)換為左邊變量的類型,然后再達(dá)式的值之后,先將該值轉(zhuǎn)換為左邊變量的類型,然后再賦值給左邊的變量。賦值給左邊的變量。 (2)賦值運(yùn)算符)賦值運(yùn)算符“=”右邊的表達(dá)式可以又是一個(gè)賦值表右邊的表達(dá)式可以又是一個(gè)賦值表達(dá)式,形式為:達(dá)式,形式為: 變量變量=變量變量=表達(dá)式表達(dá)式; (3)在變量說明中,不允許連續(xù)給多個(gè)變量賦初值。)在變量說明中,不允許連續(xù)給多個(gè)變量賦初值。 6、賦值語句、賦值語句一、一、 函數(shù)的分類與定義函數(shù)的分類與定義1函數(shù)的分類函數(shù)的分類(1) 從語言

51、結(jié)構(gòu)劃分,函數(shù)分為主函數(shù)從語言結(jié)構(gòu)劃分,函數(shù)分為主函數(shù)main()和普和普通函數(shù)兩類。通函數(shù)兩類。(2) 從使用角度劃分,函數(shù)分為標(biāo)準(zhǔn)庫函數(shù)和用戶從使用角度劃分,函數(shù)分為標(biāo)準(zhǔn)庫函數(shù)和用戶自定義函數(shù)兩類。自定義函數(shù)兩類。 庫函數(shù)是庫函數(shù)是C編譯系統(tǒng)提供的一系列標(biāo)準(zhǔn)函數(shù),它們編譯系統(tǒng)提供的一系列標(biāo)準(zhǔn)函數(shù),它們放在一些頭文件中,用戶可直接調(diào)用,使用它們必須先放在一些頭文件中,用戶可直接調(diào)用,使用它們必須先用用# include語句將相應(yīng)頭文件包含在程序中。語句將相應(yīng)頭文件包含在程序中。 用戶自定義函數(shù)是用戶按任務(wù)需要編寫的函數(shù)。用戶自定義函數(shù)是用戶按任務(wù)需要編寫的函數(shù)。3.4.5 C51函數(shù)及功能函

52、數(shù)及功能(3) 從參數(shù)形式上劃分,函數(shù)分為無參數(shù)函數(shù)、有參從參數(shù)形式上劃分,函數(shù)分為無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)三類。數(shù)函數(shù)和空函數(shù)三類。 無參數(shù)函數(shù)調(diào)用時(shí)無須輸入?yún)?shù),也無結(jié)果返回。無參數(shù)函數(shù)調(diào)用時(shí)無須輸入?yún)?shù),也無結(jié)果返回。 有參數(shù)函數(shù)調(diào)用時(shí)要給被調(diào)用函數(shù)提供實(shí)質(zhì)參數(shù),有參數(shù)函數(shù)調(diào)用時(shí)要給被調(diào)用函數(shù)提供實(shí)質(zhì)參數(shù),被調(diào)用函數(shù)運(yùn)行后產(chǎn)生的結(jié)果也要返回給調(diào)用函數(shù)使用。被調(diào)用函數(shù)運(yùn)行后產(chǎn)生的結(jié)果也要返回給調(diào)用函數(shù)使用。 空函數(shù)是內(nèi)無語句的空白函數(shù),調(diào)用時(shí)不產(chǎn)生任空函數(shù)是內(nèi)無語句的空白函數(shù),調(diào)用時(shí)不產(chǎn)生任何操作,這種函數(shù)用于功能備用,以便擴(kuò)充。何操作,這種函數(shù)用于功能備用,以便擴(kuò)充。2函數(shù)的定義函

53、數(shù)的定義(1) 無參數(shù)函數(shù)的定義形式:無參數(shù)函數(shù)的定義形式: 返回值類型標(biāo)識(shí)符返回值類型標(biāo)識(shí)符 函數(shù)名函數(shù)名() 函數(shù)體語句函數(shù)體語句無參數(shù)函數(shù)通常不帶返回值,因此標(biāo)識(shí)符可省略或無參數(shù)函數(shù)通常不帶返回值,因此標(biāo)識(shí)符可省略或用用void。(2) 有參數(shù)函數(shù)的定義形式:有參數(shù)函數(shù)的定義形式:返回值類型標(biāo)識(shí)符返回值類型標(biāo)識(shí)符 函數(shù)名函數(shù)名(形式參數(shù)表形式參數(shù)表)形式參數(shù)說明形式參數(shù)說明函數(shù)體語句函數(shù)體語句return(返回參數(shù)名返回參數(shù)名)(3) 空函數(shù)的定義形式:空函數(shù)的定義形式:返回值類型說明符返回值類型說明符 函數(shù)名函數(shù)名() 用用return(返回)語句(返回)語句使程序控制從被調(diào)用使程序控

54、制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)調(diào)用函數(shù)。 3. 函數(shù)的返回值函數(shù)的返回值 void型函數(shù)型函數(shù)(不需要返回值不需要返回值),無,無return語句。語句。 對(duì)于對(duì)于int類型的函數(shù),不寫類型的函數(shù),不寫return語句時(shí),相語句時(shí),相當(dāng)于執(zhí)行了當(dāng)于執(zhí)行了rerun 0;語句。語句。 return 語句中表達(dá)式的值一般應(yīng)與函數(shù)類型一語句中表達(dá)式的值一般應(yīng)與函數(shù)類型一致。致。二、二、 函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)一般調(diào)用形式定義為:函數(shù)一般調(diào)用形式定義為:函數(shù)名函數(shù)名(實(shí)際參數(shù)表列實(shí)際參數(shù)表列)無參數(shù)函數(shù)不存在無參數(shù)函數(shù)不存在“實(shí)際參數(shù)表

55、列實(shí)際參數(shù)表列”。有參數(shù)函數(shù)。有參數(shù)函數(shù)的的“實(shí)際參數(shù)表列實(shí)際參數(shù)表列”的各參數(shù)之間用逗號(hào)隔開,主調(diào)函的各參數(shù)之間用逗號(hào)隔開,主調(diào)函數(shù)與被調(diào)函數(shù)的形式參數(shù)數(shù)目應(yīng)該相等,實(shí)際參數(shù)按順數(shù)與被調(diào)函數(shù)的形式參數(shù)數(shù)目應(yīng)該相等,實(shí)際參數(shù)按順序依次對(duì)應(yīng)傳遞給形式參數(shù)序依次對(duì)應(yīng)傳遞給形式參數(shù)。函數(shù)調(diào)用有三種方式:函數(shù)調(diào)用有三種方式:(1) 使用函數(shù)調(diào)用語句,被調(diào)函數(shù)名作為主調(diào)函數(shù)使用函數(shù)調(diào)用語句,被調(diào)函數(shù)名作為主調(diào)函數(shù)中的一個(gè)語句。如:中的一個(gè)語句。如:print_message(); /*message()是被調(diào)用函數(shù)是被調(diào)用函數(shù) */(2) 被調(diào)函數(shù)作為表達(dá)式的運(yùn)算對(duì)象。如:被調(diào)函數(shù)作為表達(dá)式的運(yùn)算對(duì)象。

56、如:result5*good(x,y)(3) 被調(diào)函數(shù)作為另一個(gè)函數(shù)的實(shí)際參數(shù)。如被調(diào)函數(shù)作為另一個(gè)函數(shù)的實(shí)際參數(shù)。如:mmin(x,alpha(a,b)三、函數(shù)調(diào)用條件三、函數(shù)調(diào)用條件主調(diào)函數(shù)調(diào)用被調(diào)函數(shù),必須滿足如下條件:主調(diào)函數(shù)調(diào)用被調(diào)函數(shù),必須滿足如下條件:(1) 被調(diào)函數(shù)必須已經(jīng)存在,是庫函數(shù)或用戶自定被調(diào)函數(shù)必須已經(jīng)存在,是庫函數(shù)或用戶自定義函數(shù)。義函數(shù)。(2) 程序中如程序中如要使用庫函數(shù)要使用庫函數(shù),或使用不在同一文件或使用不在同一文件中的其它用戶定義函數(shù),必須在程序的開頭用中的其它用戶定義函數(shù),必須在程序的開頭用#include語句,將所用函數(shù)信息包括到程序中來語句,將所用函

57、數(shù)信息包括到程序中來(3) 如被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之后,應(yīng)在主調(diào)函如被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之后,應(yīng)在主調(diào)函數(shù)前對(duì)被調(diào)函數(shù)的返回值類型予以說明數(shù)前對(duì)被調(diào)函數(shù)的返回值類型予以說明。說明方式為:。說明方式為:返回值類型被調(diào)函數(shù)名返回值類型被調(diào)函數(shù)名(形式參列形式參列)【例例】 被調(diào)函數(shù)在主調(diào)函數(shù)后,需被調(diào)函數(shù)在主調(diào)函數(shù)后,需要說明要說明。 main() int max(); /*被調(diào)函數(shù)說明被調(diào)函數(shù)說明*/ int x = 70, y = 40, m; m=max(X,Y); int max(a,b);/*被調(diào)函數(shù),在主調(diào)函數(shù)之后出現(xiàn)被調(diào)函數(shù),在主調(diào)函數(shù)之后出現(xiàn)*/int a,b;return(a

58、b?a:b);(4) 被調(diào)函數(shù)說明的語句被調(diào)函數(shù)說明的語句int max(a,b)也可以移至主調(diào)也可以移至主調(diào)函數(shù)函數(shù)man()前,可不必說明。前,可不必說明。 int max(a,b); /*被調(diào)函數(shù),在主調(diào)函數(shù)之前出現(xiàn)被調(diào)函數(shù),在主調(diào)函數(shù)之前出現(xiàn)*/int a,b;return(ab?a:b);main() /*主調(diào)函數(shù),函數(shù)內(nèi)無被調(diào)函數(shù)說明主調(diào)函數(shù),函數(shù)內(nèi)無被調(diào)函數(shù)說明int max();*/int x = 70, y = 40, m;m=max(X,Y);(1) 函數(shù)是C51程序的基本單位,一個(gè)C51程序至少有一個(gè)主函數(shù)main(),也可以由一個(gè)主函數(shù)main()和若干個(gè)其它函數(shù)構(gòu)成。

59、若干其它函數(shù)受主函數(shù)調(diào)用,被調(diào)用的函數(shù)既可以是編譯器提供的庫函數(shù),也可以是用戶自己根據(jù)需要設(shè)定編制的函數(shù)。(2) 一個(gè)函數(shù)由函數(shù)說明部分和函數(shù)體兩部分組成。(3) 函數(shù)說明部分由函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)參數(shù)名和形式參數(shù)類型組成,其中允許沒有函數(shù)參數(shù),函數(shù)名后面必須有1個(gè)圓括號(hào),括號(hào)內(nèi)就是可有可無的形式參數(shù)表。(4) 函數(shù)體是用大括號(hào)圍起來的部分。大括號(hào)內(nèi)有兩部分內(nèi)容:一部分是變量及變量的定義;另一部分是由若干語句組成的執(zhí)行部分。如果一個(gè)函數(shù)內(nèi)有多個(gè)大括號(hào),則最外層的一對(duì)大括號(hào)為函數(shù)體的范圍。有的函數(shù)體既有變量定義部分,又有執(zhí)行部分;有的函數(shù)體僅有執(zhí)行部分無變量定義部分;有的函數(shù)這兩部分

60、都沒有。 3.4.6 C51程序設(shè)計(jì)的編程規(guī)則程序設(shè)計(jì)的編程規(guī)則(5) 語句的組成規(guī)則為:每個(gè)變量必須先定義后使用;變量名由英文字母組成,英文字母要區(qū)分大小寫,大小寫不同則變量名不同;書寫格式自由,一行可以寫多個(gè)語句,一個(gè)語句也可以寫成多行,但每條語句必須以“;”結(jié)尾;分號(hào)是C語言的必須組成部分,每個(gè)語句和數(shù)據(jù)在定義的最后必須有一個(gè)分號(hào),程序的最后一個(gè)語句也應(yīng)有分號(hào)。(6) C語言對(duì)I/O操作實(shí)現(xiàn)了“函數(shù)化”,分別調(diào)用庫函數(shù)scanf和printf等函數(shù)完成,無專門的輸入/輸出語句。(7) C51的注釋用/*/表示,有了注釋,閱讀程序更方便。C51程序結(jié)構(gòu)如下:全局變量說明/*可被各函數(shù)引用*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論