單片機的C51語言基礎_第1頁
單片機的C51語言基礎_第2頁
單片機的C51語言基礎_第3頁
單片機的C51語言基礎_第4頁
單片機的C51語言基礎_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、2022-4-141項目項目4 4 單片機的單片機的C51C51語言基礎語言基礎本章要點本章要點v 了解C51的數(shù)據(jù)類型v 掌握掌握順序結構、選擇結構、循環(huán)結構的C程序的構成及編程技巧v 了解C51的運算符、表達式及其規(guī)則v 掌握掌握數(shù)組的定義和使用、指針的定義和使用、函數(shù)的定義和使用2022-4-1422022-4-1434.1 4.1 任務任務1 1 認識單片機的認識單片機的C C語言語言v4.1.1 C51程序開發(fā)概述程序開發(fā)概述v 1.采用采用C51的優(yōu)點的優(yōu)點v 2.C51程序的開發(fā)過程程序的開發(fā)過程v4.1.2 C51程序結構程序結構v C51程序結構同標準C一樣,是由若干個函數(shù)構

2、成的,每個函數(shù)即是完成某個特殊任務的子程序段。組成一個程序的若干個函數(shù)可以保存在一個或幾個源文件中,最后再將它們連接在一起。C語言程序的擴展名為“.c”,如my_test.c。v 2022-4-144C語言的語句規(guī)則:語言的語句規(guī)則: v 每個變量必須先說明后引用,變量名英文大小寫是有差別的。v C語言程序一行可以書寫多條語句,但每個語句必須以“;”結尾,一個語句也可以多行書寫。 v C語言的注釋用/*/表示。 v “”花括號必須成對,位置隨意,可在緊挨函數(shù)名后,也可另起一行,多個花括號可以同行書寫,也可逐行書寫,為層次分明,增加可讀性,同一層的“”花括號對齊,采用逐層縮進方式書寫。2022-

3、4-1454.2 任務任務2 認識認識C51的數(shù)據(jù)類型的數(shù)據(jù)類型v4.2.1 C51的標識符和關鍵字的標識符和關鍵字v4.2.2 數(shù)據(jù)與數(shù)據(jù)類型數(shù)據(jù)與數(shù)據(jù)類型v4.2.3 C51數(shù)據(jù)的存儲類型數(shù)據(jù)的存儲類型v4.2.4 80C51硬件結構的硬件結構的C51定義定義2022-4-1464.2.1 C51的標識符和關鍵字的標識符和關鍵字v 標識符標識符是一種單詞,它用來給變量、函數(shù)、符號常量、自定義類型等命名。用標識符給C語言程序中各種對象命名時,要用字母、下劃線和數(shù)字組成的字符序列,并要求首字符是字母或下劃線,不能是數(shù)字。v 關鍵字關鍵字是一種已被系統(tǒng)使用過的具有特定含義的標識符。用戶不得再用關

4、鍵字給變量等命名。C語言關鍵字較少,ANSI C標準一共規(guī)定了32個關鍵字,見表4-1母的大小寫是有區(qū)別的。2022-4-147關 鍵 字用 途說 明auto存儲種類說明用以說明局部變量,缺省值為此break程 序 語句退出最內層循環(huán)case程 序 語句Switch語句中的選擇項char數(shù)據(jù)類型說明單字節(jié)整型數(shù)或字符型數(shù)據(jù)const存儲種類說明在程序執(zhí)行過程中不可更改的常量值continue程 序 語句轉向下一次循環(huán)default程 序 語句Switch語句中的失敗選擇項do程 序 語句構成 dowhile循環(huán)結構double數(shù)據(jù)類型說明雙精度浮點數(shù)else程 序 語句構成 ifelse選擇結

5、構e n um數(shù)據(jù)類型說明枚舉類型extern存儲種類說明在其他程序模塊中說明了的全局變量float數(shù)據(jù)類型說明單精度浮點數(shù)for程 序 語句構成for循環(huán)結構goto程 序 語句構成goto轉移結構if程 序 語句構成 ifelse選擇結構int數(shù)據(jù)類型說明基本整型數(shù)long數(shù)據(jù)類型說明長整型數(shù)register存儲種類說明使用CPU內部寄存器的變量return程 序 語句函數(shù)返回short數(shù)據(jù)類型說明短整型數(shù)signed數(shù)據(jù)類型說明有符號數(shù),二進制數(shù)據(jù)的最高位為符號位sizeof運算符計算表達式或數(shù)據(jù)類型的字節(jié)數(shù)static存儲種類說明靜態(tài)變量struct數(shù)據(jù)類型說明結構類型數(shù)據(jù)switch

6、程 序 語句構成Switch選擇結構typedef數(shù)據(jù)類型說明重新進行數(shù)據(jù)類型定義union數(shù)據(jù)類型說明聯(lián)合類型數(shù)據(jù)unsigned數(shù)據(jù)類型說明無符號數(shù)數(shù)據(jù)void數(shù)據(jù)類型說明無類型數(shù)據(jù)volatile數(shù)據(jù)類型說明該變量在程序執(zhí)行中可被隱含地改變while程 序 語句構成while和dowhile循環(huán)結構2022-4-148關 鍵 字用 途說 明bit位標量聲明聲明一個位標量或位類型的函數(shù)sbit位變量聲明聲明一個可位尋址變量sfr特殊功能寄存器聲明聲明一個特殊功能寄存器(8位)sfr16特殊功能寄存器聲明聲明一個16位的特殊功能寄存器data存儲器類型說明直接尋址的8051內部數(shù)據(jù)存儲器bd

7、ata存儲器類型說明可位尋址的8051內部數(shù)據(jù)存儲器idata存儲器類型說明間接尋址的8051內部數(shù)據(jù)存儲器pdata存儲器類型說明“分頁”尋址的8051外部數(shù)據(jù)存儲器xdata存儲器類型說明8051外部數(shù)據(jù)存儲器code存儲器類型說明8051程序存儲器interrupt中斷函數(shù)聲明定義一個中斷函數(shù)reetrant再入函數(shù)聲明定義一個再入函數(shù)using寄存器組定義定義8051的工作寄存器組Keil C51編譯器擴展關鍵字編譯器擴展關鍵字4.2.2 數(shù)據(jù)與數(shù)據(jù)類型數(shù)據(jù)與數(shù)據(jù)類型v 數(shù)據(jù):具有一定格式的數(shù)字或數(shù)值。數(shù)據(jù)是計算機的操作對象。不管使用任何語言,任何算法進行程序設計,最終在計算機中運行的

8、只有數(shù)據(jù)流。v 數(shù)據(jù)類型:數(shù)據(jù)的不同格式叫數(shù)據(jù)類型。v 數(shù)據(jù)結構:數(shù)據(jù)按一定的數(shù)據(jù)類型進行排列、組合及架構稱為數(shù)據(jù)結構。v 程序設計中用到的數(shù)據(jù)都存儲在存儲單元中,在匯編語言中我們可以用DB或DW偽指令來定義存放數(shù)據(jù)的存儲單元;在C51中,編譯系統(tǒng)要根據(jù)定義的數(shù)據(jù)類型來預留存儲單元,這就是定義數(shù)據(jù)類型的意義。C51提供的數(shù)據(jù)數(shù)據(jù)結構是以數(shù)據(jù)類型的形式出現(xiàn)的,C51的數(shù)據(jù)類型如表4-3所示2022-4-149表4-3 C51的數(shù)據(jù)類型2022-4-14104.2.3 C51數(shù)據(jù)的存儲類型數(shù)據(jù)的存儲類型v C51是面向80C51系列單片機的程序設計語言,應用程序中使用的任何數(shù)據(jù)(變量和常數(shù))必須以

9、一定的存儲類型定位于單片機相應的存儲區(qū)域中。C51編譯器支持的存儲類型如表4-4所示。v 表4-4 C51的存儲類型與8051存儲空間的對應關系2022-4-1411v 如果用戶不對變量的存儲類型進行定義,C51的編譯器采用默認的存儲類型。默認的存儲類型由編譯命令中存儲模式指令限制。C51支持的存儲模式如表4-5所示。例如:v Char var ; /*在 small模式中,var定位data存儲區(qū)*/v /*在 compact模式中,var定位pdata存儲區(qū)*/v /*在 large模式中,var定位xdata存儲區(qū)*/v v 表4-5 C51存儲模式2022-4-1412v v 在kei

