19單片機高級語言設(shè)計課件_第1頁
19單片機高級語言設(shè)計課件_第2頁
19單片機高級語言設(shè)計課件_第3頁
19單片機高級語言設(shè)計課件_第4頁
19單片機高級語言設(shè)計課件_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第2章單片機高級語言設(shè)計C語言是一種計算機程序設(shè)計語言,它既具有高級語言的特點,又具有匯編語言的特點。它的優(yōu)點:簡潔緊湊、靈活方便、適用范圍大,可移植性好。單片機程序開發(fā)中,C語言是技術(shù)人員必不可少的一個工具,具有開發(fā)周期短、程序可視性好、通用性強等功能,支持多種類型單片機。學(xué)習(xí)目標掌握C51基本結(jié)構(gòu)掌握C51數(shù)據(jù)類型掌握C51常用語句了解并學(xué)會使用C51程序的庫函數(shù)用C語言進行簡單編程2.1C與C512.2C51常用運算符2.3C51基本語句2.4C51數(shù)據(jù)類型2.5C51存儲器類型2.6C51程序基本結(jié)構(gòu)2.7C51重要庫函數(shù)2.8C51標識符

實訓(xùn)項目——電子時鐘2.1C與C51

C語言具有下列特點:(1)將高級語言的基本結(jié)構(gòu)、語句與低級語言的實用性結(jié)合起來,可以對位、字節(jié)和地址進行操作。(2)是結(jié)構(gòu)式語言,以函數(shù)形式提供給用戶。(3)功能齊全,具有各種各樣的數(shù)據(jù)類型,并引入了指針概念,使程序效率更高。(4)適用范圍大,適合于多種操作系統(tǒng),也適用于多種機型。C51語言是以C語言作基礎(chǔ),在結(jié)構(gòu)上、定義及函數(shù)表達方式等兩者是相同,不同的地方是C51的寄存器、位操作、數(shù)據(jù)分區(qū)等的表述應(yīng)用方式。2.2C51常用運算符與C語言相同,C51的基本運算主要有:算術(shù)運算符,關(guān)系運算符,邏輯運算符,字位左移、右移,字位運算符,條件運算符,逗號運算符,指針運算符,長度計算符,強制類型轉(zhuǎn)換運算符,分量運算符,下標運算符,函數(shù)調(diào)用運算符,自增自減運算符,復(fù)合賦值表達式,逗號表達式16種。2.3C51基本語句

C51常用基本語句主要有8種(1)if語句if

(表達式1)

語句1;else

語句2;如果表達式1成立就執(zhí)行語句1,否則執(zhí)行語句2,可以嵌套。

(2)switch語句,多分支選擇switch

(表達式){

case常量表達式1:語句1;break;

case常量表達式2:語句2;break;

:

case常量表達式N:語句N;break;

default:

語句;break;}根據(jù)表達式值選擇執(zhí)行。如果都不是,執(zhí)行default語句。(3)goto語句goto

語句標號

