第4章-KeilC51程序設(shè)計(jì)(黃云峰老師制作)_第1頁
第4章-KeilC51程序設(shè)計(jì)(黃云峰老師制作)_第2頁
第4章-KeilC51程序設(shè)計(jì)(黃云峰老師制作)_第3頁
第4章-KeilC51程序設(shè)計(jì)(黃云峰老師制作)_第4頁
第4章-KeilC51程序設(shè)計(jì)(黃云峰老師制作)_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章-KeilC51程序設(shè)計(jì)(黃云峰老師制作)第一頁,共110頁?;趨R編與C語言的單片機(jī)原理及應(yīng)用2主要內(nèi)容:C51語言程序設(shè)計(jì)基礎(chǔ)2C51語言的編程技巧41KeilC51編程語言1C51語言程序設(shè)計(jì)方法3第二頁,共110頁。4.1KeilC51編程語言KeilC51(由美國KeilSoftware公司推出)是目前最流行的51系列單片機(jī)C語言軟件開發(fā)平臺(tái),具有程序的編輯、編譯、連接、目標(biāo)文件格式轉(zhuǎn)換、調(diào)試和模擬仿真等功能。C51是其中的一個(gè)編譯器,它具有ANSIC標(biāo)準(zhǔn)C所有的功能,并針對(duì)51系列單片機(jī)的硬件特點(diǎn)做了擴(kuò)展。本章首先介紹了KeilVision4的使用方法,隨后對(duì)標(biāo)準(zhǔn)C的基本語法做了概括性的介紹,重點(diǎn)闡述了C51的擴(kuò)展功能,使具有C語言基礎(chǔ)的讀者能盡快掌握C51程序的編寫方法?;趨R編與C語言的單片機(jī)原理及應(yīng)用3第三頁,共110頁。4.1.1KeilC51的簡介

KeilC51語言是在ANSIC的基礎(chǔ)上針對(duì)51單片機(jī)的硬件特點(diǎn)進(jìn)行的擴(kuò)展,并向51單片機(jī)上移植,經(jīng)過多年努力,C51語言已經(jīng)成為公認(rèn)的高效、簡潔而又貼近51單片機(jī)硬件的實(shí)用高級(jí)編程語言。目前大多數(shù)的51單片機(jī)用戶都在使用C51語言來進(jìn)行程序設(shè)計(jì)。用C51進(jìn)行單片機(jī)軟件開發(fā),有如下優(yōu)點(diǎn):基于匯編與C語言的單片機(jī)原理及應(yīng)用4第四頁,共110頁。4.1.1KeilC51的簡介(1)可讀性好。(2)模塊化開發(fā)與資源共享。(3)可移植性好。(4)代碼效率高?;趨R編與C語言的單片機(jī)原理及應(yīng)用5第五頁,共110頁。4.1.2KeilC51的開發(fā)環(huán)境Keil公司目前已推出V7.0以上版本的C51編譯器,為51單片機(jī)軟件開發(fā)提供了全新的C語言環(huán)境,同時(shí)保留了匯編代碼高效、快速的特點(diǎn)。現(xiàn)在,KeilC51已被完全集成到一個(gè)功能強(qiáng)大的全新集成開發(fā)環(huán)境(IDE)Vision4中,該環(huán)境下集成了文件編輯處理、編譯鏈接、項(xiàng)目管理、窗口、工具引用和仿真軟件模擬器以及Monitor51硬件目標(biāo)調(diào)試器等多種功能,這些功能均可在KeilVision4環(huán)境中極為簡便地進(jìn)行操作。本章用到KeilC51和KeilVision4兩個(gè)術(shù)語。分別是51單片機(jī)編程所用的C語言和51單片機(jī)的C51程序編寫、調(diào)試的集成開發(fā)環(huán)境?;趨R編與C語言的單片機(jī)原理及應(yīng)用6第六頁,共110頁。4.1.3KeilVision4初步應(yīng)用方法使用匯編語言或C語言要用到編譯器,以便把寫好的程序編譯為機(jī)器碼,隨后才能把HEX可執(zhí)行文件寫入單片機(jī)內(nèi)。KeiluVision4是眾多單片機(jī)應(yīng)用開發(fā)軟件中最新、最優(yōu)秀的軟件之一,它支持眾多不同公司的MCS51架構(gòu)的芯片,甚至ARM系統(tǒng),它集編輯,編譯,仿真等多種功能于一體,它的界面和常用的微軟VC++的操作界面相似,人機(jī)交互友好,易學(xué)易用,在調(diào)試程序,軟件仿真方面也有很強(qiáng)大的功能?;趨R編與C語言的單片機(jī)原理及應(yīng)用7第七頁,共110頁。建立第一個(gè)KeilVision4C語言項(xiàng)目

運(yùn)行KeilVision4的首個(gè)畫面:基于匯編與C語言的單片機(jī)原理及應(yīng)用8第八頁,共110頁。(1)在Project菜單,選擇彈出的下拉式菜單中的NewProject,創(chuàng)建新的Vision項(xiàng)目。注意,這里的項(xiàng)目文件擴(kuò)展名是uvproj。(2)選擇所要的單片機(jī),這里我們選擇常用的MCU單片機(jī)芯片是Ateml公司的AT89C51。(3)創(chuàng)建新的程序文件如例4-1的串口輸出字符串“HelloWorld!”程序?;趨R編與C語言的單片機(jī)原理及應(yīng)用9第九頁,共110頁?;趨R編與C語言的單片機(jī)原理及應(yīng)用10第十頁,共110頁?!纠?-1】串口輸出字符串“HelloWorld!”#include<AT89X51.H>#include<stdio.h>voidmain(void){SCON=0x50; //串口方式1,允許接收

TMOD=0x20; //定時(shí)器1定時(shí)方式2

TCON=0x40; //設(shè)定時(shí)器1開始計(jì)數(shù)

TH1=0xE8; //11.0592MHz1200波特率

TL1=0xE8;

TI=1;

TR1=1; //啟動(dòng)定時(shí)器

while(1){

printf("HelloWorld!\n");//顯示HelloWorld!

}}基于匯編與C語言的單片機(jī)原理及應(yīng)用11第十一頁,共110頁。(4)保存新建的C語言程序可以用File菜單的Save或快捷鍵Ctrl+S進(jìn)行保存。如圖4-3所示,我們把第一個(gè)程序命名為example801.c,保存在項(xiàng)目所在的目錄中。如圖4-3鼠標(biāo)在屏幕左邊project項(xiàng)目區(qū)域中的Target1,點(diǎn)擊其左側(cè)的+號(hào);然后,在SourceGroup1文件夾圖標(biāo)上右擊彈出菜單,在這里可以實(shí)現(xiàn)在項(xiàng)目中增加減少文件等操作。我們點(diǎn)擊AddGroup'SourceGroup1'彈出文件窗口,選擇剛剛保存的example801.c文件,按ADD按鈕,實(shí)現(xiàn)添加example801.c文件到項(xiàng)目工程,如圖4-4所示;然后,點(diǎn)擊CLOSE按鈕,實(shí)現(xiàn)關(guān)閉文件窗口并退出。這時(shí)在Target1項(xiàng)目文件夾下的SourceGroup1文件夾圖標(biāo)左邊出現(xiàn)了一個(gè)小+號(hào)說明,文件組中有了文件,點(diǎn)擊它可以展開查看。基于匯編與C語言的單片機(jī)原理及應(yīng)用12第十二頁,共110頁?;趨R編與C語言的單片機(jī)原理及應(yīng)用13第十三頁,共110頁。(5)設(shè)置OptionsforTarget'Target1在Project下拉菜單中或者在Target1圖標(biāo)上點(diǎn)擊右鍵,打開OptionsforTarget'Target1',彈出項(xiàng)目選項(xiàng)設(shè)置窗口。如圖4-5所示,Output選項(xiàng)頁中1是選擇編譯輸出的路徑,2是設(shè)置編譯輸出生成的文件名,3則是決定是否要?jiǎng)?chuàng)建HEX文件,選中它就可以輸出HEX文件到指定的路徑中。Debug選項(xiàng)頁如圖4-6所示,由于本章內(nèi)容不涉及到Proteus仿真和單片機(jī)開發(fā)板燒錄,Debug選項(xiàng)頁中均保持如圖顯示的默認(rèn)值即可?;趨R編與C語言的單片機(jī)原理及應(yīng)用14第十四頁,共110頁?;趨R編與C語言的單片機(jī)原理及應(yīng)用15第十五頁,共110頁。(6)項(xiàng)目的編譯運(yùn)行