10、l C51 uVision3平臺下,設置存儲模式的界面如圖4-2所示,步驟:工程建立好后,使用菜單Project|Option for Target Target1即出現(xiàn)圖4-2所示工程對話框,點擊Target標簽,其中的Memory Model用于設置RAM的使用情況,有3個選項: small是所有的變量都在單片機的內部RAM中;Compact變量存儲在外部RAM里,使用8位間接尋址;large變量存儲在外部RAM中,使用16位間接尋址,可以使用全部外部的擴展RAM。2022-4-14134.2.4 80C51硬件結構的硬件結構的C51定義定義v C51是適合于80C51單片機的C語言。它對

11、標準C語言(ANSI C)進行擴展,從而具有對80C51單片機硬件結構的良好支持與操作能力.v1.特殊功能寄存器的定義特殊功能寄存器的定義v 80C51單片機內部RAM的80HFFH區(qū)域有21個特殊功能寄存器,為了對它們能夠直接訪問,C51編譯器利用擴充的關鍵字SFR和SFR16對這些特殊功能寄存器進行定義。vSFR的定義方法: sfr 特殊功能寄存器名=地址常數(shù) v例如:vsfr P0= 0 x80; /* 定義P0口,地址為0 x80*/vsfr TMOD=0 x89; /*定時/計數(shù)器方式控制寄存器地址89H*/v2.特殊功能寄存器中特定位的定義特殊功能寄存器中特定位的定義v在C51中可

12、以利用關鍵字sbit定義可獨立尋址訪問的位變量,如定義80C51單片機SFR中的一些特定位。定義的方法有3種:2022-4-1414v1)sbit 位變量名=特殊功能寄存器名位的位置(07)v例如:vsfr PSW =0 xD0; /*定義PSW寄存器地址為0 xd0h*/vsbit OV = PSW2; /*定義OV位為PSW.2,地址為0 xd2*/vsbit CY = PSW7; /*定義Cy位為PSW.7,地址為0 xd7*/v 2)sbit位變量名=字節(jié)地址位的位置v例如:vsbit OV =0 xd02; /*定義OV位的地址為0 xd2*/v sbit CF =0 xd07; /

13、*定義CF位的地址為0 xd7*/v注意:字節(jié)地址作為基地址,必須位于0 x800 xff之間。v3)sbit 位變量名=位地址v例如:vsbit OV =0 xd2; /*定義OV位的地址為0 xd2*/v sbit CF =0 xd7; /*定義CF位的地址為0 xd7*/v注意:位地址必須位于0 x800 xFF之間。2022-4-1415v3.8051并行接口及其并行接口及其C51定義定義v1)對于8051片內I/O口用關鍵字sfr來定義。例:vsfr P0=0 x80; /*定義P0口,地址為80h*/vsfr P1=0 x90; /*定義P1口,地址為90h */v2)對于片外擴展

14、I/O口,則根據(jù)其硬件譯碼地址,將其視為片外數(shù)據(jù)存儲器的一個單元,使用define語句進行定義。v例:v #include /絕對地址定義頭文件v#define PORTA XBYTE0 x78f0 ; /*將PORTA定義為外部口,地址為78f0,長度為8位*/v一旦在頭文件或程序中對這些片內外的I/O口進行定義以后,在程序中就可以就可以自由使用這些口了。定義口地址的目的是為了便于C51編譯器按8051實際硬件結構建立I/O口變量名與其實際地址的聯(lián)系,以便使程序員能用軟件模擬8051硬件操作。2022-4-1416v4.位變量(位變量(bit)及其定義)及其定義vC51編譯器支持bit數(shù)據(jù)類