:無條件轉(zhuǎn)移(4)while語句while(表達式)語句先判斷,后執(zhí)行,當表達式為非0值時執(zhí)行語句,表達式為0值時,不執(zhí)行內(nèi)嵌語句。(5)do...while語句do語句;while(表達式);先執(zhí)行語句,再判斷表達式,當表達式不為0,執(zhí)行,為零則不執(zhí)行。注意與while區(qū)別。(6)for語句for(表達式1;表達式2;表達式3)語句;先求解表達式1,求解表達式2,均為非0,則執(zhí)行語句,然后求解表達式3,轉(zhuǎn)回求解式2,式2為0值,則結(jié)束。否則繼續(xù)。(7)break語句中斷當前循環(huán),通常在switch語句和while、for或do...while循環(huán)中使用break語句。執(zhí)行break語句會退出當前循環(huán)或語句,并開始執(zhí)行緊接著的語句。(8)continue語句其作用為結(jié)束本次循環(huán)。即跳出循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定。continue語句和break語句的區(qū)別是:continue語句只結(jié)束本次循環(huán),而不終止整個循環(huán)的執(zhí)行。而break語句則是結(jié)束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。continue語句的作用是跳過循環(huán)本中剩余的語句而強行執(zhí)行下一次循環(huán)。continue語句只用在for、while、do-while等循環(huán)體中,常與if條件語句一起使用,用來加速循環(huán)。2.4C51數(shù)據(jù)類型序號數(shù)據(jù)類型長度值域1unsignedchar單字節(jié)0~255signedchar單字節(jié)-128~+1272unsignedint雙字節(jié)0~65535signedint雙字節(jié)-32768~+327673unsignedlong四字節(jié)0~4294967295signedlong四字節(jié)-2147483648~+21474836474float四字節(jié)±1.175494E-38~±3.402823E+385*1~3字節(jié)對象的地址6bit位0或17sfr單字節(jié)0~2558sfr16雙字節(jié)0~655359sbit位0或1(1)char字符類型char類型的長度是一個字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常量。分無符號字符類型unsignedchar和有符號字符類型signedchar,默認值為signedchar類型。unsignedchar類型用字節(jié)中所有的位來表示數(shù)值,所能表達的數(shù)值范圍是0~255。signedchar類型用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負數(shù),負數(shù)用補碼表示。所能表示的數(shù)值范圍是-128~+127。unsignedchar常用于處理ASCII字符或用于處理小于或等于255的整型數(shù)。(2)int整型int整型長度為兩個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。分有符號int整型數(shù)signedint和無符號整型數(shù)unsignedint,默認值為signedint類型。signedint表示的數(shù)值范圍是-32768~+32767,字節(jié)中最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負數(shù)。unsignedint表示的數(shù)值范圍是0~65535。(3)long長整型long長整型長度為四個字節(jié),用于存放一個四字節(jié)數(shù)據(jù)。分有符號long長整型signedlong和無符號長整型unsignedlong,默認值為signedlong類型。signedint表示的數(shù)值范圍是-2147483648~+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負數(shù)。unsignedlong表示的數(shù)值范圍是0~4294967295。(4)float浮點型float浮點型在十進制中具有7位有效數(shù)字,是符合IEEE-754標準的單精度浮點型數(shù)據(jù),占用四個字節(jié)。因浮點數(shù)的結(jié)構(gòu)較復(fù)雜在以后的章節(jié)中再做詳細的討論。(5)*指針型指針型本身就是一個變量,在這個變量中存放的指向另一個數(shù)據(jù)的地址。這個指針變量要占據(jù)一定的內(nèi)存單元,對不一樣的處理器長度也不盡相同,在c51中它的長度一般為1~3個字節(jié)。指針變量也具有數(shù)據(jù)類型,C51支持的指針是一般指針和存儲器指針。C51編譯器支持用星號(*)進行指針聲明??梢杂弥羔樛瓿稍跇藴蔆語言中有的所有操作。由于80C51及其派生系列所具有的獨特結(jié)構(gòu),C51編譯器支持兩種不同類型的指針:通用指針和存儲器指針。(6)bit位標量bit位標量是c51編譯器的一種擴充數(shù)據(jù)類型,利用它可定義一個位標量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個二進制位,不是0就是1,類似一些高級語言中的Boolean類型中的True和False。(7)sfr特殊功能寄存器sfr也是一種擴充數(shù)據(jù)類型,是定義8位的特殊功能寄存器。利用它能訪問51單片機內(nèi)部的所有特殊功能寄存器。如用sfrP1=0x90這一句定P1為P1端口在片內(nèi)的寄存器,在后面的語句中可用P1=255(對P1端口的所有引腳置高電平)之類的語句來操作特殊功能寄存器。sfr關(guān)鍵字后面是一個要定義的名字,等號后面必須是常數(shù),不允許有帶運算符的表達式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(0X80-0XFF)