(7)進(jìn)入調(diào)試模式在下拉菜單Debug中Start\StopDebugSession,或者,快捷鍵為Ctrl+F5。點(diǎn)擊下拉菜單Debug中的Run,或者,快捷鍵F5,程序連續(xù)運(yùn)行。顯示內(nèi)容見圖4-8,在此畫面中同時(shí)打開了了SerialWindows,以觀察字符串的輸出情況。圖中1為運(yùn)行按鈕,當(dāng)程序處于停止?fàn)顟B(tài)時(shí)才有效,圖中2為停止按鈕,程序處于運(yùn)行狀態(tài)時(shí)才有效。圖中3是復(fù)位按鈕,模擬芯片的復(fù)位,程序回到最開頭處執(zhí)行。按圖中的Peripherals下拉菜單中我們可以打開串行調(diào)試窗口,如圖4所示。這個(gè)窗口我們可以看到從51芯片的串行口輸入輸出的字符,“HelloWorld!”。最后我們要停止程序運(yùn)行回到文件編輯模式中,就要先按停止按鈕再按Start\StopDebugSession開啟\關(guān)閉調(diào)試模式按鈕。基于匯編與C語言的單片機(jī)原理及應(yīng)用16第十六頁,共110頁?;趨R編與C語言的單片機(jī)原理及應(yīng)用17第十七頁,共110頁。4.2MCS-51單片機(jī)C51語言程序設(shè)計(jì)基礎(chǔ)在單片機(jī)應(yīng)用系統(tǒng)開發(fā)過程中,應(yīng)用程序設(shè)計(jì)是整個(gè)應(yīng)用系統(tǒng)開發(fā)的重要組成部分,它直接決定著應(yīng)用系統(tǒng)開發(fā)周期的長短、性能。盡管采用匯編語言編寫的應(yīng)用程序可直接操縱系統(tǒng)的硬件資源,能編寫出較高運(yùn)行效率的程序代碼,程序運(yùn)行速度快。但因匯編語言學(xué)習(xí)困難、可讀性差、修改調(diào)試?yán)щy,且編寫比較復(fù)雜的數(shù)值計(jì)算程序非常復(fù)雜。因此,為了提高編制單片機(jī)系統(tǒng)和其應(yīng)用程序的效率,改善程序的可讀性和可移植性,最好采用高級(jí)語言編程,及類似于C語言的單片機(jī)開發(fā)語言?;趨R編與C語言的單片機(jī)原理及應(yīng)用18第十八頁,共110頁。4.2.1C51與MCS-51匯編語言的比較

C51語言能直接對(duì)計(jì)算機(jī)的硬件進(jìn)行操作,與匯編語言相比它具有如下優(yōu)點(diǎn):(1)C51要比MCS-51匯編語言的可讀性好。(2)程序由若干函數(shù)組成,為模塊化結(jié)構(gòu)。(3)使用C51編寫的程序可移植性好。(4)編程及程序調(diào)試的時(shí)間短。(5)C51中的庫函數(shù)包含了許多標(biāo)準(zhǔn)的子程序(6)對(duì)單片機(jī)中的寄存器分配、不同存儲(chǔ)器的尋址以及數(shù)據(jù)類型等細(xì)節(jié)可由編譯器來管理。匯編語言的特點(diǎn)如下:(1)代碼執(zhí)行效率高。(2)占用存儲(chǔ)空間少。(3)可讀性和可移植性差?;趨R編與C語言的單片機(jī)原理及應(yīng)用19第十九頁,共110頁。4.2.2C51與標(biāo)準(zhǔn)C的主要區(qū)別(1)頭文件的差異。KeilC51系列的頭文件集中體現(xiàn)了各系列芯片的不同資源及功能。(2)數(shù)據(jù)類型的不同。51系列單片機(jī)包含位操作空間和豐富的位操作指令。(3)數(shù)據(jù)存儲(chǔ)類型的不同。51系列單片機(jī)有片內(nèi)、外程序存儲(chǔ)器,還有片內(nèi)、外數(shù)據(jù)存儲(chǔ)器。(4)標(biāo)準(zhǔn)C語言沒有處理單片機(jī)中斷的定義。(5)KeilC51與標(biāo)準(zhǔn)C的庫函數(shù)有較大的不同。(6)程序結(jié)構(gòu)的差異?;趨R編與C語言的單片機(jī)原理及應(yīng)用20第二十頁,共110頁。因此,C51語言。它與傳統(tǒng)的、通用的像K&R(Kernighan和Ritchie)所著的C語言是有所區(qū)別的。Thompson(左)和Ritchie(中)于1999年接受當(dāng)時(shí)美國總統(tǒng)克林頓授予的國家技術(shù)勛章。基于匯編與C語言的單片機(jī)原理及應(yīng)用21第二十一頁,共110頁。4.2.3C51數(shù)據(jù)類型與MCS51的存貯方式1.C51的字符集、標(biāo)示符與關(guān)鍵字(1)字符集和詞匯(2)標(biāo)識(shí)符(3)關(guān)鍵字以下是標(biāo)準(zhǔn)C規(guī)定的關(guān)鍵字:autobreakcasecharconstontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedstaticstructswitchtypedefunionunsignedvoidvolatilewhile

