第周C語言知識與KeilC的使用學習教案_第1頁
第周C語言知識與KeilC的使用學習教案_第2頁
第周C語言知識與KeilC的使用學習教案_第3頁
第周C語言知識與KeilC的使用學習教案_第4頁
第周C語言知識與KeilC的使用學習教案_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、會計學1第周第周C語言知識語言知識(zh shi)與與KeilC的使用的使用第一頁,共54頁。匯編語言:優(yōu)點:面向機器、目標代碼短、占用存儲器空間少、運行快。缺點:指令助記符多、編程靈活性差。C語言:優(yōu)點:具有面向機器和面向用戶的特點,良好的可讀性易維護性和可移植性,對硬件的控制能力也很強, C語言的數據類型及運算符豐富,具有良好的程序結構。缺點:代碼效率稍低(同匯編語言相比(xin b)),占用存儲空間較大。解決方法:單片機內部都嵌入了大容量的Flash ROM,有效的彌補了這個缺陷。第1頁/共54頁第二頁,共54頁。采用Keil C51語言編程的優(yōu)點:(1) 不需要對單片機的匯編語言指令系

2、統(tǒng)有深入的了解;(2)寄存器分配不同存儲器的尋址及數據類型等完全由編譯器自動管理;(3) 程序的結構規(guī)范,由一個主函數和不同功能的子函數組成;(4) 自帶的庫中包含許多標準子函數,具有較強的數據處理能力,方便使用;(5) C語言和匯編語言可以聯(lián)合使用??捎脜R編語言編寫與硬件(yn jin)有關的程序,用C語言編寫與硬件(yn jin)無關的運算部分。第2頁/共54頁第三頁,共54頁。1 。C51源程序的基本(jbn)結構和常用的頭文件1.1 C51源程序的基本結構文件的擴展名為“.c”。由主函數和若干子函數組成。預處理命令(mng lng) /例如:include, define等全局變量說明

3、 /例如:int a,b;main() 局部變量說明執(zhí)行語句(包括子函數的調用語句)第3頁/共54頁第四頁,共54頁。func1(形式參數及說明)/子函數1 局部變量說明執(zhí)行(zhxng)語句(包括調用其它子函數語句)funcn(形式參數及說明)/子函數n 局部變量說明執(zhí)行(zhxng)語句第4頁/共54頁第五頁,共54頁。C51編程時應注意的問題:(1)C51源程序是由函數組成的:主函數和子函數。(2)一個函數由兩個部分組成,分別是函數說明(shumng)部分和函數體。函數說明(shumng)部分包括函數名函數類型函數屬性函數參數(形參)名形式參數類型。函數名后面必須跟一對圓括號,函數參數可

