51單片機(jī)C語言編程.ppt_第1頁
51單片機(jī)C語言編程.ppt_第2頁
51單片機(jī)C語言編程.ppt_第3頁
51單片機(jī)C語言編程.ppt_第4頁
51單片機(jī)C語言編程.ppt_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余26頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)C51編程,一、C51與標(biāo)準(zhǔn)C的差異,1、庫函數(shù)不同,2、頭文件不同,3、數(shù)據(jù)類型有一定區(qū)別,4、增加了存儲模式,5、增加了中斷函數(shù),6、輸入、輸出不同,C51通過串口進(jìn)行。,二、C語言與匯編語言,單片機(jī)C語言編程與匯編語言編程的差異:,1、用匯編語言編寫單片機(jī)程序必須要考慮其存儲器結(jié)構(gòu),資 源分配是匯編語言編程中的一大負(fù)擔(dān)。而且不同的存儲器操作 對象尋址方式不同,訪問的指令也不同。,3、匯編語言編程,子程序調(diào)用要考慮現(xiàn)場的保護(hù)與恢復(fù),要考慮工作寄存器的分組使用,避免資源沖突。C語言編譯系統(tǒng)自動完成這些工作。,如MOV, MOVC,MOVX訪問的空間不同。,2、匯編語言中的指令繁多,功能

2、單一。如單片機(jī)中大量的轉(zhuǎn)移 類指令在C語言中均由分支程序?qū)崿F(xiàn)。,4、匯編語言編寫中的循環(huán)程序是通過轉(zhuǎn)移指令重復(fù)執(zhí)行來現(xiàn)實(shí)的,C語言則通過循環(huán)語句來實(shí)現(xiàn)。,6、用C語言編寫的單片機(jī)應(yīng)用程序: (1)所有操作對象都可以看成變量或常量,沒有尋址方式(數(shù)據(jù)傳送由賦值語句實(shí)現(xiàn),所有運(yùn)算都通過表達(dá)式實(shí)現(xiàn))。 (2)不用像匯編語言那樣須具體組織、分配存儲器資源和處理端口數(shù)據(jù). (3)子程序調(diào)用時,C語言程序的編譯系統(tǒng)自動進(jìn)行現(xiàn)場的保護(hù)。 (5)C語言語法簡單,語句緊湊,容易理解和掌握。 (4)在C語言編程中,對數(shù)據(jù)類型與變量的定義,必須要與單片機(jī)的存儲結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。,5、匯編語言

3、編程中使用大量的算術(shù)邏輯運(yùn)算指令在單片機(jī)C語言編程中全部由相應(yīng)的運(yùn)算表達(dá)式實(shí)現(xiàn)。,三、 C51的數(shù)據(jù)類型,1、特殊功能寄存器類型: 在C51中對特殊功能寄存器的訪問必須先用sfr或sfr16 進(jìn)行聲明。,sfr P0= 0 x80; /*P0口的寄存器地址為0 x80*/,兩種使用特殊功能寄存器的方法:,1)、先定義再使用:,2)、包含51單片機(jī)的頭文件:,#include ,void main(void) uchar var1; var1 = P1 . while(1); ,2、位類型 這也是C51中擴(kuò)充的數(shù)據(jù)類型,用于訪問MCS-51單片機(jī)中的可尋址的位單元。在C51中,支持兩種位類型:b

4、it型和sbit型。它們在內(nèi)存中都只占一個二進(jìn)制位,其值可以是“1”或“0”。,bit flags; /* 在bdata區(qū)定義一個位變量*/ sfr P0= 0 x80; /*因P0口的寄存器是可位尋址的*/ sbit P0_0=P00; /*所以P0_0為P0中的P0.0引腳*/ 除了以上定義方式外,還可以用P0.0的地址去寫,如: sbit P0_0=0 x80;,區(qū)別:用bit定義的位變量在C51編譯器編譯時,在不同的時 候位地址是可以變化的,而用sbit定義的位變量必須與51單 片機(jī)的一個可以尋址位單元或可位尋址的字節(jié)單元中的某一 位聯(lián)系在一起,在C51編譯器編譯時,其對應(yīng)的位地址是不

5、可 變化的。,四、新增存貯類型 變量是在程序運(yùn)行過程中其值可以改變的量。一個變量由兩部分組成:變量名和變量值。 在C51中,變量在使用前必須對變量進(jìn)行定義,指出變量的數(shù)據(jù)類型和存儲模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲單元。定義的格式如下: 數(shù)據(jù)類型說明符 存儲器類型 變量名1=初值,變量名2=初值;,2、六種存儲器類型:,【例】變量定義存儲種類和存儲器類型相關(guān)情況。 char data varl; /*在片內(nèi)RAM低128B定義用直接尋址方式訪問的字符型變量var1*/ int idata var2; /*在片內(nèi)RAM256B定義用間接尋址方式訪問的整型變量var2*/ unsigned lo