15、型:v1)位變量的C51定義語法及語義如下:v bit dir_bit; /*將dir_bit定義為位變量*/v bit lock_bit; /*將lock_bit 定義為位變量*/v2)函數(shù)可包含類型為bit的參數(shù),也可以將其作為返回值。vbit func(bit b0,bit b1) /*.*/ return (b1);v3)對位定義的限制:位變量不能定義成一個指針。v如 bit *bit_ptr是非法的。不存在位數(shù)組,如不能定義bit arr。v在位定義中允許定義存儲類型,位變量都放在一個段位中,此段總位于8051片內RAM中,因此存儲類型限制為data或idata。如果將位變量的存儲類

16、型定義成其他類型,編譯時將出錯。v4)可位尋址對象:可位尋址的對象是指可以字節(jié)尋址或位尋址的對象,該對象位于8051片內RAM可位尋址RAM區(qū)中,C51編譯器允許數(shù)據(jù)類型為idata的對象放入8051片內可位尋址的區(qū)中。先定義變量的數(shù)據(jù)類型和存儲類型:vbdata int ibase; /*定義ibase為bdata整型變量*/vbdata char bary4; /*定義bary4為bdata字符型數(shù)組*/2022-4-14174.3 C51的運算符、表達式及其規(guī)則的運算符、表達式及其規(guī)則v4.3.1 算術運算符和算術表達式算術運算符和算術表達式v4.3.2 關系運算符、關系表達式及優(yōu)先級關

17、系運算符、關系表達式及優(yōu)先級v4.3.3 邏輯運算符和邏輯表達式及優(yōu)先級邏輯運算符和邏輯表達式及優(yōu)先級v4.3.4 C51位操作及其表達式位操作及其表達式v4.3.5 運算符的優(yōu)先級運算符的優(yōu)先級2022-4-14184.3.1 算術運算符和算術表達式算術運算符和算術表達式v1.基本算術運算符基本算術運算符v 加法運算符,或正值符號;v 減法運算符,或負值符號;v 乘法運算符;v 除法運算符;v% 模(求余)運算符;例11%3=2,結果是11除以3所得余數(shù)為2。v2.自增減運算符自增減運算符v自增減運算符的作用是使變量值自動加1或減1。v + 自增運算符;v- 自減運算符;2022-4-141

18、9v3.類型轉換類型轉換v運算符兩側的數(shù)據(jù)類型不同時,要轉換成同種類型。轉換的方法有兩種:自動轉換和強制類型轉換。v自動轉換是編譯系統(tǒng)在編譯時自動進行的類型轉換,順序是: vbitcharintlongfloat,signedunsigned。v強制類型轉換是通過類型轉換運算來實現(xiàn)的。v其一般形式:(類型說明符)(表達式) v功能:把表達式的運算結果強制轉換成類型說明符所表示的類型。v如:v(double)a 將a強制轉換成double類型v(int)(x+y) 將x+y值強制轉換成int類型v(float)(5%3) 將模運算5%3的值強制轉換成float類型。2022-4-14204.3.

19、2 關系運算符、關系表達式及優(yōu)先級關系運算符、關系表達式及優(yōu)先級v1.C51提供六種關系運算符提供六種關系運算符v 小于; v= 小于等于;v 大于;v= 大于等于v = 測試等于;v != 測試不等于;v 2.關系運算符的優(yōu)先級關系運算符的優(yōu)先級v1)、=的優(yōu)先級相同,兩種=、!=相同;前4種優(yōu)先級高于后兩種。v2)關系運算符的優(yōu)先級低于算術運算符。v3)關系運算符的優(yōu)先級高于賦值運算符。v如: ca+b 等效于 c(a+b); ab!=c 等效于(ab)!=cv a=bc 等效于a=(bc)2022-4-1421v3.關系運算符的結合性為左結合關系運算符的結合性為左結合v如:a=4,b=3

20、,c=1 ,則 f=abc,則ab的值為1,1c的值為0,故f=0。v4.關系表達式關系表達式v用關系運算符和將兩個表達式(可以是算術表達式、關系表達式、邏輯表達式、字符表達式)連接起來的式子。v5.關系表達式的結果關系表達式的結果v真和假。C51中用0表示假,1表示真。2022-4-14224.3.3 邏輯運算符和邏輯表達式及優(yōu)先級邏輯運算符和邏輯表達式及優(yōu)先級v1.C51提供提供3種邏輯運算符種邏輯運算符v! 邏輯“非”(NOT)v& 邏輯 “與”(AND)v | 邏輯“或”(OR)v“&”和“|”是雙目運算符,要求有兩個運算對象;而“!”是單目運算符,只要求有一個運算對象

21、。v2.邏輯運算符的優(yōu)先級邏輯運算符的優(yōu)先級v在邏輯運算中,邏輯非的優(yōu)先級最高,且高于算術運算符;邏輯“與”、“或”的優(yōu)先級最低,低于關系運算符,但高于賦值運算符。v3.邏輯表達式邏輯表達式v用邏輯運算符將關系表達式或邏輯量連接起來的式子稱為邏輯表達式。其值應為邏輯量真和假,邏輯表達式和關系表達式的值相同,以0代表假,1代表真。v4.邏輯運算符的結合性為從左到右。邏輯運算符的結合性為從左到右。v例:如a=4,b=5則:v!a 為假。因為a=4(非0)為真,所以!a為假(0)。2022-4-14234.3.4 C51位操作及其表達式位操作及其表達式vC51提供6種位運算符:v & 位與;

22、v| 位或;v 位異或;v 位取反;v 右移;v除按位取反運算符“”以外,以上位操作運算符都是雙目運算符,及要求運算符兩側各有一個運算對象。2022-4-14244.3.5 運算符的優(yōu)先級運算符的優(yōu)先級v 當一個表達式中有多個運算符參加運算時,將按表4-6所規(guī)定的優(yōu)先級進行運算。表中優(yōu)先級從上往下逐漸降低,同一行優(yōu)先級相同。2022-4-14254.4 C51流程控制語句流程控制語句v 順序結構、選擇結構和循環(huán)結構是實現(xiàn)所有程序的三種基本結構,也是C51語言程序的三種基本構造單元。v 選擇結構體現(xiàn)了程序的邏輯判斷能力,分支結構分為簡單分支(兩分支)和多分支兩種情況。一般采用if語句實現(xiàn)簡單分支