4、以沒有,如main()。函數體: 內的部分。 “”必須成對出現(xiàn),書寫位置隨意。一般為了層次分明,同一層的大括號對齊,并采用逐層縮進方法書寫。(3)每個語句必須以“;”結尾。(4)可以用“/*/”或“/”對程序中的任何部分進行注釋。(5)每個語句和數據定義的最后必須有分號。第5頁/共54頁第六頁,共54頁。1.2 C51中常用(chn yn)的頭文件 reg51.h、reg52.h、math.h、ctype.h、stdio.h、stdlib.h、absacc.h和intrins.h。(1)reg51.h和reg52.h (定義(dngy)51或52子系列單片機特殊功能寄存器和特殊位) reg52

5、.h比reg51.h多了幾行定義(dngy)T2寄存器的內容。 第6頁/共54頁第七頁,共54頁。sfr P1=0 x90;/*定義P1口的地址為90H*/sfr TCON=0 x88;sfr TMOD=0 x89;sfr TL0=0 x8A;sfr16 T2=0 xCC;T2L=0CCH,T2H=0CDH*/sbit ET0=IE1; /*指定ET0為中斷(zhngdun)允許控制寄存器IE的第1位*/sbit ET0=0 xaa;/*指定ET0為可尋址位0AAH,即IE.1。*/第7頁/共54頁第八頁,共54頁。(2)absacc.h訪問(fngwn)絕對地址頭文件。當用絕對地址訪問(fn

6、gwn)內部RAM(data)、外部RAM的一頁(pdata)、整個外部RAM(xdata)和ROM(code)時,需包含此文件。命令有:CBYTE、CWORD (以字節(jié)型、字型訪問(fngwn)ROM)DBYTE、DWORD (訪問(fngwn)內部RAM)PBYTE、PWORD (外部RAM的一頁空間(256B)XBYTE、XWORD (訪問(fngwn)外部RAM)第8頁/共54頁第九頁,共54頁。#include main( ) DBYTE0 x30=0 xff; /*給片內RAM的30H單元(dnyun)賦值0FFH*/ XWORD0 x1000=0 x1234; /*給片外RAM的

7、1000H單元(dnyun)賦值12H,1001H單元(dnyun)賦值34H*/第9頁/共54頁第十頁,共54頁。(3)其它頭文件math.h:數學運算函數,如求絕對值、平方根、指數、正弦等函數。ctype.h:提供兩類重要的函數:字符測試函數和字符大小轉化函數。例如,判斷一個整型變量是數字、字母、換行符、控制符等。stdio.h:標準輸入(shr)輸出函數頭文件,用于從標準輸入(shr)設備讀取字符、數字,或向標準輸出設備輸出字符、字符串等。第10頁/共54頁第十一頁,共54頁。stdlib.h:標準庫頭文件。說明了用于數值轉換、內存分配以及具有其他相似任務的函數,例如求絕對值、把字符(z

8、 f)串轉換成整型、長整型等。intrins.h :字符(z f)型、整型和長整型數字的左、右循環(huán)移位頭文件。例如_cror_、_crol_、_iror_、_irol_分別表示字符(z f)型數字右循環(huán)、左循環(huán)和整型數字的右循環(huán)、左循環(huán)。例如:_cror_(a,2); /對變量a循環(huán)右移2位此處的循環(huán)移位和按位操作的左移()實現(xiàn)的功能是不同的。_nop_(); 第11頁/共54頁第十二頁,共54頁。2 C51的基本數據類型、數據存儲(cn ch)類型和存儲(cn ch)模式2.1 C51的基本(jbn)數據類型 常量和變量數值型常量: 十進制數或十六進制數(用0 x表示)符號型常量:需用宏定義

9、指令(#define)對其進行定義。 如:#define PI 3.14159常量第12頁/共54頁第十三頁,共54頁。變量(binling):數據類型數據類型長度長度值域值域位型位型bit1bit0或或1字符型字符型signedchar1B-128+127unsignedchar1B0255整型整型signedint2B-32768+32767unsignedint2B065535singedlong4B-2147483648+2147483647unsignedlong4B04,294,967,295實型實型float4B1.176E-3840E+38第13頁/共54頁第十四頁,共54頁。

10、數據類型數據類型長度長度值域值域指針型指針型data/idata/pdata1B1字節(jié)地址字節(jié)地址code/xdata2B2字節(jié)地址字節(jié)地址通用指針通用指針3B其中其中1字節(jié)為存儲器類字節(jié)為存儲器類型編碼,型編碼,23字節(jié)為地字節(jié)為地址偏移量址偏移量訪問訪問SFR的數據類的數據類型型sbit1bit0或或1sfr1B0255sfr162B065535第14頁/共54頁第十五頁,共54頁。2.2 C51數據(shj)的存儲類型3個存儲(cn ch)區(qū):內部RAM外部RAM和ROM。存儲類型存儲類型與硬件存儲空間的對應關系與硬件存儲空間的對應關系data直接尋址直接尋址內部內部RAM(128B),

11、訪問變量速度最快),訪問變量速度最快bdata可位尋址可位尋址內部內部RAM(16B),允許位與字節(jié)混合訪問),允許位與字節(jié)混合訪問idata間接尋址內部間接尋址內部RAM,可訪問內部地址空間(,可訪問內部地址空間(256B)pdata外部外部RAM的一頁空間(的一頁空間(256B),),由由MOVXDPTR指令訪問指令訪問xdata外部外部RAM(64KB),),由由MOVXDPTR指令訪問指令訪問code代碼存儲器(代碼存儲器(64KB),),由由MOVCA+DPTR指令訪問指令訪問第15頁/共54頁第十六頁,共54頁。2.3 C51數據(shj)的存儲模式存儲模式決定(judng)了變量

