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

正文內(nèi)容

單片機第14章c語言程序設(shè)計(存儲版)

2025-02-15 17:56上一頁面

下一頁面
  

【正文】 ital的值為 255時再加 1就發(fā)生溢出并為 0,所以在程序中不用再判斷 cDigital是否為 255。具體說明如下: ( 1)函數(shù) SelectChannel( )用來 進行通道的選擇,主程序?qū)⒌刂泛蛿?shù)據(jù)以參數(shù)的方式傳遞給 SelectChannel。這一優(yōu)點的意義在本章 細說明。使用該地址進行 DAC0832寫訪問時要先進行類型轉(zhuǎn)換。 105 case KV_I_harmon: /* “電流諧波顯示”鍵 */ { /*調(diào)用 hammon_print子函數(shù) 。 //TODO: /*調(diào)整延時以確定按鍵釋放 */ return keyValue。 /*補充 P1口鍵位行號 */ KEY_PORT= 0xF0。 typedef unsigned long ulong。 首先查詢判斷是否有鍵按下: 驅(qū)動 P1口高半字節(jié)為全 0,低半字節(jié)為全 1,當(dāng)讀回 P1口低半字節(jié)存在某位為 0時,表明有鍵按下。獨立式鍵盤的接口電路如 圖 143所示 。方式 0的典型應(yīng)用是外擴串行輸入并行輸出的同步移位寄存器74LS164,實現(xiàn)并行 I/O的擴展。 ( 1)設(shè)置 TMOD寄存器 定時器 T0工作在方式 1,應(yīng)使 TMOD寄存器的 MM0=01;定時器模式,應(yīng)設(shè)置 C/ =0;對 T0的運行控制僅由 TR0來控制,應(yīng)使 GATE0=0。在外部中斷 0輸入腳 ( ) 引腳接上拉電阻并接有一只 按鈕開關(guān) K1。如果在沒有實際的中斷請求的情況下,直接調(diào)用中斷函數(shù),也就不會執(zhí)行RETI指令,其操作結(jié)果有可能產(chǎn)生一個致命的錯誤。 使用 關(guān)鍵字 using在函數(shù)中確定一個工作寄存器區(qū)時必須小心,要保證工作寄存器區(qū)切換都只在 指定的控制區(qū)域中發(fā)生 ,否則將產(chǎn)生不正確的函數(shù)結(jié)果。 C51中斷服務(wù)函數(shù)的定義 由于 標(biāo)準(zhǔn) C沒有處理 單片機中斷 的定義,為直接編寫中斷服務(wù)程序, C51編譯器對函數(shù)的定義進行了擴展, 增加了一個 擴展關(guān)鍵字 interrupt,使用該關(guān)鍵字可以將一個函數(shù)定義成中斷服務(wù)函數(shù)。 利用絕對地址的頭文件。 ( 2) while循環(huán) 格式為: while(循環(huán)體執(zhí)行條件),花括號 {}中為循環(huán)體內(nèi)容。 59 2. 循環(huán)結(jié)構(gòu)程序 循環(huán)語句有以下 三種 。 表 147 位運算其說明 符號 說明 = 賦值 * 指向運算符 amp。 51 表 144 邏輯運算符及其說明 3. 關(guān)系運算符 判斷兩個數(shù)之間的關(guān)系。例如 “ 5/3”的結(jié)果(商) 為 1,而“ 5%3”的結(jié)果 為 2(余數(shù))。 47 ? 再入函數(shù)不能包括位操作以及 51單片機的未尋址區(qū)。 例如, 例 141中的第 8行的 “;” 就是一個空語句。 ( 1)無參數(shù)函數(shù) 此種函數(shù)在被調(diào)用時,既無參數(shù)輸入,也不返回結(jié)果給調(diào)用函數(shù),只是為完成某種操作而編寫的。如 例 141中的Delay函數(shù) 。 注意, 若 Delay( )的定義寫在 main函數(shù)的后面,則需要先作出聲明,否則編譯無法通過,因為編譯到 main函數(shù)中的 Delay( )語句時,找不到相應(yīng)的函數(shù)體。 注意, 內(nèi)層循環(huán) for( j=0。文件“ ”包含了 51單片機全部的特殊功能寄存器的字節(jié)地址及可尋址位的位地址定義。例如: bit *ptr ; /* 錯誤,不能用位變量來定義指針 */ bit aarray[ ] ; /* 錯誤,不能用位變量來定義數(shù)組 */ 在定義位變量時,允許定義存儲類型,位變量都被放入一個位段,此段總是位于 AT89S51片內(nèi) RAM中,因此其存儲器類型限制為 bdata, data 或 idata,如果將位變量定義成其他類型都會在編譯時出錯。對于那些經(jīng)常使用的變量要使用內(nèi) 27 部尋址。 ( 3)片外程序存儲器 code: 外部程序存儲器的 64KB空間。 C51編譯器 通過將變量、常量定義成不同存儲類型的方法將它們定義在不同的存儲區(qū)中。在后面的語句中可以對 DPTR進行操作。 ( 1)位變量 bit bit的值可以是 1( true) , 也可以是 0( false)。 如果程序設(shè)計者具備了有關(guān)標(biāo)準(zhǔn) C的編程基礎(chǔ),只要注意Keil C51與標(biāo)準(zhǔn) C的不同之處,并熟悉 AT89S51單片機的硬件結(jié)構(gòu),就能夠較快地掌握 Keil C51的編程。 ( 5) Keil C51與標(biāo)準(zhǔn) C的 庫函數(shù) 有較大的不同。因此,Keil C51系列的頭文件 集中體現(xiàn)了各系列芯片的不同資源及功能。Vision3還 支持軟件模擬仿真( Simulator) 和 用戶目標(biāo)板調(diào)試 (Monitor51)兩種工作方式 。 11 本章經(jīng)常用到 Keil C51和 Keil 181。當(dāng)前較好的 C51語言編譯系統(tǒng)編譯出來的代碼效率只比直接使用匯編語言 低 20%左右,如果使用 優(yōu)化編譯選項 ,效果會更好。 用 C51進行單片機軟件開發(fā),有 如下優(yōu)點 : ( 1)可讀性好。 C51是在 標(biāo)準(zhǔn) C的基礎(chǔ)上 ,根據(jù)單片機存儲器硬件結(jié)構(gòu)及內(nèi)部資源, 擴展了相應(yīng)的數(shù)據(jù)類型和變量 , 而 C51在語法規(guī)定、程序結(jié)構(gòu) 與 設(shè)計方法 上,都與標(biāo)準(zhǔn) C相同。Vision3軟件的安裝、啟動和運行 C51程序的開發(fā)流程 C51與匯編語言的混合編程 C51與 MCS51匯編語言的比較 C51與匯編語言混合編程的方法 5 內(nèi)容概要 本章在假定讀者 已掌握 標(biāo)準(zhǔn) C語言前提下 ,初步介紹如何使用 C51來編寫 AT89C51單片機的應(yīng)用程序 。 7 目前大多數(shù)的 51單片機用戶都在使用 C51語言來進行程序設(shè)計。 ( 4)代碼效率高 。Vision3環(huán)境中極為簡便地進行操作。此外, 181。 51系列單片機廠家有多個,它們的差異在于內(nèi)部資源如定時器、中斷、 I/O等數(shù)量以及功能的不同 ,而對使用者來說,只需要將相應(yīng)的功能寄存器的頭文件加載在程序內(nèi),就可實現(xiàn)所具有的功能。 ( 4)標(biāo)準(zhǔn) C語言 沒有 處理 單片機中斷 的定義 。 16 但是從數(shù)據(jù)運算操作、程序控制語句以及函數(shù)的使用上來說, Keil C51與標(biāo)準(zhǔn) C幾乎沒有什么明顯的差別。 , 浮點數(shù) (精確到 15位) * 24 1~3 對象指針 bit 1 0或 1 sfr 8 1 0~255 sfr16 16 2 0~65535 sbit 1 可進行位尋址的特殊功能寄存器 的某位的絕對地址 19 2. C51的擴展數(shù)據(jù)類型 下面對 表 141中擴展的 4種數(shù)據(jù)類型進行說明。 例如: sfr16 DPTR=0x82語句定義了片內(nèi) 16位數(shù)據(jù)指針寄存器 DPTR,其低 8位字節(jié)地址為 82H。在 51單片機中,程序存儲器與數(shù)據(jù)存儲器是完全分開的,且分為片內(nèi) 和 片外 兩個獨立的尋址空間,特殊功能寄存器與片內(nèi)RAM統(tǒng)一編址,數(shù)據(jù)存儲器與 I/O端口統(tǒng)一編址。 xdata: 片外數(shù)據(jù)存儲器 RAM的 64KB空間。 定義數(shù)據(jù)的存儲類型通常遵循如下原則: 只要條件滿足,盡量選擇內(nèi)部直接尋址的存儲類型 data,然后選擇idata即內(nèi)部間接尋址。例如: bit func(bit b0, bit b1); /* 位變量 b0, b1作為函數(shù) func的參數(shù) */ { …… return(b1); /* 位變量 b1作為函數(shù)的返回值 */ } 31 3. 位變量的限制 位變量不能用來定義指針和數(shù)組 。 程序的 第 1行 是 “文件包含”, 是將另一個文件“ ” 的內(nèi)容全部包含進來。自行編寫的函數(shù) Delay( )的用途是軟件延時,調(diào)用時使用的這個“ 800”被稱為“實際參數(shù)”,以延時 800ms的時間。編程者可在一定范圍內(nèi)對 i、 j調(diào)整(不超過 i、 j的取值范圍),來控制延時時間的長短。 例如 調(diào)用輸出函數(shù) printf時,要求程序在調(diào)用輸出庫函數(shù)前包含以下的 include 命令: include ( 2)用戶自定義函數(shù) 用戶根據(jù)自己需要所編寫的函數(shù)。 43 從函數(shù)的定義的形式上劃分可以有 三種形 式: 無參數(shù)函數(shù)、有參數(shù)函數(shù) 和 空函數(shù) 。因此先將非基本模塊的功能函數(shù)定義成空函數(shù),用一個空語句“;”占好位置,并寫好注釋,以后再用一個編好的函數(shù)代替它。 再入函數(shù)有以下幾點規(guī)定。這 兩個符號 都涉及除法運算,但“ /”運算是取商,而“ %” 運算為取余數(shù)。 2. 邏輯運算符 邏輯運算符及其說明如 表 144所示。賦值、指針和取值運算符及其說明如 表 147所示。 實際上在對應(yīng)的匯編語言源程序中, case(0), case(1) …… 只是確定了分支的地址,真正的判斷是在 switch語句開始的。i++)對應(yīng)的匯編語句為: MOV R7, 02H ; 2個機器周期 LOOP: INC R7 ;一個機器周期 CJNE R7, 0AH, LOOP ;兩個機器周期 61 為什么當(dāng) i=0時,編譯器要多花一個機器周期對 for循環(huán)初始化?這是因為在使用立即數(shù)時,單片機需要在代碼空間(程序存儲器)中為該立即數(shù)申請一個存儲單元,用來存放該立即數(shù),作為 MOV指令的操作數(shù);而累加器 A是單片機中的寄存器,使用 A可以節(jié)省一個字節(jié)的存儲空間,從而實現(xiàn)以時間換取空間。 65 AT89C51不同存儲區(qū)的 C51定義 AT89C51有不同的存儲區(qū)。一旦在頭文件或程序中通過使用 define語句對片外 I/O口進行了定義,在程序中就可以自由使用變量名(例如: PORTB)來訪問這些片外 I/O端口了。 中斷號 n 中斷源 中斷向量( 8 n+3) 0 外部中斷 0 0003H 1 定時器 0 000BH 2 外部中斷 1 0013H 3 定時器 1 001BH 4 串行口 0023H 其他值 保留 8 n+3 70 關(guān)鍵字 using對函數(shù)目標(biāo)代碼的影響如下 : 在中斷函數(shù)的入口處將當(dāng)前工作寄存器區(qū)內(nèi)容保護到堆棧中,函數(shù)返回前將被保護的寄存器區(qū)的內(nèi)容從堆棧中恢復(fù)。 RETI指令會影響 AT89S51中的硬件中斷系統(tǒng)內(nèi)的不可尋址的中斷優(yōu)先級寄存器的狀態(tài)。當(dāng) P1口某一口線輸出為 0時,將 LED點亮。下面采用定時器 T0的方式 1的定時中斷方式 ,使 P1口外接的 8只 LED每 。 定時器 T0方式 1中斷定時的 參考程序 : include Char i=100; /*給變量 i賦初值 */ void main() { TMOD=0x01; /*設(shè)置定時器 T0為方式 1*/ TH0=0xee; /*向 TH0寫入初值的高 8位 */ 82 TL0=0x00; /*向 TL0寫入初值的低 8位 */ P1=0x00; /*P1口 8只 LED點亮 */ EA=1; /*總中斷允許 */ ET0=1; /*定時器 T0中斷允許 */ TR0=1; /*啟動定時器 T0*/ while(1) ; /*循環(huán) */ { ; } } 83 Void T0_int(void) interrupt 1 /*定時器 T0中斷服務(wù)程序 */ { TH0=0xee; /*給 T0裝入 16位初值,計數(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是同步串行通信接口。 圖 142 串行口的方式 0 外接 8個 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; nInd
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1