6、ng data var3; /*在片內(nèi)RAM128B定義用直接尋址方式訪問的自動無符號長整型變量var3*/ float xdata var4; /*在片外RAM64KB空間定義用間接尋址方式訪問的外部實(shí)型變量var4*/ int code var5; /*在ROM空間定義整型變量var5*/ unsign char bdata var6;/*在片內(nèi)RAM位尋址區(qū)20H2FH單元定義可字節(jié)處理和位處理的無符號字符型變量var6*/,五、 存儲模式,C51編譯器支持三種存儲模式:SMALL模式、COMPACT模式和LARGE模式。不同的存儲模式對變量默認(rèn)的存儲器類型不一樣。 (1)SMALL模式

7、。SMALL模式稱為小編譯模式,在SMA-LL模式下,編譯時,函數(shù)參數(shù)和變量被默認(rèn)在片內(nèi)RAM中,存儲器類型為data。 (2)COMPACT模式。COMPACT模式稱為緊湊編譯模式,在COMPACT模式下,編譯時,函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的低256字節(jié)空間,存儲器類型為pdata。 (3)LARGE模式。LARGE模式稱為大編譯模式,在LARGE模式下,編譯時函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的64K字節(jié)空間,存儲器類型為xdata。,六、 絕對地址訪問,1. 使用指針 采用指針的方法,可實(shí)現(xiàn)在C51程序中對任意指定的存儲器地址進(jìn)行操作。例如:,#define uchar unsign

8、ed char #define uint unsigned int void test_memory(void) uchar idata ivar1; uchar xdata *xdp; /*定義一個指向xdata存儲器空間的指針*/ char data *dp; /*定義一個指向data存儲器空間的指針*/ uchar idata *idp; /*定義一個指向idata存儲器空間的指針*/ xdp=0 x1000;/*xdata指針賦值,指向xdata存儲器地址1000H處*/ *xdp=0 x5A;/*將數(shù)據(jù)5AH送到xdata的1000H單元*/ dp=0 x61; /*data指針賦值

9、,指向data存儲器地址61H處*/ *dp=0 x23; /*將數(shù)據(jù)23H送到data的61H單元*/ idp= /*等價于ivar1=0 x16*/,2、使用C51運(yùn)行庫中預(yù)定義宏 C51編譯器提供了一組宏定義來對51系列單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對尋址。規(guī)定只能以無符號數(shù)方式訪問,定義了8個宏定義,其函數(shù)原型如下:,#define CBYTE(unsigned char volatile code *) 0 ) #define DBYTE(unsigned char volatile data * ) 0 ) #define PBYTE(unsigned

10、 char volatile pdata *) 0 ) #define XBYTE(unsigned char volatile xdata *) 0 ) #define CWORD(unsigned int volatile code *) 0 ) #define DWORD(unsigned int volatile data *) 0 ) #define PWORD(unsigned int volatile pdata *) 0 ) #define XWORD(unsigned int volatile xdata *) 0 ),這些函數(shù)原型放在absacc.h文件中。使用時須用預(yù)處理

11、命令把該頭文件包含到文件中,形式為:#include 。 其中:CBYTE以字節(jié)形式對code區(qū)尋址, DBYTE以字節(jié)形式對data區(qū)尋址, PBYTE以字節(jié)形式對pdata區(qū)尋址, XBYTE以字節(jié)形式對xdata區(qū)尋址, CWORD以字形式對code區(qū)尋址, DWORD以字形式對data區(qū)尋址, PWORD以字形式對pdata區(qū)尋址, XWORD以字形式對xdata區(qū)尋址。,【例】絕對地址對存儲單元的訪問 #include /*將絕對地址頭文件包含在文件中*/ #include /*將寄存器頭文件包含在文件中*/ #define uchar unsigned char /*定義符號uch

12、ar為數(shù)據(jù)類 型符unsigned char*/ #define uint unsigned int /*定義符號uint為數(shù)據(jù)類型 符unsigned int*/ void main(void) uchar var1; uint var2; var1=XBYTE0 x0002; /*訪問片外RAM的0002字節(jié)單元*/ var2=XWORD0 x0004; /*訪問片外RAM的00040005單元*/ . while(1); ,3、使用C51擴(kuò)展關(guān)鍵字_at_ 使用_at_對指定的存儲器空間的絕對地址進(jìn)行訪問,一般格式如下: 存儲器類型 數(shù)據(jù)類型 標(biāo)識符 _at_ 地址常數(shù); 其中,存儲器類