12、的默認存儲類型、參數傳遞區(qū)和無明確存儲區(qū)類型的說明。(1)small 模式所有參數及局部變量都放在可直接尋址的內部RAM(最大128B),這和用data定義變量所起的作用是相同的。優(yōu)點:訪問速度快;缺點:空間有限,只適用于對RAM需求小的程序。第16頁/共54頁第十七頁,共54頁。(2)compact模式所有參數及局部變量都放在外部RAM區(qū)的一頁(最大256B),這和用pdata定義變量的作用相同。具體哪一頁,可由P2口定義,并在STARTUP.A51文件(wnjin)中說明。一般默認的是外部RAM的低256B。特點:存儲器空間比small 模式大,但速度較small 模式慢,卻比large模

13、式快。(3)large 模式所有參數及局部變量都放在外部RAM區(qū)(最大64KB),這和用xdata定義變量的作用是相同的。用數據指針(DPTR)尋址。該模式優(yōu)點是其空間足夠大,可存放變量多,缺點(qudin)是速度較慢。第17頁/共54頁第十八頁,共54頁。2.4 變量(binling)聲明舉例(1)字符型、整型、實型變量(binling)的聲明聲明存儲類型和signed/unsigned屬性。char data i;/*字符型變量(binling)i定位在內部RAM*/unsigned char code Tab =”key in number”;long xdata array10;flo

14、at idata m,n;unsigned int pdata j;unsigned char xdata score1044;char bdata flag;第18頁/共54頁第十九頁,共54頁。如果在變量說明時略去(l q)存儲器類型標志符,編譯器會自動選擇默認的存儲器類型。默認的存儲器類型由控制指令smallcompact和large限制。 第19頁/共54頁第二十頁,共54頁。(2)位變量聲明指定義(dngy)的變量為內部RAM中可位尋址的位。普通位:bit flag;/*位變量(binling)flag定位于片內RAM中的可位尋址*/bit flag=0 x40;/*用flag表示內

15、部RAM的40H位,flag bit 40Hbit flag=0 x200;特殊(tsh)功能寄存器的位:#include sbit led = P10;/*led表示P1.0*/sbit led = 0 x900;/*90H是P1口的地址,結果同上*/第20頁/共54頁第二十一頁,共54頁。(3)指針(zhzhn)變量聲明指針(zhzhn)變量的應用類似于匯編語言中的寄存器間接尋址。指針(zhzhn)變量的聲明格式為:數據類型 存儲器類型1 *存儲器類型2 標識符* 表示是指針(zhzhn)類型,此處*不含取內容之意;數據類型聲明指針(zhzhn)所指變量的類型;存儲器類型1聲明指針(zhz

16、hn)所指變量的存儲類型,若默認則定義為一般指針(zhzhn);存儲器類型2聲明該指針(zhzhn)變量本身的存儲類型;標識符聲明指針(zhzhn)變量本身的數據類型和名稱。第21頁/共54頁第二十二頁,共54頁。例:char xdata *data pd;/*指針pd指向字符型外部RAM區(qū)(每個數據1個字節(jié)(z ji));指針pd定位在片內RAM區(qū)(data),默認長度2個字節(jié)(z ji)*/char xdata * pd;/*同上*/data int *pd;/*整型通用指針,指針在內部RAM,長度為3B*/int *data pd/*功能同上*/第22頁/共54頁第二十三頁,共54頁。注

17、意:指針變量中只能存放地址(dzh),不能將一個非地址(dzh)的數據賦給指針變量。例如:如果通過指針(zhzhn)取出RAM中存放的數據100。int m=100;int *pd;int n;*pd=&m;/* &為取地址運算符,將變量(binling)m的地址賦給指針pd*/n=*pd; /*使用指針變量(binling)進行間接訪問,將變量(binling)m的值賦給 n,n=100*/第23頁/共54頁第二十四頁,共54頁。+ - * / %(加 減 乘 除 余) = (位右移 位左移)& | (按位與 按位或) (按位異或 按位取反)按位操作運算符與C語言基本

