MCS-51單片機(jī)C51程序設(shè)計(jì).ppt_第1頁(yè)
MCS-51單片機(jī)C51程序設(shè)計(jì).ppt_第2頁(yè)
MCS-51單片機(jī)C51程序設(shè)計(jì).ppt_第3頁(yè)
MCS-51單片機(jī)C51程序設(shè)計(jì).ppt_第4頁(yè)
MCS-51單片機(jī)C51程序設(shè)計(jì).ppt_第5頁(yè)
已閱讀5頁(yè),還剩143頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

22 31 1 單片機(jī)原理與接口技術(shù) 太原理工大學(xué) 電子工業(yè)出版社 第5章MCS 51單片機(jī)C51程序設(shè)計(jì) 制作張興忠修審牛昱光 22 31 2 熟悉C51語(yǔ)法基礎(chǔ)和程序結(jié)構(gòu) 掌握C51結(jié)構(gòu)化程序設(shè)計(jì) 掌握C51對(duì)單片機(jī)硬件的訪問(wèn)方法 掌握C51函數(shù)定義與調(diào)用 了解匯編語(yǔ)言和C51的混和編程 本章教學(xué)要求 第5章MCS 51單片機(jī)C51程序設(shè)計(jì) 22 31 3 5 1C51概述5 2C51語(yǔ)法基礎(chǔ)5 2 1標(biāo)識(shí)符和關(guān)鍵字5 2 2數(shù)據(jù)類型5 2 3運(yùn)算符和表達(dá)式5 2 4程序結(jié)構(gòu) 第5章MCS 51單片機(jī)C51程序設(shè)計(jì) 本章目錄 5 3C51對(duì)MCS 51單片機(jī)的訪問(wèn)5 3 1存儲(chǔ)類型5 3 2存儲(chǔ)模式5 3 3對(duì)特殊功能寄存器的訪問(wèn)5 3 4對(duì)存儲(chǔ)器和并行口的訪問(wèn)5 3 5位地址訪問(wèn) 22 31 4 5 4C51函數(shù)5 4 1函數(shù)的分類5 4 2函數(shù)的定義5 4 3函數(shù)的調(diào)用5 4 4對(duì)被調(diào)函數(shù)的說(shuō)明5 4 5中斷函數(shù)5 5C51結(jié)構(gòu)化程序設(shè)計(jì)5 5 1順序結(jié)構(gòu)程序5 5 2選擇結(jié)構(gòu)程序 第5章MCS 51單片機(jī)C51程序設(shè)計(jì) 本章目錄 5 5 3循環(huán)結(jié)構(gòu)程序5 5 4查表程序5 6C51程序設(shè)計(jì)實(shí)例5 6 1單片機(jī)內(nèi) 外部資源應(yīng)用程序設(shè)計(jì)5 6 2C51語(yǔ)言和MCS 51匯編語(yǔ)言混合編程5 6 3編程優(yōu)化的概念習(xí)題與思考題 22 31 5 5 1C51概述 C語(yǔ)言是一種通用的程序設(shè)計(jì)語(yǔ)言 其代碼率高 數(shù)據(jù)類型及運(yùn)算符豐富 位操作能力強(qiáng) 適用于各種應(yīng)用的程序設(shè)計(jì) 使用C語(yǔ)言進(jìn)行單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā) 具有編程靈活 調(diào)試方便 目標(biāo)代碼編譯效率高的特點(diǎn) C語(yǔ)言也是目前使用最廣的單片機(jī)應(yīng)用系統(tǒng)編程語(yǔ)言 由C語(yǔ)言編程的單片機(jī)應(yīng)用程序 稱為單片機(jī)C語(yǔ)言程序 MCS 51系列單片機(jī)開(kāi)發(fā)系統(tǒng)的編譯軟件可以對(duì)51單片機(jī)C語(yǔ)言源程序進(jìn)行編譯 稱為C51編譯器 在C51編譯軟件中可進(jìn)行51單片機(jī)C語(yǔ)言程序的調(diào)試 C51編譯器 22 31 6 1 擴(kuò)展了專門訪問(wèn)MCS 51單片機(jī)硬件的數(shù)據(jù)類型 2 存儲(chǔ)類型按MCS 51單片機(jī)存儲(chǔ)空間分類 3 存儲(chǔ)模式遵循存儲(chǔ)空間選定編譯器模式 4 指針?lè)譃橥ㄓ弥羔樅痛鎯?chǔ)器指針 5 函數(shù)增加了中斷函數(shù)和再入函數(shù) 5 1C51概述 C51特點(diǎn) C51編譯器針對(duì)MCS 51單片機(jī)硬件在下列幾方面對(duì)ANSIC進(jìn)行了擴(kuò)展 22 31 7 使用具有C51編譯擴(kuò)展功能的C語(yǔ)言進(jìn)行MCS 51單片機(jī)應(yīng)用系統(tǒng)的開(kāi)發(fā)編程 簡(jiǎn)稱C51編程 C51編程具有以下特點(diǎn) 1 可管理內(nèi)部寄存器和存儲(chǔ)器的分配 編程時(shí) 無(wú)需考慮不同存儲(chǔ)器的尋址和數(shù)據(jù)類型等細(xì)節(jié)問(wèn)題 2 程序由若干函數(shù)組成 具有良好的模塊化結(jié)構(gòu) 可移植性好 便于項(xiàng)目維護(hù)管理 3 有豐富的子程序庫(kù)可直接引用 從而大大減少用戶編程工作量 提高編程效率 4 與匯編語(yǔ)言交叉編程 用匯編語(yǔ)言編寫與硬件有關(guān)的程序 用C51編寫與硬件無(wú)關(guān)的運(yùn)算程序 充分發(fā)揮兩種語(yǔ)言的長(zhǎng)處 提高開(kāi)發(fā)效率 5 1C51概述 C51特點(diǎn) 22 31 8 C51編程和匯編語(yǔ)言編程過(guò)程一樣 單片機(jī)C語(yǔ)言源程序經(jīng)過(guò)編輯 編譯 連接后生成目標(biāo)程序 BIN和 HEX 文件 然后運(yùn)行即可 調(diào)試51單片機(jī)C語(yǔ)言程序可用KeilC51編譯器 注意 使用C51編程可以取代繁瑣的匯編語(yǔ)言編程 但仍需要了解MCS 51單片機(jī)的硬件結(jié)構(gòu) 所以對(duì)于單片機(jī)系統(tǒng)的開(kāi)發(fā)應(yīng)采用匯編語(yǔ)言與C51混合編程的方法更為有效 5 1C51概述 C51特點(diǎn) 22 31 9 5 2C51語(yǔ)法基礎(chǔ) 標(biāo)識(shí)符用來(lái)標(biāo)識(shí)源程序中某個(gè)對(duì)象的名字 這些對(duì)象可以是語(yǔ)句 數(shù)據(jù)類型 函數(shù) 變量 數(shù)組等 標(biāo)識(shí)符由字符串 數(shù)字和下劃線等組成 應(yīng)該注意的是第一個(gè)字符必須是字母或下劃線 不能用數(shù)字開(kāi)頭 如 1 a 是錯(cuò)誤的 編譯時(shí)會(huì)有錯(cuò)誤提示 在C51編譯器中 只支持標(biāo)識(shí)符的前32位為有效標(biāo)識(shí) C51語(yǔ)言是區(qū)分大小寫的一種高級(jí)語(yǔ)言 如 a 1 和 A 1 是兩個(gè)完全不同的標(biāo)識(shí)符 5 2 1標(biāo)識(shí)符和關(guān)鍵字 標(biāo)識(shí)符 22 31 10 C51中有些庫(kù)函數(shù)的標(biāo)識(shí)符是以下劃線開(kāi)頭的 所以一般不要以下劃線開(kāi)頭命名用戶自定義標(biāo)識(shí)符 標(biāo)識(shí)符在命名時(shí)應(yīng)當(dāng)簡(jiǎn)單 含義清晰 這樣有助于閱讀理解程序 關(guān)鍵字則是編程語(yǔ)言保留的特殊標(biāo)識(shí)符 它們具有固定的名稱和含義 在程序編寫中不允許將關(guān)鍵字另做他用 C51中的關(guān)鍵字除了有ANSIC標(biāo)準(zhǔn)的32個(gè)關(guān)鍵字外 還根據(jù)MCS 51單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的關(guān)鍵字 C51關(guān)鍵字如表5 1所示 在C51的文本編輯器中編寫C程序 系統(tǒng)可以把保留關(guān)鍵字以不同顏色顯示 如int關(guān)鍵字的默認(rèn)顏色為天藍(lán)色 5 2 1標(biāo)識(shí)符和關(guān)鍵字 關(guān)鍵字 22 31 11 5 2 1標(biāo)識(shí)符和關(guān)鍵字 關(guān)鍵字列表 22 31 12 5 2 1標(biāo)識(shí)符和關(guān)鍵字 關(guān)鍵字列表 22 31 13 5 2 1標(biāo)識(shí)符和關(guān)鍵字 關(guān)鍵字列表 22 31 14 5 2 2數(shù)據(jù)類型 C51具有ANSIC的所有標(biāo)準(zhǔn)數(shù)據(jù)類型 其基本數(shù)據(jù)類型包括 char int short long float和double 對(duì)C51編譯器來(lái)說(shuō) short類型和int類型相同 double類型和float類型相同 C51的數(shù)據(jù)類型 22 31 15 除此之外 為了更加有利地利用MCS 51的結(jié)構(gòu) C51還增加了一些特殊的數(shù)據(jù)類型 包括bit sbit sfr sfr16 數(shù)據(jù)類型如表5 2所示 5 2 2數(shù)據(jù)類型 C51的數(shù)據(jù)類型 22 31 16 char類型的長(zhǎng)度是1B 通常用于定義處理字符數(shù)據(jù)的變量或常量 unsignedchar類型用字節(jié)中所有的位表示數(shù)值 可以表達(dá)的數(shù)值范圍是0 255 signedchar類型用字節(jié)中最高位表示數(shù)據(jù)的符號(hào) 0表示正數(shù) 1表示負(fù)數(shù) 負(fù)數(shù)用補(bǔ)碼表示 能表示的數(shù)值范圍是 128 127 unsignedchar常用于處理ASCII字符或用于處理小于或等于255的整型數(shù) 1 char字符類型 5 2 2數(shù)據(jù)類型 char字符類型 22 31 17 2 int整型 int整型長(zhǎng)度為2B 用于存放一個(gè)雙字節(jié)數(shù)據(jù) signedint表示的數(shù)值范圍是 32768 32767 字節(jié)中最高位表示數(shù)據(jù)的符號(hào) 0表示正數(shù) 1表示負(fù)數(shù) unsignedint表示的數(shù)值范圍是0 65535 5 2 2數(shù)據(jù)類型 int整型 22 31 18 long長(zhǎng)整型長(zhǎng)度為4B 用于存放一個(gè)四字節(jié)數(shù)據(jù) 分有符號(hào)long長(zhǎng)整型signedlong和無(wú)符號(hào)long長(zhǎng)整型unsignedlong 默認(rèn)值為signedlong類型 signedint表示的數(shù)值范圍是 2147483648 2147483647 字節(jié)中最高位表示數(shù)據(jù)的符號(hào) 0表示正數(shù) 1表示負(fù)數(shù) unsignedlong表示的數(shù)值范圍是0 4294967295 3 long長(zhǎng)整型 5 2 2數(shù)據(jù)類型 long長(zhǎng)整型 22 31 19 4 float浮點(diǎn)型 float浮點(diǎn)型在十進(jìn)制中具有7位有效數(shù)字 是符合IEEE 754標(biāo)準(zhǔn) 32 的單精度浮點(diǎn)型數(shù)據(jù) 占用4B 具有24位精度 5 2 2數(shù)據(jù)類型 float浮點(diǎn)型 22 31 20 5 指針型 指針型本身就是一個(gè)變量 在這個(gè)變量中存放著指向另一個(gè)數(shù)據(jù)的地址 這個(gè)指針變量要占據(jù)一定的內(nèi)存單元 對(duì)不同的處理器長(zhǎng)度也不盡相同 在C51中它的長(zhǎng)度一般為1 3個(gè)字節(jié) 5 2 2數(shù)據(jù)類型 指針型 22 31 21 bit位標(biāo)量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型 利用它可定義一個(gè)位標(biāo)量 它的值是一個(gè)二進(jìn)制位 不是0 就是1 類似一些高級(jí)語(yǔ)言中的boolean型數(shù)據(jù)的True和False 6 bit位標(biāo)量 5 2 2數(shù)據(jù)類型 bit位標(biāo)量 22 31 22 7 sfr特殊功能寄存器 sfr是一種C51擴(kuò)充數(shù)據(jù)類型 占用一個(gè)內(nèi)存單元 值域?yàn)? 255 利用它可以訪問(wèn)MCS 51單片機(jī)內(nèi)部的所有特殊功能寄存器 如用sfrP1 0 x90定義一個(gè)特殊功能寄存器變量 P1 0 x90是指51單片機(jī)的P1端口地址90H 變量P1即指51單片機(jī)的P1端口 在后面的語(yǔ)句中可以用P1 255 對(duì)P1端口的所有引腳置高電平 之類的語(yǔ)句操作特殊功能寄存器 5 2 2數(shù)據(jù)類型 sfr特殊功能寄存器 22 31 23 8 sfr1616位特殊功能寄存器 sfr16也是一種C51擴(kuò)充數(shù)據(jù)類型 用于定義存在于MCS 51單片機(jī)內(nèi)部RAM的16位特殊功能寄存器 如定時(shí)器T0和T1 sfr16型數(shù)據(jù)占用2個(gè)內(nèi)存單元 取值范圍為0 65535 5 2 2數(shù)據(jù)類型 16位特殊功能寄存器 22 31 24 sbit也是一種C51擴(kuò)充數(shù)據(jù)類型 利用它可以訪問(wèn)芯片內(nèi)部RAM中的可尋址位或特殊功能寄存器中的可尋址位 定義方法有如下三種 1 sbit位變量名 位地址將位的絕對(duì)地址賦給位變量 位地址必須位于80H FFH 特殊功能寄存器的位地址 之間 9 sbit可尋址位 5 2 2數(shù)據(jù)類型 sbit可尋址位 22 31 25 2 sbit位變量名 特殊功能寄存器名 位位置當(dāng)可尋址位位于特殊功能寄存器中時(shí) 可采用這種方法 位位置是一個(gè)0 7之間的常數(shù) 3 sbit位變量名 字節(jié)地址 位位置這種方法是以一個(gè)常數(shù) 字節(jié)地址 作為基地址 該常數(shù)必須在80H FFH 特殊功能寄存器的字節(jié)地址 之間 位位置是一個(gè)0 7之間的常數(shù) 9 sbit可尋址位 5 2 2數(shù)據(jù)類型 sbit可尋址位 22 31 26 MCS 51單片機(jī)中的特殊功能寄存器及其可尋址位 已被預(yù)先定義放在文件reg51 h中 在程序的開(kāi)頭只需加上 include或 include即可 另外 bit還可訪問(wèn)MCS 51單片機(jī)片內(nèi)20H 2FH范圍內(nèi)的位對(duì)象 C51編譯器提供了一個(gè)bdata存儲(chǔ)器類型 允許將具有bdata類型的對(duì)象放入MCS 51單片機(jī)片內(nèi)可位尋址區(qū) 5 2 2數(shù)據(jù)類型 reg51 h 22 31 27 sbit和bit的區(qū)別 sbit定義特殊功能寄存器中的可尋址位 而bit則定義了一個(gè)普通的位變量 一個(gè)函數(shù)中可包含bit類型的參數(shù) 函數(shù)返回值也可為bit類型 5 2 2數(shù)據(jù)類型 sbit和bit 22 31 28 5 2 3運(yùn)算符和表達(dá)式 C51算術(shù)運(yùn)算符有五種 加法運(yùn)算符或正號(hào) 減法運(yùn)算符或負(fù)號(hào) 乘法運(yùn)算符 除法運(yùn)算符 模 求余 運(yùn)算符優(yōu)先級(jí) 先乘除 后加減 先括號(hào)內(nèi) 再括號(hào)外 結(jié)合性 自左至右方向 模運(yùn)算即求余數(shù) 如7 3 結(jié)果是7除以3所得余數(shù)1 1 C51的算術(shù)運(yùn)算符 算術(shù)運(yùn)算符 22 31 29 C51關(guān)系運(yùn)算符有六種 大于 大于等于 相等 不相等優(yōu)先級(jí) 前四個(gè)高 后兩個(gè) 和 級(jí)別低 結(jié)合性 自左至右方向 關(guān)系表達(dá)式的結(jié)果是邏輯值 真 或 假 C51中以 1 代表真 0 代表假 2 C51關(guān)系運(yùn)算符 5 2 3運(yùn)算符和表達(dá)式 關(guān)系運(yùn)算符 22 31 30 C51邏輯運(yùn)算符有三種 邏輯與 邏輯或 邏輯非優(yōu)先級(jí) 邏輯非 最高 結(jié)合性 和 自左至右方向 自右至左方向 運(yùn)算符的兩邊為關(guān)系表達(dá)式 邏輯表達(dá)式和關(guān)系表達(dá)式的值相同 以 0 代表假 以 1 代表真 3 C51邏輯運(yùn)算符 5 2 3運(yùn)算符和表達(dá)式 邏輯運(yùn)算符 22 31 31 C51按位操作運(yùn)算符有六種 按位與 按位或 按位異或 位取反 位右移注 移位操作為補(bǔ)零移位 位運(yùn)算符只能對(duì)整形和字符型運(yùn)算 不能對(duì)實(shí)型數(shù)據(jù)運(yùn)算 如 chara 0 x0f 表達(dá)式a a值為0 xf0 如 chara 0 x22 表達(dá)式a 2值為0 x88 即a值左移兩位 移位后空白位補(bǔ)0 4 位操作運(yùn)算符 5 2 3運(yùn)算符和表達(dá)式 22 31 32 自增1 自減1自增 自減運(yùn)算符可以在變量的前面或后面使用 如 i或 I 意為在使用i之前 先使i值加1或減1 如 i 或i 意為在使用變量i之后 再使i值加1或減1 例如 定義整型變量 inti 6 并有j i 則j值為7 i值也為7 而如有j i 則j值為6 i值為7 5 自增 自減運(yùn)算符 5 2 3運(yùn)算符和表達(dá)式 運(yùn)算符 22 31 33 6 賦值運(yùn)算符 賦值將 右邊的值賦給 左邊的變量 注 不是相等運(yùn)算符 5 2 3運(yùn)算符和表達(dá)式 賦值運(yùn)算符 22 31 34 C51提供了十種復(fù)合賦值運(yùn)算符 采用符合賦值運(yùn)算的目的是為了簡(jiǎn)化程序 提高C51程序的編譯效率 例 a b相當(dāng)于a a b a b相當(dāng)于a a b 7 復(fù)合賦值運(yùn)算符 5 2 3運(yùn)算符和表達(dá)式 復(fù)合賦值運(yùn)算符 22 31 35 8 對(duì)指針操作的運(yùn)算符 取地址運(yùn)算符 指針運(yùn)算符注意 與 的用法意義如下 1 與按位與運(yùn)算符的差別 如果 為 與 運(yùn)算 運(yùn)算符的兩邊必須為變量或常量 如a c b 是取地址運(yùn)算時(shí) 如a b 5 2 3運(yùn)算符和表達(dá)式 指針操作的運(yùn)算符 22 31 36 2 與指針定義時(shí)指針前的 的差別 如char pt 這里的 只表示pt為指針變量 不代表間址取內(nèi)容的運(yùn)算 而c b 是將以b的內(nèi)容為地址的單元內(nèi)容送c變量 C51運(yùn)算的優(yōu)先級(jí)如下所示 非 算術(shù)運(yùn)算 關(guān)系運(yùn)算 和 賦值運(yùn)算 8 對(duì)指針操作的運(yùn)算符 5 2 3運(yùn)算符和表達(dá)式 指針操作的運(yùn)算符 22 31 37 5 2 4程序結(jié)構(gòu) 和ANSIC一樣 C51的程序是一個(gè)函數(shù)定義的集合 可以由任意個(gè)函數(shù)構(gòu)成 其中必須有一個(gè)主函數(shù)main 程序的執(zhí)行是從主函數(shù)main 開(kāi)始的 調(diào)用其他函數(shù)后返回主函數(shù)main 最后在主函數(shù)中結(jié)束整個(gè)程序 而不管函數(shù)的排列順序如何 函數(shù)定義的集合 22 31 38 全局變量說(shuō)明 可被各函數(shù)引用 類型說(shuō)明main 主函數(shù) 聲明部分語(yǔ)句部分 類型說(shuō)明函數(shù)名1 形式參數(shù)表 函數(shù)1 聲明部分語(yǔ)句部分 類型說(shuō)明函數(shù)名n 形式參數(shù)表 函數(shù)n 聲明部分語(yǔ)句部分 5 2 4程序結(jié)構(gòu) 程序的組成 22 31 39 5 3C51對(duì)MCS 51單片機(jī)的訪問(wèn) MCS 51單片機(jī)的存儲(chǔ)器分為片內(nèi)數(shù)據(jù)存儲(chǔ)器 特殊功能寄存器 片外數(shù)據(jù)存儲(chǔ)器 片內(nèi)程序存儲(chǔ)器和片外程序存儲(chǔ)器 在C51中訪問(wèn)這些存儲(chǔ)器時(shí) 是通過(guò)定義不同存儲(chǔ)類型的變量 以說(shuō)明該變量所訪問(wèn)的存儲(chǔ)器位置 5 3 1存儲(chǔ)類型 C51訪問(wèn)存儲(chǔ)器 22 31 40 1 data直接尋址片內(nèi)RAM直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)RAM 128字節(jié) 訪問(wèn)速度快 2 bdata位尋址片內(nèi)RAM可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)RAM 16個(gè)字節(jié) 允許位與字節(jié)混合訪問(wèn) 3 idata間接尋址片內(nèi)RAM間接尋址內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū) 可訪問(wèn)全部?jī)?nèi)部地址空間 00 FFH 256字節(jié) 5 3C51對(duì)MCS 51單片機(jī)的訪問(wèn) 定義存儲(chǔ)類型 22 31 41 4 pdata分頁(yè)尋址片外RAM分頁(yè) 256Byte 外部數(shù)據(jù)存儲(chǔ)區(qū)RAM 256字節(jié) 由操作碼MOVX Ri訪問(wèn) 5 xdata尋址片外RAM尋址片外數(shù)據(jù)存儲(chǔ)區(qū)RAM 64K字節(jié) 由操作碼MOVX DPTR訪問(wèn) 6 code尋址ROM尋址片內(nèi)外程序存儲(chǔ)區(qū)ROM 64K字節(jié) 由操作碼MOVX A DPTR訪問(wèn) 5 3C51對(duì)MCS 51單片機(jī)的訪問(wèn) 定義存儲(chǔ)類型 22 31 42 5 3 2存儲(chǔ)器模式 存儲(chǔ)器模式?jīng)Q定了變量的默認(rèn)存儲(chǔ)類型和參數(shù)傳遞區(qū) 變量定義不明確存儲(chǔ)區(qū)類型時(shí)使用默認(rèn)值 C51有三種存儲(chǔ)器模式 SMALL LARGE和COMPACT 變量的存儲(chǔ)類型 22 31 43 5 3 2存儲(chǔ)器模式 變量的存儲(chǔ)類型 22 31 44 有兩種方式 預(yù)處理命令和編譯控制命令 1 使用預(yù)處理命令設(shè)定數(shù)據(jù)存儲(chǔ)模式需在程序的第一句加預(yù)處理命令 如 pragmasmall 設(shè)定數(shù)據(jù)存儲(chǔ)模式為小編譯模式 pragmacompact 設(shè)定數(shù)據(jù)存儲(chǔ)模式為緊湊編譯模式 pragmalarge 設(shè)定數(shù)據(jù)存儲(chǔ)模式為大編譯模式 數(shù)據(jù)存儲(chǔ)模式的設(shè)定 5 3 2存儲(chǔ)器模式 存儲(chǔ)模式的設(shè)定 22 31 45 2 使用編譯控制命令設(shè)定數(shù)據(jù)存儲(chǔ)模式用C51編譯程序?qū)51源程序進(jìn)行編譯時(shí) 使用編譯控制命令 格式如下 C51源程序名SMALLC51源程序名COMPACTC51源程序名LARGE 5 3 2存儲(chǔ)器模式 存儲(chǔ)模式的設(shè)定 22 31 46 例如 C51源程序?yàn)閒ile1 C 若使程序中的變量存儲(chǔ)類型和參數(shù)傳遞區(qū)限定在外部數(shù)據(jù)存儲(chǔ)區(qū) 即設(shè)定數(shù)據(jù)存儲(chǔ)模式為COMPACT 緊湊編譯模式 方法1 在程序的第一句加預(yù)處理命令 pragmacompact 方法2 用C51對(duì)file1 C進(jìn)行編譯時(shí) 使用編譯控制命令 C51file1 CCOMPACT 5 3 2存儲(chǔ)器模式 存儲(chǔ)模式的設(shè)定 22 31 47 5 3 2存儲(chǔ)器模式 pragmasmall 默認(rèn)存儲(chǔ)類型為MCS 51直接尋址片內(nèi)RAM chardatai j k 在MCS 51片內(nèi)直接尋址RAM中定義了3個(gè)變量 默認(rèn)為自動(dòng)變量 chari j k 未指明存儲(chǔ)類型 由 pragmasmall決定 與前一句完全等價(jià) intxdatam n 在MCS 51片外RAM中定義了兩個(gè)自動(dòng)變量 staticcharm n 在MCS 51片內(nèi)直接尋址RAM中定義了兩個(gè)靜態(tài)變量 unsignedcharxdataram 10 在MCS 51片外RAM中定義了大小為10B的數(shù)組變量 例5 1 變量和函數(shù)的存儲(chǔ)模式設(shè)置 22 31 48 5 3 2存儲(chǔ)器模式 intfunc1 inti intj large 指定函數(shù)中變量是LARGE模式 return i j intfunc2 inti intj 未指明存儲(chǔ)模式 按默認(rèn)的SMALL模式 return i j 例5 1 變量和函數(shù)的存儲(chǔ)模式設(shè)置 22 31 49 5 3 3特殊功能寄存器的訪問(wèn) MCS 51系列單片機(jī)片內(nèi)有21個(gè)特殊功能寄存器 SFR 分散在片內(nèi)RAM區(qū)的0 x80 0 xFF地址范圍內(nèi) 對(duì)SFR的操作只能用直接尋址方式 為了能直接訪問(wèn)這些特殊功能寄存器 C51提供了定義sfr的方法 這與ANSIC不兼容 只適用于MCS 51系列單片機(jī) 定義sfr的方法 22 31 50 1 sfr數(shù)據(jù)類型 特殊功能寄存器數(shù)據(jù)類型來(lái)實(shí)現(xiàn) 定義特殊功能寄存器名的語(yǔ)法如下 sfr特殊功能寄存器名 整型常量 5 3 3特殊功能寄存器的訪問(wèn) 1 sfr數(shù)據(jù)類型 22 31 51 1 sfr數(shù)據(jù)類型 5 3 3特殊功能寄存器的訪問(wèn) sfrPSW 0 xD0 定義程序狀態(tài)字PSW 因MCS 51單片機(jī)的PSW地址為D0H sfrTMOD 0 x89 定義定時(shí) 計(jì)數(shù)器方式控制寄存器TMOD 因MCS 51單片機(jī)的TMOD地址為89H sfrP1 0 x90 定義P1口 因MCS 51單片機(jī)的P1口地址為90H sfrSCON 0 x98 定義串口控制寄存器SCON 因MCS 51單片機(jī)的SCON地址為8H 22 31 52 2 用sbit數(shù)據(jù)類型訪問(wèn)可位尋址的特殊功能寄存器中的位 MCS 51系列單片機(jī)片內(nèi)21個(gè)特殊功能寄存器 SFR 中有11個(gè)特殊功能寄存器是可位尋址的 訪問(wèn)這些可位尋址的特殊功能寄存器中的位的方法可由關(guān)鍵字sbit定義特殊功能寄存器位尋址數(shù)據(jù)類型來(lái)實(shí)現(xiàn) 定義特殊功能寄存器位名的語(yǔ)法有下列三種 sbit特殊功能寄存器位名 特殊功能寄存器名 整型常量其中 特殊功能寄存器名是已由sfr定義了的特殊功能寄存器名 整型常量是位可尋址特殊功能寄存器中的位 是一個(gè)0 7之間的常數(shù) 5 3 3特殊功能寄存器的訪問(wèn) 2 sbit數(shù)據(jù)類型 22 31 53 sbit特殊功能寄存器位名 整型常量1 整型常量2其中 整型常量1是指可位尋址特殊功能寄存器的字節(jié)地址 在80H FFH之間 整型常量2是指該寄存器中的位 是一個(gè)0 7之間的常數(shù) sbit特殊功能寄存器位名 整型常量其中 整型常量是可位尋址特殊功能寄存器的絕對(duì)位地址 位于80H FFH之間 5 3 3特殊功能寄存器的訪問(wèn) 定義方法 22 31 54 標(biāo)準(zhǔn)SFR在reg51 h reg52 h等頭文件中已經(jīng)被定義 只要用文件包含做出申明即可使用 5 3 3特殊功能寄存器的訪問(wèn) sfrPSW 0 xD0 首先定義程序狀態(tài)字PSW 因MCS 51單片機(jī)的PSW地址為D0H sbitOV PSW 2 在前面定義了PSW后 OV位于PSW的第2位 sbitAC 0 xD0 6 D0H是程序狀態(tài)字PSW的字節(jié)地址 輔助進(jìn)位標(biāo)志位AC位于PSW的第6位 sbitRS0 0 xD0 3 工作寄存器組控制位RS0位于PSW的第3位 sbitCY 0 xD7 進(jìn)位標(biāo)志位Cy的絕對(duì)位地址為D7H 實(shí)例 22 31 55 例5 2特殊功能寄存器的訪問(wèn) include reg51 h sbitP10 P1 0 定義P10為P1口第0位 即P1 0口 sbitP12 P1 2 定義P12為P1口第2位 即P1 2口 voidmain P10 1 置位P1 0口 P12 0 復(fù)位P1 2口 PSW 0 x08 程序狀態(tài)字置0 x08 5 3 3特殊功能寄存器的訪問(wèn) 應(yīng)用實(shí)例 22 31 56 5 3 4存儲(chǔ)器和并行口的訪問(wèn) MCS 51單片機(jī)片內(nèi)有128個(gè)字節(jié)的RAM區(qū) 00H 7FH 可擴(kuò)展片外64KB的ROM和RAM 有P0 P1 P2 P3四個(gè)8位雙向并行I O口 每個(gè)端口可以按字節(jié)輸入或輸出 也可以按位進(jìn)行輸入或輸出 四個(gè)口共32根口線 使用C51編程時(shí) 片內(nèi) 外存儲(chǔ)器 片內(nèi)I O口與片外擴(kuò)展I O口可以統(tǒng)一在頭文件中定義 也可以在程序中進(jìn)行定義 一般在程序開(kāi)始的位置 C51定義存儲(chǔ)器 并行口方法如下 在頭文件中定義 22 31 57 1 對(duì)存儲(chǔ)器使用絕對(duì)地址訪問(wèn) C51編譯器提供了一組宏定義用來(lái)對(duì)MCS 51系列單片機(jī)的CODE DATA PDATA和XDATA空間進(jìn)行絕對(duì)地址訪問(wèn) 函數(shù)原型如下 defineCBYTE unsignedcharvolatile 0 x50000L defineDBYTE unsignedcharvolatile 0 x40000L definePBYTE unsignedcharvolatile 0 x30000L defineXBYTE unsignedcharvolatile 0 x20000L defineCWORD unsignedintvolatile 0 x50000L defineDWORD unsignedintvolatile 0 x40000L definePWORD unsignedintvolatile 0 x30000L defineXWORD unsignedintvolatile 0 x20000L 這些函數(shù)原型放在absacc h文件中 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 絕對(duì)地址訪問(wèn) 22 31 58 CBYTE以字節(jié)形式對(duì)CODE區(qū)尋址 DBYTE以字節(jié)形式對(duì)DATA區(qū)尋址 PBYTE以字節(jié)形式對(duì)PDATA區(qū)尋址 XBYTE以字節(jié)形式對(duì)XDATA區(qū)尋址 CWORD以字形式對(duì)CODE區(qū)尋址 DWORD以字形式對(duì)DATA區(qū)尋址 PWORD以字形式對(duì)PDATA區(qū)尋址 XWORD以字形式對(duì)XDATA區(qū)尋址 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 絕對(duì)地址訪問(wèn) 22 31 59 例5 3使用絕對(duì)地址訪問(wèn)存儲(chǔ)器 include include defineuintunsignedint defineucharunsignedcharvoidmain void uintui var1 ucharuc var1 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 絕對(duì)地址訪問(wèn) 22 31 60 例5 3使用絕對(duì)地址訪問(wèn)存儲(chǔ)器 ui var1 XWORD 0 x0000 訪問(wèn)外部RAM的0000H 0001H地址的內(nèi)容 uc var1 XBYTE 0 x0002 訪問(wèn)外部RAM的0002H地址的內(nèi)容 XWORD 0 x0000 0 xAABB 將0 xAABB送入外部RAM的0000H 0001H地址中 XBYTE 0 x0002 0 xAA 將0 xAA送入外部RAM的0002H地址中 for 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 絕對(duì)地址訪問(wèn) 22 31 61 2 對(duì)存儲(chǔ)器使用指針訪問(wèn) 例5 4使用指針訪問(wèn)存儲(chǔ)器 defineucharunsignedchar defineuintunsignedintvoidtest memory void ucharidataivar1 定義一個(gè)指向idata存儲(chǔ)空間的變量 ucharxdata xdp 定義一個(gè)指向XDATA存儲(chǔ)器空間的指針 chardata dp 定義一個(gè)指向DATA存儲(chǔ)器空間的指針 采用指針的方法 可實(shí)現(xiàn)在C51程序中對(duì)任意指定的存儲(chǔ)器地址進(jìn)行操作 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 指針訪問(wèn) 22 31 62 ucharidata idp 定義一個(gè)指向IDATA存儲(chǔ)器空間的指針 xdp 0 x1000 XDATA指針賦值 指向XDATA存儲(chǔ)器地址1000H處 xdp 0 x5A 將數(shù)據(jù)5AH送到XDATA區(qū)的1000H單元 dp 0 x61 DATA指針賦值 指向DATA存儲(chǔ)器地址61H處 dp 0 x23 將數(shù)據(jù)23H送到DATA區(qū)的61H單元 idp 數(shù)據(jù)16H送到IDATA區(qū)的變量ivar1所在的地址單元中 等價(jià)于ivar1 0 x16 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 指針訪問(wèn) 22 31 63 3 C51定義片內(nèi)I O口 單片機(jī)內(nèi)部并行口可用關(guān)鍵字sfr定義 I O口定義格式舉例 sfrP0 0 x80 定義P0口 地址80H sfrP1 0 x90 定義P1口 地址90H 5 3 4存儲(chǔ)器和并行口的訪問(wèn) sfr定義片內(nèi)I O 22 31 64 例5 5操作片內(nèi)I O口 sfrP1 0 x90 定義P1口 地址90H sfrP3 0 xB0 定義P3口 地址B0H sbitDIPswitch P1 4 P1口第4位 P1 4口 為DIP開(kāi)關(guān)的輸入 sbitLEDgreen P3 5 P3口第5位 P3 5口 為L(zhǎng)ED的輸出 voidmain unsignedcharinval 0 for if DIPswitch 1 檢查P1 4口輸入是否為高 inval P1 P1口0 3位輸出與P3口的0 3位相或輸出 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 22 31 65 4 C51定義外部并行口 對(duì)片外擴(kuò)展的I O口 則根據(jù)其硬件譯碼地址 將其看作片外數(shù)據(jù)存儲(chǔ)器的一個(gè)單元 使用 define語(yǔ)句進(jìn)行定義 用指針定義 指針的定義在absacc h頭文件中 5 3 4存儲(chǔ)器和并行口的訪問(wèn) define語(yǔ)句定義片外I O 22 31 66 例5 6操作片外I O口 include absacc h definePAXBYTE 0 xffec 將PA定義為外部I O口 地址為0 xffec voidmain PA 0 x5A 將數(shù)據(jù)5AH寫入地址為0 xffec的存儲(chǔ)單元或I O端口 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 22 31 67 例5 6操作片外I O口 在頭文件或程序中對(duì)片內(nèi) 外I O口進(jìn)行定義以后 在程序中就可以使用這些口了 定義口地址的目的是為了便于C51編譯器按MCS 51單片機(jī)系統(tǒng)的實(shí)際硬件結(jié)構(gòu)建立I O口變量名與其實(shí)際地址的聯(lián)系 以便程序員能用軟件模擬MCS 51單片機(jī)系統(tǒng)的硬件操作 5 3 4存儲(chǔ)器和并行口的訪問(wèn) 22 31 68 5 3 5位地址訪問(wèn) C51對(duì)位變量的定義有3種方法 1 用bit關(guān)鍵字定義C51位變量例如 bitlock 將lock定義為位變量 bitdirention 將direction定義為位變量 bitdisplay 將display定義為位變量 注意 不能定義位變量指針 也不能定義位變量數(shù)組 對(duì)位變量的定義 22 31 69 例如 bitfun bita1 bita2 return a1 5 3 5位地址訪問(wèn) 2 函數(shù)可包含bit的參數(shù)和返回值 函數(shù)的定義 22 31 70 3 可位尋址存儲(chǔ)區(qū)的位變量定義 C51編譯器允許數(shù)據(jù)類型為bdata的變量放入片內(nèi)RAM可位尋址區(qū)中 例如 先定義變量的數(shù)據(jù)類型和存儲(chǔ)類型 然后使用sbit定義位變量 bdataintibdata ibdata定義為bdata整型變量 bdatacharcarry 5 carry定義為bdata字符數(shù)組 sbitmybit0 ibdata 0 mybit0定義為ibdata的第0位 sbitmybit15 ibdata 15 mybit15定義為ibdata的第15位 5 3 5位地址訪問(wèn) 22 31 71 3 可位尋址存儲(chǔ)區(qū)的位變量定義 sbitarrybit07 carry 0 7 arrybit07定義為carry 0 的第7位 sbitarrybit37 carry 3 7 arrybit37定義為carry 3 的第7位 arrybit37 0 carry 3 的第7位賦值為0 位尋址 carry 0 A carry 0 賦值為 A 字節(jié)尋址 位置 操作符 后的最大值取決于指定的基本數(shù)據(jù)類型 對(duì)于char而言是0 7 對(duì)于int而言是0 15 對(duì)于long而言是0 31 5 3 5位地址訪問(wèn) 22 31 72 5 4C51函數(shù) C51程序是由一個(gè)個(gè)函數(shù)構(gòu)成的 在構(gòu)成C51程序的若干個(gè)函數(shù)中 必須有一個(gè)主函數(shù)main 主函數(shù)可根據(jù)需要來(lái)調(diào)用其它函數(shù) 同一個(gè)函數(shù)可以在不同的地方被調(diào)用 22 31 73 5 4 1函數(shù)的分類 從用戶使用角度劃分 函數(shù)分為庫(kù)函數(shù)和用戶自定義函數(shù) 庫(kù)函數(shù)是編譯系統(tǒng)為用戶設(shè)計(jì)的一系列標(biāo)準(zhǔn)函數(shù) 用戶只需調(diào)用 而無(wú)需自己去編寫這些復(fù)雜的函數(shù) 在調(diào)用前要先使用 include包含命令包含和該函數(shù)有關(guān)的頭文件 然后才能調(diào)用 如前面所用到的頭文件reg51 h等 每一種頭文件中包括一系列函數(shù) 22 31 74 用戶自定義函數(shù)是用戶根據(jù)任務(wù)編寫的函數(shù) 從函數(shù)定義形式上可劃分為三種 無(wú)參函數(shù) 有參函數(shù)和空函數(shù) 無(wú)參函數(shù) 函數(shù)中無(wú)參數(shù)定義 該函數(shù)調(diào)用時(shí)無(wú)參數(shù)傳遞 有參函數(shù) 函數(shù)中定義形式參數(shù) 在調(diào)用函數(shù)時(shí) 實(shí)際參數(shù)值傳遞給形式參數(shù) 調(diào)用后返回結(jié)果給調(diào)用它的函數(shù)使用 空函數(shù) 函數(shù)中無(wú)參數(shù) 也無(wú)語(yǔ)句 該函數(shù)可以調(diào)用但沒(méi)有任何功能 該函數(shù)是為了開(kāi)發(fā)程序時(shí)將一些非基本模塊的功能函數(shù)定義成空函數(shù) 先占好位置 以后再用編好的函數(shù)替換它 5 4 1函數(shù)的分類 無(wú)參函數(shù) 有參函數(shù)和空函數(shù) 22 31 75 5 4 2函數(shù)的定義 函數(shù)類型函數(shù)名 函數(shù)體語(yǔ)句 如果函數(shù)沒(méi)有返回值 可以將返回值類型設(shè)為void 函數(shù)以 開(kāi)始 以 結(jié)束 1 無(wú)參函數(shù)的定義 函數(shù)的定義 22 31 76 例5 7無(wú)參函數(shù)的定義與調(diào)用 includevoidfun1 printf ThisisaC51Program n voidmain fun1 5 4 2函數(shù)的定義 函數(shù)的定義 22 31 77 2 有參函數(shù)的定義 函數(shù)類型函數(shù)名 形式參數(shù)表列 函數(shù)體語(yǔ)句return 返回形參名 其中形式參數(shù)表列的各項(xiàng)要用 隔開(kāi) 通過(guò)return語(yǔ)句將需返回的值返回給調(diào)用函數(shù) 5 4 2函數(shù)的定義 函數(shù)的定義 22 31 78 voidfun2 inta intb intsum sum a b returnsum voidmain intx 123 y 456 sum sum fun2 x y 5 4 2函數(shù)的定義 例5 8有參函數(shù)的定義與調(diào)用 22 31 79 3 空函數(shù)的定義 函數(shù)類型函數(shù)名 函數(shù)可以將返回值類型設(shè)為void 例5 9空函數(shù)的定義與調(diào)用 voidfun3 voidmain fun3 5 4 2函數(shù)的定義 22 31 80 5 4 3函數(shù)的調(diào)用 函數(shù)名 實(shí)際參數(shù)表列 函數(shù)的調(diào)用方式有三種 1 把被調(diào)函數(shù)作為主調(diào)函數(shù)中的一個(gè)語(yǔ)句 例如fun1 2 把被調(diào)函數(shù)作為表達(dá)式的一個(gè)運(yùn)算對(duì)象 例如sum 2 fun2 x y 3 把被調(diào)函數(shù)作為另一個(gè)函數(shù)的參數(shù) 例如printf sumis d n fun2 x y 函數(shù)調(diào)用的形式 22 31 81 5 4 4對(duì)被調(diào)函數(shù)的說(shuō)明 1 被調(diào)用函數(shù)必須是已經(jīng)存在的函數(shù) 庫(kù)函數(shù)和用戶自定義函數(shù) 2 調(diào)用庫(kù)函數(shù)需要 include包含和該函數(shù)有關(guān)的頭文件 然后才能調(diào)用 3 調(diào)用用戶自定義函數(shù) 如果被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之后 在主調(diào)函數(shù)前應(yīng)對(duì)被調(diào)函數(shù)作聲明 形式為 函數(shù)類型函數(shù)名 形參表列 函數(shù)調(diào)用條件 22 31 82 voidmain 主函數(shù) intfun1 inta intb 函數(shù)聲明 intd u 3 v 2 d 2 fun1 u v intfun1 inta intb intc c a b return c 5 4 4對(duì)被調(diào)函數(shù)的說(shuō)明 例5 10函數(shù)的定義與聲明 22 31 83 intfun1 inta intb intc c a b return c voidmain intd u 3 v 2 d 2 fun1 u v 5 4 4對(duì)被調(diào)函數(shù)的說(shuō)明 函數(shù)的調(diào)用 上例中被調(diào)函數(shù)在主調(diào)函數(shù)之后 在主調(diào)函數(shù)一開(kāi)始對(duì)被調(diào)函數(shù)進(jìn)行了聲明 若被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前時(shí) 可以不對(duì)被調(diào)函數(shù)進(jìn)行聲明 上例可修改如下 22 31 84 5 4 5中斷函數(shù) 中斷服務(wù)程序在C51程序中是以中斷函數(shù)的形式出現(xiàn)的 中斷函數(shù)的格式為 void函數(shù)名 interruptnusingm 函數(shù)體語(yǔ)句 interrupt是中斷函數(shù)的關(guān)鍵字 n是中斷號(hào) MCS 51的中斷號(hào)與中斷源的對(duì)應(yīng)關(guān)系如表5 5所示 using是指定中斷函數(shù)中選用工作寄存器組的關(guān)鍵字 m是0 3范圍的常數(shù) 若不用該選項(xiàng) 編譯器會(huì)自動(dòng)選擇默認(rèn)工作寄存器組 0組寄存器 中斷函數(shù)的格式 22 31 85 表5 5MCS 51中斷源和中斷的關(guān)系 void函數(shù)名 interruptnusingm 5 4 5中斷函數(shù) 中斷函數(shù)的中斷號(hào) 22 31 86 void函數(shù)名 interruptnusingm 例如 voidT0 srv void interrupt1using1 定時(shí) 計(jì)數(shù)器0中斷函數(shù) 定時(shí) 計(jì)數(shù)器0中斷服務(wù)程序 5 4 5中斷函數(shù) 中斷函數(shù)的格式 22 31 87 1 中斷函數(shù)不能進(jìn)行參數(shù)傳遞 2 中斷函數(shù)沒(méi)有返回值 應(yīng)定義為void型 3 禁止對(duì)中斷函數(shù)的直接調(diào)用 4 如果中斷函數(shù)調(diào)用了其他函數(shù) 被調(diào)函數(shù)與中斷函數(shù)使用相同的寄存器組 5 中斷函數(shù)最好寫在程序尾部 void函數(shù)名 interruptnusingm 5 4 5中斷函數(shù) 編寫中斷函數(shù)要點(diǎn) 22 31 88 5 5C51結(jié)構(gòu)化程序設(shè)計(jì) C51程序是一種結(jié)構(gòu)化程序 由若干模塊組成 每個(gè)模塊中包含若干個(gè)基本結(jié)構(gòu) 而每個(gè)基本結(jié)構(gòu)中可以有若干條語(yǔ)句 基本結(jié)構(gòu)有三種 順序結(jié)構(gòu) 選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu) 5 5 1順序結(jié)構(gòu)程序順序結(jié)構(gòu)是一種最基本 最簡(jiǎn)單的程序結(jié)構(gòu) 在這種結(jié)構(gòu)中 語(yǔ)句被依次逐條地順序執(zhí)行 順序結(jié)構(gòu)程序 22 31 89 例5 11設(shè)計(jì)一乘法程序 乘積放在外部RAM中的0000H單元 voidmain unsignedlongxdata p 設(shè)定p是指向外部RAM區(qū)的unsignedlong指針 unsignedlongx 12345 y 67890 mum mum x y p 0 p指向外部RAM區(qū)0000H單元 p mum 乘積存入外部RAM區(qū)0000H單元 5 5C51結(jié)構(gòu)化程序設(shè)計(jì) 順序程序設(shè)計(jì) 22 31 90 5 5 2選擇結(jié)構(gòu)程序 用if語(yǔ)句可以構(gòu)成選擇結(jié)構(gòu) 它根據(jù)給定的條件進(jìn)行判斷 以決定執(zhí)行某個(gè)分支程序段 語(yǔ)言的if語(yǔ)句有三種基本形式 1 單分支語(yǔ)句if 條件表達(dá)式 語(yǔ)句組 其語(yǔ)義是 如果條件表達(dá)式的值為真 則執(zhí)行其后的語(yǔ)句組 否則不執(zhí)行其后的語(yǔ)句組 單分支語(yǔ)句執(zhí)行過(guò)程可表示為圖5 1所示 單分支程序 22 31 91 例5 12尋找兩個(gè)數(shù)中的大數(shù)輸出 voidmain unsignedxdata p unsigneda 35 b 78 max max a if max b max b p 0 p指向外部RAM區(qū)0000H單元 p max 最大值存入外部RAM區(qū)0000H單元 5 5 2選擇結(jié)構(gòu)程序 例5 12尋找兩個(gè)數(shù)中的大數(shù)輸出 22 31 92 2 雙分支語(yǔ)句 if 條件表達(dá)式 語(yǔ)句組1 else語(yǔ)句組2 其語(yǔ)義是 如果條件表達(dá)式的值為真 則執(zhí)行語(yǔ)句組1 否則執(zhí)行語(yǔ)句組2 其執(zhí)行過(guò)程可表示為圖5 2所示 5 5 2選擇結(jié)構(gòu)程序 雙分支程序 22 31 93 例5 13尋找兩個(gè)數(shù)中的大數(shù)輸出 include reg51 h voidmain unsignedxdata p unsigneda 35 b 78 max if a b max a elsemax b p 0 p指向外部RAM區(qū)0000H單元 p max 最大值存入外部RAM區(qū)0000H單元 5 5 2選擇結(jié)構(gòu)程序 雙分支程序設(shè)計(jì) 22 31 94 3 多分支語(yǔ)句 當(dāng)有多個(gè)分支選擇時(shí) 可采用if else if語(yǔ)句結(jié)構(gòu) 其一般形式為 if 條件表達(dá)式1 語(yǔ)句組1 elseif 條件表達(dá)式2 語(yǔ)句組2 elseif 條件表達(dá)式3 語(yǔ)句組3 elseif 條件表達(dá)式n 語(yǔ)句組n else語(yǔ)句m 5 5 2選擇結(jié)構(gòu)程序 多分支程序 22 31 95 例5 14 如圖5 3所示 單片機(jī)P1口的P1 0和P1 1各接一個(gè)開(kāi)關(guān)K1 K2 P1 4 P1 5 P1 6和P1 7各接一只發(fā)光二極管 由K1和K2的不同狀態(tài)來(lái)確定哪個(gè)發(fā)光二極管被點(diǎn)亮 5 5 2選擇結(jié)構(gòu)程序 多分支程序設(shè)計(jì) 22 31 96 例5 14 include reg51 h voidmain chara a P1 a a 5 5 2選擇結(jié)構(gòu)程序 多分支程序設(shè)計(jì) 22 31 97 4 開(kāi)關(guān)選擇switch語(yǔ)句 switch語(yǔ)句結(jié)構(gòu)的一般形式為 switch 表達(dá)式 case常量表達(dá)式1 語(yǔ)句組1 case常量表達(dá)式2 語(yǔ)句組2 case常量表達(dá)式n 語(yǔ)句組n default 語(yǔ)句組n 1 5 5 2選擇結(jié)構(gòu)程序 多分支程序 22 31 98 例5 15 用switch語(yǔ)句完成例5 14任務(wù) 程序如下 includevoidmain chara a P1 a a 5 5 2選擇結(jié)構(gòu)程序 多分支程序設(shè)計(jì) 22 31 99 在使用switch語(yǔ)句時(shí)還應(yīng)注意以下幾點(diǎn) 1 在case后的各常量表達(dá)式的值不能相同 否則會(huì)出現(xiàn)錯(cuò)誤 2 在case后 允許有多條語(yǔ)句 可以不用 括起來(lái) 3 各case和default子句的先后順序可以變動(dòng) 而不會(huì)影響程序執(zhí)行結(jié)果 4 default子句可以省略不用 5 在每一case語(yǔ)句之后增加break語(yǔ)句 使每一次執(zhí)行之后均可跳出switch語(yǔ)句 這樣才能實(shí)現(xiàn)多分支結(jié)構(gòu) 5 5 2選擇結(jié)構(gòu)程序 注意 22 31 100 5 5 3循環(huán)結(jié)構(gòu)程序 其特點(diǎn)是 在給定條件成立時(shí) 反復(fù)執(zhí)行某程序段 直到條件不成立為止 給定的條件稱為循環(huán)條件 反復(fù)執(zhí)行的程序段稱為循環(huán)體 語(yǔ)言提供了多種循環(huán)語(yǔ)句 可以組成各種不同形式的循環(huán)結(jié)構(gòu) 語(yǔ)言提供的循環(huán)語(yǔ)句有 1 用while語(yǔ)句 2 用do while語(yǔ)句 3 用for語(yǔ)句 語(yǔ)言提供的循環(huán)語(yǔ)句 22 31 101 1 while循環(huán)語(yǔ)句 while循環(huán)語(yǔ)句的一般形式為 while 表達(dá)式 語(yǔ)句組其中表達(dá)式是循環(huán)條件 語(yǔ)句組為循環(huán)體 while語(yǔ)句的語(yǔ)義是 計(jì)算表達(dá)式的值 當(dāng)值為真 非0 時(shí) 執(zhí)行循環(huán)體語(yǔ)句組 5 5 3循環(huán)結(jié)構(gòu)程序 while循環(huán)語(yǔ)句 22 31 102 例5 16 前面的例5 15程序只能執(zhí)行一遍 用while語(yǔ)句使其無(wú)窮循環(huán)執(zhí)行 程序如下 includevoidmain chara while 1 循環(huán)條件表達(dá)式的值始終為1 無(wú)窮循環(huán) a P1 a a 5 5 3循環(huán)結(jié)構(gòu)程序 while循環(huán)語(yǔ)句 22 31 103 例5 17 用do while語(yǔ)句實(shí)現(xiàn)例5 16 程序如下 includevoidmain chara do a P1 a a 循環(huán)條件表達(dá)式的值始終為1 無(wú)窮循環(huán) 5 5 3循環(huán)結(jié)構(gòu)程序 do while循環(huán)語(yǔ)句應(yīng)用 22 31 104 3 for循環(huán)語(yǔ)句 for 表達(dá)式1 表達(dá)式2 表達(dá)式3 語(yǔ)句組for循環(huán)語(yǔ)句的執(zhí)行過(guò)程如下 1 先求解表達(dá)式1 2 求解表達(dá)式2 若其值為真 非0 則執(zhí)行for語(yǔ)句中指定的內(nèi)嵌語(yǔ)句 然后執(zhí)行下面第3步 若其值為假 0 則轉(zhuǎn)到第5步 結(jié)束循環(huán) 5 5 3循環(huán)結(jié)構(gòu)程序 22 31 105 3 for循環(huán)語(yǔ)句 3 求解表達(dá)式3 4 轉(zhuǎn)回上面第2步繼續(xù)執(zhí)行 5 循環(huán)結(jié)束 執(zhí)行for語(yǔ)句體后面的一個(gè)語(yǔ)句 for循環(huán)語(yǔ)句的執(zhí)行過(guò)程如圖5 6所示 5 5 3循環(huán)結(jié)構(gòu)程序 22 31 106 1 for循環(huán)中的 表達(dá)式1 循環(huán)變量賦初值 表達(dá)式2 循環(huán)條件 和 表達(dá)式3 循環(huán)變量增量 都是選擇項(xiàng) 即可以缺省 但 不能缺省 2 省略了 表達(dá)式1 循環(huán)變量賦初值 表示不對(duì)循環(huán)控制變量賦初值 5 5 3循環(huán)結(jié)構(gòu)程序 for循環(huán)語(yǔ)句使用說(shuō)明 22 31 107 3 省略了 表達(dá)式2 循環(huán)條件 則不做其它處理時(shí)便成為死循環(huán) 4 省略了 表達(dá)式3 循環(huán)變量增量 則不對(duì)循環(huán)控制變量進(jìn)行操作 這時(shí)可在語(yǔ)句體中加入修改循環(huán)控制變量的語(yǔ)句 5 5 3循環(huán)結(jié)構(gòu)程序 for循環(huán)語(yǔ)句使用說(shuō)明 22 31 108 5 表達(dá)式1 循環(huán)變量賦初值 和 表達(dá)式3 循環(huán)變量增量 可同時(shí)省略 結(jié)果如同前面第2 4兩種情況 6 3個(gè)表達(dá)式都可同時(shí)省略 結(jié)果如同前面第2 3 4三種情況的綜合效果 7 表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式 但也可是數(shù)值表達(dá)式或字符表達(dá)式 只要其值非零 就執(zhí)行循環(huán)體 5 5 3循環(huán)結(jié)構(gòu)程序 for循環(huán)語(yǔ)句使用說(shuō)明 22 31 109 例5 18用for語(yǔ)句實(shí)現(xiàn)例5 16 include reg51 h voidmain chara for 無(wú)循環(huán)條件 無(wú)窮循環(huán) a P1 讀P1口的值 a a 5 5 3循環(huán)結(jié)構(gòu)程序 for循環(huán)程序設(shè)計(jì) 22 31 110 4 break語(yǔ)句 break語(yǔ)句通常用在循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句中 當(dāng)break用于開(kāi)關(guān)語(yǔ)句switch中時(shí) 可使程序跳出switch而執(zhí)行switch以后的語(yǔ)句 當(dāng)break語(yǔ)句用于do while for while循環(huán)語(yǔ)句中時(shí) 可使程序終止循環(huán)而執(zhí)行循環(huán)結(jié)構(gòu)后面的語(yǔ)句 通常break語(yǔ)句總是與if語(yǔ)句聯(lián)在一起 即滿足條件時(shí)便跳出循環(huán) 5 5 3循環(huán)結(jié)構(gòu)程序 break語(yǔ)句 22 31 111 5 continue語(yǔ)句 continue語(yǔ)句的作用是跳過(guò)循環(huán)體中剩余的語(yǔ)句而強(qiáng)行開(kāi)始執(zhí)行下一次循環(huán) continue語(yǔ)句只用在for while do while等循環(huán)體中 常與if條件語(yǔ)句一起使用 用來(lái)加速循環(huán) 5 5 3循環(huán)結(jié)構(gòu)程序 22 31 112 5 5 4查表程序 在許多單片機(jī)嵌入式應(yīng)用系統(tǒng)中 經(jīng)常采用查表法代替數(shù)學(xué)公式的計(jì)算 特別是對(duì)傳感器的非線性補(bǔ)償?shù)膱?chǎng)合 使用查表法比采用復(fù)雜的曲線擬合效果更好 可以將預(yù)先計(jì)算好的數(shù)據(jù)隨程序裝入到EPROM的一塊指定區(qū)間 形成數(shù)據(jù)表 查表程序可以用數(shù)組實(shí)現(xiàn) 22 31 113 例5 19 defineUCHunsigenedcharUCHcodetem 32 34 36 37 39 41 UCHf to c UCHdeg returntem deg voidmain UCHx x f to c 3 5 5 4查表程序 編寫一個(gè)將攝氏溫度轉(zhuǎn)換為華氏溫度的查表程序 已知攝氏溫度0 1 2 3 4 5對(duì)應(yīng)的華氏溫度為32 34 36 37 39 41 查表程序應(yīng)用 22 31 114 例5 20 片內(nèi)RAM的20H單元存放著一個(gè)0 05H的數(shù) 用查表法求出該數(shù)的平方值放入內(nèi)部RAM的21H單元

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論