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

正文內(nèi)容

單片機(jī)第14章c語言程序設(shè)計(jì)-在線瀏覽

2025-03-05 17:56本頁面
  

【正文】 數(shù)的 目的 ,是 為以后程序功能的擴(kuò)充 。因此先將非基本模塊的功能函數(shù)定義成空函數(shù),用一個(gè)空語句“;”占好位置,并寫好注釋,以后再用一個(gè)編好的函數(shù)代替它。 45 3. 函數(shù)調(diào)用 程序設(shè)計(jì)者的任務(wù) 就是編寫一系列的用戶自定義函數(shù)模塊,并在需要的時(shí)候調(diào)用這些函數(shù)以及庫函數(shù),實(shí)現(xiàn)程序所要求的功能。 ( 1)簡單調(diào)用 調(diào)用格式為: 函數(shù)名(實(shí)際參數(shù) 1,實(shí)際參數(shù) 2, … ) 例如,例 141中主函數(shù) main ( )里的子函數(shù)調(diào)用語句“ Delay(800);”,其中 800為實(shí)際參數(shù)。 ( 3)遞歸調(diào)用 函數(shù)的遞歸調(diào)用就是一個(gè)函數(shù)在其函數(shù)體內(nèi)有調(diào)用自身。 再入函數(shù)有以下幾點(diǎn)規(guī)定。 ? 在同一個(gè)程序中可以定義和使用不同存儲(chǔ)模式的再入函數(shù), 任何模式的再入函數(shù)不能調(diào)用不同模式的再入函數(shù)。 C51的運(yùn)算符 在程序中實(shí)現(xiàn)運(yùn)算,要熟悉常用的運(yùn)算符。 1. 算術(shù)運(yùn)算符 如 表 143所示。這 兩個(gè)符號(hào) 都涉及除法運(yùn)算,但“ /”運(yùn)算是取商,而“ %” 運(yùn)算為取余數(shù)。 表 143中的自增和自減運(yùn)算符是使變量自動(dòng)加 1或減 1,自增和自減運(yùn)算符放在變量前和變量之后是不同的。 i++, i:在使用 i之后,再使 i值加(減) 1。 再如: 若 i=4,則執(zhí)行 x=i++時(shí),先引用 i值,即 x=4,再使 i加 1,運(yùn)算結(jié)果為 i=5, x=4。 2. 邏輯運(yùn)算符 邏輯運(yùn)算符及其說明如 表 144所示。關(guān)系運(yùn)算符及其說明如 表 145。amp。 表 146 位運(yùn)算其說明 符號(hào) 說明 amp。賦值、指針和取值運(yùn)算符及其說明如 表 147所示。 取地址 55 C51的分支與循環(huán)程序結(jié)構(gòu) 程序結(jié)構(gòu)上 可把程序分為 三類 ,即 順序、分支 和 循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)比較簡單和便于理解,這里 重點(diǎn)介紹 分支結(jié)構(gòu) 和 循環(huán)結(jié)構(gòu) 。 57 switch ( ) { case( ):語句; break; case( ):語句; break; ………… default:語句; break; } 58 注意: 每個(gè) switch分支必須有一個(gè) break語句, 否則程序并不能跳出 switch,就會(huì)繼續(xù)執(zhí)行 case后面的 case語句。 實(shí)際上在對(duì)應(yīng)的匯編語言源程序中, case(0), case(1) …… 只是確定了分支的地址,真正的判斷是在 switch語句開始的。 ( 1) for循環(huán) 格式: for(循環(huán)體初始化;循環(huán)體執(zhí)行條件;循環(huán)體執(zhí)行后操作) 花括號(hào) {}中為循環(huán)體內(nèi)容。 例如, for (i=0。i++)對(duì)應(yīng)的匯編語句為: 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。i++)對(duì)應(yīng)的匯編語句為: 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ǔ)單元,用來存放該立即數(shù),作為 MOV指令的操作數(shù);而累加器 A是單片機(jī)中的寄存器,使用 A可以節(jié)省一個(gè)字節(jié)的存儲(chǔ)空間,從而實(shí)現(xiàn)以時(shí)間換取空間。 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í)行。下面來說明 for語句的應(yīng)用。 程序如下: include include main( ) { int nVar1, nSum; for(nVar1=0,nSum=1; nSum=100; nSum++) nVar1+ =nCount; /*累加求和 */ while(1); } 64 關(guān)于循環(huán),需說明的是,在無操作系統(tǒng)的控制器和處理器上運(yùn)行的程序, 主體通常采用 輪詢方式 ,即把所有的操作包含在一個(gè) while(1){}中,如例 141。 65 AT89C51不同存儲(chǔ)區(qū)的 C51定義 AT89C51有不同的存儲(chǔ)區(qū)。 該 頭文件的函數(shù)包括 : CBYTE (訪問 code區(qū),字符型 ) DBYTE (訪問 data區(qū),字符型 ) PBYTE (訪問 pdata區(qū)或 I/O口,字符型 ) XBYTE (訪問 xdata區(qū)或 I/O口,字符型 ) 另外還有 CWORD、 DWORD、 PWORD、 XWORD四個(gè)函數(shù),它們的訪問區(qū)域同上, 只是訪問的數(shù)據(jù)類型為 int型 。而 AT89S51在 片外擴(kuò)展的并行 I/O口 ,這些擴(kuò)展的 I/O口與片外擴(kuò)展的RAM是統(tǒng)一編址的,即把一個(gè)外部 I/O端口當(dāng)作外部 RAM的一個(gè)單元來看待。 對(duì)于 片外擴(kuò)展的 I/O端口 ,根據(jù)硬件譯碼地址,將其看作片外 RAM的一個(gè)單元,使用 語句 define進(jìn)行定義 。一旦在頭文件或程序中通過使用 define語句對(duì)片外 I/O口進(jìn)行了定義,在程序中就可以自由使用變量名(例如: PORTB)來訪問這些片外 I/O端口了。由于 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ù)程序的繁瑣程度,而把精力放在如何處理引發(fā)中斷請(qǐng)求的事件上。 AT89S51中斷源對(duì)應(yīng)的中斷號(hào)和中斷向量見 表 143。 C51擴(kuò)展了一個(gè) 關(guān)鍵字 using,專門用來 選擇 AT89S51的 4個(gè)不同的工作寄存器區(qū) 。 中斷號(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ù)。還要注意, 帶using屬性的函數(shù)原則上不能返回 bit類型 的值 ,且關(guān) 鍵字using和 關(guān)鍵字 interrupt都不允許用于外部函數(shù),另外也都不允許有一個(gè)帶運(yùn)算符的表達(dá)式。因此建議在定義中斷函數(shù)時(shí),將其定義為 void類型,以明確說明沒有返回值。 INT172 ( 3)在任何情況下都不能直接調(diào)用中斷函數(shù), 否則會(huì)產(chǎn)生編譯錯(cuò)誤。 RETI指令會(huì)影響 AT89S51中的硬件中斷系統(tǒng)內(nèi)的不可尋址的中斷優(yōu)先級(jí)寄存器的狀態(tài)。 ( 4)如果在中斷函數(shù)中再調(diào)用其他函數(shù) ,則被調(diào)用的函數(shù)所使用的寄存器區(qū)必須與中斷函數(shù)使用的寄存器區(qū)不同。 中斷程序的編寫 為響應(yīng)中斷請(qǐng)求而進(jìn)行中斷處理的程序稱為中斷程序。 中斷初始化程序 的位置位于主程序中,主要包括 選擇外部中斷的觸發(fā)方式、開中斷、設(shè)置中斷優(yōu)先級(jí) 等。當(dāng) P1口某一口線輸出為 0時(shí),將 LED點(diǎn)亮。用 K1按鈕來產(chǎn)生外部中斷 0的輸入信號(hào)。 要求將 外部中斷 0設(shè)為負(fù)跳沿觸發(fā) 。按一次按鈕開關(guān) K1,使引腳 地,產(chǎn)生一個(gè)外中斷 0的中斷請(qǐng)求,在中斷服務(wù)程序中,讓低 4位 LED和 高 4位 LED交替閃爍 。下面采用定時(shí)器 T0的方式 1的定時(shí)中斷方式 ,使 P1口外接的 8只 LED每 。定時(shí)器 T1不使用,各相關(guān)位均設(shè)為 0。 T80 ( 2)計(jì)算定時(shí)器 T0的計(jì)數(shù)初值 設(shè)定時(shí)時(shí)間 5ms(即 5000181。 ( 3)設(shè)置 IE寄存器 本例由于采用定時(shí)器 T0中斷,因此需將 IE寄存器中的EA、 ET0位置 1。 定時(shí)器 T0方式 1中斷定時(shí)的 參考程序 : include Char i=100; /*給變量 i賦初值 */ void main() { TMOD=0x01; /*設(shè)置定時(shí)器 T0為方式 1*/ TH0=0xee; /*向 TH0寫入初值的高 8位 */ 82 TL0=0x00; /*向 TL0寫入初值的低 8位 */ P1=0x00; /*P1口 8只 LED點(diǎn)亮 */ EA=1; /*總中斷允許 */ ET0=1; /*定時(shí)器 T0中斷允許 */ TR0=1; /*啟動(dòng)定時(shí)器 T0*/ while(1) ; /*循環(huán) */ { ; } } 83 Void T0_int(void) interrupt 1 /*定時(shí)器 T0中斷服務(wù)程序 */ { TH0=0xee; /*給 T0裝入 16位初值,計(jì)數(shù) 4608后, T0溢出 */ TL0=0x00; i; /*循環(huán)次數(shù)減 1*/ if(i =0) { P1=~ P1; /*P1口按位取反 */ i =100; /*重新設(shè)置循環(huán)次數(shù) */ } } 84 串行口方式 0應(yīng)用程序的編寫 AT89S51的串口的方式 0是同步串行通信接口。 【 例 145】 圖 142是利用 串行口方式 0通過 74LS164外接 8個(gè) LED發(fā)光二極管的接口電路,編寫程序使發(fā)光二極管輪流顯示。 STB為控制端,當(dāng) STB=0時(shí),則 8位并行輸出端關(guān)閉,但是允許串行數(shù)據(jù)從 A和 B端輸入。 85 當(dāng) 8位串行數(shù)據(jù)發(fā)送完畢后,引起中斷,在中服務(wù)程序中,串行發(fā)出下一個(gè) 8位數(shù)據(jù)。 圖 142 串行口的方式 0 外接 8個(gè) LED發(fā)光二極管的接口電路 86 include include sbit P10 = 0x90; Xdata char nIndex; Delay(); main() { SCON = 0x00; /* 串行口初始化為方式 0*/ ES=1; EA=1; /* 全局中斷允許 */ nIndex=1; SBUF=nIndex; P10=0; while(1) 87 {; } } void Serial_Port() interrupt 4 using 0 { if(TI==1){ P10=1; Delay( ); P10=1; nIndex=1; if(nIndex==0) nIndex=1; SBUF=nIndex; } TI=0; RI=0; 88 } Delay( ) {int nCounter; for(nCounter=0; nCounter128; nCounter++); } 89 獨(dú)立式鍵盤查詢方式 【 例 146】 采用查詢方式對(duì)實(shí)現(xiàn)獨(dú)立式鍵盤的鍵值讀取。 圖 143 獨(dú)立式鍵盤的接口電路 90 由 圖 143,當(dāng) P1口某一位為 0時(shí),表明該位所接的按鍵被按下,然后在計(jì)算機(jī)屏幕上輸出按下的按鍵的信息。 程序如下: include include /*因?yàn)橛玫?printf( )函數(shù),所以要包含 */ Uart_Init(); sbit P10=0x90; /*定義 P1口各位的位名 */ sbit P11=0x91; sbit P12=0x92; 91 sbit P13=0x93; sbit P14=0x94; sbit P15=0x95; sbit P16=0x96; sbit P17=0x97; main( ) { Uart_Init( ); while(1); /*無限循環(huán),不斷查詢按鍵狀態(tài),鍵值判斷和提示信 息的顯示 */ { 92 if(P10==0) printf(key down\n); /*如 0號(hào)鍵按下,串行輸出按下鍵信息 */ if(P11==0) printf(key down\n); /*如 1號(hào)鍵按下,串行輸出按下鍵信息 */ if(P12==0) printf(key down\n); /
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1