23、結構的程序,用switch-case語句實現(xiàn)多分支結構程序。循環(huán)結構解決了重復性的程序段的設計,主要有for語句、while語句以及do-while語句。2022-4-14264.4 C51流程控制語句流程控制語句v4.4.1 C51的順序結構的順序結構v4.4.2 C51的選擇結構的選擇結構v4.4.3 C51的循環(huán)結構的循環(huán)結構2022-4-14274.4.1 C51的順序結構的順序結構v 順序結構是一種基本、最簡單的編程結構。在這種結構中,程序由低地址向高地址順序執(zhí)行指令代碼。如圖4-3所示,程序先執(zhí)行A操作,再執(zhí)行B操作,兩者是順序執(zhí)行的關系。2022-4-14284.4.2 C51的

24、選擇結構的選擇結構v 在C51中,選擇語句有條件語句和開關語句兩種。選擇結構的流程圖參考圖4-4。2022-4-14294.4.3 C51的循環(huán)結構的循環(huán)結構v 循環(huán)結構是結構化程序設計的3種基本結構之一,因此掌握循環(huán)結構的概念是程序設計,尤其是C程序設計最基本的要求。循環(huán)程序結構流程圖參考圖4-5。2022-4-1430v在C51語言中,實現(xiàn)循環(huán)的語句主要有3種。v1.While語句的一般形式語句的一般形式vWhile(表達式)v語句; /*循環(huán)體*/v2.do-while 語句的一般形式語句的一般形式vdov語句; /*循環(huán)體*/vwhile (表達式);v3.for 語句的一般形式語句的

25、一般形式vfor (表達式1;表達式2;表達式3)v語句; /*循環(huán)體*/2022-4-14314.5 C51的數(shù)組的數(shù)組v 在程序設計中,為了處理方便,把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類型數(shù)據(jù)元素的集合稱為數(shù)組。v 在C語言中,數(shù)組屬于構造數(shù)據(jù)類型。一個數(shù)組可以分解為多個數(shù)據(jù)元素,這些數(shù)據(jù)元素可以是基本的數(shù)據(jù)類型或是構造類型。因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結構數(shù)組等各種類別。2022-4-14324.5 C51的數(shù)組的數(shù)組v4.5.1 一維數(shù)組一維數(shù)組v4.5.2 二維數(shù)組二維數(shù)組v4.5.3 字符數(shù)組字符數(shù)組v4.5.4

26、查表查表2022-4-14334.5.1 一維數(shù)組一維數(shù)組v1.一維數(shù)組的定義方式一維數(shù)組的定義方式v 類型說明符 數(shù)組名 整型常量表達式;例如:int a10;v它表示數(shù)組名為a,此數(shù)組有10個元素。v2.一維數(shù)組的初始化一維數(shù)組的初始化v對數(shù)組元素的初始化可以用以下方法實現(xiàn):v1)在定義數(shù)組時對數(shù)組元素賦予初值。例如:vint a10=0,1,2,3,4,5,6,7,8,9;v2)可以只給一部分元素賦值。例如:vint a10=0,1,2,3,4;v3)在對全部數(shù)組元素賦初值時,可以不指定數(shù)組的長度。例如:vint a5=1,2,3,4,5;v也可以寫成: int a=1,2,3,4,5;

27、2022-4-1434v3.一維數(shù)組元素的引用一維數(shù)組元素的引用v數(shù)組必須先定義,后使用。C51語言規(guī)定只能逐個引用數(shù)組元素而不能一次引用整個數(shù)組。數(shù)組元素的表示形式為:v數(shù)組名下標 , 下標可以是整型常量或整型表達式。如:va0=a5+a7-a2*3;2022-4-14354.5.2 二維數(shù)組二維數(shù)組v1.二維數(shù)組定義的一般形式二維數(shù)組定義的一般形式v類型說明符 數(shù)組名常量表達式 常量表達式v例如 int a34,b510;v定義a為3x4(3行4列)的數(shù)組,b為5x10(5行10列)的數(shù)組。數(shù)組元素為int型數(shù)據(jù)。vC51語言對二維數(shù)組采用這樣的定義方式,使我們可以把二維數(shù)組看作一種特殊的

28、一維數(shù)組:它的元素又是一維數(shù)組。例如把a看做一個一維數(shù)組,它有3個元素:a0、a1、a2,每一個元素又是一個包含4個元素的一維數(shù)組,如圖所示。2022-4-1436v2.二維數(shù)組的初始化二維數(shù)組的初始化v(1) 按行賦初值v數(shù)據(jù)類型 數(shù)組名行常量表達式列常量表達式=第0行初值表,第1行初值表,最后1行初值表;v(2) 按二維數(shù)組在內存中的排列順序給各元素賦初值v數(shù)據(jù)類型 數(shù)組名 行常量表達式 列常量表達式=初值表;v3.二維數(shù)組元素的引用二維數(shù)組元素的引用v數(shù)組名 行下標表達式 列下標表達式v(1)“行下標表達式”和“列下標表達式”,都應是整型表達式或符號常量。v(2)“行下標表達式”和“列下

29、標表達式”的值,都應在已定義數(shù)組大小的范圍內。v(3) 對基本數(shù)據(jù)類型的變量所能進行的操作,也適合于相同數(shù)據(jù)類型的二維數(shù)組元素。2022-4-14374.5.3 字符數(shù)組字符數(shù)組v 字符數(shù)組就是元素類型為字符型(char)的數(shù)組,字符數(shù)組是用來存放字符的。在字符數(shù)組中,一個元素存放一個字符,可以用字符數(shù)組來存儲長度不同的字符串。v1.字符數(shù)組的定義字符數(shù)組的定義v字符數(shù)組的定義和數(shù)組定義的方法類似。v如 char str10, 定義str為一個有10個字符的一維數(shù)組。v2.字符數(shù)組置初值字符數(shù)組置初值v最直接的方法是將各字符逐個賦給數(shù)組中的各元素。如:vchar str10=M,I,A,N,