13、型為data、bdata、idata、pdata等如省略則按存儲模式規(guī)定的默認(rèn)存儲器類型確定變量的存儲器區(qū)域; 數(shù)據(jù)類型為C51支持的數(shù)據(jù)類型。地址常數(shù)用于指定變量的絕對地址,必須位于有效的存儲器空間之內(nèi); 使用_at_定義的變量必須為全局變量。,【例】通過_at_實(shí)現(xiàn)絕對地址的訪問。 #define uchar unsigned char /*定義符號uchar為數(shù)據(jù)類 型符unsigned char*/ #define uint unsigned int /*定義符號uint為數(shù)據(jù)類型 符unsigned int*/ data uchar x1 _at_ 0 x40; /*在data區(qū)中定

14、義字節(jié)變量 x1,它的地址為40H*/ xdata uint x2 _at_ 0 x2000; /*在xdata區(qū)中定義字變量 x2,它的地址為2000H*/ void main(void) x1=0 xff; x2=0 x1234; . while(1); ,由于標(biāo)準(zhǔn)C沒有處理單片機(jī)中斷的定義,由此C51增加了一個擴(kuò)展關(guān)鍵字interrupt。使用interrupt將一個函數(shù)定義成中斷服務(wù)函數(shù)。對于中斷服務(wù)函數(shù),編譯時會自動添加了相應(yīng)的現(xiàn)場保護(hù)、恢復(fù)現(xiàn)場等,因而用戶在編程時可不必考慮這些問題,減小了編程的繁瑣程度。 中斷函數(shù)一般形式為:viod 函數(shù)名( ) interrupt n usin

15、g n interrupt后的 n是中斷號,n取值為04,分別對應(yīng)5個中斷源:外中斷0、T0中斷、外中斷1、T1中斷、串行口中斷。 using后的 n是中斷函數(shù)中所采用的工作寄存器組號,n取值03,分別對應(yīng)通用工作寄存器區(qū):第0組、第1組、第2組、第3組。 using是選項(xiàng)可省略。若沒有使用using,中斷函數(shù)中使用原指定的工作寄存器組,但使用前將其內(nèi)容保存到堆棧中,返回時復(fù)原。,4、C51的中斷函數(shù),例:使用一個“+”鍵和一個“-”鍵來進(jìn)行數(shù)據(jù)的的修改,若用INT0和INT1作“+”鍵和“-”鍵的輸入,P1口接一個數(shù)碼管,顯示加、減操作數(shù)據(jù)的變化信息。系統(tǒng)上電后初始顯示數(shù)據(jù)0,每按一次加鍵,

16、加1顯示,加到9后再按加鍵自動回0;每按一次減鍵,減1顯示,減到0后再按減鍵,自動回9;畫出接線電路圖,編程實(shí)現(xiàn)。,#include #define uchar unsigned char #define uint unsigned int /段碼 uchar code DSY_CODE=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d, 0 x7d,0 x07,0 x7f,0 x6f,0 x07;,/按鍵計數(shù) char Key_Counts=0; sbit AddKey=P32; sbit SubKey=P33; /延時 void DelayMS(uint x) uch

17、ar i; while(x-) for(i=0;i120;i+); ,/顯示函數(shù) void Show_Counts_ON_DSY(char x) P1= DSY_CODE x; ,/主程序 void main() Show_Counts_ON_DSY(Key_Counts); while(1) if (AddKey) DelayMS(10); if (AddKey) while (AddKey); +Key_Counts; if (Key_Counts9) Key_Counts=0; else if (SubKey) DelayMS(10); if (SubKey) while (SubKey

18、) ; -Key_Counts; if (Key_Counts0) Key_Counts=9; Show_Counts_ON_DSY(Key_Counts); ,例:設(shè)計單片機(jī)與44矩陣鍵盤接口并驅(qū)動一數(shù)碼管顯示的電路,P1口接鍵盤,P0口接共陰數(shù)碼管,按數(shù)字鍵(0 9),在數(shù)碼管上顯示相應(yīng)的鍵號,按其它鍵數(shù)碼管清零,編程實(shí)現(xiàn)。,#include ,#define uchar unsigned char #define uint unsigned int,/段碼 uchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82, 0 x

19、f8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x00;,sbit BEEP=P37;,/上次按鍵和當(dāng)前按鍵的序號,該矩陣中序號范圍015, / 16表示無按鍵 uchar Pre_KeyNo=16 ,KeyNo=16;,/延時 void DelayMS(uint x) uchar i; while(x-) for(i=0;i120;i+); ,/矩陣鍵盤擊鍵檢查,uchar CH_Key (void) uchar key_temp; P1=0 x0f; /高4 位置0,放入4 行 key_temp =P10 x0f; return (key_temp);,/矩陣鍵盤掃描,void Keys_Scan() uchar Tmp; P1=0 x0f; /高4 位置0,放入4列 Tmp=P10 x0f switch(Tmp) /判斷按鍵發(fā)生于03 行的哪一行 case 1: KeyNo=0 ; break; case 2: KeyNo=4 ; break; case 4: KeyNo

溫馨提示

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

最新文檔

評論

0/150

提交評論