以下是C51擴(kuò)展的關(guān)鍵字:_at_alienbdatabitcodecompactdataidatainterruptlargepdata_priority_reentrantsbitsfrsfr16small_task_usingxdata基于匯編與C語言的單片機(jī)原理及應(yīng)用22第二十二頁,共110頁。2.C51常量與變量的數(shù)據(jù)類型基于匯編與C語言的單片機(jī)原理及應(yīng)用23數(shù)據(jù)類型長度(bit)長度(byte)數(shù)據(jù)表示域bit11/80,1unsignedchar810~255signedchar81128~127unsignedint1620~65535signedint16232768~32767unsignedlong3240~4294967295signedlong3242147483648~2147483647float324±1.176E38~±3.40E+38(6位數(shù)字)double648±1.176E38~±3.40E+38(10位數(shù)字)指針類型243存貯空間0~65536表4-1C51編譯器的數(shù)據(jù)類型第二十三頁,共110頁。(1)常量①整型常量整型常量即整常數(shù)又稱為標(biāo)量,有3種表示形式:八進(jìn)制整數(shù),十六進(jìn)制整數(shù),十進(jìn)制整數(shù)。②字符型常量普通字符和轉(zhuǎn)義字符。常用轉(zhuǎn)義字符及其含義見后頁表:③字符串常量④實(shí)型常量基于匯編與C語言的單片機(jī)原理及應(yīng)用24第二十四頁,共110頁。轉(zhuǎn)義字符含義ASCII碼(16/10進(jìn)制數(shù))\0空字符(NULL)00H/0\n換行符(LF)0AH/10\r回車符(CR)0DH/13\t水平制表符(HT)09H/9\b退格符(BS)08H/8\f換頁符(FF)0CH/12\'單引號(hào)27H/39\"雙引號(hào)22H/34\\反斜杠5CH/92基于匯編與C語言的單片機(jī)原理及應(yīng)用25第二十五頁,共110頁。(2)變量①變量定義格式51系列單片機(jī)有內(nèi)部RAM、SFR、外部RAM/IO、程序存貯器等存貯區(qū)域,為了能訪問不同存貯區(qū)域的變量,C51對(duì)變量的定義增加了存貯器類型說明。變量定義的一般格式為:[存貯種類]數(shù)據(jù)類型[存貯器類型]變量名(或變量名表);定義格式中的方括號(hào)部分[]是可選項(xiàng),可有可無。基于匯編與C語言的單片機(jī)原理及應(yīng)用26第二十六頁,共110頁。②整型變量:整型變量的類型符為int,有以下4種:有符號(hào)基本整型[signed]int無符號(hào)基本整型unsignedint有符號(hào)長整型long[int]無符號(hào)長整型unsignedlong[int]③字符型變量有符號(hào)字符型[signed]char無符號(hào)字符型unsignedchar④實(shí)型變量C51支持單精度實(shí)型變量,長度為4字節(jié),類型符為關(guān)鍵字float,又稱為浮點(diǎn)型?;趨R編與C語言的單片機(jī)原理及應(yīng)用27第二十七頁,共110頁。3.C51數(shù)據(jù)變量在MCS51中的存貯方式C51語言運(yùn)行的平臺(tái)是MCS-51單片機(jī)。所以,C51編譯器要用一系列機(jī)器指令對(duì)其進(jìn)行復(fù)雜的數(shù)據(jù)類型處理。在實(shí)際編程時(shí)最好采用無符號(hào)型數(shù)據(jù)和盡量少的數(shù)據(jù)變量類型,這樣將明顯提高代碼的運(yùn)行效率。位型變量字符型變量整型變量長整型變量基于匯編與C語言的單片機(jī)原理及應(yīng)用28第二十八頁,共110頁。⑤浮點(diǎn)數(shù)量數(shù)的表示方法可分為定點(diǎn)表示和浮點(diǎn)表示。浮點(diǎn)數(shù)則是小數(shù)點(diǎn)的位置是浮動(dòng)的。通常,對(duì)于任意一個(gè)二進(jìn)制數(shù)X,都可表示成:X=2E×M式中:M表示全部有效數(shù)字,稱之為數(shù)X的尾數(shù);E為數(shù)X的階碼,它指明了小數(shù)點(diǎn)的位置;2是階碼的底。M和E均為用二進(jìn)制表示的數(shù),它們可正可負(fù)。階碼常用補(bǔ)碼表示法,尾數(shù)常為原碼表示的純小數(shù)。當(dāng)E值可變時(shí),表示是浮點(diǎn)數(shù)。基于匯編與C語言的單片機(jī)原理及應(yīng)用29第二十九頁,共110頁。(1)C51數(shù)據(jù)的存貯類型C51存貯類型與MCS51實(shí)際存貯空間的對(duì)應(yīng)關(guān)系基于匯編與C語言的單片機(jī)原理及應(yīng)用304.C51數(shù)據(jù)的存貯類型與MCS51單片機(jī)的存貯關(guān)系存貯類型與MCS51系列單片機(jī)存貯空間的對(duì)應(yīng)關(guān)系備注data直接尋址片內(nèi)數(shù)據(jù)存貯區(qū),訪問速度快片內(nèi)RAM的00H~7FH區(qū)域bdata位尋址片內(nèi)數(shù)據(jù)存貯區(qū),允許位與字節(jié)混合訪問片內(nèi)RAM的20H~2FH區(qū)域idata間接尋址片內(nèi)數(shù)據(jù)存貯區(qū),可訪問片內(nèi)全部RAM,用@R0,@R1間接訪問片內(nèi)全部RAM,即00H~0FFH區(qū)域pdata由MOVX@R0,@R1間接訪問分頁尋址片外數(shù)據(jù)存貯區(qū),每頁256字節(jié),即00H~0FFH區(qū)域xdata由MOVX@DPTR訪問的片外數(shù)據(jù)存貯區(qū),64KB空間外部64KRAM0000H~0FFFFH區(qū)域code程序存貯區(qū),64KB空間,由MOVC@DPTR訪問外部64KROM0000H~0FFFFH區(qū)域第三十頁,共110頁。(2)C51存儲(chǔ)模式存貯模式?jīng)Q定了變量的默認(rèn)存貯器類型、參數(shù)傳遞區(qū)和無明確存貯區(qū)類型的說明等,存貯器模式說明如表基于匯編與C語言的單片機(jī)原理及應(yīng)用31存貯器模式說明SMALL默認(rèn)的存貯類型為data,參數(shù)及局部變量放入可直接尋址的片內(nèi)RAM中。另外,所有對(duì)象(包括堆棧),都必須嵌入片內(nèi)RAM中。COMPACT默認(rèn)的存貯類型為pdata,參數(shù)及局部變量放入分頁的外部RAM,通過@R0或@R1間接訪問,堆??臻g位于片內(nèi)RAM中。LARGE默認(rèn)的存貯類型為xdata,參數(shù)及局部變量放入外部RAM,使用數(shù)據(jù)指針DPTR來進(jìn)行尋址,用此指針訪問效率較低。堆棧空間也位于外部RAM中。第三十一頁,共110頁。C51允許在變量類型定義之前指定存貯模式。書寫格式上,定義datacharx與定義chardatax是等價(jià)的,但應(yīng)盡量使用后一種方法。在C51中有兩種方法來指定存貯模式,例如,以下為兩種方法來指定COMPACT模式:方法1:在編譯時(shí)指定。如使用命令C51PROC.CCOMPACT方法2:在程序的第一句加預(yù)處理命令#pragmacompact基于匯編與C語言的單片機(jī)原理及應(yīng)用32第三十二頁,共110頁。5.MCS51特殊功能寄存器(SFR)及其C51定義方法(1)MCS51系列單片機(jī)中,除了程序計(jì)數(shù)器PC,片內(nèi)RAM低128個(gè)字節(jié)空間和4組工作寄存器組外。其它所有的寄存器均為特殊功能寄存器(SFR),離散地分布在片內(nèi)RAM高128個(gè)字節(jié)中,地址范圍為80H~0FFH。SFR中地址為8的倍數(shù)的寄存器具有位尋址能力。為了能直接訪問SFR,C51編譯器提供了一種與標(biāo)準(zhǔn)C語言不兼容,而只適用于對(duì)MCS51系列單片機(jī)進(jìn)行C語言編程的SFR定義方法,其定義8位SFR語句的一般格式為:sfrsfr-name=intconstant;基于匯編與C語言的單片機(jī)原理及應(yīng)用33第三十三頁,共110頁。(2)由于SFR中地址為8的倍數(shù)的寄存器具有位尋址能力,在C51中規(guī)定了支持SFR位操作的定義,當(dāng)然這也是與標(biāo)準(zhǔn)C語言不兼容的,使用“sbit”來定義SFR的位尋址單元。定義SFR的位尋址單元的語法格式有3種:第1種格式:sbitbit-name=sfr-name^intconstant第2種格式:sbitbit-name=intconstant^intconstant第3種格式:sbitbit-name=intconstant基于匯編與C語言的單片機(jī)原理及應(yīng)用34第三十四頁,共110頁。(3)MCS51位變量及其C51定義方法①位變量的C51定義的方法C51通過“bit”關(guān)鍵字來定義位變量,一般格式為:bitbit-name;②C51程序函數(shù)的參數(shù)及返回值C51程序函數(shù)可包含類型為“bit”的參數(shù),也可以將其作為返回值。例如:bitfunc(bitb0,bitb1) /*位變量b0、b1作為函數(shù)的參數(shù)*/{

return(b1); /*變量b1作為函數(shù)的返回值*/}基于匯編與C語言的單片機(jī)原理及應(yīng)用35第三十五頁,共110頁。③對(duì)位變量的限制位變量不能說明為指針和數(shù)組。例如:bit*ptr;/*用位變量定義指針,錯(cuò)誤*/bitb-array[];/*用位變量定義數(shù)組,錯(cuò)誤*/在定義位變量時(shí),允許定義存貯類型,位變量都被放入一個(gè)位段,此段總位于MCS51系列單片機(jī)片內(nèi)RAM中,因此其存貯類型限制為data或idata,如果將其定義成其它類型都將在編譯時(shí)出錯(cuò)。基于匯編與C語言的單片機(jī)原理及應(yīng)用36第三十六頁,共110頁。4.2.4MCS51并行接口及其C51定義方法MCS51系列單片機(jī)片內(nèi)有4個(gè)并行I/O口(P0~P3),因這4個(gè)并行I/O口都是SFR,故這4個(gè)并行I/O口的定義采用定義SFR的方法。另外,MCS51系列單片機(jī)在片外可擴(kuò)展并行I/O口,因其外部I/O口與外部RAM是統(tǒng)一編址的,即把一個(gè)外部I/O口當(dāng)作外部RAM的一個(gè)單元來看待。利用絕對(duì)地址訪問的頭文件absacc.h可對(duì)不同的存貯區(qū)進(jìn)行訪問。該頭文件的函數(shù)有:CBYTE (訪問code區(qū)字符型)DBYTE (訪問data區(qū)字符型)PBYTE (訪問pdata區(qū)或I/O口字符型)XBYTE (訪問xdata區(qū)或I/O口字符型)基于匯編與C語言的單片機(jī)原理及應(yīng)用37第三十七頁,共110頁。對(duì)于片外擴(kuò)展的I/O口,根據(jù)硬件譯碼地址,將其看作片外RAM的一個(gè)單元,使用語句#define進(jìn)行定義。例如:#include<absacc.h>/*必須要,不能少*/#definePORTAXBYTE[0xFFC0]/*定義外部I/O口PORTA的地址為外部RAM的0FFC0H*/