30、,Y,A,N,G,0; /* 0表示字符串的結束標志。*/vC語言還允許用字符串直接給字符數(shù)組置初值。其方法有以下兩種形式:vchar str10=Cheng Du; char str10=Bei Jing2022-4-14384.5.4 查表查表v 在C51編程中,數(shù)組的一個非常有用的功能之一就是查表。v 在實際單片機應用系統(tǒng)中,希望單片機能進行高精度的數(shù)學運算,但這并非單片機的特長,也不是完全必要的。許多嵌入式控制系統(tǒng)的應用中,人們更愿意用表格而不是數(shù)學公式,特別是在A/D轉換中對模擬量的標定,使用表格查找法避免數(shù)值計算。在LED數(shù)碼顯示、LCD的漢字顯示系統(tǒng)中,一般將字符或漢字的點陣信息

31、存放在表格中,表格可事先計算好裝入EPROM中。2022-4-14392022-4-14404.6 指針指針v4.6.1 指針的基本概念指針的基本概念v4.6.2 指針變量的使用指針變量的使用v4.6.3 數(shù)組指針和指向數(shù)組的指針變量數(shù)組指針和指向數(shù)組的指針變量v4.6.4 指向多維數(shù)組的指針和指針變量指向多維數(shù)組的指針和指針變量v4.6.5 關于關于KEIL C51的指針類型的指針類型 v4.6.6 避免使用浮點指針避免使用浮點指針2022-4-14414.6.1 指針的基本概念指針的基本概念v1.地址地址v 對于變量,實際存在3個基本要素,即變量名、變量的地址和變量的值。變量名是變量的外在

32、表現(xiàn)形式,方便用戶對數(shù)據(jù)進行引用;變量的值是變量的核心內容,是設置變量的目的,設置變量就是為了對其中的值進行讀寫訪問,變量的值存放在內存單元中;變量的地址則起到紐帶的作用,把變量名和變量的值聯(lián)系起來,通過變量名得到變.v 對于內存單元,也要明確兩個概念,一個是內存單元的地址,一個是內存單元的內容。前者是內存對該單元的編號,它表示該單元在整個內存中的位置。后者指的是在該內存單元中存放著的數(shù)據(jù)。量的地址,再通過變量地址在內存中尋址找到變量值2022-4-1442v2.指針指針v 變量存儲單元的分配、地址的記錄以及尋址過程雖然是在系統(tǒng)內部自動完成的,一般用戶不需要關心其中的細節(jié),但是出于對變量靈活使

33、用的需要,有時在程序中圍繞變量的地址展開操作,這就引入“指針”的概念。變量的地址稱為變量的指針,指針的引入把地址形象化了,地址是找變量值的索引或指南,就像一根“指針”一樣指向變量值所在的存儲單元,因此指針即是地址,是記錄變量存儲單元位置的正整數(shù)。v3.指針變量指針變量v圖4-7反映了指針變量與指針、指針與指針所指變量之間的關系。變量n是一般變量,變量n的指針(地址)又存放在指針變量p中,因此要存取變量n的值可以通過指針變量p以“間接訪問”的方式進行:先從指針變量p中得到存放在其中的指針,即變量n的地址,在根據(jù)這個指針(地址)尋址,找到對應的存儲單元,實現(xiàn)對變量 n的訪問。2022-4-1443

34、4.6.2 指針變量的使用指針變量的使用v1.指針變量的定義指針變量的定義vC語言規(guī)定,所有的變量在使用前必須定義,以確定其類型。指針變量也不例外,由于它是專門存放地址的,因此必須將它定義為“指針類型”。v指針定義的一般形式為: 類型識別符 *指針變量名;v如: int *ap; float *pointer;v2.指針變量的賦值指針變量的賦值取地址運算符取地址運算符“&”v將指針變量指向某個變量的賦值格式通常是:指針變量名=&所指向的變量名;v如:要建立圖4-5中指針變量p與一般變量n的指向關系,則需要進行一下的定義和賦值。v int *p,n=10; p=&n;20

35、22-4-1444v3.指針變量的引用指針變量的引用-指針運算符指針運算符“*”v 在進行了變量和指針變量的定義之后,如果對這些語句進行編譯,C編譯器就會為每個變量和指針變量在內存中安排相應的內存單元,如: v定義變量和指針變量:vint x=1,y=2,z=3; /* 定義整型變量x,y,z */vint *x_point; /* 定義指針變量x_point */vint x=1,y=2,z=3; /* 定義整型變量x,y,z */vint *x_point; /* 定義指針變量x_point */vint *y_point; /* 定義指針變量y_point */vint *z_point

36、; /* 定義指針變量z_point */2022-4-14454.6.3 數(shù)組指針和指向數(shù)組的指針變量數(shù)組指針和指向數(shù)組的指針變量v 指針既然可以指向變量,當然也可以指向數(shù)組。所謂數(shù)組的指針,就是數(shù)組的起始地址。若有一個變量用來存放一個數(shù)組的起始地址(指針),則稱它為指向數(shù)組的指針變量.v1.指向數(shù)組的指針變量的定義、引用和賦值指向數(shù)組的指針變量的定義、引用和賦值v首先定義一個數(shù)組a10和一個指向數(shù)組的指針變量array_ptr:vint a10; /* 定義a為包含10個整型元素的數(shù)組*/vint *array_ptr; /* 定義array_ptr為指向整型數(shù)據(jù)的指針*/v為了將指針變量

37、指向數(shù)組a10,需要對array_ptr進行引用,有如下兩種引用方法。v1) array_ptr=&a0v2)array_ptr =a2022-4-1446v2. 通過指針引用數(shù)組元素通過指針引用數(shù)組元素v引用數(shù)組元素,可以使用數(shù)組下標法如a4,也可以使用指針法。與數(shù)組下標法相比,使用指針法引用數(shù)組元素能使目標代碼效率高(占用內存少,運行速度快)。v通過指針引用數(shù)組元素:設指針變量array_ptr的初值為&a0,如圖4-9所示.2022-4-1447v3.關于指針變量的運算關于指針變量的運算v p+ (或者或者 p+=1)v該操作將使指針變量p指向數(shù)組a 的下一個元素,即 a

