![單片機編程實例_led等重要_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/11/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e44/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e441.gif)
![單片機編程實例_led等重要_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/11/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e44/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e442.gif)
![單片機編程實例_led等重要_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/11/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e44/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e443.gif)
![單片機編程實例_led等重要_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/11/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e44/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e444.gif)
![單片機編程實例_led等重要_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-6/11/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e44/81e1f8f8-29f7-43c7-b4ed-c1dd3a609e445.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、3.1 單片機系統(tǒng)開發(fā)過程單片機系統(tǒng)開發(fā)過程簡單的例子:讓一個發(fā)光二極管閃爍簡單的例子:讓一個發(fā)光二極管閃爍5次。次。1、明確系統(tǒng)功能:讓一個發(fā)光二極管閃爍、明確系統(tǒng)功能:讓一個發(fā)光二極管閃爍5次。次。系統(tǒng)啟動后,一支發(fā)光二極管閃爍系統(tǒng)啟動后,一支發(fā)光二極管閃爍5次后熄滅,次后熄滅,當(dāng)按下一個按鈕開關(guān)后再閃爍當(dāng)按下一個按鈕開關(guān)后再閃爍5次后熄滅。次后熄滅。以后每次按下按鈕開關(guān),發(fā)光二極管都會閃爍以后每次按下按鈕開關(guān),發(fā)光二極管都會閃爍5次次。第三章第三章 單片機系統(tǒng)開發(fā)過程單片機系統(tǒng)開發(fā)過程 51單片機指令系統(tǒng)簡介單片機指令系統(tǒng)簡介 2、硬件設(shè)計、硬件設(shè)計(單片機單片機+外圍器件外圍器件)外圍
2、器件:外圍器件:一個發(fā)一個發(fā)光二極光二極管、三管、三個電阻、個電阻、三個電三個電容容一個按一個按鈕開關(guān)鈕開關(guān)3、 搭建硬件平臺搭建硬件平臺在面包板上插入器件,用導(dǎo)線完成電氣連接。在面包板上插入器件,用導(dǎo)線完成電氣連接。 4、 軟件設(shè)計軟件設(shè)計 ORG 00H ; 設(shè)置起始地址設(shè)置起始地址START: MOV R0, #5 ; 循環(huán)閃爍循環(huán)閃爍5次,次,R0為計數(shù)器為計數(shù)器LOOP: MOV P1,#00H ; P1口輸出全口輸出全0,點亮二極管點亮二極管 CALL DELAY ; 調(diào)用延時子程序調(diào)用延時子程序 MOV P1,#0FFH ; P1口輸出全口輸出全1,熄滅二極管,熄滅二極管 CAL
3、L DELAY ; 調(diào)用延時子程序調(diào)用延時子程序 DJNZ R0, LOOP ; R0減減1,若不為,若不為0轉(zhuǎn)轉(zhuǎn)LOOP處處 JB P2.0, $ ; 測測P2.0為高電平為高電平(無按鍵無按鍵)則執(zhí)行本行則執(zhí)行本行 JMP START ; 否則否則,有鍵按下有鍵按下,跳到跳到START處重新開處重新開 始執(zhí)行始執(zhí)行DELAY: ; 延時子程序(延時子程序(500ms) RET ; 返回主程序返回主程序 END ; 匯編程序結(jié)束匯編程序結(jié)束5 、下載程序到單片機并調(diào)試、下載程序到單片機并調(diào)試(1) 在在Vision中把目標程序編輯好,中把目標程序編輯好,(2)編譯、連接無錯后生成單片機可執(zhí)行
4、的代碼文件,編譯、連接無錯后生成單片機可執(zhí)行的代碼文件,(3) 用下載線下載到單片機系統(tǒng)板中,用下載線下載到單片機系統(tǒng)板中,(4)運行程序運行程序(5)根據(jù)運行結(jié)果)根據(jù)運行結(jié)果檢查功能實現(xiàn)情況檢查功能實現(xiàn)情況,若未達系統(tǒng)要求若未達系統(tǒng)要求,則則在在Vision中修改程中修改程序,然后重復(fù)步驟序,然后重復(fù)步驟 (2)(5),直至達到系直至達到系統(tǒng)要求統(tǒng)要求.在程序反復(fù)檢查無在程序反復(fù)檢查無邏輯錯誤時邏輯錯誤時,應(yīng)檢查應(yīng)檢查硬件電路是否有問硬件電路是否有問題題. 3.2 Vision Vision軟件的使用1、新建一個工程、新建一個工程(項目項目),并為該項目選定合適的并為該項目選定合適的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選項,選項,在彈出的框中選擇你的源文件和文件類型,然后點擊在彈出的框中選擇你的源文件和文件類型,然后點擊ADD,再點擊,再點擊close。 5、編譯工程中的源程序,生成、編譯工程中的源程序,生成 .HEX(可執(zhí)行可執(zhí)行)文件文件 在在Project窗口中窗口中選選 Target 1Build Target F7, (點點擊擊
7、)對源程序編譯連接。對源程序編譯連接。(或點擊或點擊 RBuild Target ) 程序有語法錯誤時程序有語法錯誤時,會在輸出窗口會在輸出窗口(Output Windows)中中顯示錯誤信息和警告信息顯示錯誤信息和警告信息,修改編譯成功后生成修改編譯成功后生成 HEX文件文件生成生成.HEX文件后文件后,可利可利用專門的下載程序用專門的下載程序,將將此可執(zhí)行程序下載到單此可執(zhí)行程序下載到單片機內(nèi)的片機內(nèi)的ROM中運行中運行 3 3、在窗口中點、在窗口中點擊擊 , , 打開你系統(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、點擊、點擊Download,Download,打開電路板上的電源打開電路板上的電源, ,燒錄程序燒錄程序,若若燒錄出現(xiàn)問燒錄出現(xiàn)問題題, ,點擊點擊stopstop。注意:注意: 5、6 兩步驟的兩步驟的順序不能顛倒!即在點順序不能顛倒!即在點擊擊Download之前要先之前要先關(guān)掉板上的電源關(guān)掉板上的電源。
9、7、打開電路、打開電路板上的電源板上的電源 ,程序即開始運程序即開始運行。行。 3.4 單片機應(yīng)用系統(tǒng)單片機應(yīng)用系統(tǒng)C語言程序設(shè)計語言程序設(shè)計 單片機應(yīng)用系統(tǒng)的程序設(shè)計有兩種方法:一種單片機應(yīng)用系統(tǒng)的程序設(shè)計有兩種方法:一種是基于匯編語言的,另一種是基于是基于匯編語言的,另一種是基于C語言的。語言的。 匯編語言程序的機器代碼生成效率高,但可匯編語言程序的機器代碼生成效率高,但可讀性較差,而讀性較差,而C語言程序的可讀性和可移植性遠超語言程序的可讀性和可移植性遠超過匯編語言。過匯編語言。 C51是一種專門為是一種專門為51單片機設(shè)計的高級語言單片機設(shè)計的高級語言C編譯器,支持符合編譯器,支持符合
10、ANSI標準的標準的C語言,同時針語言,同時針對對51單片機的特點做了一些特殊擴展。單片機的特點做了一些特殊擴展。 C語言的主要特點:語言的主要特點: 語言簡潔,使用方便靈活。它是程序設(shè)計語語言簡潔,使用方便靈活。它是程序設(shè)計語言中規(guī)模最小的語言之一。言中規(guī)模最小的語言之一。 ANSI標準標準C語言只有語言只有32個關(guān)鍵字,個關(guān)鍵字,9種流程種流程控制語句??刂普Z句。程序可移植性好。程序可移植性好。所設(shè)計的程序不依賴機器硬件。所設(shè)計的程序不依賴機器硬件。表達方式靈活。表達方式靈活。 利用利用 C語言的多種運算符可組成各種表達式,語言的多種運算符可組成各種表達式,還可采用多種方法來獲得表達式的值
11、,使程序設(shè)計還可采用多種方法來獲得表達式的值,使程序設(shè)計具有更大的靈活性。具有更大的靈活性。表達能力強。表達能力強。 具有豐富的數(shù)據(jù)結(jié)構(gòu)類型和多種運算符。用戶具有豐富的數(shù)據(jù)結(jié)構(gòu)類型和多種運算符。用戶可靈活采用多種數(shù)據(jù)類型和使用各種運算符,實現(xiàn)可靈活采用多種數(shù)據(jù)類型和使用各種運算符,實現(xiàn)復(fù)雜運算。復(fù)雜運算。可直接操作計算機硬件。可直接操作計算機硬件。 C語言具有直接訪問機器物理地址的能力,語言具有直接訪問機器物理地址的能力,C51的編譯器都的編譯器都可直接對單片機內(nèi)部的可直接對單片機內(nèi)部的SFR和和I/O端口進端口進行操作,可以直接訪問片內(nèi)、片外存儲器,還可以行操作,可以直接訪問片內(nèi)、片外存儲器
12、,還可以進行各種為操作進行各種為操作。生成的目標代碼質(zhì)量較高。生成的目標代碼質(zhì)量較高。可進行結(jié)構(gòu)化程序設(shè)計。可進行結(jié)構(gòu)化程序設(shè)計。 C語言以函數(shù)作為程序設(shè)計的基本單位,非常適語言以函數(shù)作為程序設(shè)計的基本單位,非常適合結(jié)構(gòu)化程序設(shè)計。合結(jié)構(gòu)化程序設(shè)計。 用用C51語言編寫單片機應(yīng)用程序,不用具體組語言編寫單片機應(yīng)用程序,不用具體組織、分配存儲器資源和處理端口數(shù)據(jù),但織、分配存儲器資源和處理端口數(shù)據(jù),但對數(shù)據(jù)類對數(shù)據(jù)類型與變量的定義,必須要與單片機的存儲結(jié)構(gòu)相關(guān)型與變量的定義,必須要與單片機的存儲結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。聯(lián),否則編譯器不能正確地映射定位。 與標準與標準C語言相比,
13、語言相比,C51包含的數(shù)據(jù)類型、變量包含的數(shù)據(jù)類型、變量存儲模式、輸入輸出處理、函數(shù)等方面有一定差存儲模式、輸入輸出處理、函數(shù)等方面有一定差異,異,需根據(jù)單片機存儲結(jié)構(gòu)及內(nèi)部資源來定義相應(yīng)的數(shù)需根據(jù)單片機存儲結(jié)構(gòu)及內(nèi)部資源來定義相應(yīng)的數(shù)據(jù)類型和變量,據(jù)類型和變量,而其它語法規(guī)則、程序結(jié)構(gòu)及設(shè)計而其它語法規(guī)則、程序結(jié)構(gòu)及設(shè)計方法等與標準方法等與標準C語言相同。語言相同。 3.4.1 C51的程序結(jié)構(gòu)的程序結(jié)構(gòu) 一、一、 C51語言概述語言概述 C語言程序語言程序由若干函數(shù)組成,其中有且僅有一由若干函數(shù)組成,其中有且僅有一個主函數(shù)個主函數(shù),每個函數(shù)都是完成某個特殊任務(wù)的子程,每個函數(shù)都是完成某個特
14、殊任務(wù)的子程序段。序段。 組成程序的若干函數(shù)可保存在一個源程序文件組成程序的若干函數(shù)可保存在一個源程序文件中,也可保存在幾個源程序文件中,最后將它們連中,也可保存在幾個源程序文件中,最后將它們連接在一起。接在一起。 函數(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) 可實現(xiàn)一個可實現(xiàn)一個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編譯器就會給這個變量分配相應(yīng)的存儲單編譯器就會給這個變量分配相應(yīng)的存儲單元。此后變量名就與存儲單元地址相對應(yīng)元。此后變量名就與存儲單元地址相對應(yīng),變量值就與,變
16、量值就與存儲單元的內(nèi)容相對應(yīng)。存儲單元的內(nèi)容相對應(yīng)。 定義一個變量的格式如下:定義一個變量的格式如下:存儲種類存儲種類數(shù)據(jù)類型數(shù)據(jù)類型存儲類型存儲類型變量名變量名C51的變量概念示意圖的變量概念示意圖 圖中引用變量圖中引用變量a實現(xiàn)了對分配內(nèi)存實現(xiàn)了對分配內(nèi)存20H單元的數(shù)據(jù)操作單元的數(shù)據(jù)操作 (1)存儲種類)存儲種類 存儲種類存儲種類是指變量在程序執(zhí)行過程中的作用范圍。是指變量在程序執(zhí)行過程中的作用范圍。變量的存儲種類有四種:變量的存儲種類有四種:自動(自動(auto) 用存儲種類說明符用存儲種類說明符auto定義的變量定義的變量外部(外部(extern) 用外部種類存儲符用外部種類存儲符e
17、xtern定義的變量定義的變量靜態(tài)(靜態(tài)(static) 用存儲種類說明符用存儲種類說明符static定義的變量定義的變量寄存器(寄存器(register)用存儲種類說明符用存儲種類說明符register定義的定義的 變量變量自動變量:自動變量: 自動變量作用范圍在定義它的函數(shù)體或復(fù)合語句內(nèi)自動變量作用范圍在定義它的函數(shù)體或復(fù)合語句內(nèi)部部,在定義它的,在定義它的函數(shù)體或復(fù)合語句被執(zhí)行時,函數(shù)體或復(fù)合語句被執(zhí)行時,C51才為該變量分配內(nèi)存空間,當(dāng)函數(shù)調(diào)用結(jié)束或復(fù)合才為該變量分配內(nèi)存空間,當(dāng)函數(shù)調(diào)用結(jié)束或復(fù)合語句執(zhí)行結(jié)束時,自動變量占用的內(nèi)存空間被釋放語句執(zhí)行結(jié)束時,自動變量占用的內(nèi)存空間被釋放。
18、 定義變量時若省略存儲種類,則變量默認為自定義變量時若省略存儲種類,則變量默認為自動變量。通常將函數(shù)體內(nèi)和復(fù)合語句中使用頻繁的動變量。通常將函數(shù)體內(nèi)和復(fù)合語句中使用頻繁的變量放在片內(nèi)變量放在片內(nèi)RAM中,且定義為自動變量,可有效中,且定義為自動變量,可有效利用片內(nèi)利用片內(nèi)RAM資源。資源。外部變量:外部變量: 在一個函數(shù)內(nèi),在一個函數(shù)內(nèi),要使用已在本函數(shù)外或別的程序要使用已在本函數(shù)外或別的程序模塊文件中定義過的外部變量時,在本函數(shù)體內(nèi)模塊文件中定義過的外部變量時,在本函數(shù)體內(nèi)要用要用extern說明該變量說明該變量。 通常將多個函數(shù)或模塊共享的變量定義為外通常將多個函數(shù)或模塊共享的變量定義為外
19、部變量。部變量。 外部變量是全局變量,在程序執(zhí)行期間一直外部變量是全局變量,在程序執(zhí)行期間一直占有固定的內(nèi)存空間。占有固定的內(nèi)存空間。當(dāng)片內(nèi)當(dāng)片內(nèi)RAM資源緊張時,資源緊張時,不建議將外部變量放在片內(nèi)不建議將外部變量放在片內(nèi)RAM。 外部變量被定義后,即分配了固定的內(nèi)存空間,外部變量被定義后,即分配了固定的內(nèi)存空間,在程序的整個執(zhí)行時間內(nèi)都是有效的。在程序的整個執(zhí)行時間內(nèi)都是有效的。 靜態(tài)變量:靜態(tài)變量: 靜態(tài)變量又分為靜態(tài)變量又分為內(nèi)部靜態(tài)變量內(nèi)部靜態(tài)變量和和外部靜態(tài)變量外部靜態(tài)變量。 在函數(shù)體內(nèi)定義的靜態(tài)變量為在函數(shù)體內(nèi)定義的靜態(tài)變量為內(nèi)部靜態(tài)變量內(nèi)部靜態(tài)變量,它在該函數(shù)體內(nèi)有效,它在該函
20、數(shù)體內(nèi)有效,但在該函數(shù)體外不可見,但在該函數(shù)體外不可見,這這使變量在定義它的函數(shù)體外被保護使變量在定義它的函數(shù)體外被保護,實現(xiàn)了離,實現(xiàn)了離開函數(shù)時值不會被改變。開函數(shù)時值不會被改變。 寄存器變量:寄存器變量: 通常將使用頻率最高的那些變量定義為寄存器通常將使用頻率最高的那些變量定義為寄存器變量,但目前已不推薦使用這種方式。變量,但目前已不推薦使用這種方式。 外部靜態(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ù)類型 有符號數(shù)據(jù)類型可以忽略有符號數(shù)據(jù)類型可以忽略signed標識符,如標識符,如int 等等價于價于signed int , char 等價于等價于signed char等。等。 為了更有效地利用為了更有效地利用51單片機的內(nèi)部結(jié)構(gòu),單片機的內(nèi)部結(jié)構(gòu), C51還還增加了一些特殊的數(shù)據(jù)類型增加了一些特殊的數(shù)據(jù)類型,它們分別對應(yīng)于,它們分別對應(yīng)于bit、sfr、sfr16和和sbit四個關(guān)鍵字。四個關(guān)鍵字。bit 位型位型 利用利用bit
22、 位型,可定義一個位變量或位函數(shù),位型,可定義一個位變量或位函數(shù),但不能定義位指針,也不能定義位數(shù)組。它的值但不能定義位指針,也不能定義位數(shù)組。它的值是一個二進制位,不是是一個二進制位,不是0 就是就是1。C51增加的特殊數(shù)據(jù)類型增加的特殊數(shù)據(jù)類型sfr特殊功能寄存器型特殊功能寄存器型 51系列單片機內(nèi)的系列單片機內(nèi)的21個特殊功能寄存器個特殊功能寄存器(SFR),分散在片內(nèi)分散在片內(nèi)RAM區(qū)的高區(qū)的高128字節(jié),地址為字節(jié),地址為80HFFH。為了能直接訪問這些為了能直接訪問這些SFR,需要通過關(guān)鍵字,需要通過關(guān)鍵字“sfr”對對其進行定義其進行定義,語法如下:語法如下: sfr sfr_n
23、ame = 地址常數(shù)地址常數(shù); sfr_name是一個特殊功能寄存器名,是一個特殊功能寄存器名,“=”后面必須后面必須是常數(shù),其數(shù)值范圍必須在特殊功能寄存器地址范圍是常數(shù),其數(shù)值范圍必須在特殊功能寄存器地址范圍內(nèi),即位于內(nèi),即位于0 x80-0 xFF之間。之間。例如,例如, sfr P1 = 0 x90; /定義定義P1口地址口地址90H sfr PSW = 0 xD0; /定義定義PSW地址地址D0H 對于對于16位位SFR,要使用關(guān)鍵字,要使用關(guān)鍵字“sfr16”,定義的地定義的地址必須是址必須是16位位SFR的低端地址。的低端地址。 sfr16 DPTR = 0 x82;/定義定義DP
24、TR,其,其DPL = 82H DPH=83H 注意:不能用注意:不能用sfr16定義定時器定義定時器/計數(shù)器計數(shù)器0和和1。 sbit可尋址位可尋址位 在單片機應(yīng)用中,經(jīng)常要訪問特殊功能寄存器在單片機應(yīng)用中,經(jīng)常要訪問特殊功能寄存器中的某些位,中的某些位,用關(guān)鍵字用關(guān)鍵字sbit定義可位尋址的特殊功定義可位尋址的特殊功能寄存器的位尋址對象能寄存器的位尋址對象。定義方法有如下三種:。定義方法有如下三種:sbit 位變量名位變量名 = 位地址位地址 將位的絕對地址賦給位變量名,位地址必須位于將位的絕對地址賦給位變量名,位地址必須位于0 x80H0 xFF之間。之間。 例:例:sbit CY=0
25、xD7; /將位的絕對地址賦給變量將位的絕對地址賦給變量sbit 位變量名位變量名 = SFR名稱名稱 位位置位位置 當(dāng)可尋址位位于特殊功能寄存器中時,可采用這種當(dāng)可尋址位位于特殊功能寄存器中時,可采用這種方法。其中方法。其中SFR名稱必須是已定義的名稱必須是已定義的SFR的名字,位位的名字,位位置是一個置是一個07之間的常數(shù)。之間的常數(shù)。例:例: sfr PSW = 0 xD0; sbit CY=PSW7; /定義定義CY位為位為PSW.7,位地址為,位地址為 0 xD7sbit 位變量名位變量名 = 字節(jié)地址字節(jié)地址 位位置位位置 這種方法是以一個字節(jié)地址作為基地址,該地址必這種方法是以一
26、個字節(jié)地址作為基地址,該地址必須在須在0 x80H0 xFF之間。之間。例如,例如,sbit CY = 0 xD07; /將位的相對地址賦給變量將位的相對地址賦給變量 注:注:C51編譯器把編譯器把51單片機常用特殊功能寄存器和特殊位進行單片機常用特殊功能寄存器和特殊位進行了統(tǒng)一定義,并存放在了統(tǒng)一定義,并存放在 “reg51.h”或或“reg52.h” 頭文件中,只須在頭文件中,只須在使用前用預(yù)處理命令使用前用預(yù)處理命令#include 把這頭文件包含到程序中,把這頭文件包含到程序中,就可使用殊功能寄存器名和特殊位名稱。就可使用殊功能寄存器名和特殊位名稱。(3)存儲類型)存儲類型 51系列單
27、片機有三個邏輯存儲空間:片內(nèi)低系列單片機有三個邏輯存儲空間:片內(nèi)低128B RAM,片外,片外64KB RAM和片內(nèi)外統(tǒng)一編址的和片內(nèi)外統(tǒng)一編址的64KB ROM。51系列單片機邏輯存儲空間示意圖 C51的存儲類型與存儲空間對應(yīng)關(guān)系表的存儲類型與存儲空間對應(yīng)關(guān)系表 注:注:一個變量除了與存儲單元相對應(yīng)外,還與它所在一個變量除了與存儲單元相對應(yīng)外,還與它所在的存儲空間有關(guān),即還需要指出其存儲類型。的存儲空間有關(guān),即還需要指出其存儲類型。 如果在如果在定義變量時省略了存儲類型標識符,定義變量時省略了存儲類型標識符,C51編譯器會根據(jù)當(dāng)前編譯模式自動認定默認的存儲類編譯器會根據(jù)當(dāng)前編譯模式自動認定默
28、認的存儲類型。型。編譯模式共分為:小編譯模式(編譯模式共分為:小編譯模式(SMALL)、緊)、緊湊編譯模式(湊編譯模式(COMPACT)和大編譯模式()和大編譯模式(LARGE)三種模式三種模式 編譯模式與存儲類型編譯模式與存儲類型(4)變量名)變量名 C51對變量名的規(guī)定與標準對變量名的規(guī)定與標準C類似,由字母、類似,由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須數(shù)字和下劃線三種字符組成,且第一個字符必須為字母或下劃線,變量名長度無統(tǒng)一規(guī)定,隨編為字母或下劃線,變量名長度無統(tǒng)一規(guī)定,隨編譯系統(tǒng)而定。譯系統(tǒng)而定。 注意注意:大寫和小寫字母是兩個不同的標識符,習(xí):大寫和小寫字母是兩個不同的標
29、識符,習(xí)慣上變量用小寫表示。變量名除了不可使用標準慣上變量用小寫表示。變量名除了不可使用標準C語言的語言的32個關(guān)鍵字外,還要不可使用個關(guān)鍵字外,還要不可使用C51擴展擴展的新關(guān)鍵字。的新關(guān)鍵字。 C51擴展的擴展的21個關(guān)鍵字一覽表個關(guān)鍵字一覽表 C51擴展的擴展的21個關(guān)鍵字一覽表(續(xù))個關(guān)鍵字一覽表(續(xù)) 注:注: 所有變量在使用前必須說明,即必須所有變量在使用前必須說明,即必須“先定先定義,后使用義,后使用”,凡未被定義的,不作為變量名。,凡未被定義的,不作為變量名。unsigned char data system_status=0; /定義定義system_status為無符號字符
30、型自動變量,該變量位為無符號字符型自動變量,該變量位于于data區(qū)中且初值為區(qū)中且初值為0。 unsigned char bdata status_byte; /定義定義status_byte為為無符號字符型自動變量,該變量位于無符號字符型自動變量,該變量位于bdata區(qū)中。區(qū)中。unsigned int code unit_id2=0 x1234, 0 x89ab; /定義定義unit_id2為無符號整型自動變量,該變量位于為無符號整型自動變量,該變量位于code區(qū)區(qū)中,為長度為中,為長度為2的數(shù)組,初值為的數(shù)組,初值為0 x1234和和0 x89ab。static char m, n; /
31、定義定義m和和n為為2個位于個位于data區(qū)中的區(qū)中的有符號字符型靜態(tài)變量。有符號字符型靜態(tài)變量。extern float xdata var4; /在片外在片外RAM 空間定義空間定義外部實型變量外部實型變量var4。 C51的指針與標準的指針與標準C的指針幾乎是一樣的,都的指針幾乎是一樣的,都可以簡單理解為可以簡單理解為“存儲某個地址的變量存儲某個地址的變量”。 2. C51的指針的指針 例如要存取變量例如要存取變量a中的值時,可以先將變量中的值時,可以先將變量a的的地址放在另一個變量地址放在另一個變量b中,訪問時先找到變量中,訪問時先找到變量b,從,從中取出變量中取出變量a的地址,然后根
32、據(jù)這個地址從內(nèi)存單的地址,然后根據(jù)這個地址從內(nèi)存單元中取出變量元中取出變量a的值。在這里,變量的值。在這里,變量b稱為指針變量。稱為指針變量。上述說法相當(dāng)于上述說法相當(dāng)于 int a=AA; int *b=&a在在C51里定義指針,還需要額外指明兩個問題:里定義指針,還需要額外指明兩個問題: 1)指針變量自身位于哪個存儲區(qū)域;)指針變量自身位于哪個存儲區(qū)域; 2)該指針的值代表的是哪個存儲區(qū)域里的地址。)該指針的值代表的是哪個存儲區(qū)域里的地址。在在SMALL編譯模式下的例子編譯模式下的例子例例1 char xdata a = A; char * ptr = &a; ptr是一個是一個char型
33、的指針變量型的指針變量,它本身位于默它本身位于默認的認的data存儲區(qū)存儲區(qū)(因為它省略了(因為它省略了存儲類型)存儲類型),它它的值是的值是xdata存儲區(qū)里變量存儲區(qū)里變量a的地址的地址。 例例2 char xdata a = A; char * ptr = &a; char idata b = B; * ptr = &b; 變量變量b位于位于idata存儲區(qū)中,執(zhí)行完存儲區(qū)中,執(zhí)行完*ptr=&b之后,之后,ptr里的值就是里的值就是idata空間里的空間里的b變量的地址。變量的地址。 例例3 char idata a = A; 變量變量a是是idata區(qū)域里的變量;區(qū)域里的變量; ch
34、ar idata * ptr = &a; 定義指針時就限定它只能指向某一個區(qū)域,例如定義指針時就限定它只能指向某一個區(qū)域,例如idata 例例4 若若例例3中的中的ptr指針自身位于指針自身位于xdata存儲區(qū),由于存儲區(qū),由于指針變量本質(zhì)上也是變量,所以,可在例指針變量本質(zhì)上也是變量,所以,可在例3的的“char idata * ptr”里,為里,為ptr加上指明所在區(qū)域的加上指明所在區(qū)域的xdata即可即可 char idata a = A; char idata * xdata ptr = &a; xdata指明了指明了ptr本身是在本身是在xdata存儲區(qū)里的存儲區(qū)里的,而它是一個而它
35、是一個(char idata *)類型的變量類型的變量,即指向即指向idata區(qū)域的一個區(qū)域的一個char類型的指針。類型的指針。 3. 4. 3 C51的運算符的運算符說明說明 : (1)關(guān)于關(guān)于/ (除除)運算的結(jié)果運算的結(jié)果, 若若: 兩個整數(shù)相除兩個整數(shù)相除 ,運算結(jié)果的值為整數(shù)運算結(jié)果的值為整數(shù)(如如 5 / 3,結(jié)果為結(jié)果為1) 兩數(shù)中有一個為負值時兩數(shù)中有一個為負值時,結(jié)果向零取整結(jié)果向零取整。(如如-5/3為為 -1 兩數(shù)中有一個為實數(shù)時兩數(shù)中有一個為實數(shù)時,結(jié),結(jié)果為果為 double 型型1 C51的基本算術(shù)運算符的基本算術(shù)運算符基本算術(shù)運算符有基本算術(shù)運算符有5種:,種:
36、,* (乘乘),/ (除除), (模運算符,又稱求余模運算符,又稱求余)。-7 % 4 ,7 % -4 ,-7 % -4的值為多少?(2)參加參加/(模模)運算的兩數(shù)為運算的兩數(shù)為整型數(shù)據(jù)整型數(shù)據(jù)結(jié)果結(jié)果, 結(jié)果為結(jié)果為整型數(shù)整型數(shù)如 7 % 4 的值為 3(-3,3,-3) 關(guān)系運算符有關(guān)系運算符有6種:種:(小于小于)、(大于大于)、(小于或等于小于或等于)、(大于或等于大于或等于)(相等相等),!(不等于不等于)。2 C51的關(guān)系運算符的關(guān)系運算符前前4種運算符的優(yōu)先級別高種運算符的優(yōu)先級別高(彼此間優(yōu)先級相同彼此間優(yōu)先級相同),后兩種運算符的優(yōu)先級較低后兩種運算符的優(yōu)先級較低(彼此間優(yōu)
37、先級相同彼此間優(yōu)先級相同)。關(guān)系運算的結(jié)果只有兩種:關(guān)系運算的結(jié)果只有兩種:“真真”(1)和和“假假”(0)。例:設(shè)例:設(shè)a5,b4,c3,則則ab的值為的值為“真真”,表達式的值為,表達式的值為1若有賦值語句若有賦值語句 d(ab)c按優(yōu)先級,先算按優(yōu)先級,先算ab,表達式的值為,表達式的值為1;再算;再算1c,表達式的值為表達式的值為0,所以,所以d0。邏輯運算符有邏輯運算符有3種:種:&(邏輯與邏輯與),(邏輯或邏輯或),!,!(邏邏輯非輯非)。邏輯運算結(jié)果只有兩個:邏輯運算結(jié)果只有兩個:“真真”(1)和和“假假”(0)。3 C51的邏輯運算符的邏輯運算符C51的算術(shù)、關(guān)系、的算術(shù)、關(guān)系
38、、邏輯運算符的優(yōu)先級邏輯運算符的優(yōu)先級別見右圖。別見右圖。西安電子科技大學(xué)出版社西安電子科技大學(xué)出版社西安電子科技大學(xué)出版社( ) 括號! (非運算)關(guān)系運算賦值運算()高優(yōu)先級算術(shù)運算符(先乘除后加減)&(與)和| |(或)低優(yōu)先級位操作運算符有位操作運算符有6種:種:&(按位與按位與), (按位或按位或),(按位異或按位異或), (位取反位取反),(位右移,當(dāng)位右移,當(dāng)操作數(shù)為無符號數(shù)時操作數(shù)為無符號數(shù)時,高位補零高位補零,為有符號為有符號數(shù)數(shù),則則高位保持原狀態(tài)高位保持原狀態(tài))?!纠?-4】 設(shè)設(shè)X1001 1110B,Y1010 0101B,則,則XY的運算過程為:的運算過程為:XY
39、的值為的值為0011 1011B。4 C51位操作運算符位操作運算符自增減運算符有自增減運算符有4種:種:+i(先將先將i加加1,再使用,再使用i),-i (先先將將i減減1,再使用,再使用i),i+(使用使用i后,再將后,再將i加加1),i-(使用使用i后,后,再將再將i減減1)?!纠?-6】 設(shè)設(shè)i值為值為8,則,則j+i,使用前,使用前i為為8,加,加1后為后為9,則,則i、j值都是值都是9;ji+,使用前,使用前i為為8,先將,先將8賦給賦給j,使用后使,使用后使i加加1,所以所以i9,j8。5C51自增、減運算符自增、減運算符復(fù)合賦值運算符有復(fù)合賦值運算符有10種:,種:,* ,/
40、,。6C51賦值運算符賦值運算符7C51復(fù)合賦值運算符復(fù)合賦值運算符用賦值運算符將變量與表達式連接起來,就用賦值運算符將變量與表達式連接起來,就構(gòu)成了賦值表達式,在賦值表達式構(gòu)成了賦值表達式,在賦值表達式 之后加上分號之后加上分號“;”便構(gòu)成了賦值語句。便構(gòu)成了賦值語句。X=Y=8;復(fù)合賦值運算復(fù)合賦值運算首先對變量進行某種運算,然后首先對變量進行某種運算,然后將運算結(jié)果再賦給變量將運算結(jié)果再賦給變量。采用復(fù)合賦值運算符,可。采用復(fù)合賦值運算符,可使程序簡化和提高程序編譯效率。使程序簡化和提高程序編譯效率。例如,例如, x*y+8 等價于等價于x x *( y+8 )8C51的條件運算符的條件
41、運算符條件運算符條件運算符 ? :它是它是C語言中唯一一個三目運算符語言中唯一一個三目運算符邏輯表達式邏輯表達式 ?表達式?表達式1 :表達式:表達式2邏輯表達式結(jié)果為真時,表達式的值等于表達式邏輯表達式結(jié)果為真時,表達式的值等于表達式1的值的值 ,否則,等于表達式,否則,等于表達式2的值的值 。此外,還有逗號運算符、指針和地址運算符、強制類此外,還有逗號運算符、指針和地址運算符、強制類型轉(zhuǎn)換運算符、取數(shù)據(jù)類型運算符。型轉(zhuǎn)換運算符、取數(shù)據(jù)類型運算符。 一個表達式后加上一個表達式后加上“;”就構(gòu)成了表達式語句,如算術(shù)表達就構(gòu)成了表達式語句,如算術(shù)表達式、關(guān)系表達式等。最典型的是用賦值表達式組成的
42、賦值語式、關(guān)系表達式等。最典型的是用賦值表達式組成的賦值語句。句。例如:例如: i = 1; i+;1、表達式語句、表達式語句C 語言所有的操作都是通過表達式來實現(xiàn)的。語言所有的操作都是通過表達式來實現(xiàn)的。表達式語句:表達式語句: 表達式表達式 ; 2、函數(shù)調(diào)用語句、函數(shù)調(diào)用語句函數(shù)調(diào)用語句由函數(shù)名、括號、實際參數(shù)加上分號函數(shù)調(diào)用語句由函數(shù)名、括號、實際參數(shù)加上分號“;”組組成成。其一般形式為:。其一般形式為: 函數(shù)名函數(shù)名( 實際參數(shù)表實際參數(shù)表 ); 例:例: printf (Hello , worldn);“函數(shù)調(diào)用語句函數(shù)調(diào)用語句”也可以看成是表達式語句,也可以看成是表達式語句,C語言
43、稱為語言稱為“表表達式語言達式語言”。 3.4.4 C語句概述3、控制語句、控制語句 控制語句用于控制程序流程,以實現(xiàn)程序的各種控制語句用于控制程序流程,以實現(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 (條件表達式)(條件表達式) 語句語句1格式格式2: If (條件表達式)(條件表達式) 語句語句1 else 語句語句2格式格式3: If (條件表達式(條件表達式1) 語句語句1 else if (條件表達式(條件表達式2)語句)語句2 else if (條件表達式(條件表達式3)語句)語句3 . else if (條件表達式(條件表達式m)語句)語句m else 語句語句 n注意注意: 1) 當(dāng)條件后面的語句多于一句時,要用一對當(dāng)條件后面的語句多于一句時,要用一對 “ ”把這些語句括起來。把這些語句括起來。 2)用格式用格式3實現(xiàn)多重實現(xiàn)多重if else
45、 嵌套時嵌套時, 注意注意if-else的配對,的配對,else總是和其前面最近的總是和其前面最近的if相配。此相配。此外,嵌套層數(shù)會增加程序閱讀難度。外,嵌套層數(shù)會增加程序閱讀難度。開關(guān)語句開關(guān)語句Switch(表達式)(表達式) case 常量表達式常量表達式1:語句:語句1 break; case 常量表達式常量表達式2:語句:語句2 break; . case 常量表達式常量表達式n:語句:語句n break; Default: 語句語句d循環(huán)語句循環(huán)語句while (表達式表達式)其含義是:當(dāng)條件成立時反復(fù)執(zhí)行循環(huán)體中的其含義是:當(dāng)條件成立時反復(fù)執(zhí)行循環(huán)體中的語句,直到條件不成立時為
46、止。語句,直到條件不成立時為止。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é)束整個循環(huán)。而不是結(jié)束整個循環(huán)。注:注:continue只用在只用在for、while、do-while等循環(huán)等循環(huán)語句中,一般與語句中,一般與if語句一起使用,可以加速循環(huán)。語句一起使用,可以加速循環(huán)。返回語句返回語句retu
47、rn return (表達式表達式) return 表達式表達式 作用:作用:使程序控制從被調(diào)用函數(shù)返回到調(diào)用使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返回值帶給調(diào)用函數(shù)函數(shù)中,同時把返回值帶給調(diào)用函數(shù)。 跳轉(zhuǎn)語句跳轉(zhuǎn)語句goto 語句標號語句標號 作用:作用: 無條件轉(zhuǎn)移到指定標號處無條件轉(zhuǎn)移到指定標號處注:最好不使用注:最好不使用goto語句語句4、復(fù)合語句、復(fù)合語句例:例:while ( i 1) sum = sum + i; i = i + 1;說明:說明: 復(fù)合語句的復(fù)合語句的 之后不能有之后不能有 “;” 允許一行寫幾個語句,或者一條語句寫幾允許一行寫幾個語句,或者一條語句寫幾
48、行行 復(fù)合語句中還復(fù)合語句中還可以包含復(fù)合語句可以包含復(fù)合語句由括在由括在 內(nèi)的若干內(nèi)的若干C語句組成語句組成5、空語句、空語句 只有一個分號的語句,不產(chǎn)生任何操作只有一個分號的語句,不產(chǎn)生任何操作例:例:for ( i=1; i 100 ; i +) ;空語句什么也不做,可用來做被轉(zhuǎn)向點,或循環(huán)語空語句什么也不做,可用來做被轉(zhuǎn)向點,或循環(huán)語句中的循環(huán)體(循環(huán)體是空語句,表示循環(huán)體什么句中的循環(huán)體(循環(huán)體是空語句,表示循環(huán)體什么也不做)。也不做)。 當(dāng)程序中出現(xiàn)連續(xù)的兩個分號當(dāng)程序中出現(xiàn)連續(xù)的兩個分號“;”時,一般時,一般可把后面的分號看作空語句。可把后面的分號看作空語句。 rept: ; .
49、 goto rept; #include char _getkey() char c; while (!RI) ; /*用空語句等待串口接收結(jié)束用空語句等待串口接收結(jié)束 C=SBUF; RI=0; return(c); 一個讀取串口數(shù)據(jù)的函數(shù)一個讀取串口數(shù)據(jù)的函數(shù)不要濫用空語句,以免引起程序誤操作或語法錯誤不要濫用空語句,以免引起程序誤操作或語法錯誤 賦值語句是由賦值表達式加上一個分號構(gòu)成的,是用賦值語句是由賦值表達式加上一個分號構(gòu)成的,是用于實現(xiàn)計算和賦值的一類最基本的語句。于實現(xiàn)計算和賦值的一類最基本的語句。其一般形式如下:其一般形式如下:可賦值對象可賦值對象v = 表達式表達式e; 注意
50、:注意:(1)如果賦值運算符兩邊的類型不一致,則系統(tǒng)在算出表)如果賦值運算符兩邊的類型不一致,則系統(tǒng)在算出表達式的值之后,先將該值轉(zhuǎn)換為左邊變量的類型,然后再達式的值之后,先將該值轉(zhuǎn)換為左邊變量的類型,然后再賦值給左邊的變量。賦值給左邊的變量。 (2)賦值運算符)賦值運算符“=”右邊的表達式可以又是一個賦值表右邊的表達式可以又是一個賦值表達式,形式為:達式,形式為: 變量變量=變量變量=表達式表達式; (3)在變量說明中,不允許連續(xù)給多個變量賦初值。)在變量說明中,不允許連續(xù)給多個變量賦初值。 6、賦值語句、賦值語句一、一、 函數(shù)的分類與定義函數(shù)的分類與定義1函數(shù)的分類函數(shù)的分類(1) 從語言
51、結(jié)構(gòu)劃分,函數(shù)分為主函數(shù)從語言結(jié)構(gòu)劃分,函數(shù)分為主函數(shù)main()和普和普通函數(shù)兩類。通函數(shù)兩類。(2) 從使用角度劃分,函數(shù)分為標準庫函數(shù)和用戶從使用角度劃分,函數(shù)分為標準庫函數(shù)和用戶自定義函數(shù)兩類。自定義函數(shù)兩類。 庫函數(shù)是庫函數(shù)是C編譯系統(tǒng)提供的一系列標準函數(shù),它們編譯系統(tǒng)提供的一系列標準函數(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)用時無須輸入?yún)?shù),也無結(jié)果返回。無參數(shù)函數(shù)調(diào)用時無須輸入?yún)?shù),也無結(jié)果返回。 有參數(shù)函數(shù)調(diào)用時要給被調(diào)用函數(shù)提供實質(zhì)參數(shù),有參數(shù)函數(shù)調(diào)用時要給被調(diào)用函數(shù)提供實質(zhì)參數(shù),被調(diào)用函數(shù)運行后產(chǎn)生的結(jié)果也要返回給調(diào)用函數(shù)使用。被調(diào)用函數(shù)運行后產(chǎn)生的結(jié)果也要返回給調(diào)用函數(shù)使用。 空函數(shù)是內(nèi)無語句的空白函數(shù),調(diào)用時不產(chǎn)生任空函數(shù)是內(nèi)無語句的空白函數(shù),調(diào)用時不產(chǎn)生任何操作,這種函數(shù)用于功能備用,以便擴充。何操作,這種函數(shù)用于功能備用,以便擴充。2函數(shù)的定義函
53、數(shù)的定義(1) 無參數(shù)函數(shù)的定義形式:無參數(shù)函數(shù)的定義形式: 返回值類型標識符返回值類型標識符 函數(shù)名函數(shù)名() 函數(shù)體語句函數(shù)體語句無參數(shù)函數(shù)通常不帶返回值,因此標識符可省略或無參數(shù)函數(shù)通常不帶返回值,因此標識符可省略或用用void。(2) 有參數(shù)函數(shù)的定義形式:有參數(shù)函數(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ù)返回到調(diào)用函數(shù)中,同時把返回值帶給調(diào)用函數(shù)調(diào)用函數(shù)。 3. 函數(shù)的返回值函數(shù)的返回值 void型函數(shù)型函數(shù)(不需要返回值不需要返回值),無,無return語句。語句。 對于對于int類型的函數(shù),不寫類型的函數(shù),不寫return語句時,相語句時,相當(dāng)于執(zhí)行了當(dāng)于執(zhí)行了rerun 0;語句。語句。 return 語句中表達式的值一般應(yīng)與函數(shù)類型一語句中表達式的值一般應(yīng)與函數(shù)類型一致。致。二、二、 函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)一般調(diào)用形式定義為:函數(shù)一般調(diào)用形式定義為:函數(shù)名函數(shù)名(實際參數(shù)表列實際參數(shù)表列)無參數(shù)函數(shù)不存在無參數(shù)函數(shù)不存在“實際參數(shù)表
55、列實際參數(shù)表列”。有參數(shù)函數(shù)。有參數(shù)函數(shù)的的“實際參數(shù)表列實際參數(shù)表列”的各參數(shù)之間用逗號隔開,主調(diào)函的各參數(shù)之間用逗號隔開,主調(diào)函數(shù)與被調(diào)函數(shù)的形式參數(shù)數(shù)目應(yīng)該相等,實際參數(shù)按順數(shù)與被調(diào)函數(shù)的形式參數(shù)數(shù)目應(yīng)該相等,實際參數(shù)按順序依次對應(yīng)傳遞給形式參數(shù)序依次對應(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ù)中的一個語句。如:中的一個語句。如:print_message(); /*message()是被調(diào)用函數(shù)是被調(diào)用函數(shù) */(2) 被調(diào)函數(shù)作為表達式的運算對象。如:被調(diào)函數(shù)作為表達式的運算對象。
56、如:result5*good(x,y)(3) 被調(diào)函數(shù)作為另一個函數(shù)的實際參數(shù)。如被調(diào)函數(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ù)前對被調(diào)函數(shù)的返回值類型予以說明數(shù)前對被調(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程序的基本單位,一個C51程序至少有一個主函數(shù)main(),也可以由一個主函數(shù)main()和若干個其它函數(shù)構(gòu)成。
59、若干其它函數(shù)受主函數(shù)調(diào)用,被調(diào)用的函數(shù)既可以是編譯器提供的庫函數(shù),也可以是用戶自己根據(jù)需要設(shè)定編制的函數(shù)。(2) 一個函數(shù)由函數(shù)說明部分和函數(shù)體兩部分組成。(3) 函數(shù)說明部分由函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)參數(shù)名和形式參數(shù)類型組成,其中允許沒有函數(shù)參數(shù),函數(shù)名后面必須有1個圓括號,括號內(nèi)就是可有可無的形式參數(shù)表。(4) 函數(shù)體是用大括號圍起來的部分。大括號內(nèi)有兩部分內(nèi)容:一部分是變量及變量的定義;另一部分是由若干語句組成的執(zhí)行部分。如果一個函數(shù)內(nèi)有多個大括號,則最外層的一對大括號為函數(shù)體的范圍。有的函數(shù)體既有變量定義部分,又有執(zhí)行部分;有的函數(shù)體僅有執(zhí)行部分無變量定義部分;有的函數(shù)這兩部分
60、都沒有。 3.4.6 C51程序設(shè)計的編程規(guī)則程序設(shè)計的編程規(guī)則(5) 語句的組成規(guī)則為:每個變量必須先定義后使用;變量名由英文字母組成,英文字母要區(qū)分大小寫,大小寫不同則變量名不同;書寫格式自由,一行可以寫多個語句,一個語句也可以寫成多行,但每條語句必須以“;”結(jié)尾;分號是C語言的必須組成部分,每個語句和數(shù)據(jù)在定義的最后必須有一個分號,程序的最后一個語句也應(yīng)有分號。(6) C語言對I/O操作實現(xiàn)了“函數(shù)化”,分別調(diào)用庫函數(shù)scanf和printf等函數(shù)完成,無專門的輸入/輸出語句。(7) C51的注釋用/*/表示,有了注釋,閱讀程序更方便。C51程序結(jié)構(gòu)如下:全局變量說明/*可被各函數(shù)引用*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教學(xué)設(shè)計方案作業(yè)
- XX公司天花吊頂施工合作合同
- 個人貸款合同范文及格式
- 個人保證擔(dān)保借款合同書正式版
- 臨街門面租賃合同標準版
- 中鐵物資商城物流配送合同新范本
- 個人住房抵押借款合同模板
- 產(chǎn)品生產(chǎn)裝配標準化合同
- 采購預(yù)付款合同范本
- 臨建勞務(wù)合同范本
- 蘇教版六年級下冊數(shù)學(xué)第二單元《圓柱與圓錐》單元分析及全部教案+每課作業(yè)設(shè)計
- 卵巢黃體囊腫破裂教學(xué)查房
- 醫(yī)院定崗定編
- 計算機網(wǎng)絡(luò)畢業(yè)論文3000字
- 2023年大學(xué)物理化學(xué)實驗報告化學(xué)電池溫度系數(shù)的測定
- 農(nóng)村公共基礎(chǔ)知識
- 腦出血的護理課件腦出血護理查房PPT
- 煤礦機電運輸安全培訓(xùn)課件
- 扣繳個人所得稅報告表-(Excel版)
- Unit+4+History+and+Traditions單元整體教學(xué)設(shè)計課件 高中英語人教版(2019)必修第二冊單元整體教學(xué)設(shè)計
- 2023年全國自學(xué)考試00054管理學(xué)原理試題答案
評論
0/150
提交評論