當(dāng)然也可把對(duì)外部I/O口的定義放在一個(gè)頭文件中,然后在程序中通過#include語句調(diào)用,一旦在頭文件或程序中通過使用#define語句對(duì)片外I/O口進(jìn)行了定義,在程序中就可以自由使用變量名(如PORTA)來訪問這些外部I/O口了。基于匯編與C語言的單片機(jī)原理及應(yīng)用38第三十八頁,共110頁。C語言的運(yùn)算符有以下幾類:算術(shù)運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號(hào)運(yùn)算符、求字節(jié)數(shù)運(yùn)算符和一些特殊運(yùn)算符。用運(yùn)算符和括號(hào)將運(yùn)算對(duì)象(也稱為操作數(shù))連接起來并符合C語法規(guī)則的式子稱為表達(dá)式;C語言有算術(shù)表達(dá)式、賦值表達(dá)式、逗號(hào)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式等。C運(yùn)算符的優(yōu)先級(jí)有15級(jí)(具體內(nèi)容見相關(guān)通用C語言書籍),在表達(dá)式求值時(shí),按運(yùn)算的優(yōu)先級(jí)由高至低的次序運(yùn)算(例如先乘除后加減),若在一個(gè)運(yùn)算分量的兩側(cè)出現(xiàn)兩個(gè)相同優(yōu)先級(jí)的運(yùn)算待時(shí),則按運(yùn)算符的結(jié)合性處理。有的運(yùn)算符具有左結(jié)合特性,按自左至右的次序計(jì)算;有的運(yùn)算符具有右結(jié)合特性,按自右至左的次序運(yùn)算。基于匯編與C語言的單片機(jī)原理及應(yīng)用394.2.5C51的運(yùn)算符和表達(dá)式第三十九頁,共110頁。1.算術(shù)運(yùn)算符和算術(shù)表達(dá)式(1)算術(shù)運(yùn)算符①+(加)、-(減)、*(乘)、/(除)都是雙目運(yùn)算符;②%(求余數(shù)運(yùn)算符,也稱模運(yùn)算)為雙目運(yùn)算符;③+(取正)、-(取負(fù))都是單目運(yùn)算符,具有右結(jié)合特性;④++(自增1)、--(自減1)運(yùn)算符。自增1和自減1運(yùn)算符都是單目運(yùn)算符,都具有右結(jié)合特性,它們只能用于變量的加1或減1:●++i;--j;

/*先自加,后引用*/●i++;j--;

/*先引用,后自加*/基于匯編與C語言的單片機(jī)原理及應(yīng)用40第四十頁,共110頁。(2)算術(shù)表達(dá)式由算術(shù)運(yùn)算符、括號(hào)將運(yùn)算對(duì)象連接起來的式子稱為算術(shù)表達(dá)式。例如:a、b、x、y都是整型變量,則下式a+b、a*2/x、(x+y)*8都是算術(shù)表達(dá)式基于匯編與C語言的單片機(jī)原理及應(yīng)用41第四十一頁,共110頁。位運(yùn)算符的功能是對(duì)數(shù)據(jù)進(jìn)行按位運(yùn)算,使之能對(duì)單片機(jī)的硬件直接進(jìn)行位操作,位運(yùn)算符只能用于字符型和整型數(shù)據(jù),不能用于浮點(diǎn)數(shù)。C51共有以下6種位運(yùn)算符。(1)按位與運(yùn)算符&(2)按位或運(yùn)算符|(3)按位異或^(4)按位取反

~(5)左移運(yùn)算符<<(6)右移運(yùn)算符>>基于匯編與C語言的單片機(jī)原理及應(yīng)用422.位運(yùn)算符和位運(yùn)算第四十二頁,共110頁。3.賦值運(yùn)算符和賦值表達(dá)式(1)賦值運(yùn)算符和賦值表達(dá)式賦值運(yùn)算符的符號(hào)為“=”,其優(yōu)先級(jí)別很低,僅僅高于最低優(yōu)先級(jí)別的“,”逗號(hào)運(yùn)算符。由賦值運(yùn)算符將一個(gè)變量和一個(gè)表達(dá)式連起來稱為賦值表達(dá)式,其一般形式為:

變量=表達(dá)式;(2)復(fù)合賦值運(yùn)算符及表達(dá)式在賦值運(yùn)算符“=”的前面加上其他雙目運(yùn)算符,就構(gòu)成復(fù)合賦值運(yùn)算符。c的復(fù)合賦值運(yùn)算符有如下十種:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=由復(fù)合運(yùn)算符將一個(gè)變量和表達(dá)式連起來也構(gòu)成賦值表達(dá)式。一般形式為:

變量

雙目運(yùn)算符=表達(dá)式;

基于匯編與C語言的單片機(jī)原理及應(yīng)用43第四十三頁,共110頁?!埃倍禾?hào)是C的一種特殊運(yùn)算符,其功能是把幾個(gè)表達(dá)式連接起來,組成(逗)號(hào)表達(dá)式,一般形式為:

表達(dá)式1,表達(dá)式2,……,表達(dá)式n;逗號(hào)表達(dá)式的功能是依次計(jì)算表達(dá)式1,表達(dá)式2,…,表達(dá)式n的值,整個(gè)逗號(hào)表達(dá)式的值為表達(dá)式n的值。逗號(hào)表達(dá)式在for(;;)循環(huán)控制語句中用于對(duì)循環(huán)變量的初始化?;趨R編與C語言的單片機(jī)原理及應(yīng)用444.逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式第四十四頁,共110頁。1.C51語句和程序結(jié)構(gòu)C51語句是計(jì)算機(jī)執(zhí)行的操作命令,一條語句以分號(hào)結(jié)尾(注意:程序中的變量、函數(shù)聲明部分盡管不是語句,但也以分號(hào)結(jié)尾)。從程序流程分析,程序主要有順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)這樣三種最基本的結(jié)構(gòu)。而C語句有表達(dá)式語句、復(fù)合語句、控制語句、空語句和函數(shù)調(diào)用語句等。基于匯編與C語言的單片機(jī)原理及應(yīng)用454.2.6C51語句和結(jié)構(gòu)化程序設(shè)計(jì)第四十五頁,共110頁。表達(dá)式語旬的一般形式為如下:

例如:x=y+z;

/*賦值語句*/i++;

/*自增1語句*/順序結(jié)構(gòu)程序由按先后順序執(zhí)行的多個(gè)語句組成,在C語言中,將按順序執(zhí)行的多條語句用花括號(hào){}括起來構(gòu)成復(fù)合語句,復(fù)合語句中每個(gè)語句以分號(hào)結(jié)尾,復(fù)合語句花括號(hào)后不再加分號(hào)。而沒有內(nèi)容,只有分號(hào),不執(zhí)行任意操作的語句稱為空語句。像賦值語句那種不包含其他語句的語句,稱為簡單語句。基于匯編與C語言的單片機(jī)原理及應(yīng)用462.表達(dá)式語句、復(fù)合語句和順序結(jié)構(gòu)程序第四十六頁,共110頁。(1)關(guān)系運(yùn)算符和關(guān)系表達(dá)式比較兩個(gè)量的大小關(guān)系的運(yùn)算符稱為關(guān)系運(yùn)算符,關(guān)系運(yùn)算符有以下6種:<(小于)、<=(小于等于)、>(大于)、.>=(大于等于)、==(等于)、!=(不等于)關(guān)系運(yùn)算符都是雙目運(yùn)算符,都具有左結(jié)合特性。關(guān)系表達(dá)式的一般形式為:表達(dá)式1關(guān)系運(yùn)算符表達(dá)式2(2)邏輯運(yùn)算符和邏輯表達(dá)式邏輯運(yùn)算符有&&(邏輯與)、||(邏輯或)、?。ㄟ壿嫹牵┻@樣三種。基于匯編與C語言的單片機(jī)原理及應(yīng)用473.選擇語句和選擇結(jié)構(gòu)程序第四十七頁,共110頁。if語句用來判定所給的條件是否滿足來決定執(zhí)行的兩種可能操作之一。if話句有3種形式。①if(表達(dá)式)語句;括號(hào)中的表達(dá)式一般為關(guān)系表達(dá)式或邏輯表達(dá)式。當(dāng)表達(dá)式的值為非零時(shí),則執(zhí)行語句;否則,不執(zhí)行語句。語句可以是簡單語句或復(fù)合語句。②if(表達(dá)式) 語句1;else 語句2;當(dāng)括號(hào)中的表達(dá)式值為非零時(shí)執(zhí)行語句1;否則,執(zhí)行語句2。其中的語句1和語句2可以是簡單語句或復(fù)合語句。

③if(表達(dá)式1)

語句1;elseif(表達(dá)式2) 語句2;

:elseif(表達(dá)式n) 語句n;else語句n+l;這種形式的if語句可以實(shí)現(xiàn)多種條件的選擇。基于匯編與C語言的單片機(jī)原理及應(yīng)用48(3)if語句第四十八頁,共110頁。在if(表達(dá)式)語句1;else語句2;這種形式中,若語句1、語句2都是給同一個(gè)變量賦值,則可以用更加簡潔的條件表達(dá)式來實(shí)現(xiàn)。條件表達(dá)式的一般形式為:

表達(dá)式1?表達(dá)式2:表達(dá)式3

條件表達(dá)式求解時(shí),先求表達(dá)式1的值,若非零(即表達(dá)式1為真),則求解表達(dá)式2的值,并作為整個(gè)條件表達(dá)式的值;如果表達(dá)式1的值為零(即表達(dá)式1為假),則求解表達(dá)式3的值,并作為整個(gè)條件表達(dá)式的值?;趨R編與C語言的單片機(jī)原理及應(yīng)用49(4)條件表達(dá)式第四十九頁,共110頁。switch語句是直接處理多分支的選擇語句,其功能類似于51的散轉(zhuǎn)指令JMP@A+DPTR。一般形式為:switch(表達(dá)式){case常量表達(dá)式1:

語句1;case常量表達(dá)式2:

語句2;:case常量表達(dá)式n:

語句n;default: 語句n+l;}基于匯編與C語言的單片機(jī)原理及應(yīng)用50(5)switch語句第五十頁,共110頁?!纠?-2】若在一個(gè)應(yīng)用系統(tǒng)中設(shè)置5個(gè)單字符命令:A、F、G、W、Z。變量SIO_IN為串行口輸入的字符。要求設(shè)計(jì)一個(gè)程序,若SIO_IN為合法的命令字符求出其命令號(hào)(0~4),非法字符則置為0FFH。設(shè)SIO_IN、CMD_N為已定義的無符號(hào)字符型變量,則程序如下:switch(SIO_IN)/*SIO一IN為輸入字符變量*/{case'A': CMD_N=0;break;

/*CMDN為命令號(hào)*/case'F': CMD_N=l; break;case'G': CMD_N=2;break;case'W':CMD_N=3;break;case'Z': CMD_N=4;break;default:CMD_N=0xff;}基于匯編與C語言的單片機(jī)原理及應(yīng)用51第五十一頁,共110頁。(1)while語句while語句的一般形式為:while(表達(dá)式)語句;基于匯編與C語言的單片機(jī)原理及應(yīng)用524.循環(huán)語句和循環(huán)結(jié)構(gòu)程序第五十二頁,共110頁。【例4-3】求S=1+2+3+…+100和的程序,請(qǐng)用while循環(huán)來實(shí)現(xiàn):#include<stdio.h>voidmain(){unsignedints=0;

/*定義變量并初始化*/unsignedchari=l;while(i<=100){s+=i;

/*循環(huán)體為復(fù)合語句*/i++;} /*修改循環(huán)變量x/printf("s=%d\n",s);}基于匯編與C語言的單片機(jī)原理及應(yīng)用53第五十三頁,共110頁。Do{語句;}/*循環(huán)體,可以是簡單語句或復(fù)合語句*/while(表達(dá)式);

/*其后分號(hào)不可少,表達(dá)式為關(guān)系表達(dá)式或邏輯表達(dá)式*/

【例4-4】求S=1+2+3+…+100和的程序,請(qǐng)用do-while循環(huán)來實(shí)現(xiàn):#include<stdio.h>voidmain(){inti,s;i=1;s=0;do{s=s+i;i=i+1;}while(i<=100);printf("s=%d\n",s);}基于匯編與C語言的單片機(jī)原理及應(yīng)用54(2)do-while語句第五十四頁,共110頁?!纠?-5】P1.1輸出16次跳變,產(chǎn)生8個(gè)脈沖,P1.1初態(tài)為0,則程序如下:unsignedchari=0;

/*定義循環(huán)控制變量i*/do{P1=P1^0x02;/*P1.1求反,Pl口其他位不變*/i++; /*修改循環(huán)控制變量*/}while(1<16);/*;號(hào)不可省*/基于匯編與C語言的單片機(jī)原理及應(yīng)用55第五十五頁,共110頁。for語句的一般形式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句;for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)控制變量修改){語句}/*循環(huán)體,可以是簡單語句、復(fù)合語句或空語句*/基于匯編與C語言的單片機(jī)原理及應(yīng)用56(3)for語句第五十六頁,共110頁。【例4-6】用for語句實(shí)現(xiàn)S=1+2+3+…+100的程序。

●{unsignedints;

/*標(biāo)準(zhǔn)形式*/unsignedchari;for(i=1,s=0;i<=100;i++)s+=i;}●{unsignedints=0;/*省表達(dá)式l*/unsignedchari=l;for(;i<=100;i++)s+=i;}

●{unsignedints;/*缺省表達(dá)式3*/unsignedchari;for(i=l,s=0;i<=100;)

{s+=i;i++;/*循環(huán)體中修改變量i*/}}基于匯編與C語言的單片機(jī)原理及應(yīng)用57第五十七頁,共110頁。①goto話句為無條件跳轉(zhuǎn)語句,一般形式為:goto語句標(biāo)號(hào);/*goto語句盡量少用*/②break語句用來從循環(huán)體中跳出循環(huán)體,終止整個(gè)循環(huán)。一般形式為:Break;③continue語句用于循環(huán)體中,其功能為跳過本次循環(huán)中尚未執(zhí)行的語句,繼續(xù)下次循環(huán),而不終止整個(gè)循環(huán),一般形式為:Continue;基于匯編與C語言的單片機(jī)原理及應(yīng)用58(4)goto語句、break語句和continue語句第五十八頁,共110頁。C51編譯器支持的基本數(shù)據(jù)類型有:位型(bit)、無符號(hào)字符(unsignedchar)、有符號(hào)字符(signedchar)、無符號(hào)整型(unsignedint)、有符號(hào)整型(signedint)、無符號(hào)長整型(unsignedlong)、有符號(hào)長整型(signedlong)、浮點(diǎn)(float)、雙精度浮點(diǎn)(double),另外C51還提供了一些擴(kuò)展的數(shù)據(jù)類型,它們是由C51支持的基本數(shù)據(jù)類型按一定的規(guī)則組合成的數(shù)據(jù)類型,稱之為構(gòu)造數(shù)據(jù)類型。C51支持的構(gòu)造數(shù)據(jù)類型有:數(shù)組、結(jié)構(gòu)、指針、共同體(或者,也稱為聯(lián)合)、枚舉等。其實(shí)C51支持的構(gòu)造數(shù)據(jù)類型與標(biāo)準(zhǔn)C語言是一樣的,對(duì)構(gòu)造數(shù)據(jù)類型的定義、引用以及運(yùn)算的規(guī)則也與標(biāo)準(zhǔn)的C語言相同?;趨R編與C語言的單片機(jī)原理及應(yīng)用594.2.7C51構(gòu)造數(shù)據(jù)類型第五十九頁,共110頁。1.數(shù)組2.結(jié)構(gòu)體3.聯(lián)合(共用)體4.指針基于匯編與C語言的單片機(jī)原理及應(yīng)用60第六十頁,共110頁。數(shù)組是相關(guān)的同類對(duì)象的集合,是一種構(gòu)造類型的變量。數(shù)組中各元素的數(shù)據(jù)類型必須相同,元素的個(gè)數(shù)必須固定,數(shù)組中的元素按順序存放,每個(gè)元素對(duì)應(yīng)于一個(gè)序號(hào)(稱為下標(biāo)),各元素按下標(biāo)存取。數(shù)組元素下標(biāo)的個(gè)數(shù)由數(shù)組的維數(shù)確定,一維數(shù)組有一個(gè)下標(biāo),二維數(shù)組有兩個(gè)下標(biāo)。(1)一維數(shù)組的定義(2)一維數(shù)組的引用(3)一維數(shù)組的初始化基于匯編與C語言的單片機(jī)原理及應(yīng)用611.數(shù)組第六十一頁,共110頁?!纠?-7】統(tǒng)計(jì)某班學(xué)生成績中80分以上,60分~80分,60分以下人數(shù)的程序。{unsignedchari=0,score_A=0,score_B=0,scroe_F=0;for(;i<20;i++){if(student_score[i]>80)score_A++; /*score_A統(tǒng)計(jì)80分以上學(xué)生人數(shù)*/elseif(student_score[i]>=60)score_B++;/*score_B統(tǒng)計(jì)60~80分之間學(xué)生人數(shù)*/elsescore_F++;

/*score_F統(tǒng)計(jì)60分以下學(xué)生人數(shù)*/}}基于匯編與C語言的單片機(jī)原理及應(yīng)用62第六十二頁,共110頁。結(jié)構(gòu)是另一種構(gòu)造類型數(shù)據(jù)。通過使用結(jié)構(gòu)可以把一些數(shù)據(jù)類型可能不同的相關(guān)變量結(jié)合在一起,給它們一個(gè)共同的名稱,以方便編程。(1)定義結(jié)構(gòu)類型