18、相同:算術關系邏輯3 C51的運算符第24頁/共54頁第二十五頁,共54頁。自增自減運算符:+i、-i、i+、i-。復合(fh)賦值運算符:+=,=,*=,/=,%=,=,&=,=,|=對指針操作的運算符:&、* 分別表示取地址運算符和間接尋址運算符。例如:*pd= &m;/*將變量m的地址賦給指針pd*/n=*pd; /*使用指針變量進行間接訪問,將變量m的值賦給n*/注意:與運算符“&”的兩邊(lingbin)必須為變量 。第25頁/共54頁第二十六頁,共54頁。4 C51的函數(hnsh)int addfunc(int a, int b) /*加法子函數(

19、hnsh)*/ int c; c=a+b; return(c);void delay( )/*延時10ms子函數(hnsh),假設fOSC11.0592MHz*/ int ms=10; while (ms-) for (i=0; i115; i+); /*延時1ms*/第26頁/共54頁第二十七頁,共54頁。void main()/*主函數(hnsh)*/ int x=10, y=3, z;z=addfunc(x, y);delay();第27頁/共54頁第二十八頁,共54頁。4.1 函數的分類從用戶使用的角度看,函數有兩種:(1)標準函數,即庫函數。如“math.h”、“intrins.h”

20、等。(2)用戶自己(zj)定義的函數。如例6-1中的addfunc和delay。從函數(hnsh)的形式上看,函數(hnsh)分兩類:(1)無參函數(hnsh)。(2)有參函數(hnsh)。第28頁/共54頁第二十九頁,共54頁。4.2 函數(hnsh)的定義int addfunc(int a, int b) int c; c=a+b; return(c);有參函數定義(dngy)的一般形式:類型標識符 函數名(形式參數列表) 函數體語句;無參函數的定義形式(xngsh):類型標識符 函數名()函數體語句;第29頁/共54頁第三十頁,共54頁。4.3 函數的調用三種函數調用方式:(1)函數語句

21、:如 “delay();” (2)函數表達式:如z=addfunc(x,y);(3)函數參數:如 m= addfunc(z, addfunc(x,y); 此時函數addfunc(x,y)的值作為(zuwi)函數addfunc的另一個形參,m的值為z+(x+y)。第30頁/共54頁第三十一頁,共54頁。4.4 對被調用函數的說明(shumng)若被調用函數出現(xiàn)(chxin)在主調函數之前,可以不對被調用函數說明。若被調用函數出現(xiàn)(chxin)在主調函數之后,在主調函數前應對被調用函數做出說明,形式為:返回值類型 被調函數名(形參列表);如:void delay( ); int addfunc(i

22、nt, int); 第31頁/共54頁第三十二頁,共54頁。int addfunc(int, int)void delay() int ms=10; while (ms-) for (i=0;i115;i+); void main() int x=10,y=3,z; z=addfunc(x,y); delay();int addfunc(int a,int b) int c;c=a+b;return(c);第32頁/共54頁第三十三頁,共54頁。中斷(zhngdun)服務程序函數名(void)interrupt n 函數體 n=0:外部(wib)0中斷;n=1:定時器0中斷n=2:外部(wib

23、)1中斷;n=3:定時器1中斷n=4:串口中斷; n=5:ADC中斷I/O口定義(dngy)#include /使用系統(tǒng)的頭文件#define prot xbyte0 x1000 /直接定義或 用指針定義第33頁/共54頁第三十四頁,共54頁。幾個(j )Keil C51的關鍵字volatile:它是被設計用來修飾被不同線程訪問和修改的變量。如果沒有volatile,基本上會導致這樣的結果:要么無法編寫多線程程序,要么編譯器失去大量優(yōu)化的機會。頻繁地使用volatile很可能會增加代碼尺寸和降低性能(xngnng),因此要合理的使用volatile。const=code:它限定一個變量不允許被

24、改變。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在觀看別人代碼的時候,清晰理解const所起的作用。第34頁/共54頁第三十五頁,共54頁。5 單片機的C51語言(yyn)編程#include void main () char a,b;/*a為高半字節(jié),b為低半字節(jié)*/ DBYTE0 x40=25; a=DBYTE0 x40&0 xf0;/*分離(fnl)出高半字節(jié)*/ a=4;/*右移四位*/ b=DBYTE0 x40&0 x0f;/*分離(fnl)出低半字節(jié)*/ DBYTE0 x41=a+0 x30; DBYTE0 x42=b+0 x30; 例6-2

25、將40H單元(dnyun)的高、低半字節(jié)的兩個BCD碼拆,轉換成相對應的ASCII碼后分別存入41H和42H單元(dnyun)。第35頁/共54頁第三十六頁,共54頁。若在程序開始時對0 x40單元(dnyun)寫入0 x19,則程序的運行結果:第36頁/共54頁第三十七頁,共54頁。例6-2 把外部RAM 2000H201FH單元(dnyun)的內容置為10H。知識回顧:C語言的循環(huán)語句的幾種形式:(1)while(表達式)語句;當表達式值為真(值為1)時,重復執(zhí)行循環(huán)體。 屬于當型循環(huán)。(2)do 語句; while(表達式)先執(zhí)行循環(huán)體,再判斷表達式是否為真,如此(rc)循環(huán);直至表達式

26、為假時退出循環(huán)。屬于直到型循環(huán)。(3)for(表達式1;表達式2;表達式3;)語句;第37頁/共54頁第三十八頁,共54頁。#include void main() char xdata i; for (i=0; i0 x20; i+) XBYTE0 x2000+i=0 x10; C51源程序:第38頁/共54頁第三十九頁,共54頁。 例6-3 把ROM從2000H單元開始(kish)的數據塊傳送到外部RAM從1000H開始(kish)的存儲區(qū)中,當數據為0時停止傳送。#include void main() unsigned char i=0; while (CBYTE0 x2000+i!=

27、0) XBYTE0 x1000+i=CBYTE0 x2000+ii+;第39頁/共54頁第四十頁,共54頁。例6-4第40頁/共54頁第四十一頁,共54頁。void main() while(1) led=0 xfe; for (x=1;x9;x+) delayxms(x);/調用延時子函數,傳遞(chund)參數x led=_crol_(led,1);/循環(huán)左移,每次只移1位 第41頁/共54頁第四十二頁,共54頁。#include #include unsigned int x;unsigned char led;#define led P1delayxms(unsigned int x)