38、1。若再執(zhí)行x=*p,則將a1的值賦給變量x。v *p+v由于+運算符優(yōu)先級高于*,故*p+等價于*(p+)。其作用是先得到p所指向的變量的值(即*p),再執(zhí)行p自加運算。v *p+ 和和*+p作用不同作用不同v*p+ 先取*p的值,后使p自加1;*+p 先使p自加1,再取*p的值。v (*p)+v表示p所指向的元素值加1,而不是指針變量值加1。若p=a,即p指向&a0,且a0=12,則(*p)+等價于(a0)+。此時a0=13。v 若若p當前指向數(shù)組的第當前指向數(shù)組的第i個元素個元素ai,則,則:v*(p-)與ai-等價,相當于先執(zhí)行*p,然后再使p自減1。v*(+p)和 a+i等價

39、,相當與先執(zhí)行p自加1,再執(zhí)行*p運算。v*(-p)與a-i等價,相當與先執(zhí)行p自減1,再執(zhí)行*p運算。2022-4-14484.6.4 指向多維數(shù)組的指針和指針變量指向多維數(shù)組的指針和指針變量v以二維數(shù)組為例來說明指向多維數(shù)組的指針和指針變量的使用方法。v現(xiàn)在定義一個三行四列的二維數(shù)組a34。v同時,定義這樣一個(*p)4。它的含義是:p是一個指針變量,指向一個包含4個元素的一維數(shù)組。下面使指針變量p指向a34的首地址:p=a或者p=&a0。則此時p和a等價,均指向數(shù)組a34的第0行首址(a00)。vp+1和a+1等價,均指向數(shù)組a34的第1行首址(a10)。vp+2和a+2等價,均

40、指向數(shù)組a34的第2行首址(a20)。v v而 (p+1)+3 與 &a13等價,指向a13的地址。v*(*(p+1)+3) 與 a13等價,表示a13的值。v一般,對于數(shù)組元素aij來講,有:v(p+i)+j 就相當于 &aij,表示數(shù)組第i行第j列元素的地址。v*(*(p+i)+j) 就相當于aij,表示數(shù)組第i行第j列元素的值。2022-4-14494.6.5 關于關于KEIL C51的指針類型的指針類型 v1.基于存儲器的指針基于存儲器的指針v定義指針變量時,若指定了它所指向的對象的存儲類型時,該變量就被認為是基于存儲器的指針。例如:vchar xdata *px;v定

41、義了一個指向xdata存儲器中字符類型(char)的指針。指針本身在默認存儲器(決定于編譯模式),長度為2字節(jié)(值為00 xffff)。vchar xdata * data pdx;v2.一般指針一般指針v定義一般指針變量時,若未指定它所指向的對象的存儲類型,該指針變量就認為是一個一般指針。一般指針包括三個字節(jié): 2字節(jié)偏移和1字節(jié)存儲器類型,如表4-7所示2022-4-14504.6.6 避免使用浮點指針避免使用浮點指針v在C51編譯器上使用32位浮點數(shù)是得不償失的,會浪費大量的時間,所以當要在系統(tǒng)中使用浮點數(shù)的時候,要確定這是否一定需要,可以通過提高數(shù)值數(shù)量級和使用整型運算來消除浮點指針,

42、,處理ints和longs比處理doubles和floats要方便得多。代碼執(zhí)行起來更快,也不用連接處理浮點指針的模塊。如果一定要采用浮點指針的話,應該采用西門子80517和達拉斯半導體公司的80320,這些單片機已經(jīng)對數(shù)據(jù)處理進行過優(yōu)化。v如果不得不在代碼中加入浮點指針, 那么代碼長度會增加,程序執(zhí)行速度會比較慢,如果浮點指針運算能被中斷的話,必須確保要么中斷中不會使用浮點指針運算,要么在中斷程序前使用fpsave指令,把中斷指針推入堆棧,在中斷程序執(zhí)行后,使用fprestore指令把指針恢復。還有一種方法是,當要使用像sinO這樣的浮點運算程序時,禁止使用中斷,在運算程序執(zhí)行完之后再使能它

43、。2022-4-14512022-4-14524.7 C51的函數(shù)的函數(shù)v4.7.1 函數(shù)的分類函數(shù)的分類v4.7.2 函數(shù)的參數(shù)傳遞和函數(shù)值函數(shù)的參數(shù)傳遞和函數(shù)值v4.7.3 函數(shù)的調用函數(shù)的調用v4.7.4 C51函數(shù)的定義函數(shù)的定義2022-4-14534.7.1 函數(shù)的分類函數(shù)的分類vC51函數(shù)的一般定義形式為:v返回值類型 函數(shù)名(形式參數(shù)列表) 編譯模式reentrantinterrupt musing nv 函數(shù)體v(1)當函數(shù)沒有返回值時,應用關鍵字void明確說明返回值類型。形式參數(shù)的類型要明確說明,對于無形參的函數(shù),括號也要保留。v(2)編譯模式為small、compact

44、或large,用來指定函數(shù)中局部變量參數(shù)和參數(shù)在存儲器空間。v(3)reentrant 用于定義可重入函數(shù)。vinterrupt m 用于定義中斷函數(shù),m為中斷號,可以為031, 但具體的中斷號要取決于芯片的型號,像 AT89c51 實際上就使用 04 號中斷。每個中斷號都對應一個中斷向量,具體地址為 8n+3, 中斷源響應后處理器會跳轉到中斷向量所在的地址執(zhí)行程序,編譯器會在這地址上產(chǎn)生一個無條件跳轉語句,轉到中斷服務函數(shù)所在的地址執(zhí)行程序。v(4)Using n 用于確定中斷服務函數(shù)所使用的工作寄存器組,n為工作寄存器組號,取值為03。這個選項是指定選用 51單片機芯片內部 4 組工作寄存