(8)sfr1616位特殊功能寄存器sfr16也是一種擴充數(shù)據(jù)類型,是用來定義16位特殊功能寄存器,sfr16關(guān)鍵定后面是一個要定義的名字,等號后面必須是常數(shù),不允許有帶運算符的表達式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(0X80-0XFF)。sfr16和sfr一樣用于操作特殊功能寄存器,所不一樣的是它用于操作占兩個字節(jié)的寄存器。(9)sbit可尋址位sbit是單片機c語言中的一種擴充數(shù)據(jù)類型,利用它能訪問芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位,如訪問特殊功能寄存器中的某位。如要訪問P1口中的第2個引腳P1.1,定義方法如下:(A)sbit位變量名=位地址sbitP1_1=0x91;這樣是把位的絕對地址賦給位變量。同sfr一樣sbit的位地址必須位于0X80-0XFF之間。(B)sbit位變量名=特殊功能寄存器名^位位置sftP1=0x90;

sbitP1_1=P1^1;//先定義一個特殊功能寄存器名,再指定位變量名所在的位置,當可尋址位位于特殊功能寄存器中時可采用這種方法。(C)sbit位變量名=字節(jié)地址^位位置

sbitP1_1=0x90^1;這種方法其實和(B)是一樣的,只是把特殊功能寄存器的位址直接用常數(shù)表示。在C51存儲器類型中提供有一個bdata的存儲器類型,這個是指可位尋址的數(shù)據(jù)存儲器,位于單片機的可位尋址區(qū)(內(nèi)部RAM0x20-0x2f字節(jié)單元)中,可以將要求可位尋址的數(shù)據(jù)定義為bdata。如:unsignedcharbdataib;//在可位錄址區(qū)定義ucsignedchar類型的變量ibintbdataab[2]; //在可位尋址區(qū)定義數(shù)組ab[2],這些也稱為可尋址位對象sbitib7=ib^7 //用關(guān)鍵字sbit定義位變量來獨立訪問可尋址位對象的其中一位sbitab12=ab[1]^12;操作符“^”后面位的最大值取決于指定的基址類型,char型0-7,int型0-15,long型0-31。2.5C51存儲器類型

從數(shù)據(jù)存儲類型來說,8051系列有片內(nèi)、片外程序存儲器,片內(nèi)、片外數(shù)據(jù)存儲器,片內(nèi)程序存儲器還分直接尋址區(qū)和間接尋址類型,分別對應(yīng)code、data、xdata、idata以及根據(jù)51系列特點而設(shè)定的pdata類型,使用不同的存儲器,將使程序執(zhí)行效率不同,在編寫C51程序時,最好指定變量的存儲類型,這樣將有利于提高程序執(zhí)行效率。在51系列中data,idata,xdata的區(qū)別:data:固定指前面0x00-0x7f的128個RAM,速度最快,生成的代碼也最小。idata:固定指前面0x00-0xff的256個RAM,其中前128和data的128完全相同,只是因為訪問的方式不同。idata是用類似C中的指針方式訪問的。xdata:外部擴展RAM,指外部0x0000-0xffff空間,用類似C中的指針方式訪問或用絕對地址方式訪問。表2.3存儲器類型存儲器類型說明data直接訪問內(nèi)部數(shù)據(jù)存儲器(128字節(jié)),訪問速度最快bdata可位尋址內(nèi)部數(shù)據(jù)存儲器(16字節(jié)),允許位與字節(jié)混合訪問idata間接訪問內(nèi)部數(shù)據(jù)存儲器(256字節(jié)),允許訪問全部內(nèi)部地址pdata分頁訪問外部數(shù)據(jù)存儲器(256字節(jié))xdata外部數(shù)據(jù)存儲器(64KB)code程序存儲器(64KB)2.6C51程序基本結(jié)構(gòu)

(1)C51基本結(jié)構(gòu)#include<reg51.h>

/*頭文件說明部份,預(yù)處理部分*/unsignedcharx1,x2;