定義結(jié)構(gòu)類型的一般形式為:struct結(jié)構(gòu)類型名{/*struct為結(jié)構(gòu)類型關(guān)鍵字*/

成員表列

/*對(duì)各個(gè)成員數(shù)據(jù)類型聲明*/};

/*分號(hào)不能省略*/

例如:定義包含年、月、日的結(jié)構(gòu)類型:structdate{unsignedintyear;

/*3個(gè)成員的數(shù)據(jù)類型聲明*/unsignedcharmonth;unsignedcharday;};

/*;號(hào)不可省略*/基于匯編與C語言的單片機(jī)原理及應(yīng)用632.結(jié)構(gòu)體的定義與引用第六十三頁,共110頁。(2)定義結(jié)構(gòu)類型變量●定義結(jié)構(gòu)類型以后,再定義這種結(jié)構(gòu)類型的變量。一般形式為:結(jié)構(gòu)類型名[存貯器類型說明]結(jié)構(gòu)變量名表;●在定義結(jié)構(gòu)類型時(shí)同時(shí)定義結(jié)構(gòu)變量,一般形式為:struct結(jié)構(gòu)類型名{

成員表列}變量名表列;●直接定義結(jié)構(gòu)類型變量基于匯編與C語言的單片機(jī)原理及應(yīng)用64第六十四頁,共110頁。(3)結(jié)構(gòu)變量的引用對(duì)結(jié)構(gòu)變量的成員只能一個(gè)一個(gè)引用。引用結(jié)構(gòu)變量成員的方法有兩種:●用結(jié)構(gòu)變量名引用結(jié)構(gòu)成員,其形式為:結(jié)構(gòu)變量名.成員名例如:birth_day.year=1960;●用指向結(jié)構(gòu)的指針引用成員,其形式為:指針變量名->成員名例如:birth_day->year=1960;基于匯編與C語言的單片機(jī)原理及應(yīng)用65第六十五頁,共110頁。聯(lián)合也稱為共用體,聯(lián)合中的成員是幾種不同類型變量,它們共用一個(gè)存貯區(qū)域,任意瞬間只能存取其中的一個(gè)變量,即一個(gè)變量被修改了,其他變量原來的值也就消失了。(1)定義聯(lián)合類型和聯(lián)合類型變量,定義形式為:union聯(lián)合類型名{

成員表列}變量名表;(2)聯(lián)合類型變量成員引用

聯(lián)合類型變量成員的引用方法類似于結(jié)構(gòu)類型變量成員的引用:變量名.成員名基于匯編與C語言的單片機(jī)原理及應(yīng)用663.聯(lián)合的定義與引用第六十六頁,共110頁。在C語言中,把存放數(shù)據(jù)的地址稱為指針,把存放數(shù)據(jù)地址的變量稱為指針變量。一般的數(shù)據(jù)變量表示存貯單元內(nèi)容,而指針變量表示存貯單元的地址。利用指針變量訪問數(shù)據(jù)對(duì)象類似于用DPTR間接尋址一樣地方便。(1)定義指針變量指針變量也必須先定義后使用,C51指針變量定義的一般形式為:

基類型[存貯器類型]*指針變量名表;基于匯編與C語言的單片機(jī)原理及應(yīng)用674.指針第六十七頁,共110頁。C51支持“基于存貯器”的指針和“通用指針”兩種指針類型。①基于存貯器的指針基于存貯器的指針以存貯類型為參量,在編譯時(shí)確定。用這種指針可以高效地訪問指針指向單元的內(nèi)容。這類指針的長度為1個(gè)字節(jié)(idata*,data*,pdata*)或2個(gè)字節(jié)(code*,xdata*)。②通用指針凡是在指針定義時(shí)未對(duì)指針指向的對(duì)象存貯空間進(jìn)行修飾說明的,編譯器都使用3個(gè)字節(jié)的通用指針。一個(gè)通用指針可以訪問任何變量而不管它在MCS51哪個(gè)存貯空間的什么位置。通用指針只在編譯和連接/定位時(shí)才把存貯空間代碼和地址填入預(yù)留的3個(gè)字節(jié)中?;趨R編與C語言的單片機(jī)原理及應(yīng)用68第六十八頁,共110頁。通用指針包括3個(gè)字節(jié),其中1個(gè)字節(jié)為存貯類型,另2個(gè)字節(jié)為偏移地址。存貯類型決定了對(duì)象所占用的MCS51存貯空間,偏移地址指向?qū)嶋H地址。有關(guān)通用指針的字節(jié)分配、存貯類型編碼以及通用指針到具體存貯空間的定位如“字節(jié)分配表”和“存儲(chǔ)器類型編碼表”所示。基于匯編與C語言的單片機(jī)原理及應(yīng)用69地址+0+1+2地址保存內(nèi)容存貯器類型偏移地址高位字節(jié)偏移地址低位字節(jié)存貯器類型idataxdatapdatadatacode編碼值12345第六十九頁,共110頁。(2)指針變量的引用①取變量的地址賦給指針變量C51中的單目運(yùn)算符&,是取變量地址的運(yùn)算符,用&可以將變量的地址賦給一個(gè)指針變量。②引用指針變量間接訪問所指向的變量C51中指針運(yùn)算符*,為單目運(yùn)算符,也稱間接訪問運(yùn)算符,它可以用指針變量間接訪問所指向的變量。③指針變量的加減1指針變量的加減1是使指針變量指向下一個(gè)或上一個(gè)變量。所以,指針變量加減1,其步進(jìn)是加減數(shù)據(jù)類型的長度。基于匯編與C語言的單片機(jī)原理及應(yīng)用70第七十頁,共110頁。C語言是函數(shù)式語言,C源程序中有一個(gè)主函數(shù)main(),由主函數(shù)調(diào)用其他函數(shù),程序的功能是由函數(shù)完成的。C51提供豐富的庫函數(shù),只要在源文件開頭包含相應(yīng)的頭文件,就可以調(diào)用庫函數(shù),也允許用戶自己定義函數(shù)。1.函數(shù)的定義定義一個(gè)函數(shù)的一般形式如下:[類型說明符]函數(shù)名(形參表列){聲明部分

語句}基于匯編與C語言的單片機(jī)原理及應(yīng)用714.2.8C51函數(shù)與中斷函數(shù)第七十一頁,共110頁。①類型說明符②函數(shù)名③形參表列④函數(shù)體【例4-8】求兩個(gè)整型變量中的大數(shù)intmax(intx,inty){intz;

/*變量聲明*/z=x>y?x:y;

/*條件語句,判斷x和y變量中的大數(shù),賦值給變量z*/returnz;}基于匯編與C語言的單片機(jī)原理及應(yīng)用72第七十二頁,共110頁。①函數(shù)調(diào)用的一般形式函數(shù)名

(實(shí)參表列)②函數(shù)調(diào)用方式●函數(shù)調(diào)用語句:這種方式適用于無參數(shù)傳遞的函數(shù)。●函數(shù)表達(dá)式:例如:c=2*max(a,b);●函數(shù)參數(shù):例如:m=max(a,max(b,c));③對(duì)被調(diào)用函數(shù)的聲明聲明的一般形式為:[extern]類型說明符

函數(shù)名