45、器中的那個組。開始學習者能不必去做工作寄存器設定,而由編譯器自動選擇。2022-4-14542022-4-14554.8 任務3 C51與匯編語言的混合編程實例與匯編語言的混合編程實例v4.8.1 C51中調用匯編程序中調用匯編程序v4.8.2 在在C51中嵌入?yún)R編代碼中嵌入?yún)R編代碼2022-4-14564.8.1 C51中調用匯編程序中調用匯編程序2022-4-14574.8.2 在在C51中嵌入?yún)R編代碼中嵌入?yún)R編代碼v 程序中需要用到一些簡短的匯編指令時,可以采用在C51函數(shù)中直接嵌入?yún)R編代碼的辦法,但這需要對Keil編譯器(見本書1.2.2節(jié))進行一些設置,方法如下:v將嵌有匯編代碼的C

46、51源文件加入當前工程文件中,右鍵單擊工程管理窗口“Project”中的C51文件名,單擊菜單項“Option for File,將屬性“Properties”中的“Generate Assembler SRC File”與“Assemble SRC File”兩項設置為力深黑色“”(生成匯編SRC文件)。v根據(jù)采用的編譯模式,將相應的庫文件加入當前工程文件中。對于Small模式,其路徑及庫文件名是KeilC51LibC51S.Lib。對于Cmpact和Large模式,其庫文件名分別是C51C.Lib和C51. Lib。注意,該庫文件應為當前工程的最后一個文件,即需要先先加入C51源文件,后加

47、入庫文件。2022-4-14582022-4-1459v【例題4-4】混合編程實例-鍵控流水燈,電路如圖4-11所示,鍵控流水燈的C語言程序中的延時函數(shù)delay(第3章中實例7)用匯編語言實現(xiàn),完成系統(tǒng)的混合編程。v實例中的延時函數(shù)是無返回型,但有一個char型輸入?yún)?shù)。根據(jù)4.8.1關于在C51中調用匯編程序的要求,本實例采用大寫形式且加“_”前綴的同名“函數(shù)”來實現(xiàn)延時功能,具體內容如下:2022-4-14602022-4-1461v例題4-4的編程界面如圖4-12所示。2022-4-14624.9 任務任務4 簡易密碼鎖設計簡易密碼鎖設計v4.9.1 鍵盤工作原理鍵盤工作原理v4.9.

48、2 獨立式按鍵獨立式按鍵v4.9.3 矩陣式按鍵矩陣式按鍵v4.9.4 矩陣鍵盤密碼鎖設計矩陣鍵盤密碼鎖設計v4.9.5 程序分析程序分析v4.9.6 調試與仿真運行調試與仿真運行2022-4-14634.9.1 鍵盤工作原理鍵盤工作原理v1.開關的分類開關的分類v2鍵輸入原理鍵輸入原理v3鍵盤與單片機接口需解決的問題鍵盤與單片機接口需解決的問題2022-4-1464v(1)鍵盤開關狀態(tài)的可靠輸入v單片機應用系統(tǒng)通常使用觸點式按鍵開關,其主要功能是把機械上的通斷轉換成為電氣上的連接關系。觸點式按鍵按下或釋放時,由于機械彈性作用的影響,觸點通常伴隨有一定時間的機械抖動,從而使輸入到單片機的電壓信

49、號也出現(xiàn)抖動,其抖動過程如圖4-14(a)所示。抖動時間的長短與開關的機械特性有關,一般為510 ms。v(2)對按鍵進行編碼以給定鍵值v一組按鍵或鍵盤都要通過單片機I/O口線查詢按鍵的開關狀態(tài)。根據(jù)鍵盤結構的不同,采用不同的編碼方法。無論有無編碼,以及采用什么編碼,最后都要轉換成為與累加器中數(shù)值相對應的鍵值,以實現(xiàn)按鍵功能程序的跳轉2022-4-14654.9.2 獨立式按鍵獨立式按鍵v1.獨立式按鍵結構獨立式按鍵結構v 獨立式按鍵電路結構 鍵控流水燈掃描流程圖2022-4-1466v2. 獨立式按鍵的程序設計獨立式按鍵的程序設計v 在程序設計中,監(jiān)測獨立式按鍵的的開關狀態(tài)常采用查詢方式。電

50、路如圖4-11所示,在圖4-11中,先逐位查詢每根I/O口線的輸入狀態(tài),如某一根I/O口線輸入為“0”(低電平),則可確認該I/O口線所對應的按鍵已按下;而無鍵按下時,I/O口線輸入為“1”(高電平)。當確認某鍵按下后,再轉向該鍵的功能處理程序。掃描流程圖所示。2022-4-14674.9.3 矩陣式按鍵矩陣式按鍵v1.矩陣式按鍵的結構矩陣式按鍵的結構v矩陣式按鍵由行線和列線組成,按鍵位于行、列線的交叉點上,其結構如圖所示。2022-4-1468v2. 矩陣式按鍵的程序設計矩陣式按鍵的程序設計v矩陣式按鍵識別按鍵的方法很多,其中,最常見的是動態(tài)掃描法。其識別按鍵的過程分2步:首先確定是否有鍵閉

51、合,然后逐一掃描以進一步確定是哪一鍵閉合。下面以圖所示電路為例說明動態(tài)掃描法識別按鍵的過程。v(1)識別有無按鍵閉合v圖中行線為輸入,列線為輸出。沒有鍵按下時,行線列線之間斷開,行線端口輸入全為高電平。有鍵按下時,鍵所在行線與列線短路,故行線輸入的電平為列線輸出的狀態(tài),若列線輸出低電平,則按鍵所在行線的輸入也為低電平。因此,通過檢測行線的狀態(tài)是否全為高電平1,就可以判斷是否有鍵按下。v(2)進一步確定閉合的按鍵v 圖中,可以采用逐列掃描法,原理同上,此時逐個給每列輸出低電平0,讀取行線的狀態(tài),若行值全為高電平1,則說明此列無鍵閉合,繼續(xù)掃描下一列,使下一列輸出為低電平0。若行值中某位為低電平0