/*全局變量聲明部份*/…Function1(…){

……}/*功能函數(shù)定義部份*/main(){inti,j;

/*整型變量聲明部份*/Function1(…);

/*功能函數(shù)說明部份,函數(shù)聲明,先聲明后調(diào)用*/……}(2)C51程序的一般結(jié)構(gòu):預(yù)處理全局變量說明函數(shù)1說明……函數(shù)n說明main(){/*在一個工程中必須有、且只有一個小寫的main()函數(shù)*/局部變量說明;執(zhí)行語句;函數(shù)調(diào)用;}返回類型函數(shù)1名(形參說明){局部變量說明;執(zhí)行語句;函數(shù)調(diào)用;}…….返回類型函數(shù)n名(形參說明){局部變量說明;執(zhí)行語句;函數(shù)調(diào)用;}

C51程序與C程序一樣遵循“先聲明后調(diào)用”原則。2.7C51重要庫函數(shù)

除了可以使用C語言的常用庫函數(shù),C51還有包含寄存器庫函數(shù)和本征庫函數(shù),對使用C51語言編程是比較重要的。(1)absacc.h該文件中實際只定義了幾個宏,以確定各存儲空間的絕對地址。包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD具體使用可看一看absacc.h便知。例如:rval=CBYTE[0x0002];指向程序存貯器的0X0002地址rval=XWORD[0x0002];指向外RAM的0X0004地址(2)intrins.h

在C51單片機編程中,頭文件INTRINS.H的函數(shù)使用起來,就會讓你像在用匯編時一樣簡便。原型:unsignedchar_crol_(unsignedcharval,unsignedcharn);字符循環(huán)左移unsignedint_irol_(unsignedintval,unsignedcharn);整數(shù)循環(huán)左移unsignedint_lrol_(unsignedintval,unsignedcharn);長整數(shù)循環(huán)左移例:#include<intrins.h>main(){unsignedinty;y=0x00ff;y=_irol_(y,4);//將y值按二進制左移4位,成0X0FF0}原型:unsignedchar_cror_(unsignedcharval,unsignedcharn);字符循環(huán)右移unsignedint_iror_(unsignedintval,unsignedcharn);整數(shù)循環(huán)右移unsignedint_lror_(unsignedintval,unsignedcharn);長整數(shù)循環(huán)右移例:#include<intrins.h>main(){unsignedinty;y=0x0ff00;y=_iror_(y,4);//將y值按二進制右移4位,成0x00ff0}原型:void_nop_(void);產(chǎn)生一個NOP指令,該函數(shù)可用作C程序的時間延時。例:P1_1=1;_nop_();P1_1=0;原型:bit_testbit_(bitx);該函數(shù)測試一個位,當置位時返回1,否則返回0。如果該位置為1,則將該位復(fù)位為0。_testbit_只能用于可直接尋址的位;在表達式中使用是不允許的。(3)REG51.h標準的8051頭文件,定義了所有的特殊功能寄存器SFR名及位名定義,一般系統(tǒng)都必須包括本文件。(4)stdlib.h動態(tài)內(nèi)存分配函數(shù)。(5)string.h緩沖區(qū)處理函數(shù),中包括拷貝比較移動等函數(shù)。Memccpy,memchr,memcmp,memcpy,memmove,memset。(6)stdio.h輸入輸出流函數(shù)。8051的串口或用戶定義的I/O口讀寫數(shù)據(jù),缺省為8051串口,如要修改,可修改lib目錄中的getkey.c及putchar.c源文件,然后在庫中替換它們即可。2.8C51標識符

一、C語言關(guān)鍵字具有固定名稱的特殊標識符,是編譯器保留的,在編寫C程序時,標識符命名不能于關(guān)鍵字相同。表2.4C語言關(guān)鍵字關(guān)鍵字

用途說明auto

存儲種類聲明

用于聲明局部變量,默認值是此break

程序語句

退出最內(nèi)層循環(huán)體case

程序語句

switch語句中的選擇項char

數(shù)據(jù)類型聲明

單字節(jié)整型或字符型數(shù)據(jù)const

存儲類型聲明