(形參表列);基于匯編與C語言的單片機(jī)原理及應(yīng)用732.函數(shù)的調(diào)用第七十三頁,共110頁。3.C51函數(shù)的參數(shù)傳遞C51支持用工作寄存器傳遞參數(shù),最多可以傳3個(gè)參數(shù),也可以通過固定存貯區(qū)來傳速參數(shù)。寄存器傳遞函數(shù)參數(shù)表基于匯編與C語言的單片機(jī)原理及應(yīng)用74參數(shù)序號(hào)charintLongorfloat一般指針1R7R6、R7R4~R7R1~R32R5R4、R53R3R2、R3第七十四頁,共110頁。函數(shù)返回值表基于匯編與C語言的單片機(jī)原理及應(yīng)用75返回類型返回的寄存器說明bitC在進(jìn)位標(biāo)志中返回(unsigned)charR7在R7中返回(unsigned)intR6、R7返回值高位字節(jié)在R6中,低位字節(jié)在R7中(unsigned)longR4~R7返回值高位字節(jié)在R4中,低位字節(jié)在R7中floatR4~R732位IEEE格式,指數(shù)和符號(hào)位在R7中指針R1、R2、R3R3中放存貯器類型,高位地址在R2中,低位地址在R1中第七十五頁,共110頁。(1)中斷函數(shù)的定義C51編譯器支持直接編寫中斷服務(wù)函數(shù)程序。C51編譯器對(duì)函數(shù)的定義進(jìn)行了擴(kuò)展,增加了一個(gè)擴(kuò)展關(guān)鍵字interrupt,使用關(guān)鍵字interrupt可以將一個(gè)函數(shù)定義成中斷服務(wù)函數(shù)。由于C51編譯器在編譯時(shí)對(duì)申明為中斷服務(wù)程序的函數(shù)自動(dòng)添加了相應(yīng)的現(xiàn)場保護(hù)、阻斷其它中斷、返回時(shí)恢復(fù)現(xiàn)場等處理的程序段,因而在編寫C51中斷服務(wù)函數(shù)時(shí)可以不必考慮這些問題,而把精力集中在如何處理引發(fā)中斷的事件上。C51用關(guān)鍵字interrupt和中斷號(hào)定義中斷函數(shù),定義中斷服務(wù)函數(shù)的一般形式為:[void]中斷函數(shù)名(形式參數(shù)表)interrupt中斷號(hào)[usingn]{ 聲明部分

語句}基于匯編與C語言的單片機(jī)原理及應(yīng)用764.中斷函數(shù)第七十六頁,共110頁。中斷函數(shù)注意事項(xiàng):中斷函數(shù)無返回值,數(shù)據(jù)類型以void表示,也可以缺省。中斷函數(shù)名為標(biāo)識(shí)符,以中斷名稱表示,如timer()。圓括號(hào)為函數(shù)標(biāo)志,interrupt為中斷函數(shù)的關(guān)鍵字。中斷號(hào)為該中斷在IE寄存器的使能位位置,比如外部中斷0的中斷號(hào)為0;而串行口的中斷號(hào)為4。應(yīng)根據(jù)所選單片機(jī)的器件手冊(cè)正確編寫中斷號(hào)。選項(xiàng)[usingn],指定中斷函數(shù)使用的工作寄存器組號(hào),n=0~3。如果使用[usingn]選項(xiàng),編譯器不產(chǎn)生保護(hù)和恢復(fù)R0~R7的代碼,執(zhí)行速度會(huì)快一些。基于匯編與C語言的單片機(jī)原理及應(yīng)用77第七十七頁,共110頁。關(guān)鍵字interrupt后面的n是中斷號(hào),n的取值范圍為0~31。編譯器從8*n+3處產(chǎn)生中斷向量,具體的中斷號(hào)n和中斷向量取決于不同的MCS51系列單片機(jī)芯片,基本中斷源和中斷向量如表所示?;趨R編與C語言的單片機(jī)原理及應(yīng)用78n中斷源中斷向量(8*n+3)0外部中斷00003H1定時(shí)器0000BH2外部中斷10013H3定時(shí)器1001BH4串行口0023H其它值保留8*n+3第七十八頁,共110頁。編寫MCS51系列單片機(jī)中斷程序時(shí)應(yīng)遵循的規(guī)則:①中斷函數(shù)不能進(jìn)行參數(shù)傳遞。②定義函數(shù)為void類型,以明確說明沒有返回值。③在任何情況下都不能直接調(diào)用中斷函數(shù),否則會(huì)產(chǎn)生編譯錯(cuò)誤。④C51編譯器的數(shù)學(xué)函數(shù)庫math.h中,提供了保存浮點(diǎn)寄存器狀態(tài)的庫函數(shù)pfsave和恢復(fù)浮點(diǎn)寄存器狀態(tài)的庫函數(shù)fprestore。

⑤如果在中斷函數(shù)中調(diào)用了其它函數(shù),則被調(diào)用函數(shù)所使用的寄存器組必須與中斷函數(shù)相同。用戶必須保證按要求使用相同的寄存器組,否則會(huì)產(chǎn)生不正確的結(jié)果。如果定義中斷函數(shù)時(shí)沒有使用using選項(xiàng),則由編譯器選擇一個(gè)寄存器組作絕對(duì)寄存器組訪問?;趨R編與C語言的單片機(jī)原理及應(yīng)用79第七十九頁,共110頁。(2)中斷函數(shù)舉例【例4-9】T0定時(shí)器中斷函數(shù)#include<reg51.h> /*源文件開頭宏命令*/#defineRELOADH0x3e/*宏定義符號(hào)*/#defineRELOADL0xbdunsignedintTick_count;

/*定義全局變量x/timer0()interruptl{TR0=0; /*關(guān)定時(shí)器T0*/TH0=RELOADH;

/*恢復(fù)T0初值*/TL0=RELOADL;TR0=1 /*重新允許T0計(jì)數(shù)*/Tick_count++ /*修改變量Tick_count*/}基于匯編與C語言的單片機(jī)原理及應(yīng)用80第八十頁,共110頁。①局部變量在一個(gè)函數(shù)(即使是主函數(shù))內(nèi)部定義的變量在本函數(shù)內(nèi)有效,在函數(shù)外無效。在復(fù)合語句內(nèi)定義的變量也只能在本復(fù)合語句內(nèi)有效,復(fù)合語句外無效。這類變量稱為局部變量。因此,不同函數(shù)內(nèi)使用的變量可以使用相同的名稱。局部變量名是用小寫字母表示的標(biāo)識(shí)符。②全局變量一個(gè)源文件包含若干個(gè)函數(shù),在函數(shù)外部定義的變量可以為多個(gè)函數(shù)所共用,有效范圍從定義變量處到文件結(jié)束,一般在文件開頭定義,使之對(duì)整個(gè)文件有效。這類變量稱之為全局變量。全局變量名稱一般以大寫字母開頭。基于匯編與C語言的單片機(jī)原理及應(yīng)用815.局部變量和全局變量第八十一頁,共110頁。變量定義中的存貯種類指出變量的存貯方式和作用域。①auto動(dòng)態(tài)變量在函數(shù)或復(fù)合語句內(nèi)部定義的變量,在定義中若缺省存貯種類則默認(rèn)為動(dòng)態(tài)變量,動(dòng)態(tài)變量只在函數(shù)被調(diào)用時(shí),系統(tǒng)才給動(dòng)態(tài)變量分配存貯單元,函數(shù)執(zhí)行結(jié)束時(shí)釋放存貯空間。動(dòng)態(tài)變量只能在函數(shù)或復(fù)合語句的內(nèi)部使用。②static靜態(tài)變量在函數(shù)內(nèi)或復(fù)合語句內(nèi)的變量定義中,用static指定存貯種類,這種變量稱為靜態(tài)局部變量,靜態(tài)局部變量在程序運(yùn)行時(shí)始終存在(占用存貯單元),但只能在函數(shù)內(nèi)部使用,其作用是本次調(diào)用函數(shù)時(shí)能使用上次調(diào)用后的變量值。例如中斷函數(shù)中定義的一些特殊變量可以用靜態(tài)變量?;趨R編與C語言的單片機(jī)原理及應(yīng)用826.變量的存儲(chǔ)種類第八十二頁,共110頁。全局變量也是靜態(tài)變量,始終占有存貯單元,但可以為多個(gè)函數(shù)共用。③用extern聲明外部變量在函數(shù)外部定義的變量稱為外部變量(即全局變量),如果在變量定義處之前使用該變量,必須用extern聲明,從聲明處開始可使用該變量,如果一個(gè)文件中使用另一個(gè)文件中的全局變量,在使用之前也應(yīng)用extern聲明。④用extern聲明外部函數(shù)一個(gè)文件使用另一個(gè)文件中的函數(shù),也用extern聲明是外部函數(shù)?;趨R編與C語言的單片機(jī)原理及應(yīng)用83第八十三頁,共110頁。1.預(yù)處理命令預(yù)處理命令是在編譯前預(yù)先處理的命令,編譯器不能直接對(duì)它們處理,是在編譯前預(yù)先處理的命令;下面簡單介紹常用的預(yù)處理命令。(1)宏定義#define①不帶參數(shù)的宏定義用指定的標(biāo)識(shí)符來代表一個(gè)字符序列。一般定義形式為:#define標(biāo)識(shí)符

字符序列

/*命令后不加分號(hào)*/基于匯編與C語言的單片機(jī)原理及應(yīng)用844.2.9C51預(yù)處理命令和庫函數(shù)第八十四頁,共110頁。②帶參數(shù)的宏定義預(yù)處理時(shí)不但進(jìn)行字符替換,而且替換字符序列中的形參。一般定義形式如下:#define標(biāo)識(shí)符(形參)字符序列