52、,則說明此行、列交叉點處的按鍵被閉合。2022-4-1469v【例4-5】一種矩陣式按鍵電路如圖4-18所示。試采用動態(tài)掃描方式編寫16個按鍵監(jiān)測與鍵功能處理程序。v 圖是一種簡化后的鍵盤接口電路,該鍵盤是由單片機P1口構成的44鍵盤。鍵盤的列線與P1口的高4位相連,鍵盤的行線與P1口的低4位相連,因此,P1.4P1.7是鍵輸入線,P1.0P1.3是掃描輸出線。圖中的4輸入與門用于產(chǎn)生按鍵中斷,其輸入端與各列線相連,再通過上拉電阻接至+5V電源,輸出端接至單片機的外部中斷0( )。 具體工作過程是:當鍵盤無鍵按下時,與門各輸入端均為高電平,保持輸出端為高電平;當有鍵按下時,與門輸出端為低電平,

53、向CPU申請中斷,若開放外部中斷,則CPU會響應中斷請求,轉去執(zhí)行鍵盤掃描子程序。2022-4-14704.9.4 矩陣鍵盤密碼鎖設計矩陣鍵盤密碼鎖設計v1. 硬件電路設計硬件電路設計v下面以4*4矩陣鍵盤為例講解其工作原理和檢測方法。將16個按鍵排成4行4列,將第一行的每個按鍵一端連接在一起構成第一根行線,將第一列的每個按鍵的另外一端連接在一起構成第一根列線,用同樣的方法將第二、三、四列的按鍵連接,這樣一共有4行4列共8根線,將這8根線連接到單片機的I/O口上,通過程序掃描鍵盤就可以檢測16個鍵。v對于矩陣鍵盤密碼鎖,16個按鍵的每一端都與I/O口相連接,硬件電路與仿真如圖4-19所示。矩陣

54、鍵盤的4行分別與單片機的P2.0P2.3口相連,矩陣鍵盤的4列分別與單片機的P2.4P2.7口相連。用單個共陰極的數(shù)碼管顯示鍵值,指示:燈與P1.0口連接,三極管的基極與P1.7口連接,通過控制三極管的導通和截止使繼電器吸合與斷開,從而控制電機轉動與否進行開鎖與上鎖。.2022-4-1471v2. 程序設計程序設計2022-4-1472#include #include #include#define uchar unsigned char #define uint unsigned intsbit LED=P10;sbit relay=P17;uchar code a16=0 x3F,0 x

55、06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F, 0 x6F,0 x77,0 x7C,0 x39,0 x5E,0 x79,0 x71;uchar code set_mima6=1,2,3,4,5,6;/設置的密碼 vvoid delay(uint i)/延時程序vuint j;vfor(j=0;ji;j+);vvuchar checkkey()/檢測有沒有鍵按下vuchar i ;v uchar j ;v j=0 xf0; v P2=j; /4行(P2.0P2.3)輸出全“0”v i=P2; /讀P2口v i=i&0 xf0; /屏蔽P2口的低

56、4位v if (i=0 xf0) return (0); /P2口的高4位全“1”無鍵按下,返回“0”v else return (0 xff); / 有鍵按下,返回“0 xff”v vuchar keyscan()/鍵盤掃描程序,無鍵按下返回值為FF,有鍵按下返回鍵值vvuchar scancode;vuchar codevalue;vuchar a;vuchar m=0;vuchar k;vuchar i,j;vif (checkkey()=0) return (0 xff); /無鍵按下返回值為FFv else v delay(100);v if (checkkey()=0) retur

57、n (0 xff); /無鍵按下返回值為FFvelse /有鍵按下逐行掃描v v scancode=0 xfe;m=0 x00; /鍵盤行掃描初值,m為每行首鍵號vfor (i=1;i=4;i+)/i為行數(shù)vv k=0 x10; v P2=scancode;v a=P2;v for (j=0;j4;j+)/J為列數(shù)v if (a&k)=0) v v codevalue =m+j; /計算鍵值v while (checkkey()!=0); /等待鍵釋放v return (codevalue);v v else k=k1; v m=m+4;/每一行有4個按鍵,行增加1,鍵值加4v /sc

58、ancode=_crol_(scancode,1);v scancode=scancode1;v scancode=scancode|0 x01;v v v v vvoid main() /主函數(shù)v v uchar i;v uchar data int_mima6;v int x;v P3=0 x00;vwhile(1) v uchar data int_mima6=0,0,0,0,0,0;v if (checkkey()=0 x00) continue; / 無鍵按下checkkey()返回值為0 ,返到while(1)繼續(xù)v else / 有鍵按逐行掃描返回值送int_mimav v fo

59、r(i=0;i6;i+)v v int_mimai=keyscan();v P3=aint_mimai;v while(checkkey()=0); /等待v vif( int_mima0=set_mima0&int_mima1=set_mima1&int_mima2=set_mima2&int_mima3=set_mima3&int_mima4=set_mima4& int_mima5=set_mima5)v LED=0;/密碼相同LED燈點亮v relay=0;/密碼相同,繼電器吸合v v v 4.9.5 程序分析程序分析v(1)主函數(shù)中i變量是用來

60、記錄密碼輸入個數(shù),此設計是6位密碼,每次輸入的密碼放在int_mimai中。v(2)“P3=aint_mimai;”是在數(shù)碼管上顯示按下的鍵值v(3)“if( int_mima0=set_mima0&int_mima1=set_mima1&int_mima2=vset_mima2&int_mima3=set_mima3&int_mima4=set_mima4& int_mima5=set_mima5 )”v一句是判斷輸入的密碼是否與初始設置密碼一致,方法是將存放輸入密碼的數(shù)組與存放初始密碼的數(shù)組一一進行比較。如果if語句里的條件成立,那么使指示燈點亮,并且繼電器吸合。2022-4-14784.9.6 調試與仿真運行調試與仿真運行v 在程序的調試過程中排除輸入和編輯過程中出現(xiàn)的錯誤,將Keil的輸出設置為生成HEX義件,源程序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論