在程序執(zhí)行過程中不可修改的變量值continue

程序語句

退出本次循環(huán),轉(zhuǎn)向下一次defaut

程序語句

switch語句中的失敗選擇項do

程序語句

構(gòu)成do...wihile循環(huán)結(jié)構(gòu)double

數(shù)據(jù)類型聲名

雙精度浮點數(shù)else

程序語句

構(gòu)成if....else選擇結(jié)構(gòu)enum

數(shù)據(jù)類型

枚舉extent

存儲類型

全局變量float

數(shù)據(jù)類型

單精度浮點數(shù)for

程序語句goto

程序語句if

程序語句int

數(shù)據(jù)類型

基本整型數(shù)long

數(shù)據(jù)類型

長整型數(shù)register

存儲類型

CPU內(nèi)部的寄存器變量return

程序語句

函數(shù)返回short

數(shù)據(jù)類型

短整型signed

數(shù)據(jù)類型

有符號數(shù)sizeof

運算符

計算表達式或數(shù)據(jù)類型的字節(jié)數(shù)static

存儲類型

靜態(tài)變量struct

數(shù)據(jù)類型聲明

結(jié)構(gòu)類型switch

程序語句typedef

數(shù)據(jù)類型

重新進行數(shù)據(jù)類型定義union

數(shù)據(jù)類型

聯(lián)合類型數(shù)據(jù)unsigned

數(shù)據(jù)類型

無符號數(shù)

void

數(shù)類型型

無類型數(shù)據(jù)volatile

數(shù)據(jù)類型

聲名該變量在程序執(zhí)行中可被隱含改變while

程序語句表2.5C51編譯器的擴展關(guān)鍵字關(guān)鍵字用途

_at_絕對地址定義定義一個地址數(shù)據(jù)bit位標量聲明聲明一個位標量或位類型的函數(shù)sbit位標量聲明聲明一個可位尋址變量Sfr特殊功能寄存器聲明聲明一個特殊功能寄存器Sfr16特殊功能寄存器聲明聲明一個16位的特殊功能寄存器data存儲器類型說明直接尋址的內(nèi)部數(shù)據(jù)存儲器bdata存儲器類型說明可位尋址的內(nèi)部數(shù)據(jù)存儲器idata存儲器類型說明間接尋址的內(nèi)部數(shù)據(jù)存儲器pdata存儲器類型說明分頁尋址的外部數(shù)據(jù)存儲器xdata存儲器類型說明外部數(shù)據(jù)存儲器code存儲器類型說明程序存儲器interrupt中斷函數(shù)說明定義一個中斷函數(shù)reentrant再入函數(shù)說明定義一個再入函數(shù)using寄存器組定義定義芯片的工作寄存器2、預(yù)定義標識符這類標識符在C語言中的特定的含義,一般不要作它用,如include、

define等3、用戶標識符用戶根據(jù)需要定義的標識符,要遵循一定的命名規(guī)則,建議以字母開頭,按類別定義。二、運算符及優(yōu)先級1、算術(shù)運算符:+-*/%

:加減乘除取余2、關(guān)系運算符:>

<

==

>=

<=

!=:大于,小于,等于,大于等于,小于等于,不等于3、邏輯運算符:&&||!(左結(jié)合)

4、字位左移、右移:<<

>>5、字位按位與、異或、或、取反:&^|

~6、條件運算符:?

:7、逗號運算符:,8、指針運算符:*

&9、長度計算符:sizeof10、強制類型轉(zhuǎn)換運算符:

()11、分量運算符:.

→12、下標運算符:[]13、函數(shù)調(diào)用運算符()14、自增自減運算符++

--

(向右結(jié)合:I++I計算后再+1,++I把I加1后再運算)15、復(fù)合賦值表達式:+=-=

*=

/=

%=

<<=

>>=

&=

^=

|=

(如I+=1等價于I=I+1)16、逗號表達式:,將兩個表達式連起來,從左到右運算,優(yōu)先級別最低。C語

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論