28、/帶參數(cnsh)的1s延時子函數 unsigned int i, j, k; for(k=x;k0;k-) for(i=1000;i0;i-) for(j=115;j0;j-); /本句延時1ms 第42頁/共54頁第四十三頁,共54頁。6 C51和匯編語言(hu bin y yn)的混合編程參數傳遞的寄存器選擇(xunz)參數類型參數類型charintlong,float一般指針一般指針第1個參數R7R6、R7R4-R7R1、R2、R3第2個參數R5R4、R5R4-R7R1、R2、R3第3個參數R3R2、R3無R1、R2、R3如果定義:char a=10, b=20;則a參數傳遞給R7,

29、b參數傳遞給R5。如果傳遞參數寄存器不夠用,可以(ky)使用存儲器傳送,通過指針取得參數。第43頁/共54頁第四十四頁,共54頁。對于有參函數的參數(cnsh)返回值與寄存器之間的傳遞規(guī)律: 表6-4 函數(hnsh)返回值的寄存器返回值返回值寄存器寄存器說明說明bitC進位標志進位標志CY(unsigned)charR7(unsigned)intR6、R7高位在高位在R6,低位在,低位在R7(unsigned)longR4R7高位在高位在R4,低位在,低位在R7floatR4R732位位IEEE格式,指數和符號位格式,指數和符號位在在R7指針指針R1、R2、R3R3放存儲器類型,高位在放存儲

30、器類型,高位在R2,低位在低位在R1第44頁/共54頁第四十五頁,共54頁。例6-5 采用(ciyng)混合編程方法實現(xiàn)例6-4的功能。第一步:在keil中編寫C51程序,在需要(xyo)匯編的地方先寫兩行代碼:#pragma asm.匯編程序內容#pragma endasm第45頁/共54頁第四十六頁,共54頁。#include #include unsigned char x;unsigned char led;#define led P1void delayxs(char);/子函數聲明void main() while(1) led=0 xfe; for (x=1;x9;x+) delayxs(x); led=_crol_(led,1);/循環(huán)(xnh

溫馨提示

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

評論

0/150

提交評論