版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章
單片機(jī)C51程序設(shè)計(jì)基礎(chǔ)主要結(jié)合MCS-51單片機(jī)特點(diǎn)介紹C51的基本知識(shí),重點(diǎn)講述與單片機(jī)軟件編程密切相關(guān)的內(nèi)容。第3章
單片機(jī)C51程序設(shè)計(jì)基礎(chǔ)C51概述3.1C51的編譯和編譯預(yù)處理3.2C51的基本語(yǔ)法3.3C51的程序結(jié)構(gòu)3.4C51的函數(shù)3.5C51的數(shù)組3.6
讀寫I/O端口的C51編程3.8C51的指針3.73.1C51概述-程序結(jié)構(gòu)概述#include<reg51.h> //預(yù)處理命令//全局變量定義//函數(shù)聲明charfun() //功能函數(shù)定義{ …… //功能函數(shù)體}void函數(shù)名()interruptx//中斷函數(shù)定義{ …… //中斷函數(shù)體}voidmain() //主函數(shù){//局部變量定義//單片機(jī)寄存器初始化函數(shù)
while(1) { …… //主函數(shù)體 }}一個(gè)C51源程序必須包括一個(gè)main函數(shù)?!?include<xxx.h>”語(yǔ)句是包含庫(kù)函數(shù)。全局變量在程序的所有地方都可以賦值和讀出,包括中斷函數(shù)、主函數(shù)。用戶自定義函數(shù)是用戶自己定義、自己調(diào)用的函數(shù)。如果使用中斷、定時(shí)器、串口等功能,則單片機(jī)相關(guān)寄存器的必須要初始化。主程序必須是閉環(huán)結(jié)構(gòu)。注釋部分可以用“//注釋內(nèi)容”或“/*注釋內(nèi)容*/”分割。程序中必須采用英文標(biāo)點(diǎn)。3.1C51概述-程序結(jié)構(gòu)概述#include<reg51.h> //預(yù)處理命令//全局變量定義//函數(shù)聲明charfun() //功能函數(shù)定義{ …… //功能函數(shù)體}void函數(shù)名()interruptx//中斷函數(shù)定義{ …… //中斷函數(shù)體}voidmain() //主函數(shù){//局部變量定義//單片機(jī)寄存器初始化函數(shù)
while(1) { …… //主函數(shù)體 }}除了ANSIC標(biāo)準(zhǔn)的32個(gè)關(guān)鍵字之外,C51還根據(jù)MCS-51單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的關(guān)鍵字。右表按用途列出了KeilC51編譯器擴(kuò)展的關(guān)鍵字。3.1.2
C51對(duì)標(biāo)準(zhǔn)C的擴(kuò)展關(guān)鍵字用途說(shuō)明_at_地址定位為變量進(jìn)行存儲(chǔ)器絕對(duì)空間地址定位alien函數(shù)特性聲明用于聲明與PL/M51兼容函數(shù)small存儲(chǔ)器模式指定使用內(nèi)部數(shù)據(jù)存儲(chǔ)器空間compact存儲(chǔ)器模式指定使用外部“分頁(yè)尋址”數(shù)據(jù)存儲(chǔ)器空間large存儲(chǔ)器模式指定使用外部數(shù)據(jù)存儲(chǔ)器空間code存儲(chǔ)器類型聲明聲明程序存儲(chǔ)器空間data存儲(chǔ)器類型聲明指定直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器bdata存儲(chǔ)器類型聲明指定可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類型聲明指定間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器pdata存儲(chǔ)器類型聲明指定“分頁(yè)尋址”的外部數(shù)據(jù)存儲(chǔ)器xdata存儲(chǔ)器類型聲明指定外部數(shù)據(jù)存儲(chǔ)器bit位變量聲明聲明位變量sbit位變量聲明聲明一個(gè)可位尋址變量sfr特殊功能寄存器聲明聲明一個(gè)8位的特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個(gè)16位的特殊功能寄存器interrupt中斷函數(shù)聲明定義一個(gè)中斷服務(wù)函數(shù)using工作寄存器組定義定義工作寄存器組R0~R7_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX或RTX51Tiny的任務(wù)優(yōu)先級(jí)reentrant再入函數(shù)聲明定義一個(gè)再入函數(shù)_task_任務(wù)聲明定義實(shí)時(shí)多任務(wù)函數(shù)3.1.2
C51對(duì)標(biāo)準(zhǔn)C的擴(kuò)展關(guān)鍵字用途說(shuō)明_at_地址定位為變量進(jìn)行存儲(chǔ)器絕對(duì)空間地址定位alien函數(shù)特性聲明用于聲明與PL/M51兼容函數(shù)small存儲(chǔ)器模式指定使用內(nèi)部數(shù)據(jù)存儲(chǔ)器空間compact存儲(chǔ)器模式指定使用外部“分頁(yè)尋址”數(shù)據(jù)存儲(chǔ)器空間large存儲(chǔ)器模式指定使用外部數(shù)據(jù)存儲(chǔ)器空間code存儲(chǔ)器類型聲明聲明程序存儲(chǔ)器空間data存儲(chǔ)器類型聲明指定直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器bdata存儲(chǔ)器類型聲明指定可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類型聲明指定間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器pdata存儲(chǔ)器類型聲明指定“分頁(yè)尋址”的外部數(shù)據(jù)存儲(chǔ)器xdata存儲(chǔ)器類型聲明指定外部數(shù)據(jù)存儲(chǔ)器bit位變量聲明聲明位變量sbit位變量聲明聲明一個(gè)可位尋址變量sfr特殊功能寄存器聲明聲明一個(gè)8位的特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個(gè)16位的特殊功能寄存器interrupt中斷函數(shù)聲明定義一個(gè)中斷服務(wù)函數(shù)using工作寄存器組定義定義工作寄存器組R0~R7_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX或RTX51Tiny的任務(wù)優(yōu)先級(jí)reentrant再入函數(shù)聲明定義一個(gè)再入函數(shù)_task_任務(wù)聲明定義實(shí)時(shí)多任務(wù)函數(shù)除了ANSIC標(biāo)準(zhǔn)的32個(gè)關(guān)鍵字之外,C51還根據(jù)MCS-51單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的關(guān)鍵字。右表按用途列出了KeilC51編譯器擴(kuò)展的關(guān)鍵字。3.3.2變量-存儲(chǔ)類型存儲(chǔ)類型與存儲(chǔ)空間對(duì)應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)器區(qū),訪問(wèn)速度最快(128字節(jié))bdata可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪問(wèn)(16字節(jié))idata間接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),可訪問(wèn)片內(nèi)全部RAM地址空間(256字節(jié))pdata片外RAM的256字節(jié),由MOVX@Ri訪問(wèn)xdata片外64KB的RAM空間,由MOVX@DPTR訪問(wèn)code代碼存儲(chǔ)區(qū)(64KB),由MOVCA,@A+DPTR訪問(wèn)C51存儲(chǔ)類型與MCS-51單片機(jī)存儲(chǔ)空間的對(duì)應(yīng)關(guān)系如下所示。在C51中對(duì)變量進(jìn)行定義的格式如下:[存儲(chǔ)種類]數(shù)據(jù)類型[存儲(chǔ)類型]變量名;在程序中,用關(guān)鍵字_at_實(shí)現(xiàn)對(duì)指定存儲(chǔ)空間絕對(duì)地址的訪問(wèn),使用_at_的格式如下:
[存儲(chǔ)類型]數(shù)據(jù)類型變量名_at_地址常數(shù);尋址:尋找操作數(shù)所在單元的地址。尋址方式:CPU尋找操作數(shù)所在地址的方法。MCS-51有7種尋址方式:立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對(duì)尋址和位尋址。單片機(jī)的尋址方式(了解)尋址方式使用的變量尋址空間立即尋址直接給出數(shù)值,無(wú)變量ROM直接尋址直接給出地址,無(wú)變量片內(nèi)RAM低128字節(jié)、SFR寄存器尋址R0~R7、A、B、DPTR、位累加器C工作寄存器R0~R7,部分SFR寄存器間接尋址@R0、@R1、SP或@DPTR片內(nèi)RAM或片外RAM變址尋址@A+DPTR、@A+PCROM相對(duì)尋址PC+偏移量ROM位尋址直接給出位地址或位符號(hào)片內(nèi)RAM的位尋址區(qū)、SFR的可尋址位指令中直接給出操作數(shù)的尋址方式,經(jīng)典指令MOVA,#data。【例1】執(zhí)行MOVA,#68H
結(jié)果:(A)=68H
單片機(jī)的尋址方式-立即尋址注意:在立即數(shù)前必須使用“#”標(biāo)志。尋址空間:ROM指令中直接給出操作數(shù)所在存儲(chǔ)單元的地址,經(jīng)典指令MOVA,direct?!纠?】若(30H)=56H,執(zhí)行MOVA,30H后,(A)=56H單片機(jī)的尋址方式-直接尋址尋址空間:片內(nèi)RAM低128字節(jié)SFR(一般采用符號(hào)形式替代直接地址,例:一般將MOVA,80H寫成MOVA,P0)操作數(shù)存放在寄存器中,指令中直接給出該寄存器名稱,經(jīng)典指令MOVA,Rn?!纠?】若(R1)=80H,執(zhí)行MOVA,R1后,(A)=80H
單片機(jī)的尋址方式-寄存器尋址指令中給出的寄存器中存放的不是操作數(shù),而是操作數(shù)所在單元的地址。為了與寄存器尋址區(qū)別,應(yīng)在寄存器的名稱前面加前綴標(biāo)志“@”,經(jīng)典指令MOVA,@Ri。
單片機(jī)的尋址方式-寄存器間接尋址【例4】若(R0)=40H,(40H)=30H,執(zhí)行MOVA,@R0后,(A)=30H。尋址空間:片內(nèi)RAM(@Ri、SP)通用形式:MOV指令@Ri(i=0,1)PUSH/POPdirect(SP發(fā)生相應(yīng)變化)52系列內(nèi)部RAM的高128B只能用該尋址方式片外RAM(@Ri、@DPTR)通用形式:MOVX指令@DPTR
MOVX指令@Ri(i=0,1)單片機(jī)的尋址方式-寄存器間接尋址以數(shù)據(jù)指針DPTR或程序計(jì)數(shù)器PC作基址寄存器,以累加器A作變址寄存器,并以兩者內(nèi)容相加形成操作數(shù)所在單元的地址,經(jīng)典指令MOVCA,@A+DPTR。尋址空間:ROM,尋址范圍可達(dá)到64KB。單片機(jī)的尋址方式-變址尋址【例5】若(DPTR)=1234H,(A)=60H,執(zhí)行MOVCA,@A+DPTR后,(A)=78H將程序計(jì)數(shù)器PC的當(dāng)前值加上指令中給出的偏移量rel,結(jié)果作為目標(biāo)地址的尋址方式。用于跳轉(zhuǎn)指令,實(shí)現(xiàn)程序的分支跳轉(zhuǎn)。單片機(jī)的尋址方式-相對(duì)尋址【例6】若JCL1存于0200H開始的單元,而L1對(duì)應(yīng)的地址是0277H單元,則可計(jì)算出rel為75H,該指令的機(jī)器碼是40H75H。如果PSW.7為1,執(zhí)行JCL1指令后,程序?qū)⑻D(zhuǎn)到0277H單元。
因?yàn)镾JMP是雙字節(jié)指令,則目標(biāo)地址=(PC)+2-2=(PC)即轉(zhuǎn)移的目標(biāo)地址就是SJMP指令的地址,在匯編指令中該偏移地址可用$符號(hào)表示。若在程序的末尾加上SJMP$指令,則程序?qū)⒃谠撎庍M(jìn)行無(wú)限循環(huán),進(jìn)入等待狀態(tài)。若SJMPrel中的rel=FEH(-2),目標(biāo)地址=?單片機(jī)的尋址方式-相對(duì)尋址對(duì)片內(nèi)RAM的位尋址區(qū)和某些可位尋址的特殊功能寄存器進(jìn)行位操作時(shí)的尋址方式,經(jīng)典指令MOVC,bit?!纠?】若位地址20H內(nèi)容為1,執(zhí)行MOVC,20H后,位地址PSW.7的內(nèi)容為1。單片機(jī)的尋址方式-位尋址在C51中的關(guān)鍵字除了ANSIC標(biāo)準(zhǔn)的32個(gè)關(guān)鍵字之外,還根據(jù)MCS-51單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的關(guān)鍵字,右表按用途列出了KeilC51編譯器擴(kuò)展的關(guān)鍵字。3.1.2
C51對(duì)標(biāo)準(zhǔn)C的擴(kuò)展關(guān)鍵字用途說(shuō)明_at_地址定位為變量進(jìn)行存儲(chǔ)器絕對(duì)空間地址定位alien函數(shù)特性聲明用于聲明與PL/M51兼容函數(shù)small存儲(chǔ)器模式指定使用內(nèi)部數(shù)據(jù)存儲(chǔ)器空間compact存儲(chǔ)器模式指定使用外部“分頁(yè)尋址”數(shù)據(jù)存儲(chǔ)器空間large存儲(chǔ)器模式指定使用外部數(shù)據(jù)存儲(chǔ)器空間code存儲(chǔ)器類型聲明聲明程序存儲(chǔ)器空間data存儲(chǔ)器類型聲明指定直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器bdata存儲(chǔ)器類型聲明指定可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類型聲明指定間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器pdata存儲(chǔ)器類型聲明指定“分頁(yè)尋址”的外部數(shù)據(jù)存儲(chǔ)器xdata存儲(chǔ)器類型聲明指定外部數(shù)據(jù)存儲(chǔ)器bit位變量聲明聲明位變量sbit位變量聲明聲明一個(gè)可位尋址變量sfr特殊功能寄存器聲明聲明一個(gè)8位的特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個(gè)16位的特殊功能寄存器interrupt中斷函數(shù)聲明定義一個(gè)中斷服務(wù)函數(shù)using工作寄存器組定義定義工作寄存器組R0~R7_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX或RTX51Tiny的任務(wù)優(yōu)先級(jí)reentrant再入函數(shù)聲明定義一個(gè)再入函數(shù)_task_任務(wù)聲明定義實(shí)時(shí)多任務(wù)函數(shù)3.3.2變量-C51擴(kuò)展數(shù)據(jù)類型數(shù)據(jù)類型位數(shù)字節(jié)數(shù)值域bit1/0或1sfr810~255sfr161620~65535sbit1/0或1(1)位變量bitbit用于定義位變量的名字,編譯器會(huì)對(duì)其分配地址。位變量分配在內(nèi)部RAM的20H~2FH單元相應(yīng)的位區(qū)域,位地址范圍是00~7FH,共128個(gè)。用bit定義位變量的值可以是1,也可以是0。定義方法如下:針對(duì)MCS-51單片機(jī)的硬件特點(diǎn),C51在標(biāo)準(zhǔn)C的基礎(chǔ)上,擴(kuò)展了4種數(shù)據(jù)類型,主要針對(duì)單片機(jī)片內(nèi)存儲(chǔ)區(qū)RAM。bit 位變量;(2)特殊功能寄存器sfr和sfr16特殊功能寄存器分布在片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)的地址單元80H~FFH之間。“sfr”數(shù)據(jù)類型占用一個(gè)內(nèi)存單元,利用它可以直接對(duì)MCS-51單片機(jī)的特殊功能寄存器進(jìn)行定義?!皊fr16”數(shù)據(jù)類型則占兩個(gè)內(nèi)存單元,利用它可以定義占兩個(gè)字節(jié)的特殊功能寄存器,在定義時(shí)的地址選用低位地址。定義方法如下:sfr
特殊功能寄存器名=地址;sfr16
特殊功能寄存器名=地址;3.3.2變量-C51擴(kuò)展數(shù)據(jù)類型(3)特殊功能位sbitsbit用于定義位變量的名字和地址。被定義的位變量是SFR中的可以進(jìn)行位尋址的確定位,該位變量的絕對(duì)地址是確定的且不用編譯器分配。利用sbit定義位變量名字和地址的方法有如下三種。①第一種方法(將位的絕對(duì)地址賦給位變量,位地址必須位于80H~FFH之間)。注意:不要把bit與sbit混淆。bit直接用于定義位變量,而sbit用于定義位變量的名字和地址。sbit 位變量名=位地址;②第二種方法(可尋址位位于特殊功能寄存器中)sbit 位變量名=特殊功能寄存器名^位位置;③第三種方法sbit 位變量名=字節(jié)地址^位位置;3.3.2變量-C51擴(kuò)展數(shù)據(jù)類型文件包含是將另一個(gè)指定的文件內(nèi)容包含進(jìn)來(lái)。文件包含命令的一般格式為:#include的功能是用指定文件的全部?jī)?nèi)容替換該預(yù)處理行。采用<文件名>格式時(shí),在頭文件目錄中查找指定文件;采用"文件名"格式時(shí),在當(dāng)前目錄中査找指定文件,若沒(méi)找到,再到頭文件目錄中查找。#include通常放在C語(yǔ)言程序的開頭,被包含文件的類型通常為以“.h”為后綴的頭文件和以“.c”為后綴的源程序文件。#include<文件名>或#include"文件名"3.2.2C51的編譯預(yù)處理-文件包含3.2.2C51的編譯預(yù)處理-宏定義宏定義命令為#define,作用是用一個(gè)標(biāo)識(shí)符替換一個(gè)字符串。(1)不帶參數(shù)的宏定義。不帶參數(shù)的宏定義又稱符號(hào)常量定義,一般格式為:#define標(biāo)識(shí)符常量表達(dá)式(2)帶參數(shù)的宏定義。帶參數(shù)的宏定義與符號(hào)常量定義的不同之處在于,對(duì)于源程序中出現(xiàn)的宏符號(hào)名不僅進(jìn)行字符串替換,而且還進(jìn)行參數(shù)替換。帶參數(shù)宏定義的一般格式為:#define宏符號(hào)名(參數(shù)表)表達(dá)式3.3.1常量常量又稱為標(biāo)量,它的值在程序執(zhí)行過(guò)程中不能改變。常量的數(shù)據(jù)類型有:1.整型。1234(十進(jìn)制整數(shù))、0x123(十六進(jìn)制整數(shù))、0123L(長(zhǎng)整數(shù))。2.浮點(diǎn)型。有十進(jìn)制數(shù)表示形式和指數(shù)表示形式兩種。3.字符型。單引號(hào)內(nèi)的字符,如'a','b'等。對(duì)于不可顯示的控制字符,可以在該字符前面加一個(gè)反斜杠“\”組成轉(zhuǎn)義字符。4.字符串型。由雙引號(hào)""內(nèi)的字符組成,如"ABCD"、"$1234"等。3.3C51的基本語(yǔ)法變量是一種在程序執(zhí)行過(guò)程中其值能不斷變化的量。在使用一個(gè)變量之前,必須要進(jìn)行定義,用一個(gè)標(biāo)識(shí)符作為變量名并指出它的數(shù)據(jù)類型和存儲(chǔ)類型,以便編譯系統(tǒng)為它分配相應(yīng)的存儲(chǔ)單元。在C51中對(duì)變量進(jìn)行定義的格式如下:3.3.2變量[存儲(chǔ)種類]數(shù)據(jù)類型[存儲(chǔ)類型]變量名;變量的存儲(chǔ)種類有四種:自動(dòng)(auto)、外部(extern)、靜態(tài)(static)和寄存器(register)。3.3.2變量-標(biāo)準(zhǔn)C數(shù)據(jù)類型數(shù)據(jù)類型位數(shù)字節(jié)數(shù)值域signedchar81-128~+127,有符號(hào)字符變量unsignedchar810~255,無(wú)符號(hào)字符變量signedint162-32768~+32767,有符號(hào)整型數(shù)unsignedint1620~65535,無(wú)符號(hào)整型數(shù)signedlong324-2147483648~+2147483647,有符號(hào)長(zhǎng)整型數(shù)unsignedlong3240~+4294967695,無(wú)符號(hào)長(zhǎng)整型數(shù)float324±1.175494E-38~±3.402823E+38,浮點(diǎn)數(shù)(精度6~7位)double648±4.940656458412465E-324~±1.797693134862316E+308,浮點(diǎn)數(shù)(精度15~16位)3.3.2變量-存儲(chǔ)模式(了解)在固定的存儲(chǔ)器地址上進(jìn)行變量的傳遞,是C51標(biāo)準(zhǔn)特征之一。C51存儲(chǔ)模式分為以下幾種:(1)SMALL模式。所有變量都默認(rèn)位于MCS-51單片機(jī)內(nèi)部的數(shù)據(jù)存儲(chǔ)器,這與使用data指定存儲(chǔ)類型的方式一樣。在此模式下,變量訪問(wèn)的效率高,但所有數(shù)據(jù)對(duì)象和堆棧必須使用內(nèi)部RAM。(2)COMPACT模式。變量被定義在分頁(yè)尋址的片外數(shù)據(jù)存儲(chǔ)器中,每一頁(yè)的片外存儲(chǔ)器的長(zhǎng)度為256字節(jié),適用于變量不超過(guò)256字節(jié)的情況,對(duì)應(yīng)pdata存儲(chǔ)類型。(3)LARGE模式。變量被定義在片外數(shù)據(jù)存儲(chǔ)器中(最大可達(dá)64KB),對(duì)應(yīng)xdata存儲(chǔ)類型。該模式要比SMALL和COMPACT產(chǎn)生更多的代碼。3.3.3常用運(yùn)算符與表達(dá)式-算數(shù)運(yùn)算符算術(shù)運(yùn)算符及其說(shuō)明如下表所示。符號(hào)說(shuō)明+加法運(yùn)算-減法運(yùn)算*乘法運(yùn)算/除法運(yùn)算%取模(余數(shù))運(yùn)算++自增1--自減1符號(hào)說(shuō)明&&邏輯與||邏輯或!邏輯非3.3.3常用運(yùn)算符與表達(dá)式-邏輯運(yùn)算符邏輯運(yùn)算符及其說(shuō)明如下表所示。符號(hào)說(shuō)明>大于<小于>=大于或等于<=小于或等于==等于!=不等于3.3.3常用運(yùn)算符與表達(dá)式-關(guān)系運(yùn)算符關(guān)系運(yùn)算符及其說(shuō)明如下表所示。符號(hào)說(shuō)明&按位與|按位或^按位異或~按位取反<<按位左移>>按位右移3.3.3常用運(yùn)算符與表達(dá)式-位運(yùn)算符位運(yùn)算符及其說(shuō)明如下表所示?!纠?-1】編寫程序?qū)U(kuò)展的I/O口PORT(假設(shè)地址是FFC0H,內(nèi)容是20H)的PORT.5清0,PORT.1置1。參考程序1:
xdataunsignedcharPORT_at_
0xffc0;//用_at_指定存儲(chǔ)空間絕對(duì)地址voidmain(){
PORT=0x20;
PORT=(PORT&0xdf)|0x02;}3.3.3常用運(yùn)算符與表達(dá)式-位運(yùn)算符參考程序2:#include<absacc.h>//定義片外I/O口變量PORT要用到頭文件absacc.h#definePORTXBYTE[0xffc0]//XBYTE是絕對(duì)地址訪問(wèn)函數(shù)中的宏voidmain(){
PORT=0x20;
PORT=(PORT&0xdf)|0x02;}賦值運(yùn)算符及其說(shuō)明如下表所示。符號(hào)說(shuō)明=將一個(gè)數(shù)據(jù)的值賦給一個(gè)變量變量=表達(dá)式;賦值語(yǔ)句的格式如下:變量
復(fù)合賦值運(yùn)算符
表達(dá)式;例如:a+=3;x*=y+8;...復(fù)合賦值運(yùn)算首先對(duì)變量進(jìn)行某種運(yùn)算,然后將運(yùn)算的結(jié)果再賦給該變量。復(fù)合運(yùn)算的一般形式為:3.3.3常用運(yùn)算符與表達(dá)式-賦值運(yùn)算符指針和取地址運(yùn)算符及其說(shuō)明如下表所示。符號(hào)說(shuō)明*取內(nèi)容&取變量的地址變量=*指針變量;指針變量=&目標(biāo)變量;取內(nèi)容(指針)和取地址的一般形式分別為:3.3.3常用運(yùn)算符與表達(dá)式-指針和取地址運(yùn)算符C51的程序按結(jié)構(gòu)可分為三類,即順序、分支和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)是程序的基本結(jié)構(gòu),程序自上而下,從main()函數(shù)開始一直到程序運(yùn)行結(jié)束,程序只有一條路可走,沒(méi)有其他的路徑可以選擇。3.4.1分支語(yǔ)句實(shí)現(xiàn)分支結(jié)構(gòu)的語(yǔ)句有:if語(yǔ)句和switch語(yǔ)句。1.if語(yǔ)句判定所給定的條件是否滿足,根據(jù)判定結(jié)果決定執(zhí)行哪種操作。if語(yǔ)句的基本結(jié)構(gòu)為:3.4C51的程序結(jié)構(gòu)if(表達(dá)式){語(yǔ)句;}3.4.1分支語(yǔ)句-if語(yǔ)句if(表達(dá)式){語(yǔ)句;}if(表達(dá)式){語(yǔ)句1;}else{語(yǔ)句2;}(2)形式2C51提供3種形式的if語(yǔ)句:(1)形式1if(表達(dá)式1){語(yǔ)句1;}elseif(表達(dá)式2){語(yǔ)句2;}elseif(表達(dá)式3){語(yǔ)句3;}……else{語(yǔ)句n;}(3)形式3【例8】已知片內(nèi)RAM的30H單元中存放著一個(gè)無(wú)符號(hào)數(shù)X,試編寫程序求出右式的函數(shù)值Y,并將結(jié)果存放在31H單元中。
#defineucharunsignedchardataucharx_at_0x30;datauchary_at_0x31;voidmain(){ if(x>0x20)y=0x01; elseif(x==0x20)y=0x00; elsey=0x0f; while(1);}3.4.1分支語(yǔ)句#include<absacc.h>#definexDBYTE[0x30]#defineyDBYTE[0x31]voidmain(){ if(x>0x20)y=0x01; elseif(x==0x20)y=0x00; elsey=0x0f; while(1);}參考程序2:參考程序1:【例9】已知片內(nèi)RAM的30H單元中存放著一個(gè)有符號(hào)數(shù)X,試編寫程序求出下式的函數(shù)值Y,并將結(jié)果存放在31H單元中。
datacharx_at_0x30;datachary_at_0x31;voidmain(){ if(x==0)y=0x00; elseif((x&0x80)==0)y=0x01; elsey=0x0f; while(1);}3.4.1分支語(yǔ)句#include<absacc.h>#definexDBYTE[0x30]#defineyDBYTE[0x31]voidmain(){ if(x==0)y=0x00; elseif((x&0x80)==0)y=0x01; elsey=0x0f; while(1);} 參考程序2:參考程序1:2.switch語(yǔ)句if語(yǔ)句只有兩個(gè)分支可供選擇,而switch語(yǔ)句是多分支選擇語(yǔ)句。switch語(yǔ)句的一般形式如下:switch(表達(dá)式){
case常量表達(dá)式1:{語(yǔ)句1;}break;
case常量表達(dá)式2:{語(yǔ)句2;}break;
……
case常量表達(dá)式n:{語(yǔ)句n;}break;
default:{語(yǔ)句n+1;}}3.4.1分支語(yǔ)句-switch語(yǔ)句【例3-2】在單片機(jī)程序設(shè)計(jì)中,常用switch語(yǔ)句作為鍵盤按鍵按下的判別,并根據(jù)按下鍵的鍵號(hào)跳向各自的分支處理程序。參考程序:
keynum=keyscan();switch(keynum){
case1: key1();break;//如果鍵值為1,則執(zhí)行函數(shù)key1()
case2: key2();break;//如果鍵值為2,則執(zhí)行函數(shù)key2()
case3: key3();break;//如果鍵值為3,則執(zhí)行函數(shù)key3()
case4: key4();break;//如果鍵值為4,則執(zhí)行函數(shù)key4()
……
default:;break;}3.4.1分支語(yǔ)句-switch語(yǔ)句實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句有:while語(yǔ)句、do-while語(yǔ)句和for語(yǔ)句。1.while語(yǔ)句
while語(yǔ)句的語(yǔ)法形式為:3.4.2循環(huán)語(yǔ)句-while語(yǔ)句表達(dá)式是while循環(huán)能否繼續(xù)的條件,如果表達(dá)式為真,就重復(fù)執(zhí)行循環(huán)體語(yǔ)句;反之,則終止循環(huán)體內(nèi)的語(yǔ)句。while循環(huán)結(jié)構(gòu)的特點(diǎn)在于,循環(huán)條件的測(cè)試在循環(huán)體的開頭,如條件不成立,則循環(huán)體內(nèi)的重復(fù)操作一次也不能執(zhí)行。while(表達(dá)式){
循環(huán)體語(yǔ)句;}2.do-while語(yǔ)句do-while語(yǔ)句的語(yǔ)法形式如下:do{
循環(huán)體語(yǔ)句;}while(表達(dá)式);do-while語(yǔ)句的特點(diǎn)是先執(zhí)行內(nèi)嵌的循環(huán)體語(yǔ)句,再計(jì)算表達(dá)式,如果表達(dá)式的值為非0,則繼續(xù)執(zhí)行循環(huán)體語(yǔ)句,直到表達(dá)式的值為0時(shí)結(jié)束循環(huán)。3.4.2循環(huán)語(yǔ)句-do-while語(yǔ)句3.for語(yǔ)句for語(yǔ)句的語(yǔ)法形式如下:for(表達(dá)式1;表達(dá)式2;表達(dá)式3){
循環(huán)體語(yǔ)句;}for的執(zhí)行過(guò)程如下:①計(jì)算“表達(dá)式1”,表達(dá)式1通常稱為“初值設(shè)定表達(dá)式”。②計(jì)算“表達(dá)式2”,表達(dá)式2通常稱為“終值條件表達(dá)式”,若滿足條件,轉(zhuǎn)下一步,若不滿足條件,則轉(zhuǎn)步驟⑤。③執(zhí)行一次for循環(huán)體。④計(jì)算“表達(dá)式3”,“表達(dá)式3”通常稱為“更新表達(dá)式”,執(zhí)行完成后,轉(zhuǎn)向步驟②。⑤結(jié)束循環(huán),執(zhí)行for循環(huán)之后的語(yǔ)句。3.4.2循環(huán)語(yǔ)句-for語(yǔ)句【例3-3】分別用while語(yǔ)句、do-while語(yǔ)句和for語(yǔ)句編寫求和程序,求1+2+3+…+10的和。
voidmain(){unsignedintnum,sum;num=1;sum=0;while(num<=10){sum+=num;num++;}}參考程序1:voidmain(){unsignedintnum,sum;num=1;sum=0;do{sum+=num;
num++;}while(num<=10);}參考程序2:3.4.2循環(huán)語(yǔ)句-for語(yǔ)句voidmain(){
unsignedintnum,sum;
sum=0;
for(num=1;num<=10;num++)
sum+=num;}參考程序3:【例3-4】編寫賦值程序,使片內(nèi)RAM30H~3FH單元的內(nèi)容分別為00H~0FH。
dataunsignedcharbuffer[16]_at_0x30;voidmain(){
unsignedchari;
for(i=0;i<16;i++)
buffer[i]=i;}參考程序:3.4.2循環(huán)語(yǔ)句-for語(yǔ)句【例10】試編寫程序,將片內(nèi)RAM40H~50H單元的數(shù)據(jù)塊,全部搬移到片外RAM從2000H起始的存儲(chǔ)區(qū)域。
#defineucharunsignedchardataucharbuffer1[17]_at_0x40;xdatauchar buffer2[17]_at_0x2000;voidmain(){ uchari; for(i=0;i<17;i++) { buffer2[i]=buffer1[i]; } while(1);}3.4.2循環(huán)語(yǔ)句參考程序:【例11】試編寫程序?qū)⑵瑑?nèi)RAM以30H為起始地址的數(shù)據(jù)塊傳送到片外RAM以1000H為起始地址的區(qū)域,直到發(fā)現(xiàn)“#”字符,傳送停止。(假設(shè)數(shù)據(jù)塊長(zhǎng)度為10)
#defineucharunsignedchardataucharbuffer1[10]_at_0x30;xdataucharbuffer2[10]_at_0x1000;voidmain(){ uchari; i=0; while((i<10)&&(buffer1[i]!=0x23)) { buffer2[i]=buffer1[i]; i++; } while(1);}參考程序:3.4.2循環(huán)語(yǔ)句【例12】試編寫程序,查找片外RAM以1000H為起始地址20個(gè)單元數(shù)據(jù)的最小值,并將結(jié)果送入片內(nèi)RAM30H單元。
#defineucharunsignedcharxdataucharbuffer[20]_at_0x1000;dataucharx_at_0x30;voidmain(){ uchari; x=0xff; for(i=0;i<20;i++) if(buffer[i]<x)x=buffer[i]; while(1);}參考程序:3.4.2循環(huán)語(yǔ)句3.5.1函數(shù)的定義和分類函數(shù)是一個(gè)完成一定相關(guān)功能的執(zhí)行代碼段。在高級(jí)語(yǔ)言中,函數(shù)與另外兩個(gè)名詞“子程序”和“過(guò)程”用來(lái)描述同樣的事情。一個(gè)C51程序必須至少有一個(gè)函數(shù),以main為名,稱為主函數(shù)。主函數(shù)是唯一的,整個(gè)程序從這個(gè)主函數(shù)開始執(zhí)行。從結(jié)構(gòu)上分,C51函數(shù)可分為主函數(shù)main()和普通函數(shù)兩種。而普通函數(shù)又分為兩種:標(biāo)準(zhǔn)庫(kù)函數(shù)和用戶自定義函數(shù)。
3.5C51的函數(shù)每個(gè)庫(kù)函數(shù)都在相應(yīng)的頭文件中給出了函數(shù)原型聲明,用戶如果需要使用庫(kù)函數(shù),必須在程序的開頭處采用預(yù)處理命令#include將有關(guān)頭文件包含進(jìn)來(lái)。
例如,為便于對(duì)特殊功能寄存器進(jìn)行讀寫操作,我們要在程序開頭處使用以下命令:3.5.1函數(shù)的定義和分類-C51標(biāo)準(zhǔn)庫(kù)函數(shù)#include<reg51.h>#include<stdio.h>調(diào)用輸出函數(shù)printf時(shí),我們要在程序開頭處使用以下命令:(1)字符函數(shù)CTYPE.H。通常用來(lái)對(duì)字符做檢查和轉(zhuǎn)換。(2)內(nèi)部函數(shù)INTRINS.H。_crol_、_cror_可以實(shí)現(xiàn)變量循環(huán)移位,_nop_可以執(zhí)行一次空操作。(3)標(biāo)準(zhǔn)輸入/輸出函數(shù)STDIO.H。標(biāo)準(zhǔn)I/O函數(shù)通過(guò)MCS-51單片機(jī)的串行口讀寫數(shù)據(jù)。(4)標(biāo)準(zhǔn)函數(shù)STDLIB.H??梢酝瓿蓴?shù)據(jù)類型轉(zhuǎn)換以及存儲(chǔ)器分配操作。(5)字符串處理函數(shù)STRING.H。通常接收串指針作為輸入值。(6)絕對(duì)地址訪問(wèn)函數(shù)ABSACC.H。(7)專用寄存器文件REGxx.H。包括了51系列所有的SFR及其中可尋址位(除P0~P3口外)的定義。3.5.1函數(shù)的定義和分類-C51標(biāo)準(zhǔn)庫(kù)函數(shù)(1)無(wú)參函數(shù)此種函數(shù)在被調(diào)用時(shí),既無(wú)參數(shù)輸入,也不返回結(jié)果給調(diào)用函數(shù),只是為完成某種操作而編寫的函數(shù)。無(wú)參函數(shù)的定義形式為:無(wú)參函數(shù)一般不帶返回值,因此函數(shù)的返回值類型標(biāo)識(shí)符可省略。返回值類型標(biāo)識(shí)符函數(shù)名(){
函數(shù)體;}3.5.1函數(shù)的定義和分類-用戶自定義函數(shù)voiddelay1s(){ unsignedinti,j; for(i=0;i<1000;i++) for(j=0;j<125;j++);}【例3-5】已知單片機(jī)的fosc=12MHz,編寫一個(gè)延時(shí)1s的函數(shù)。分析:晶振頻率fosc=12MHz時(shí),一個(gè)機(jī)器周期為12/fosc=1μs,因此延時(shí)1s需要消耗1000000個(gè)機(jī)器周期(1000000μs)。根據(jù)經(jīng)驗(yàn),利用C51的for語(yǔ)句進(jìn)行內(nèi)部循環(huán)大約延時(shí)8個(gè)機(jī)器周期(不同的編譯器會(huì)產(chǎn)生不同的延時(shí)),因此將for語(yǔ)句循環(huán)125次可以得到1ms,采用兩個(gè)for嵌套語(yǔ)句可以得到1s。參考程序:3.5.1函數(shù)的定義和分類-用戶自定義函數(shù)(2)有參函數(shù)調(diào)用此種函數(shù)時(shí),必須提供實(shí)際的輸入函數(shù)。有參函數(shù)的定義形式為:返回值類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)列表)形式參數(shù)說(shuō)明{
函數(shù)體;}3.5.1函數(shù)的定義和分類-用戶自定義函數(shù)【例3-6】已知單片機(jī)的fosc=12MHz,編寫一個(gè)延時(shí)nms的函數(shù)。
voiddelaynms(unsignedintn){
unsignedinti,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);}參考程序:3.5.1函數(shù)的定義和分類-用戶自定義函數(shù)【例3-7】定義一個(gè)函數(shù)max(),用于求兩個(gè)數(shù)中的大數(shù)。
inta,b;intmax(a,b){ if(a>b)return(a); else
return(b);}參考程序:3.5.1函數(shù)的定義和分類-用戶自定義函數(shù)(3)空函數(shù)此種函數(shù)體內(nèi)是空白的。調(diào)用空函數(shù)時(shí),什么工作也不做,不起任何作用。定義空函數(shù)的目的,并不是為了執(zhí)行某種操作,而是為了以后程序功能的擴(kuò)充??蘸瘮?shù)的定義形式為:返回值類型標(biāo)識(shí)符函數(shù)名(){}3.5.1函數(shù)的定義和分類-用戶自定義函數(shù)調(diào)用者稱為主調(diào)函數(shù),被調(diào)用者稱為被調(diào)函數(shù)。1.函數(shù)調(diào)用的一般形式3.5.2函數(shù)的調(diào)用-函數(shù)調(diào)用的一般形式函數(shù)名(實(shí)際參數(shù)列表);若被調(diào)函數(shù)是有參函數(shù),則主調(diào)函數(shù)必須把被調(diào)函數(shù)所需的參數(shù)傳遞給被調(diào)函數(shù)。傳遞給被調(diào)函數(shù)的數(shù)據(jù)稱為實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參),必須與形參的數(shù)據(jù)在數(shù)量、類型和順序上都一致。實(shí)參可以是常量、變量和表達(dá)式。實(shí)參對(duì)形參的數(shù)據(jù)是單向的,即只能將實(shí)參傳遞給形參。2.函數(shù)調(diào)用的方式(1)函數(shù)調(diào)用語(yǔ)句。把被調(diào)用函數(shù)的函數(shù)名作為主調(diào)函數(shù)的一個(gè)語(yǔ)句。例如:(2)函數(shù)結(jié)果作為表達(dá)式的一個(gè)運(yùn)算對(duì)象。例如:要求被調(diào)用函數(shù)帶有return語(yǔ)句,以便返回一個(gè)明確的數(shù)值參加表達(dá)式的運(yùn)算。(3)函數(shù)參數(shù)。被調(diào)用函數(shù)作為另一個(gè)函數(shù)的實(shí)際參數(shù)。例如:3.5.2函數(shù)的調(diào)用-函數(shù)調(diào)用的方式delay1s();result=2*max(a,b);m=max(a,max(u,v));【例3-10】89C51的P1口接了8個(gè)發(fā)光二極管,如右圖所示,請(qǐng)編程實(shí)現(xiàn)發(fā)光二極管由右向左流水顯示。
參考程序1:#include
<reg51.h>#include
<intrins.h> #define
uintunsignedint voiddelaynms(uintn) { uinti,j;for(i=0;i<n;i++)
for(j=0;j<125;j++);}voidmain(){ P1=0xfe; while(1) {delaynms(500); P1=_crol_(P1,1);}}3.8讀寫I/O端口的C51編程【例3-10】89C51的P1口接了8個(gè)發(fā)光二極管,如右圖所示,請(qǐng)編程實(shí)現(xiàn)發(fā)光二極管由右向左流水顯示。
參考程序2:#include
<reg51.h>#defineucharunsignedchar#define
uintunsignedint voiddelaynms(uintn) { uinti,j;for(i=0;i<n;i++)
for(j=0;j<125;j++);}3.8讀寫I/O端口的C51編程voidmain(){
uchari,temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++)
{
P1=~temp;
delaynms(500);
temp=temp<<1;
}
}}【例】89C51的P1口接了8個(gè)發(fā)光二極管,如下圖所示,請(qǐng)編程實(shí)現(xiàn)如下功能:1)讓其中一個(gè)發(fā)光二極管發(fā)光;2)讓其中一個(gè)發(fā)光二極管閃爍顯示,間隔時(shí)間為1s;3)兩只發(fā)光二極管交替閃爍顯示,間隔時(shí)間為1s;4)八只發(fā)光二極管依次流水顯示,間隔時(shí)間為1s。
3.8讀寫I/O端口的C51編程3.函數(shù)調(diào)用的條件(1)被調(diào)用函數(shù)必須是已經(jīng)存在的函數(shù)。(2)如果程序中使用了庫(kù)函數(shù),或使用了不在同一文件中的另外自定義函數(shù),則應(yīng)該在程序的開頭處使用#include包含語(yǔ)句。(3)如果程序中使用了自定義函數(shù),且該函數(shù)與調(diào)用它的函數(shù)同在一個(gè)文件中,則應(yīng)根據(jù)主調(diào)用函數(shù)與被調(diào)用函數(shù)在文件中的位置,決定是否對(duì)被調(diào)用函數(shù)做出說(shuō)明。①如果被調(diào)用函數(shù)在主調(diào)用函數(shù)之后,一般應(yīng)在主調(diào)用函數(shù)中,在被調(diào)用函數(shù)調(diào)用之前,對(duì)被調(diào)用函數(shù)的返回值類型做出說(shuō)明。②如果被調(diào)用函數(shù)出現(xiàn)在主調(diào)用函數(shù)之前,不用對(duì)被調(diào)用函數(shù)進(jìn)行說(shuō)明。通常把主函數(shù)main()放在最后。3.5.2函數(shù)的調(diào)用-函數(shù)調(diào)用的條件3.6.1數(shù)組的定義1.一維數(shù)組具有一個(gè)下標(biāo)的數(shù)組元素組成的數(shù)組稱為一維數(shù)組,一維數(shù)組的形式如下:其中,數(shù)組名是一個(gè)標(biāo)識(shí)符,元素個(gè)數(shù)是一個(gè)常量表達(dá)式,不能是含有變量的表達(dá)式。在定義數(shù)組時(shí),可以對(duì)數(shù)組進(jìn)行整體初始化,若定義后對(duì)數(shù)組賦值,則只能對(duì)每個(gè)元素分別賦值。3.6C51的數(shù)組類型說(shuō)明符數(shù)組名[元素個(gè)數(shù)];2.二維數(shù)組或多維數(shù)組具有兩個(gè)或兩個(gè)以上下標(biāo)的數(shù)組,稱為二維數(shù)組或多維數(shù)組。定義二維數(shù)組的一般形式如下:其中,數(shù)組名是一個(gè)標(biāo)識(shí)符,行數(shù)和列數(shù)都是常量表達(dá)式。。二維數(shù)組可以在定義時(shí)進(jìn)行整體初始化,也可在定義后單個(gè)地進(jìn)行賦值。3.6.1數(shù)組的定義類型說(shuō)明符數(shù)組名[行數(shù)][列數(shù)];3.字符數(shù)組若一個(gè)數(shù)組的元素是字符型的,則該數(shù)組就是一個(gè)字符數(shù)組。例如:C51還允許用字符串直接給字符數(shù)組置初值,例如:chara[10]={'H','E','L','L','O','!','\0'};chara[10]={"HELLO!"};用雙引號(hào)括起來(lái)的一串字符,稱為字符串常量,C51編譯器會(huì)自動(dòng)地在字符串末尾加上結(jié)束符‘\0’(ASCII碼值為0的字符)。用單引號(hào)括起來(lái)的字符為字符的ASCII碼值,而不是字符串。一個(gè)字符串可以用一維數(shù)組來(lái)裝入,但數(shù)組的元素?cái)?shù)目一定要比字符多一個(gè),以便C51編譯器自動(dòng)在其后面加入結(jié)束符'\0'。3.6.1數(shù)組的定義【例3-8】使用查表法,計(jì)算數(shù)0~9的平方。
#defineucharunsignedchar ucharcodesquare[10]={0,1,4,9,16,25,36,49,64,81};ucharfuction(ucharnumber){
returnsquare[number];} voidmain() {
ucharresult;
result=fuction(7);
while(1);}參考程序:3.6.2數(shù)組的應(yīng)用【例3-10】89C51的P1口接了8個(gè)發(fā)光二極管,如右圖所示,請(qǐng)編程實(shí)現(xiàn)發(fā)光二極管由右向左流水顯示。
參考程序3:3.6.2數(shù)組的應(yīng)用voidmain(){
uchari;
while(1)
{
for(i=0;i<8;i++)
{
P1=tab[i];
delaynms(500);
}
}}#include
<reg51.h>#include
<intrins.h> #defineucharunsignedchar#define
uintunsignedintuchar
codetab[]={0xfe,0xfd,
0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voiddelaynms(uintn) { uinti,j;for(i=0;i<n;i++)
for(j=0;j<125;j++);}【例13】試編寫程序,求平方和c=a2+b2,設(shè)a、b分別存于內(nèi)部RAM的40H、41H兩個(gè)單元(假設(shè)a、b均小于10),計(jì)算結(jié)果存在內(nèi)部RAM的42H單元中。
#defineucharunsignedchardataucharx_at_0x40;datauchary_at_0x41;dataucharz_at_0x42;ucharcodesquare[10]={0,1,4,9,16,25,36,49,64,81};ucharfuction(ucharnumber){
returnsquare[number];} voidmain() { z=fuction(x)+fuction(y);
while(1);} 參考程序1:3.6.2數(shù)組的應(yīng)用#defineucharunsignedchar#include<absacc.h>#definexDBYTE[0x40]#defineyDBYTE[0x41]#definezDBYTE[0x42]ucharcodesquare[10]={0,1,4,9,16,25,36,49,64,81};ucharfuction(ucharnumber){
returnsquare[number];} voidmain() { z=fuction(x)+fuction(y);
while(1);} 參考程序2:3.7.1指針與地址
一個(gè)程序的指令、常量和變量等都要存放在機(jī)器內(nèi)存單元中,而機(jī)器內(nèi)存是按字節(jié)來(lái)劃分存儲(chǔ)單元的。
每個(gè)存儲(chǔ)單元都賦予一個(gè)編號(hào),這就是存儲(chǔ)單元的地址。
每個(gè)存儲(chǔ)單元中所存放的數(shù)據(jù),稱為該存儲(chǔ)單元的內(nèi)容。
變量的地址就稱為該變量的指針。專門用來(lái)存放另一個(gè)變量的地址的變量,則稱之為“指針變量”。3.7C51的指針-指針與地址
為了表示指針變量和它所指向的變量之間的關(guān)系,C語(yǔ)言中用符號(hào)“*”來(lái)表示“指向”。3.7.1指針與地址符號(hào)“*”稱為指針運(yùn)算符,它只能與指針變量一起聯(lián)用,結(jié)果是得到該指針變量所指向變量的值。指針的定義:“標(biāo)識(shí)符”:是所定義的指針名?!皵?shù)據(jù)類型”:說(shuō)明該指針?biāo)赶虻淖兞康念愋??!按鎯?chǔ)器類型1”:指針?biāo)笖?shù)據(jù)的存儲(chǔ)器空間?!按鎯?chǔ)器類型2”:指針變量本身的存儲(chǔ)器空間。3.7.2指針的定義“存儲(chǔ)器類型1”和“存儲(chǔ)器類型2”是可選項(xiàng),它是KeilC51編譯器的一種擴(kuò)展。數(shù)據(jù)類型[存儲(chǔ)器類型1]*[存儲(chǔ)器類型2]標(biāo)識(shí)符;一般指針的語(yǔ)句如下:c_ptr、i_ptr、l_ptr全部位于MCS-51單片機(jī)的片內(nèi)數(shù)據(jù)存儲(chǔ)器中??芍付ㄒ话阒羔槺旧淼拇鎯?chǔ)器空間位置,例如:3.7.2指針的定義-一般指針char*c_ptr;int*i_ptr;long*l_ptr;
char*xdatastrptr; //位于xdata空間的一般指針int*datanumptr; //位于data空間的一般指針long*idatavarptr; //位于idata空間的一般指針指定對(duì)象具有明確的存儲(chǔ)器空間,例如:指定指針本身的存儲(chǔ)器空間位置,例如:3.7.2指針的定義-基于存儲(chǔ)器的指針chardata*str;
//指向
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作心得體會(huì)總結(jié)
- 2025年度典當(dāng)物品鑒定與拍賣代理服務(wù)合同3篇
- 二零二五年度軍事通信保密協(xié)議及網(wǎng)絡(luò)維護(hù)合同3篇
- 二零二五年度幼兒早期教育托管班入園協(xié)議書3篇
- 二零二五年度養(yǎng)殖場(chǎng)租賃與農(nóng)業(yè)生態(tài)循環(huán)經(jīng)濟(jì)發(fā)展合作合同3篇
- 2025年度新型建筑材料內(nèi)部承包協(xié)議書3篇
- 2025年度農(nóng)村保潔員崗位職責(zé)及待遇合同
- 2025年度水產(chǎn)養(yǎng)殖廢棄物處理設(shè)施建設(shè)合作協(xié)議合同3篇
- 2025年度教育培訓(xùn)機(jī)構(gòu)掛靠合作協(xié)議書標(biāo)準(zhǔn)模板3篇
- 二零二五年度農(nóng)業(yè)現(xiàn)代化土地承包合作框架協(xié)議3篇
- 2023年鞍山市海城市教育局畢業(yè)生招聘筆試真題
- 遼寧省撫順縣2024-2025學(xué)年九年級(jí)上學(xué)期期末物理試卷(含答案)
- 2024-2025學(xué)年安徽省合肥市巢湖市三年級(jí)數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)測(cè)試試題含解析
- 浙江省寧波市九校2023-2024學(xué)年高一上期末聯(lián)考生物試題
- 乳腺中心建設(shè)方案
- 提高有風(fēng)險(xiǎn)患者預(yù)防跌倒墜床護(hù)理措施落實(shí)率品管圈PDCA案例匯報(bào)
- 安環(huán)部2025年度工作計(jì)劃
- 2024年行政執(zhí)法人員執(zhí)法資格知識(shí)考試題庫(kù)(附含答案)
- 交通運(yùn)輸安全風(fēng)險(xiǎn)管控制度
- 北京城市學(xué)院《食品質(zhì)量檢測(cè)技術(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 西那卡塞治療甲旁亢
評(píng)論
0/150
提交評(píng)論