freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

單片機(jī)第14章c語(yǔ)言程序設(shè)計(jì)(編輯修改稿)

2025-02-12 17:56 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 在例 141中可以看到有關(guān)自增和自減運(yùn)算符的應(yīng)用。 2. 邏輯運(yùn)算符 邏輯運(yùn)算符及其說(shuō)明如 表 144所示。 51 表 144 邏輯運(yùn)算符及其說(shuō)明 3. 關(guān)系運(yùn)算符 判斷兩個(gè)數(shù)之間的關(guān)系。關(guān)系運(yùn)算符及其說(shuō)明如 表 145。 符號(hào) 說(shuō)明 amp。amp。 邏輯與 ΙΙ 邏輯或 ! 邏輯非 52 表 145 關(guān)系運(yùn)算符及其說(shuō)明 符號(hào) 說(shuō)明 大于 小于 = 大于或等于 = 小于或等于 == 等于 != 不等于 53 4. 位運(yùn)算 位運(yùn)算符及其說(shuō)明如 表 146所示。 表 146 位運(yùn)算其說(shuō)明 符號(hào) 說(shuō)明 amp。 位邏輯與 Ι 位邏輯或 ^ 位異或 ~ 位取反 位左移 位右移 54 5. 賦值、指針和取值運(yùn)算符 是對(duì)變量操作的基本運(yùn)算。賦值、指針和取值運(yùn)算符及其說(shuō)明如 表 147所示。 表 147 位運(yùn)算其說(shuō)明 符號(hào) 說(shuō)明 = 賦值 * 指向運(yùn)算符 amp。 取地址 55 C51的分支與循環(huán)程序結(jié)構(gòu) 程序結(jié)構(gòu)上 可把程序分為 三類 ,即 順序、分支 和 循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)是程序的基本結(jié)構(gòu),程序自上而下,從main()的函數(shù)開始一直到程序運(yùn)行結(jié)束,程序只有一條路可走,沒有其他的路徑可以選擇。順序結(jié)構(gòu)比較簡(jiǎn)單和便于理解,這里 重點(diǎn)介紹 分支結(jié)構(gòu) 和 循環(huán)結(jié)構(gòu) 。 56 1. 分支結(jié)構(gòu)程序 (1) 只有兩條分支的時(shí)候用 If (條件 ) {分支 1} else {分支 2} (2) 分支較多時(shí) 在 分支較多時(shí)的情況下使用 switch語(yǔ)句。 57 switch ( ) { case( ):語(yǔ)句; break; case( ):語(yǔ)句; break; ………… default:語(yǔ)句; break; } 58 注意: 每個(gè) switch分支必須有一個(gè) break語(yǔ)句, 否則程序并不能跳出 switch,就會(huì)繼續(xù)執(zhí)行 case后面的 case語(yǔ)句。 如果看一下上述結(jié)構(gòu)的程序?qū)?yīng)的匯編語(yǔ)言源程序 可看到,每一條 break語(yǔ)句對(duì)應(yīng)了匯編語(yǔ)言中的一條 SJMP指令,而沒有 SJMP指令程序會(huì)繼續(xù)向下執(zhí)行,并不能跳出分支選擇語(yǔ)句。 實(shí)際上在對(duì)應(yīng)的匯編語(yǔ)言源程序中, case(0), case(1) …… 只是確定了分支的地址,真正的判斷是在 switch語(yǔ)句開始的。 59 2. 循環(huán)結(jié)構(gòu)程序 循環(huán)語(yǔ)句有以下 三種 。 ( 1) for循環(huán) 格式: for(循環(huán)體初始化;循環(huán)體執(zhí)行條件;循環(huán)體執(zhí)行后操作) 花括號(hào) {}中為循環(huán)體內(nèi)容。 這里有一個(gè)值得注意的現(xiàn)象,能夠反映出 C51在編譯中對(duì)于執(zhí)行時(shí)間和占用的存儲(chǔ)單元的權(quán)衡。 例如, for (i=0。i10。i++)對(duì)應(yīng)的匯編語(yǔ)句為: 60 CLR A ; 1個(gè)機(jī)器周期 MOV R7,A ; 2個(gè)機(jī)器周期 LOOP: INC R7 ; 1個(gè)機(jī)器周期 CJNE R7, 0AH, LOOP ; 2個(gè)機(jī)器周期 而 for (i=2。i10。i++)對(duì)應(yīng)的匯編語(yǔ)句為: MOV R7, 02H ; 2個(gè)機(jī)器周期 LOOP: INC R7 ;一個(gè)機(jī)器周期 CJNE R7, 0AH, LOOP ;兩個(gè)機(jī)器周期 61 為什么當(dāng) i=0時(shí),編譯器要多花一個(gè)機(jī)器周期對(duì) for循環(huán)初始化?這是因?yàn)樵谑褂昧⒓磾?shù)時(shí),單片機(jī)需要在代碼空間(程序存儲(chǔ)器)中為該立即數(shù)申請(qǐng)一個(gè)存儲(chǔ)單元,用來(lái)存放該立即數(shù),作為 MOV指令的操作數(shù);而累加器 A是單片機(jī)中的寄存器,使用 A可以節(jié)省一個(gè)字節(jié)的存儲(chǔ)空間,從而實(shí)現(xiàn)以時(shí)間換取空間。 ( 2) while循環(huán) 格式為: while(循環(huán)體執(zhí)行條件),花括號(hào) {}中為循環(huán)體內(nèi)容。 62 ( 3) do while循環(huán) 格式為: do { },花括號(hào) { }中為循環(huán)體內(nèi)容 while(循環(huán)體執(zhí)行條件) 前兩種循環(huán) 是先進(jìn)行循環(huán)條件是否滿足的判斷,才決定循環(huán)體是否執(zhí)行; 而 “ do while循環(huán)” 是在執(zhí)行完循環(huán)體后再判斷條件是否滿足,再?zèng)Q定循環(huán)體是否繼續(xù)執(zhí)行。 三種循環(huán)中,經(jīng)常使用的是 for語(yǔ)句 。下面來(lái)說(shuō)明 for語(yǔ)句的應(yīng)用。 63 【 例 142】 求 1到 100之間整數(shù)的和。 程序如下: include include main( ) { int nVar1, nSum; for(nVar1=0,nSum=1; nSum=100; nSum++) nVar1+ =nCount; /*累加求和 */ while(1); } 64 關(guān)于循環(huán),需說(shuō)明的是,在無(wú)操作系統(tǒng)的控制器和處理器上運(yùn)行的程序, 主體通常采用 輪詢方式 ,即把所有的操作包含在一個(gè) while(1){}中,如例 141。這樣的無(wú)限循環(huán)在面向通用計(jì)算機(jī)的軟件設(shè)計(jì)中是不被允許的,然而嵌入式系統(tǒng)軟件設(shè)計(jì)中,則由于其硬件構(gòu)成和使用需求,常常采用這種無(wú)限循環(huán)。 65 AT89C51不同存儲(chǔ)區(qū)的 C51定義 AT89C51有不同的存儲(chǔ)區(qū)。 利用絕對(duì)地址的頭文件。 該 頭文件的函數(shù)包括 : CBYTE (訪問(wèn) code區(qū),字符型 ) DBYTE (訪問(wèn) data區(qū),字符型 ) PBYTE (訪問(wèn) pdata區(qū)或 I/O口,字符型 ) XBYTE (訪問(wèn) xdata區(qū)或 I/O口,字符型 ) 另外還有 CWORD、 DWORD、 PWORD、 XWORD四個(gè)函數(shù),它們的訪問(wèn)區(qū)域同上, 只是訪問(wèn)的數(shù)據(jù)類型為 int型 。 66 注意: AT89S51片內(nèi)的 4個(gè)并行 I/O口( P0~P3),都是 SFR, 故對(duì) P0~P3采用 定義 SFR的方法 。而 AT89S51在 片外擴(kuò)展的并行 I/O口 ,這些擴(kuò)展的 I/O口與片外擴(kuò)展的RAM是統(tǒng)一編址的,即把一個(gè)外部 I/O端口當(dāng)作外部 RAM的一個(gè)單元來(lái)看待??筛鶕?jù)需要來(lái)選擇為 pdata類型或xdata類型。 對(duì)于 片外擴(kuò)展的 I/O端口 ,根據(jù)硬件譯碼地址,將其看作片外 RAM的一個(gè)單元,使用 語(yǔ)句 define進(jìn)行定義 。 例如: includ ; /* 不可缺少 */ define PORTB XBYTE[0xffc2] ; /* 定義外部 I/O口 PORTB的地址為 xdata區(qū)的 0xffc2*/ 67 也可把 片外 I/O口 的定義放在 一個(gè)頭文件中 , 然后在程序中 通過(guò) include語(yǔ)句 調(diào)用 。一旦在頭文件或程序中通過(guò)使用 define語(yǔ)句對(duì)片外 I/O口進(jìn)行了定義,在程序中就可以自由使用變量名(例如: PORTB)來(lái)訪問(wèn)這些片外 I/O端口了。 C51中斷服務(wù)函數(shù)的定義 由于 標(biāo)準(zhǔn) C沒有處理 單片機(jī)中斷 的定義,為直接編寫中斷服務(wù)程序, C51編譯器對(duì)函數(shù)的定義進(jìn)行了擴(kuò)展, 增加了一個(gè) 擴(kuò)展關(guān)鍵字 interrupt,使用該關(guān)鍵字可以將一個(gè)函數(shù)定義成中斷服務(wù)函數(shù)。由于 C51編譯器在編譯時(shí)對(duì) 68 聲明為中斷服務(wù)程序的函數(shù) 自動(dòng)添加了相應(yīng)的現(xiàn)場(chǎng)保護(hù) 、阻斷其他中斷、返回時(shí)恢復(fù)現(xiàn)場(chǎng)等處理的程序段,因而在編寫中斷服務(wù)函數(shù)時(shí)可不必考慮這些問(wèn)題,減輕了用匯編語(yǔ)言編寫中斷服務(wù)程序的繁瑣程度,而把精力放在如何處理引發(fā)中斷請(qǐng)求的事件上。 中斷服務(wù)函數(shù)的一般形式為: 函數(shù)類型 函數(shù)名(形式參數(shù)表) [interrupt n] [using n] 關(guān)鍵字 interrupt后面的 n是 中斷號(hào) ,對(duì)于 AT89S51,取值為 0~4,編譯器 從 8 n+3處產(chǎn)生中斷向量 。 AT89S51中斷源對(duì)應(yīng)的中斷號(hào)和中斷向量見 表 143。 69 表 143 AT89S51中斷號(hào)和中斷向量 AT89S51在內(nèi)部 RAM中有 4個(gè)工作寄存器區(qū) ,每個(gè)寄存器區(qū)包含 8個(gè)工作寄存器( R0R7)。 C51擴(kuò)展了一個(gè) 關(guān)鍵字 using,專門用來(lái) 選擇 AT89S51的 4個(gè)不同的工作寄存器區(qū) 。在定義一個(gè)函數(shù)時(shí), using是一個(gè)選項(xiàng),如果不選用該項(xiàng), 則由編譯器選擇一個(gè)寄存器區(qū)作為絕對(duì)寄存器區(qū)訪問(wèn)。 中斷號(hào) n 中斷源 中斷向量( 8 n+3) 0 外部中斷 0 0003H 1 定時(shí)器 0 000BH 2 外部中斷 1 0013H 3 定時(shí)器 1 001BH 4 串行口 0023H 其他值 保留 8 n+3 70 關(guān)鍵字 using對(duì)函數(shù)目標(biāo)代碼的影響如下 : 在中斷函數(shù)的入口處將當(dāng)前工作寄存器區(qū)內(nèi)容保護(hù)到堆棧中,函數(shù)返回前將被保護(hù)的寄存器區(qū)的內(nèi)容從堆棧中恢復(fù)。 使用 關(guān)鍵字 using在函數(shù)中確定一個(gè)工作寄存器區(qū)時(shí)必須小心,要保證工作寄存器區(qū)切換都只在 指定的控制區(qū)域中發(fā)生 ,否則將產(chǎn)生不正確的函數(shù)結(jié)果。還要注意, 帶using屬性的函數(shù)原則上不能返回 bit類型 的值 ,且關(guān) 鍵字using和 關(guān)鍵字 interrupt都不允許用于外部函數(shù),另外也都不允許有一個(gè)帶運(yùn)算符的表達(dá)式。 71 例如 , 外中斷 1( ) 的中斷服務(wù)函數(shù)書寫如下: void int1( ) interrupt 2 using 0/*中斷號(hào) n=2,選擇 0區(qū)工作寄存器區(qū) */ 編寫 AT89S51中斷程序時(shí),應(yīng)遵循以下規(guī)則 : ( 1)中斷函數(shù)沒有返回值 , 如果定義了一個(gè)返回值,將會(huì)得到不正確的結(jié)果。因此建議在定義中斷函數(shù)時(shí),將其定義為 void類型,以明確說(shuō)明沒有返回值。 ( 2)中斷函數(shù)不能進(jìn)行參數(shù)傳遞, 如果中斷函數(shù)中包含任何參數(shù)聲明都將導(dǎo)致編譯出錯(cuò)。 INT172 ( 3)在任何情況下都不能直接調(diào)用中斷函數(shù), 否則會(huì)產(chǎn)生編譯錯(cuò)誤。因?yàn)橹袛嗪瘮?shù)的返回是由 指令 RETI完成的。 RETI指令會(huì)影響 AT89S51中的硬件中斷系統(tǒng)內(nèi)的不可尋址的中斷優(yōu)先級(jí)寄存器的狀態(tài)。如果在沒有實(shí)際的中斷請(qǐng)求的情況下,直接調(diào)用中斷函數(shù),也就不會(huì)執(zhí)行RETI指令,其操作結(jié)果有可能產(chǎn)生一個(gè)致命的錯(cuò)誤。 ( 4)如果在中斷函數(shù)中再調(diào)用其他函數(shù) ,則被調(diào)用的函數(shù)所使用的寄存器區(qū)必須與中斷函數(shù)使用的寄存器區(qū)不同。 73 C51的程序設(shè)計(jì)舉例 本節(jié)重點(diǎn)介紹對(duì) AT89S51片內(nèi)各種功能部件及硬件接口的 C51例程 ,讀者應(yīng)仔細(xì)閱讀并理解這些例程。 中斷程序的編寫 為響應(yīng)中斷請(qǐng)求而進(jìn)行中斷處理的程序稱為中斷程序。由 中斷初始化程序 和 中斷服務(wù)程序 兩部分組成。 中斷初始化程序 的位置位于主程序中,主要包括 選擇外部中斷的觸發(fā)方式、開中斷、設(shè)置中斷優(yōu)先級(jí) 等。 74 【 例 143】 在單片機(jī)系統(tǒng)的 P1口上接有 8只 LED, LED的陽(yáng)極接 +5V,陰極接 P1口的引腳。當(dāng) P1口某一口線輸出為 0時(shí),將 LED點(diǎn)亮。在外部中斷 0輸入腳 ( ) 引腳接上拉電阻并接有一只 按鈕開關(guān) K1。用 K1按鈕來(lái)產(chǎn)生外部中斷 0的輸入信號(hào)。接口電路如 圖 141所示。 要求將 外部中斷 0設(shè)為負(fù)跳沿觸發(fā) 。在程序剛啟動(dòng)時(shí),P1口上的 8只 LED亮。按一次按鈕開關(guān) K1,使引腳 地,產(chǎn)生一個(gè)外中斷 0的中斷請(qǐng)求,在中斷服務(wù)程序中,讓低 4位 LED和 高 4位 LED交替閃爍 。 參考程序 : 0INT75 圖 141 控制 8只 LED交替閃爍的電路 76 include void Delay(unsigned int i) /* 定義延時(shí)函數(shù) Delay( ), i是形式參數(shù),不能賦初值 */ { unsigned int j; for(; i 0; i ) for(j=0; j333; j++) /*晶振為 12MHz, j的范圍見例 141*/ {; } /*空函數(shù) */ } 77 void main( ) /*主函數(shù) */ { EA=1; /*總中斷允許 */ EX0=1; /*外部中斷 0中斷允許 */ IT0=1; /*選擇外部中斷 0為跳沿觸發(fā)方式 */ While(1) /*循環(huán) */ { P1=0; } /* P1口的 8只 LED全亮 */ } 78 void int0( ) interrupt 0 using 0 /*外中斷 0的中斷服務(wù)函數(shù) */ { EX0=0; /*禁止外部中斷 0中斷 */ P1=0x0f; /*低 4位 LED滅,高 4位
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1