/*字符串中含有形參*/基于匯編與C語言的單片機(jī)原理及應(yīng)用85第八十五頁,共110頁。(2)類型定義typedef使用基本類型定義或聲明變量時(shí),用數(shù)據(jù)類型關(guān)鍵字指明變量的數(shù)據(jù)類型,而用結(jié)構(gòu)、聯(lián)合等類型定義變量時(shí),先定義結(jié)構(gòu)、聯(lián)合的類型,再用關(guān)鍵字,類型名定義變量。如果用typedef定義新的類型名后,只要用類型名就可定義新的變量。例如:typedefstruct{intnum;char*name;charsex;intarg;intscore;}STD_TYPE;/*定義結(jié)構(gòu)類烈STD_TYPE*/接著便可以在程序中用STD_TYPE,就可以定義屬于這種類型的結(jié)構(gòu)變量。例如:STD_TYPEstd1,std2;/*定義STD_TYPE類型結(jié)構(gòu)變量std1,std2*/基于匯編與C語言的單片機(jī)原理及應(yīng)用86第八十六頁,共110頁。(3)文件包含#include文件包含命令是將另外的文件插入到本文伴中,作為一個(gè)整體文件編譯。C51提供了豐富的庫函數(shù),并有相應(yīng)的頭文件,只有用#include命令包含了相應(yīng)頭文件,才可以調(diào)用庫中的函數(shù)。包含命令一般形式為:#include“文件名”或者#include<文件名>#include“stdio.h”/*包含標(biāo)準(zhǔn)I/O頭文件,后面無‘;’號(hào)*/#include“math.h”/*包含數(shù)學(xué)計(jì)算函數(shù)庫頭文件*/基于匯編與C語言的單片機(jī)原理及應(yīng)用87第八十七頁,共110頁。在KeiluVision的安裝目錄C51/LIB中有幾個(gè)重要的源文件,對(duì)它們稍作修改就可以用在專用的系統(tǒng)中。(1)init_mem.C功能是初始化動(dòng)態(tài)內(nèi)存區(qū),指定動(dòng)態(tài)內(nèi)存區(qū)的大小。(2)init.a51功能是對(duì)watchdog操作。(3)C51啟動(dòng)配置文件startup.a51啟動(dòng)配置文件startup.a51中包含了目標(biāo)系統(tǒng)啟動(dòng)代碼,可以在每個(gè)工程項(xiàng)目中加入這個(gè)文件,復(fù)位以后先執(zhí)行該程序,然后轉(zhuǎn)主函數(shù)main()?;趨R編與C語言的單片機(jī)原理及應(yīng)用882.C51的通用文件第八十八頁,共110頁。(1)本征函數(shù)文件本征函數(shù)也稱為內(nèi)聯(lián)函數(shù),這種函數(shù)不采用調(diào)用形式,編譯時(shí)直接將代碼插入當(dāng)前行。①左環(huán)移本征函數(shù)_crol_,_irol_,_lrol_分別將字符型變量a、整型變量a、長整型變量a循環(huán)左移n位。②右環(huán)移本征函數(shù)_cror_,_iror_,_lror_分別將字符型變量a、整型變量a、長整型變量a循環(huán)右移n位。③其他本征函數(shù)_nop_,_testbit_()基于匯編與C語言的單片機(jī)原理及應(yīng)用893.C51的庫函數(shù)第八十九頁,共110頁。(2)庫函數(shù)C51針對(duì)51單片機(jī)硬件特點(diǎn)設(shè)置了SMALL、COMPACT、LARGE的有和沒有浮點(diǎn)運(yùn)算的函數(shù)庫。

C51S.LIB 無浮點(diǎn)運(yùn)算的小系統(tǒng)函數(shù)庫C51FPS.LIB 有浮點(diǎn)運(yùn)算的小系統(tǒng)函數(shù)庫C51C.LIB 無浮點(diǎn)運(yùn)算的緊湊系統(tǒng)函數(shù)庫C51FPC.LIB 有浮點(diǎn)運(yùn)算的緊湊系統(tǒng)函數(shù)庫C51L.LIB 無浮點(diǎn)運(yùn)算的大系統(tǒng)函數(shù)庫C51FPL.LIB 有浮點(diǎn)運(yùn)算的大系統(tǒng)函數(shù)庫基于匯編與C語言的單片機(jī)原理及應(yīng)用90第九十頁,共110頁。(3)頭文件每個(gè)函數(shù)庫都有相應(yīng)頭文件,用戶如果需要用庫函數(shù),必須將用#include命令包含相應(yīng)頭文件。下面列出相應(yīng)頭文件(位于Keil\C51\INC目錄下):

ctype.h字符函數(shù);stdio.h一般I/O函數(shù)string.h字符串函數(shù);stdlib.h標(biāo)準(zhǔn)函數(shù)math.h數(shù)學(xué)函數(shù);absacc.h絕對(duì)地址訪問宏定義intrins.h本征函數(shù);stdarg.h變量參數(shù)表setjmp.h全程跳轉(zhuǎn);regxxx.hSFR定義文件基于匯編與C語言的單片機(jī)原理及應(yīng)用91第九十一頁,共110頁。C51與匯編語言混合編程的方法為:在把匯編語言程序加入到C語言程序前,須使匯編語言和C51程序一樣具有明確的邊界、參數(shù)、返回值和局部變量;必須為匯編語言編寫程序段指定段名并進(jìn)行定義;如果要在它們之間傳遞參數(shù),則必須保證匯編程序用來傳遞數(shù)的存儲(chǔ)區(qū)和C51函數(shù)使用的存儲(chǔ)區(qū)是一樣的。C51中使用匯編語言有以下3種方法:1.C51代碼中直接嵌入?yún)R編代碼2.控制命令SRC控制3.模塊間接口基于匯編與C語言的單片機(jī)原理及應(yīng)用924.2.10MCS51匯編語言與C51的混合編程第九十二頁,共110頁。1.C51代碼中直接嵌入?yún)R編代碼第1種方法使用asm功能。第2種方法使用#pragmaasm功能?!纠?-10】編寫程序從P1.0接口輸出方波。要求KeilC環(huán)境下C51程序中嵌入?yún)R編程序段。#include<reg51.h>sbitP1_0=P1^0;

//定義位變量P1_0voidmain(void){while(1)(P1_0=!P1_0;//P1_0接口輸出取反#pragmaasm//匯編程序段開始MOVR3,#18DJNZR3,$//延時(shí)等待#pragmaendasm//匯編程序段結(jié)束}}//程序結(jié)束基于匯編與C語言的單片機(jī)原理及應(yīng)用93第九十三頁,共110頁。KeilμVision4直接嵌入?yún)R編代碼的方法:(1)在C文件中要嵌入?yún)R編代碼片的方式為:#pragmaASM#pragmaENDASM(2)在Project窗口中包含匯編代碼的C文件上右鍵,選擇“Optionsfor…”,點(diǎn)擊右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色(有效)狀態(tài);(3)根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時(shí),是Keil\C51\Lib\C51S.Lib)加人工程中,該文件必須作為工程的最后文件;(4)編譯,即可生成目標(biāo)代碼。基于匯編與C語言的單片機(jī)原理及應(yīng)用94第九十四頁,共110頁。2.控制命令SRC控制(1)按寫普通C51程序方法,建立工程,在里面導(dǎo)入main.c文件和CFUNC.c文件。(2)在

“Optionsfor…”,點(diǎn)擊右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色(有效)狀態(tài);(3)根椐選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時(shí),是Keil\C51\Lib\C51S.Lib)加人工程中,該文件必須作為工程的最后文件;(4)build這個(gè)工程后將會(huì)產(chǎn)生一個(gè)CFUNC.SRC的文件,將這個(gè)文件改名為CFUNC.A51然后在工程里去掉庫文件(如C51S.Lib)和CFUNC.c,而將CFUNC.A51添加到工程里。(5)檢查maIn.c的“GenerateAssemblerSRCFile”和“AssembleSRCFile”是否有效。基于匯編與C語言的單片機(jī)原理及應(yīng)用95第九十五頁,共110頁。3.模塊間接口當(dāng)采用C51與匯編語言混合編程時(shí),在技術(shù)上有兩個(gè)問題:一個(gè)是在C51中如何調(diào)用匯編語言程序;另一個(gè)是C51程序如何與匯編語言程序之間實(shí)現(xiàn)數(shù)據(jù)的交換。當(dāng)采用混合編程時(shí),必須約定這兩方面的規(guī)則,即命名規(guī)則和參數(shù)傳遞規(guī)則。(1)命名規(guī)則。在C51中被調(diào)用函數(shù)要在主函數(shù)中說明,在匯編語言程序中,要使用偽指令使CODE選項(xiàng)有效并申明為可再定位段類型,并且根據(jù)不同情況對(duì)函數(shù)名作轉(zhuǎn)換。(

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論