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

正文內(nèi)容

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

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

下一頁面
  

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