




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
目錄CONTENTS模塊1單片機(jī)硬件系統(tǒng)模塊2單片機(jī)開發(fā)軟件系統(tǒng)模塊3并行I/O口應(yīng)用與C語言基礎(chǔ)模塊4定時與中斷系統(tǒng)模塊5顯示和鍵盤接口技術(shù)模塊6串行口通信技術(shù)模塊7綜合應(yīng)用全套可編輯PPT課件模塊1單片機(jī)硬件系統(tǒng)
任務(wù)1點亮最簡單的單片機(jī)系統(tǒng)1.1單片機(jī)簡介1.2MCS-51單片機(jī)的內(nèi)部結(jié)構(gòu)1.38051單片機(jī)的信號引腳及最小系統(tǒng)階段小結(jié)
1.任務(wù)目的
通過利用單片機(jī)來控制LED發(fā)光二極管閃爍的電路制作,了解單片機(jī)和單片機(jī)最小系統(tǒng),掌握簡單單片機(jī)應(yīng)用系統(tǒng)的硬件電路搭建方法,了解單片機(jī)應(yīng)用系統(tǒng)開發(fā)流程。
2.任務(wù)要求
能夠獨立完成實現(xiàn)LED發(fā)光二極管閃爍控制的簡單單片機(jī)應(yīng)用系統(tǒng)硬件電路的制作,能嘗試把給定程序下載到單片機(jī)中去,觀察實現(xiàn)效果。
圖1.1單片機(jī)控制LED發(fā)光二極管閃爍系統(tǒng)硬件電路
3.硬件電路
一個最簡單的單片機(jī)系統(tǒng)的開發(fā)也需要電路設(shè)計、單片機(jī)器件選擇和程序編寫3個步驟。對于單片機(jī)系統(tǒng),最簡單的功能就是控制輸出電平的高低。本任務(wù)中將單片機(jī)系統(tǒng)接上一個發(fā)光二極管,用二極管的亮滅表示設(shè)計的單片機(jī)系統(tǒng)是否正常工作。
4.程序設(shè)計
5.任務(wù)小結(jié)
通過發(fā)光二極管閃爍控制系統(tǒng)的制作與調(diào)試,使學(xué)生對單片機(jī)、單片機(jī)最小系統(tǒng)和單片機(jī)應(yīng)用系統(tǒng)有直觀認(rèn)識,對單片機(jī)應(yīng)用系統(tǒng)的開發(fā)過程有初步了解。
單片機(jī)應(yīng)用系統(tǒng)的開發(fā)過程:設(shè)計硬件電路圖、制作電路板、程序設(shè)計、軟件調(diào)試、程序下載、軟硬件聯(lián)調(diào)、產(chǎn)品測試。
1.1單?片?機(jī)?簡?介
1.1.1單片機(jī)基本概念
1.什么是單片機(jī)
單片機(jī)是在一塊硅片上集成了微處理器(CPU)、存儲器以及各種輸入/輸出接口的芯片,如圖1.2所示,它具有了計算機(jī)的屬性,因而被稱為單片微型計算機(jī),簡稱單片機(jī)。由于它的結(jié)構(gòu)和指令功能是按照工業(yè)控制要求設(shè)計的,故又稱為微控制器。通俗地說,單片機(jī)就是一塊集成芯片,只是它具有一些特殊的功能,這些功能的實現(xiàn)要靠使用者自己編程來完成。單片機(jī)具有結(jié)構(gòu)簡單、體積小、價格低、控制功能強(qiáng)、可靠性高等優(yōu)點。
圖1.2單片機(jī)結(jié)構(gòu)
2.單片機(jī)能做什么
單片機(jī)是一種可通過編程控制的微控制器,單片機(jī)芯片自身不能單獨應(yīng)用于某個項目或產(chǎn)品上,必須靠外圍數(shù)字器件或模擬器件的配合才可發(fā)揮自身的強(qiáng)大功能。在學(xué)習(xí)單片機(jī)時,不能僅僅學(xué)習(xí)單片機(jī)芯片本身,還要逐步學(xué)習(xí)相關(guān)外圍芯片知識及外圍電路設(shè)計和調(diào)試。
單片機(jī)屬于控制類的數(shù)字集成芯片,目前已在很多領(lǐng)域廣泛應(yīng)用。如:
(1)消費(fèi)類電子產(chǎn)品,如洗衣機(jī)、電冰箱、空調(diào)、電視機(jī)、微波爐、IC卡、汽車電子設(shè)備等。
(2)智能儀器儀表,如數(shù)字示波器、數(shù)字信號源、數(shù)字萬用表、數(shù)字流量計等。
(3)工業(yè)自動化,如各種工業(yè)測控系統(tǒng)、數(shù)據(jù)采集系統(tǒng)、自適應(yīng)控制系統(tǒng)等。
(4)通信方面,如手機(jī)、調(diào)制解調(diào)器、電信局的程控交換機(jī)等。
(5)軍工領(lǐng)域的應(yīng)用,如飛機(jī)、軍艦、坦克、導(dǎo)彈、智能武器等。
3.單片機(jī)應(yīng)用系統(tǒng)組成
單片機(jī)應(yīng)用系統(tǒng)由軟件系統(tǒng)和硬件系統(tǒng)兩部分組成,如圖1.3所示,二者相互依賴,缺一不可。單片機(jī)硬件系統(tǒng)是以單片機(jī)芯片為核心,配以相關(guān)的外圍設(shè)備及接口電路構(gòu)成的;軟件在硬件系統(tǒng)的基礎(chǔ)之上,對其資源進(jìn)行合理調(diào)配和使用,控制其按照一定的要求完成各種運(yùn)算或動作,從而實現(xiàn)應(yīng)用所要求完成的任務(wù)。
圖1.3單片機(jī)應(yīng)用系統(tǒng)組成
1.1.251單片機(jī)
1.常用51單片機(jī)芯片
“8051”源自Intel公司的MCS-51系列芯片,但目前所采用的8051并不限于Intel公司所生產(chǎn)的芯片,而是以51為內(nèi)核擴(kuò)展出的單片機(jī),并且以其他廠商所發(fā)行的兼容芯片為主,如表1.1所示是不同國家的芯片廠商生產(chǎn)的以51為內(nèi)核的51單片機(jī)產(chǎn)品。
2.單片機(jī)標(biāo)號信息
如圖1.4所示為一芯片實物圖,芯片上的標(biāo)號為STC89C51RC40C-PDIP,下面以此為例來說明單片機(jī)芯片上的標(biāo)號信息。
圖1.4單片機(jī)STC89C51RC40C-PDIP實物
3.STC公司51系列單片機(jī)選型
STC公司51系列單片機(jī)選型如表1.2所示。
1.2MCS-51單片機(jī)的內(nèi)部結(jié)構(gòu)
1.2.18051單片機(jī)的內(nèi)部基本組成
標(biāo)準(zhǔn)8051的內(nèi)部基本結(jié)構(gòu)如圖1.5所示。圖1.5標(biāo)準(zhǔn)8051單片機(jī)的基本內(nèi)部結(jié)構(gòu)簡化框圖
1.中央處理器(CPU)
CPU是單片機(jī)芯片中最復(fù)雜、最核心的智能部件,完成運(yùn)算和控制功能,它分為運(yùn)算器和控制器兩部分。運(yùn)算器主要實現(xiàn)算術(shù)運(yùn)算以及控制程序計數(shù)器PC、8位累加器ACC、寄存器B、程序狀態(tài)字寄存器PSW等,能完成字節(jié)和位的運(yùn)算,字節(jié)運(yùn)算以可進(jìn)行8位算術(shù)運(yùn)算和邏輯運(yùn)算的單元ALU為核心,位運(yùn)算以可進(jìn)行位運(yùn)算的布爾處理機(jī)為核心??刂破魇菃纹瑱C(jī)的神經(jīng)中樞,包括程序計數(shù)器PC、指令寄存器IR、指令譯碼器ID等部件,主要實現(xiàn)程序譯碼以及完成輸入/輸出邏輯等。8051的CPU為8位的CPU,且內(nèi)含一個一位CPU,不僅可處理字節(jié)數(shù)據(jù),還可以進(jìn)行位數(shù)據(jù)的處理。
2.存儲器
(1)程序存儲器ROM。
(2)數(shù)據(jù)存儲器RAM。
3.I/O口
8051內(nèi)部有4個8位并行I/O端口(P0、P1、P2、P3),可以實現(xiàn)數(shù)據(jù)的并行輸入/輸出。
4.中斷系統(tǒng)
8051共有5個中斷源,其中有兩個用于外部中斷,兩個用于定時/計數(shù)器中斷,一個用于串行口中斷,它們可設(shè)置為高級和低級兩個優(yōu)先級別。
5.定時/計數(shù)器
8051內(nèi)部有兩個16位的定時/計數(shù)器T0和T1。
6.串行口
8051內(nèi)部含有1個全雙工串行口,以實現(xiàn)單片機(jī)和其他設(shè)備之間的串行數(shù)據(jù)傳送。
7.時鐘振蕩電路
8051內(nèi)部有時鐘電路,但石英晶體和微調(diào)電容需外接。時鐘電路為單片機(jī)提供時鐘脈沖序列。
1.2.28051單片機(jī)的存儲器結(jié)構(gòu)
8051在物理結(jié)構(gòu)上有四個存儲空間:片內(nèi)程序存儲器,片外程序存儲器以及片內(nèi)數(shù)據(jù)存儲器和片外數(shù)據(jù)存儲器。但從用戶角度上有三個存儲空間:片內(nèi)外統(tǒng)一編址的64KB程序存儲器地址空間、256B的片內(nèi)數(shù)據(jù)存儲器地址空間(其中高128?B離散地分布著21個特殊功能寄存器,低128B供用戶暫存中間數(shù)據(jù))、最大擴(kuò)展64?KB的片外數(shù)據(jù)存儲器。
1.程序存儲器
單片機(jī)的工作是按照事先編制好的程序按一定順序執(zhí)行的,程序存儲器(ROM)就是用來存放程序的。8051單片機(jī)程序存儲器的結(jié)構(gòu)如圖1.6所示,其內(nèi)部4?KB的ROM,片外可以擴(kuò)展,實行片內(nèi)外統(tǒng)一編址,組成64?KB的程序存儲器區(qū),采用16位程序計數(shù)器PC作為地址指針,其地址范圍為0000H~FFFFH。
圖1.68051單片機(jī)程序存儲器的結(jié)構(gòu)
對于8051系列單片機(jī)而言,程序存儲器的某些地址單元被保留,用于特定的程序入口地址,用戶程序是不能占用這些地址單元的。如表1.3所示,其中一組特殊地址單元是0000H~0002H單元,單片機(jī)系統(tǒng)復(fù)位后,PC?=?0000H,單片機(jī)從0000H單元開始執(zhí)行;另一組特殊地址單元是0003H~002AH,這40個單元被分為5部分,作為單片機(jī)5個中斷源的中斷服務(wù)程序入口地址區(qū)。
2.片內(nèi)數(shù)據(jù)存儲器
8051單片機(jī)的片內(nèi)數(shù)據(jù)存儲器(RAM)為256?B,其結(jié)構(gòu)如圖1.7所示。這256?B單元的地址空間分為兩部分,低128?B(00H~7FH)空間供用戶使用,是真正的通用型RAM區(qū);而高128?B(80H~FFH)空間,是專門為特殊功能寄存器(SFR)保留的。
圖1.78051片內(nèi)數(shù)據(jù)存儲器結(jié)構(gòu)
1)低128?B的RAM
低128?B的RAM按照用途從低地址到高地址劃分為工作寄存器組區(qū)、可位尋址區(qū)和緩沖區(qū)。
(1)工作寄存器組區(qū)。
從00H~1FH的32個地址為工作寄存器組區(qū),共分為4組,分別為寄存器組0:00H~07H,寄存器組1:08H~0FH,寄存器組2:10H~17H,寄存器組3:18H~1FH。
(2)可位尋址區(qū)。
從20H~2FH的16個字節(jié)存儲區(qū)為可位尋址區(qū),每個字節(jié)有8位,共有128位,每一個位都有一個對應(yīng)的位地址。8051單片機(jī)通常訪問存儲器以字節(jié)為單位,“可位尋址”是指可以指定訪問某一個位。位尋址區(qū)主要為執(zhí)行位操作指令時提供位地址定義,其位地址定義如表1.4所示。
(3)緩沖區(qū)。
從30H~7FH的80個字節(jié)地址為緩沖區(qū),可以提供一般數(shù)據(jù)訪問或用作堆棧區(qū)。由于CPU復(fù)位后,堆棧指針SP指向07H位置,為了確保數(shù)據(jù)安全與程序的正確執(zhí)行,最好把堆棧指針改至本區(qū)。
2)高128B的RAM
高128B的RAM中離散地分布著21個SFR,如表1.5所示,每一個SFR都有字節(jié)地址,并定義了符號名,也有一部分SFR不僅具有字節(jié)地址,還具有位地址,表中帶“*”的SFR表示該SFR具有位地址,是可以進(jìn)行位尋址的。在這128B中盡管還有許多空閑地址,但用戶不能使用。
(1)程序狀態(tài)字寄存器PSW。
程序狀態(tài)字寄存器是一個8位寄存器,用來存放運(yùn)算結(jié)果的一些特征,如有無進(jìn)位、借位等,每位的具體含義:
RS1、RS0:工作寄存器組選擇控制位,在匯編語言中這兩位用來在4組工作寄存器區(qū)中選擇哪一組為當(dāng)前工作寄存器組,其對應(yīng)關(guān)系如表1.6所示。
(2)累加器ACC。
ACC累加器提供CPU主要操作的位置,是CPU中使用頻率最高的特殊功能寄存器,CPU中的數(shù)據(jù)傳送大多數(shù)都通過它來完成。
(3)堆棧指針SP。
堆棧指針SP為8位專用寄存器。在CPU響應(yīng)中斷或調(diào)用子程序時,程序斷口16位PC便會自動壓入堆棧中;在中斷程序或子程序結(jié)束時,原PC值會自動彈出堆棧,使程序從原斷口處繼續(xù)順序執(zhí)行下去。
(4)數(shù)據(jù)指針DPTR。
數(shù)據(jù)指針DPTR是16位專用寄存器,它也可拆成高字節(jié)DPH和低字節(jié)DPL兩個獨立的8位寄存器,主要用于存放16位地址。
(5)程序計數(shù)器PC。
PC是一個16位計數(shù)器,用于存放下一條將要執(zhí)行的指令的地址,尋址范圍為64KB。在讀取指令時,程序計數(shù)器PC將其保存的內(nèi)容作為所取指令的地址輸出給程序存儲器,然后程序存儲器按此地址將指令送出,同時程序計數(shù)器PC自身自動加1,指向下一條將要取出的指令的地址。
3.片外數(shù)據(jù)存儲器
8051單片機(jī)中的數(shù)據(jù)存儲器除內(nèi)部數(shù)據(jù)存儲器外,還可以擴(kuò)展外部數(shù)據(jù)存儲器,最多可擴(kuò)展64KB(0000H~FFFFH),這兩部分?jǐn)?shù)據(jù)存儲器可以并存。
1.38051單片機(jī)的信號引腳及最小系統(tǒng)
1.3.1信號引腳及功能
8051單片機(jī)芯片采用雙列直插式封裝方式,共有40個引腳。受集成電路芯片引腳數(shù)目的限制,許多引腳具有雙功能。其引腳排列如圖1.8所示,各引腳功能如表1.7所示。
圖1.88051單片機(jī)引腳
1.電源引腳
電源引腳用于接入單片機(jī)的工作電源。8051單片機(jī)中,VCC(40腳)接5V?±?10%電源,VSS(20腳)接地。
2.時鐘引腳
時鐘引腳XTAL1(19腳)、XTAL2(18腳)既可以利用內(nèi)部時鐘振蕩電路,也可以外接振蕩電路來給單片機(jī)提供時鐘控制信號。
3.復(fù)位引腳RST(9腳)
RST:復(fù)位信號引腳。對于8051來說,在單片機(jī)運(yùn)行時,只要在此引腳加上超過兩個機(jī)器周期的高電平將使單片機(jī)復(fù)位,此引腳具有復(fù)用功能。
4.控制引腳
5.I/O口引腳
8051有四個I/O口,包括P0口、P1口、P2口、P3口(其結(jié)構(gòu)及應(yīng)用將在模塊3中詳細(xì)敘述),每個I/O口都對應(yīng)8個引腳。P0口:P0.0~P0.7(39腳~32腳),P1口:P1.0~P1.7
(1腳~8腳),P2口:P2.0~P2.7(21腳~28腳),P3口:P3.0~P3.7(10腳~17腳)。它們用來連接單片機(jī)和外部設(shè)備,實現(xiàn)數(shù)據(jù)的輸入/輸出。
1.3.2單片機(jī)的最小系統(tǒng)
單片機(jī)最小系統(tǒng)電路是指單片機(jī)工作不可或缺的最基本連接電路。單片機(jī)最小系統(tǒng)電路框圖如圖1.9所示,主要包括4部分:單片機(jī)芯片本身、電源電路、時鐘振蕩電路、復(fù)位電路。
圖1.9單片機(jī)最小系統(tǒng)電路框圖
1.電源電路
要讓單片機(jī)工作就得讓它“吃飯”,沒有電路是不需要電源的,8051單片機(jī)電路也是一樣,將第40腳接?+5?V電源,第20腳接地即可。
2.時鐘振蕩電路
單片機(jī)本身就如同一個復(fù)雜的同步時序電路,為了保證同步工作方式的實現(xiàn),電路必須在脈沖信號的統(tǒng)一指揮下才能工作。
1)時鐘電路連接方式
單片機(jī)提供兩種振蕩電路連接方式:一種是內(nèi)部時鐘方式;另一種是外部時鐘方式。
(1)內(nèi)部時鐘方式。
8051單片機(jī)雖然內(nèi)部有時鐘振蕩電路,但要形成時鐘,必須外接元件,如圖1.10所示。
圖1.10內(nèi)部時鐘方式
(2)外部時鐘方式。
當(dāng)用戶選擇有源晶振時,則使用外部時鐘方式,如圖1.11所示。圖1.11外部時鐘方式
2)?CPU時序
時鐘脈沖是單片機(jī)的基本信號,不管是采用內(nèi)部的振蕩電路,還是外部時鐘脈沖產(chǎn)生電路提供的時鐘脈沖,這個時鐘將成為整個單片機(jī)系統(tǒng)工作的基礎(chǔ)。單片機(jī)在執(zhí)行指令時,通常將一條指令分解為若干個基本的操作,這些基本操作所對應(yīng)的脈沖信號在時間上的先后次序稱為單片機(jī)CPU的時序。要理解時序,首先要理解常用的概念。
(1)振蕩周期:是指為單片機(jī)提供定時信號的振蕩源的周期或外部輸入時鐘的周期。
(2)狀態(tài)周期:兩個振蕩周期為一個狀態(tài)周期,用S表示,它分為P1節(jié)拍和P2節(jié)拍,通常在P1節(jié)拍完成算術(shù)邏輯操作,在P2節(jié)拍完成內(nèi)部寄存器之間的傳送操作。
(3)機(jī)器周期:就是單片機(jī)執(zhí)行一個基本規(guī)定操作所需要的時間。一個機(jī)器周期包含6個狀態(tài)周期,用S1、S2、…、S6表示,共12個節(jié)拍,依次可表示為SIP1、S1P2、S2P1、S2P2、…、S6P2,如圖1.12所示。
圖1.12單片機(jī)CPU的時序
(4)指令周期:就是指CPU從讀取指令開始至該指令執(zhí)行完畢所需要的時間(即執(zhí)行一條指令所需要的時間)。不同的指令所需要的時間是不同的,指令周期一般由1~4個機(jī)器周期組成。
3.復(fù)位電路
通過某種方式,使單片機(jī)內(nèi)各寄存器的值變?yōu)槌跏紶顟B(tài)的操作稱為復(fù)位。在時鐘電路工作后,只要在單片機(jī)的RST引腳上加上超過兩個機(jī)器周期以上的高電平就可以實現(xiàn)復(fù)位,這需要靠外部電路來實現(xiàn)。
1)復(fù)位方式
復(fù)位分為上電復(fù)位、手動復(fù)位和混合復(fù)位三種方式。
(1)上電復(fù)位。如圖1.13(a)所示電路中采用上電復(fù)位方式。
圖1.13復(fù)位電路
(2)手動復(fù)位。如圖1.13(b)所示電路中采用手動復(fù)位方式。手動按鍵產(chǎn)生復(fù)位信號,當(dāng)按鍵按下時RST引腳接高電平,從而使單片機(jī)復(fù)位。按鍵松開后,單片機(jī)恢復(fù)正常狀態(tài)。通常在單片機(jī)工作出現(xiàn)了混亂或“死機(jī)”時,使用手動復(fù)位實現(xiàn)單片機(jī)的“重啟”。
(3)混合復(fù)位。如圖1.13(c)所示電路為混合復(fù)位。將上電復(fù)位和手動復(fù)位結(jié)合到一起構(gòu)成的,通常使用的復(fù)位方式就是這種混合復(fù)位方式。
2)復(fù)位
對于微型計算機(jī)而言,復(fù)位是一項很重要的歸零調(diào)整操作,以實現(xiàn)功能復(fù)位。當(dāng)系統(tǒng)復(fù)位時,CPU內(nèi)部寄存器將回歸初始狀態(tài),程序?qū)?000H處開始執(zhí)行。各寄存器初始狀態(tài)如表1.8所示。
4.單片機(jī)的最小系統(tǒng)
如圖1.14所示電路為單片機(jī)的最小系統(tǒng),其中時鐘電路采用內(nèi)部時鐘電路方式,復(fù)位電路采用混合復(fù)位方式。
圖1.14單片機(jī)最小系統(tǒng)實例
1.3.3單片機(jī)應(yīng)用系統(tǒng)硬件電路
實際的單片機(jī)應(yīng)用系統(tǒng)硬件只有最小系統(tǒng)是不夠的。單片機(jī)應(yīng)用系統(tǒng)的基本組成結(jié)構(gòu)如圖1.15所示,主要由單片機(jī)、晶振和復(fù)位電路、輸入控制電路、輸出顯示電路以及外圍功能器件等五部分組成。
1.輸入控制
輸入控制是指在一定要求下,采取何種形式的控制方法來實現(xiàn)單片機(jī)不同功能之間的轉(zhuǎn)換,以及控制指令以何種方式傳送到單片機(jī)。常用的輸入控制方法有獨立按鍵、矩陣鍵盤、串行通信等方式。
2.輸出顯示
輸出顯示是指單片機(jī)將需要顯示的數(shù)據(jù)發(fā)送到LED、液晶等顯示模塊,并控制顯示模塊按照一定的格式進(jìn)行顯示。此外,輸出對象還有電機(jī)等特殊的功能器件。
3.外圍功能器件
單片機(jī)只是控制器件,對應(yīng)于一定的設(shè)計要求,需要加入特定功能的器件,常用的外圍器件有A/D、D/A轉(zhuǎn)換電路,門電路,特定功能的傳感器等。
1.3.4單片機(jī)應(yīng)用系統(tǒng)硬件實例——單片機(jī)實驗開發(fā)板
1.單片機(jī)實驗開發(fā)板
學(xué)習(xí)單片機(jī)最好是有一塊實驗開發(fā)板,可以完成LED流水燈、數(shù)碼管顯示、獨立按鍵、矩陣按鍵、溫度測量、串行通信等實驗。如圖1.16所示的單片機(jī)實驗開發(fā)板,包含了單片機(jī)的最小系統(tǒng)(如圖中單片機(jī)芯片、實時時鐘電路、復(fù)位電路等)、輸入控制(如圖中獨立按鍵、矩陣按鍵等)、輸出顯示(如圖中LED發(fā)光模塊、LED數(shù)碼管模塊等以及圖中未能顯示的LCD液晶顯示)以及其他的外圍功能器件。
圖1.16單片機(jī)實驗開發(fā)板
2.電源
單片機(jī)所需電源為5?V,如果不想自己制作電源,可以用一條USB線把計算機(jī)USB口的5V電引到板子上當(dāng)電源使用。
1)USB的接口外形
USB的接口外形如圖1.17所示。
圖1.17USB接口外形
2)USB的接口引腳
USB接口引腳如表1.9所示。
3.下載線
由于程序是在計算機(jī)上完成編寫、編譯和調(diào)試的,必須把編譯調(diào)試好的程序通過數(shù)據(jù)線下載到單片機(jī)芯片中,需要用到下載線。
以前的計算機(jī)上有串口,可以利用串口通信實現(xiàn)數(shù)據(jù)下載。由于很多新式計算機(jī)和筆記本上沒有串口,可以用帶USB接口的下載線實現(xiàn),使用方便,能夠滿足現(xiàn)在的新式計算機(jī)和筆記本的要求,可以集下載數(shù)據(jù)和提供電源于一體,如圖1.18所示,一端接單片機(jī),另一端接計算機(jī)的USB接口,但需要安裝相應(yīng)的驅(qū)動程序。
圖1.18USB線和單片機(jī)與計算機(jī)的連接
階段小結(jié)
本模塊通過任務(wù)實現(xiàn),簡單介紹了單片機(jī)的基本概念、標(biāo)準(zhǔn)8051單片機(jī)的內(nèi)部結(jié)構(gòu)以及單片機(jī)的引腳功能和單片機(jī)最小系統(tǒng),從而對單片機(jī)的硬件結(jié)構(gòu)建立初步的認(rèn)識。本模塊重點內(nèi)容:(1)單片機(jī)有關(guān)的基本概念;(2)?8051單片機(jī)存儲器結(jié)構(gòu);(3)?8051單片機(jī)各引腳功能;(4)單片機(jī)最小系統(tǒng)組成。模塊2單片機(jī)開發(fā)軟件系統(tǒng)任務(wù)2調(diào)試最簡單的單片機(jī)系統(tǒng)點亮程序2.1單片機(jī)系統(tǒng)開發(fā)軟件KeilC512.2程序下載軟件2.3Proteus仿真軟件的使用階段小結(jié)
2.1單片機(jī)系統(tǒng)開發(fā)軟件KeilC51
2.1.1KeilC51軟件基本知識
Keil軟件是目前最流行的開發(fā)MCS-51系列單片機(jī)的軟件,它提供包括C編譯器、宏匯編、連接器、庫管理和一個功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境將這些部分組合在一起。
2.1.2KeilC51軟件的使用
運(yùn)行Keil軟件,出現(xiàn)如圖2.1的屏幕。
圖2.1啟動時的屏幕
1.新建項目
點擊Project菜單,選擇彈出的下拉式菜單中的NewProject,如圖2.2所示。
圖2.2
NewProject菜單
接著彈出一個標(biāo)準(zhǔn)Windows對話窗口,如圖2.3所示
圖2.3文件窗口
在彈出的窗口中選擇要用的單片機(jī)芯片,這里我們選擇Atmel公司的AT89C51。此時屏幕如圖2.4所示。完成上面步驟后,點擊“OK”即可進(jìn)行程序的編寫。
圖2.4選取芯片
2.創(chuàng)建程序文件
在項目中創(chuàng)建新的程序文件或加入舊程序文件。如果沒有已有的程序,那么就要新建一個程序文件。在Keil中有一些程序的Demo,在這里以一個C程序為例介紹如何新建一個C程序以及如何添加到項目中。點擊圖2.5中標(biāo)號1處新建文件的快捷按鈕,在標(biāo)號2中出現(xiàn)一個新的文字編輯窗口,這個操作也可以通過菜單File→New或快捷鍵“Ctrl?+?N”來實現(xiàn)。
圖2.5新建程序文件
3.保存程序文件
點擊圖2.5中標(biāo)號3處圖標(biāo)保存新建的程序,也可以用菜單File→Save或快捷鍵Ctrl+S進(jìn)行保存。因是新文件,所以保存時會彈出類似圖2.3的文件操作窗口,把第一個程序命名為test1.c,保存在項目所在的目錄中,這時程序語句有了不同的顏色,說明Keil的C語法檢查生效了。如圖2.5所示鼠標(biāo)在屏幕左邊的SourceGroup1文件夾圖標(biāo)上右擊彈出菜單,在這里可以做在項目中增加減少文件等操作。選擇“AddFiletoGroup‘SourceGroup1’”彈出文件窗口,選擇剛剛保存的C語言文件,按ADD按鈕,關(guān)閉文件窗,程序文件已加到項目中了。這時在SourceGroup1文件夾圖標(biāo)左邊出現(xiàn)了一個小“+”號,說明文件組中有了文件,點擊它可以展開查看。
4.編譯程序
C程序文件添加到項目后,即可編譯運(yùn)行。這個項目只是用做學(xué)習(xí)新建程序項目和編譯運(yùn)行仿真的基本方法,所以使用軟件默認(rèn)的編譯設(shè)置,它不會生成用于芯片燒寫的HEX文件,如何設(shè)置生成HEX文件見后文。如圖2.6所示,圖中標(biāo)號1、2、3都是編譯按鈕,不同的是標(biāo)號1圖標(biāo)是用于編譯單個文件;標(biāo)號2所示圖標(biāo)用于編譯當(dāng)前項目,如果先前編譯過一次之后文件沒有做編輯改動,這時再點擊是不會再次重新編譯的;標(biāo)號3所示圖標(biāo)用于重新編譯,每點擊一次均會再次編譯鏈接一次,不管程序是否有改動;標(biāo)號4所示窗口可以看到編譯的錯誤信息和使用的系統(tǒng)資源情況等,程序出錯時的提示都會在該窗口列出,修改程序等工作可以根據(jù)這些提示來進(jìn)行。
圖2.6編譯程序
5.生成HEX文件
HEX文件格式是Intel公司提出的按地址排列的數(shù)據(jù)信息,數(shù)據(jù)寬度為字節(jié),所有數(shù)據(jù)使用十六進(jìn)制數(shù)字表示,常用來保存單片機(jī)或其他處理器的目標(biāo)程序代碼,它保存物理程序存儲區(qū)中的目標(biāo)代碼映像,一般的編程器都支持這種格式。我們先來打開前一節(jié)做的項目,打開它的所在目錄,找到111.uvproj的文件就可以打開先前的項目了。然后右擊圖2.7中的“Target1”項目文件夾,彈出項目功能菜單,選擇“OptionsforTarget
Target1’”,彈出項目選項設(shè)置窗口,同樣先選中項目文件夾圖標(biāo),這時在Project菜單中也有一樣的菜單可選。
圖2.7項目功能菜單
打開項目選項窗口,轉(zhuǎn)到Output選項頁如圖2.8所示,圖中標(biāo)號1所示為選擇編譯輸出的路徑,標(biāo)號2所示為設(shè)置編譯輸出生成的文件名,標(biāo)號3所示則是決定是否要創(chuàng)建HEX文件,選中它就可以輸出HEX文件到指定的路徑中。我們再將它重新編譯一次,很快在編譯信息窗口中就顯示HEX文件創(chuàng)建到指定的路徑中了,如圖2.9所示。這樣就可用編程器所附帶的軟件去讀取并燒到芯片了,再用實驗板看結(jié)果。
圖2.8項目選項窗口
圖2.9編譯信息窗口
2.2程序下載軟件
2.2.1下載軟件的作用
如何把HEX文件下載到單片機(jī)實驗板上呢?這需要用到下載軟件。下載軟件通常也叫燒錄軟件,主要作用就是將用KeilC編寫好并編譯過的程序生成的HEX文件下載到單片機(jī)應(yīng)用系統(tǒng)中,便于觀察現(xiàn)象,檢查程序,是進(jìn)行軟硬件聯(lián)調(diào)必不可少的中間環(huán)節(jié)。
2.2.2STC下載軟件的介紹
STC-ISP是一款單片機(jī)下載編程燒錄軟件,是針對STC系列單片機(jī)而設(shè)計的,可下載STC89系列、12C2052系列和12C5410等系列的STC單片機(jī),使用簡便,現(xiàn)已被廣泛
使用。
STC-ISP圖標(biāo)如圖2.10所示。
圖2.10STC-ISP軟件圖標(biāo)
2.2.3STC下載軟件的使用步驟
下載之前,讀者一定先把整個下載步驟仔細(xì)看一遍,該單片機(jī)下載程序必須有個冷啟動的過程,即要重新上電才能正常下載程序,軟件界面如圖2.11所示。
圖2.11下載軟件界面圖
使用步驟:
(1)連接好電源線與串口線。
(2)檢查電源板上電源指示等是否亮起,如果沒亮則檢查USB電源線,如果已亮則關(guān)掉電源繼續(xù)后面的步驟。
(3)啟動軟件。
(4)點擊圖2.11中標(biāo)號1處下三角選擇單片機(jī)型號使之與開發(fā)板單片機(jī)型號對應(yīng),如圖2.12所示。
圖2.12芯片選擇框
(5)選擇好計算機(jī)串口,臺式機(jī)一般默認(rèn)為COM1。
(6)點擊圖2.11標(biāo)號2所示“openfile”,出現(xiàn)如圖2.13所示對話框,選擇用Keil編譯好的HEX文件。
(7)點擊圖2.11中標(biāo)號3所示“下載”。
(8)注意在點擊下載的時候按下“冷啟動”按鍵,使單片機(jī)上電。
(9)如果正常會看到下載程序進(jìn)度條閃動的過程,最后白色方框內(nèi)會出現(xiàn)“已加密”字樣。
圖2.13選擇HEX文件
2.3Proteus仿真軟件的使用
2.3.1Proteus簡介
1.工作界面
ProteusISIS的工作界面是一種標(biāo)準(zhǔn)的Windows界面,如圖2.14所示。
圖2.14ProteusISIS的工作界面
(1)圖形編輯窗口。
在圖形編輯窗口內(nèi)完成電路原理圖的編輯和繪制。
(2)預(yù)覽窗口(TheOverviewWindow)。
該窗口通常顯示整個電路圖的縮略圖。
(3)對象選擇器窗口。
通過對象選擇按鈕,從元件庫中選擇對象,并置入對象選擇器窗口,供今后繪圖時使用。
2.圖形編輯的基本操作
(1)對象放置。
(2)選中對象。
(3)刪除對象。
(4)調(diào)整對象的朝向。
(5)編輯對象。
(6)畫線
2.3.2任務(wù)示范
用單片機(jī)控制一個LED點亮,電路如圖2.15所示。電路的核心是單片機(jī)AT89C51,單片機(jī)的P1.0引腳接一個LED,電阻起限流作用。
圖2.15任務(wù)2仿真電路
1.原理圖繪制
(1)放置元件。
首先將所需元器件加入到對象選擇器窗口,單擊對象選擇器按鈕,如圖2.16所示。
圖2.16對象選擇器按鈕
彈出“PickDevices”頁面,在“Keywords”輸入AT89C51,系統(tǒng)在對象庫中進(jìn)行搜索查找,并將搜索結(jié)果顯示在“Results”中,如圖2.17所示。
圖2.17查找AT89C51
接著在“Keywords”欄中重新輸入LED,如圖2.18所示。
圖2.18查找LED發(fā)光二極管
然后,在“Keywords”欄中重新輸入RES(電阻),如圖2.19所示。
圖2.19查找電阻元件
在對象選擇器窗口中,選中LED,將鼠標(biāo)置于圖形編輯窗口中想要放置該對象的位置,單擊鼠標(biāo)左鍵,該對象放置完成。同理,可將AT89C51、電源和RES放置到圖形編輯窗口中,如圖2.20所示。
圖2.20放置元件
(2)修改元件參數(shù)。
放置電阻的同時,需要注意修改電阻的參數(shù)。由于系統(tǒng)默認(rèn)電阻值為10kΩ,阻值過大,會導(dǎo)致LED無法發(fā)光,因此修改電阻值至100Ω。修改方法如圖2.21所示,選中電阻雙擊10k字樣,在彈出對話框中將10k修改為100即可。
圖2.21修改電阻阻值
(3)元器件之間的連線。
Proteus的智能化可以在你想要畫線的時候進(jìn)行自動檢測,Proteus具有線路自動路徑功能(簡稱WAR),當(dāng)選中兩個連接點后,WAR將選擇一個合適的路徑連線。WAR功能可通過使用標(biāo)準(zhǔn)工具欄里的“WAR”命令按鈕來關(guān)閉或打開,也可以在菜單欄的“Tools”下找到這個圖標(biāo)。
2.KeilC與Proteus連接仿真調(diào)試
雙擊畫好的電路圖中的單片機(jī),出現(xiàn)如圖2.22所示的選擇HEX文件對話框,點擊紅色方框文件夾圖標(biāo),選擇要下載的HEX文件。選擇好以后,方框空白處出現(xiàn)選擇路徑,如圖2.23所示。單擊仿真運(yùn)行開始按鈕?,我們能看到仿真結(jié)果,如圖2.24所示。
圖2.22選擇HEX文件窗口
圖2.23HEX文件選擇路徑
圖2.24Proteus仿真結(jié)果
階段小結(jié)
本模塊通過任務(wù)實現(xiàn),貫穿了單片機(jī)開發(fā)軟件和下載軟件的應(yīng)用過程,重點訓(xùn)練了兩種軟件的使用方法。本模塊重點內(nèi)容:KeilC的使用;
(1)?HEX文件的生成;
(2)?STC下載軟件的使用;
(3)?Proteus使用技巧。模塊3并行I/O口應(yīng)用與C語言基礎(chǔ)
任務(wù)3控制8個LED發(fā)光二極管閃爍3.1并行I/O端口電路結(jié)構(gòu)及功能3.2C語言基礎(chǔ)知識3.3C語言數(shù)據(jù)與運(yùn)算任務(wù)4流水燈
3.4C語言的基本語句階段小結(jié)
任務(wù)3控制8個LED發(fā)光二極管閃爍
1.任務(wù)目的了解51系列單片機(jī)4個I/O端口的內(nèi)部結(jié)構(gòu),掌握其使用方法,了解單片機(jī)C語言基礎(chǔ)。2.任務(wù)要求控制8個LED發(fā)光二極管以某種頻率閃爍,閃爍頻率可調(diào)。
3.任務(wù)分析
實現(xiàn)此任務(wù)需要設(shè)計相應(yīng)的硬件電路,然后在硬件基礎(chǔ)上編制軟件。硬件上,除了單片機(jī)之外,最主要的元件就是LED發(fā)光二極管了。
如果沒有限流電阻,LED發(fā)光二極管在工作時也會迅速發(fā)熱,為了防止LED發(fā)光二極管過熱損害,也必須采用限流串聯(lián)電阻對LED發(fā)光二極管的功耗進(jìn)行限制,如表3.1所示為典型的LED發(fā)光二極管功率限制指標(biāo)。
LED發(fā)光二極管的發(fā)光功率可以由其兩端的電壓和通過LED的電流進(jìn)行計算得到,公式如下:
LED發(fā)光二極管的典型的電壓與電流關(guān)系如圖3.1所示,可以根據(jù)需要的LED發(fā)光亮度選擇合適的電阻R進(jìn)行限流,但為了保護(hù)單片機(jī)的驅(qū)動輸出引腳,通過LED發(fā)光二極管的電流一般應(yīng)限制在10mA左右,由圖3.1所示曲線可知,也即是將LED發(fā)光二極管的正向電壓限制在2?V左右。
圖3.1LED發(fā)光二極管典型電壓電流關(guān)系
可以利用圖3.1中所示的曲線計算限流電阻R,計算的方法如下:
例如,若限制電流Id為10mA,則由圖3.1中所示曲線得到LED發(fā)光二極管的正向電壓Vd約為2?V,從而得到限流電阻值如下:
4.硬件實現(xiàn)
本模塊采用8個LED發(fā)光二極管,由AT89S51的P0口進(jìn)行驅(qū)動操作,具體電路設(shè)計如圖3.2所示,P0口的8個輸出引腳分別接到了8個LED發(fā)光二極管的陰極,LED發(fā)光二極管的另一端由阻值為470?Ω的限流電阻上拉至電源VCC。跑馬燈系統(tǒng)的8個限流電阻可以采用普通電阻也可以采用排阻,使用排阻比較有利于節(jié)省PCB布板的空間。
圖3.2單片機(jī)控制8個LED發(fā)光二極管閃爍電路原理圖
5.程序設(shè)計
為了實現(xiàn)LED燈閃爍,程序中通過反轉(zhuǎn)P0口的狀態(tài)來開關(guān)LED燈。每次延時一段時間,改變延時時間可調(diào)整閃爍頻率。
程序的第一行?#include<reg51.h>包含了51單片機(jī)硬件資源的定義,一般單片機(jī)程序都會使用硬件資源,因此,程序中總應(yīng)該包含這一行。KeilC環(huán)境下,51系列用到的頭文件都放在KEIL_PATH\C51\INC目錄下面,KEIL_PATH表示KeilC的安裝目錄。
程序?qū)懲曛?,一般需要調(diào)試,這可以通過將程序下載到硬件來完成。然而這樣調(diào)試的效率非常低下,我們可以借助仿真軟件來提高調(diào)試的效率。如圖3.3所示,參考模塊二仿真軟件應(yīng)用。
圖3.3Proteus仿真圖
3.1并行I/O端口電路結(jié)構(gòu)及功能
3.1.1P0口
P0口的字節(jié)地址為80H,位地址為80H~87H。P0口的各位口線具有完全相同但又相互獨立的邏輯電路,P0口的結(jié)構(gòu)電路原理圖如圖3.4所示。
圖3.4P0口一位結(jié)構(gòu)圖
1.P0口的組成
P0口邏輯電路主要由以下幾部分組成:
(1)?2個三態(tài)輸入緩沖器。
2個三態(tài)輸入緩沖器分別用于鎖存器數(shù)據(jù)和引腳數(shù)據(jù)的輸入緩沖。
(2)?1個多路轉(zhuǎn)接開關(guān)。
(3)?1個數(shù)據(jù)輸出鎖存器。
(4)數(shù)據(jù)輸出的驅(qū)動和控制電路。
2.P0口的使用
(1)作為I/O端口使用時的工作原理。
讀芯片引腳上的數(shù)據(jù),也就是直接讀取外部數(shù)據(jù)。這時使用鎖存器下方的緩沖器,由“讀引腳”信號把緩沖器打開,引腳上的數(shù)據(jù)經(jīng)緩沖器通過內(nèi)部總線讀進(jìn)來。需要說明的是,在P0口作為輸入口讀引腳使用時,應(yīng)先向鎖存器寫“1”(一般用傳送指令),使輸出級的V1、V2截止(系統(tǒng)復(fù)位時P0?=?FFH),如下圖3.5虛線所示。
圖3.5P0口讀引腳
讀鎖存器:通過打開讀鎖存器三態(tài)緩沖器讀取鎖存器輸出端Q的狀態(tài),如圖3.6虛線所示。圖3.6P0口讀鎖存器
(2)作為地址/數(shù)據(jù)復(fù)用口使用時的工作原理。
在訪問外部存儲器時,P0口作為地址/數(shù)據(jù)復(fù)用口使用。此時多路開關(guān)控制信號為1,與門解鎖,與門輸出信號電平由“地址/數(shù)據(jù)”信號決定。多路開關(guān)與反相器的輸出端相連,地址信號經(jīng)“地址/數(shù)據(jù)”線送到反相器,再送至V2場效應(yīng)管柵極,到V2漏極輸出。
3.1.2P1口
P1口的字節(jié)地址為90H,位地址為90H~97H。P1口邏輯電路如圖3.7所示。
P1口只能作為通用I/O口使用,所以在電路結(jié)構(gòu)上與P0口有些不同。首先,因為它只傳送數(shù)據(jù),所以不再需要多路轉(zhuǎn)接開關(guān);其次,由于只用來傳送數(shù)據(jù),因此輸出電路上有上拉電阻,上拉電阻與場效應(yīng)管共同組成輸出驅(qū)動電路。因此這樣電路的輸出不是三態(tài)的,所以P1口是準(zhǔn)雙向口。
圖3.7P1口一位內(nèi)部結(jié)構(gòu)
3.1.3P2口
P2口的字節(jié)地址為0A0H,位地址為0A0H~0A7H。P2口的邏輯電路如圖3.8所示。
因為在實際應(yīng)用中P2口用于為系統(tǒng)提供高位地址,因此同P0口一樣,在P2口電路中有一個多路轉(zhuǎn)接開關(guān)MUX。但MUX的一個輸入端不再是“地址/數(shù)據(jù)”,而是單一的“地址”,這是因為P2口只作為地址線使用而不作為數(shù)據(jù)線使用。當(dāng)P2口作為高位地址線使用時,多路轉(zhuǎn)接開關(guān)應(yīng)倒向“地址”端。正因為只作為地址使用,P2口的輸出用不著是三態(tài)的,所以P2口也是一個準(zhǔn)雙向口。
圖3.8P2口一位內(nèi)部結(jié)構(gòu)
3.1.4P3口
P3口的字節(jié)地址為B0H,位地址為B0H~B7H。P3口是一個多功能口,它除了可以作為I/O口外,還具有第二功能,P3端口的一位結(jié)構(gòu)如圖3.9所示。
圖3.9P3口一位內(nèi)部結(jié)構(gòu)
P3端口和P1端口的結(jié)構(gòu)相似,區(qū)別僅在于P3端口的各端口線有兩種功能選擇。當(dāng)處于第一功能時,第二功能輸出線為1,此時,內(nèi)部總線信號經(jīng)鎖存器和場效應(yīng)管輸入/輸出,其作用與P1端口作用相同,也是準(zhǔn)雙向I/O端口。當(dāng)處于第二功能時,鎖存器輸出1,通過第二輸出功能線輸出特定的內(nèi)含信號。在輸入方面,既可以通過緩沖器讀入引腳信號,還可以通過替代輸入功能讀入片內(nèi)的特定第二功能信號。由于輸出信號鎖存并且有雙重功能,故P3端口為靜態(tài)雙功能端口。P3口的第二功能如表3.2所示。
3.1.5P0~P3端口電路小結(jié)
前面介紹了MCS-51單片機(jī)的P0~P3端口的電路和功能,下面把這些端口在使用中一些應(yīng)該注意的問題歸納如下:
P0~P3端口都是并行I/O口,都可用于數(shù)據(jù)的輸入和輸出,但P0口和P2口除了可進(jìn)行數(shù)據(jù)的輸入和輸出外,通常用來構(gòu)建系統(tǒng)的數(shù)據(jù)總線和地址總線,所以在電路中有一個多路轉(zhuǎn)接開關(guān)MUX,以便進(jìn)行兩種用途的轉(zhuǎn)換。而P1口和P3口沒有構(gòu)建系統(tǒng)的數(shù)據(jù)總線和地址總線的功能,因此在電路中沒有多路轉(zhuǎn)接開關(guān)MUX。由于P0口可作為地址/數(shù)據(jù)復(fù)用線使用,需傳送系統(tǒng)的低8位地址或8位數(shù)據(jù),因此MUX的一段為“地址/數(shù)據(jù)”信號。而P2口僅作為高地址線使用,不涉及數(shù)據(jù),所以MUX的一個輸入信號為“地址”。
3.1.6單片機(jī)并行口的應(yīng)用
在沒有外擴(kuò)任何芯片時,MCS-51單片機(jī)內(nèi)部并行口可以作為輸出口,直接與輸出外設(shè)連接,常用的輸出外設(shè)是發(fā)光二極管;MCS-51單片機(jī)內(nèi)部并行口也可以作為輸入口,直接與輸入外設(shè)連接,常用的輸入外設(shè)是開關(guān)。
用P1~P3端口驅(qū)動LED發(fā)光二極管,P1~P3端口每一位的驅(qū)動能力,只有P0的一半。當(dāng)端口的某一位為高電平時,可提供較小的電流;當(dāng)端口的某位為低電平時,可提供較大的灌電流,如低電平允許提高,灌電流可相應(yīng)加大。所以,任一個端口想獲得加大的驅(qū)動能力,只能用低電平輸出。例如,使用單片機(jī)的并行端口P1~P3直接驅(qū)動發(fā)光二極管,電路如圖3.10所示。
圖3.10發(fā)光二極管與單片機(jī)并行口的直接連接
P0端口在“讀—修改—寫”指令時,從端口輸入(讀)信號,在單片機(jī)內(nèi)加以運(yùn)算(修改)后,再輸出(寫)到該端口上。下面是幾條“讀—修改—寫”指令的例子。
這樣安排的原因在于“讀—修改—寫”指令需要得到端口原輸出的狀態(tài),修改后再輸出,讀鎖存器而不是讀引腳,可以避免因外部電路的原因而使原端口的狀態(tài)被讀錯。
3.2C語言基礎(chǔ)知識
3.2.1C語言簡介
產(chǎn)生于20世紀(jì)70年代的C語言是一個通用的高級編程語言,它有靈活的語法,提供了結(jié)構(gòu)化的編程手段和豐富的操作符。使用C語言我們可以編寫出高效的代碼。C語言不是為任何特殊應(yīng)用領(lǐng)域而設(shè)計的,一般來說限制較少,可以為各種軟件任務(wù)提供方便和有效的編程。在許多應(yīng)用中,使用C語言比其他語言編程更方便和有效。盡管如此,由于計算機(jī)語言的發(fā)展,C語言目前主要應(yīng)用于嵌入式領(lǐng)域的開發(fā)。
當(dāng)然匯編語言依然有它的應(yīng)用,用匯編語言編寫的代碼仍然是最高效的。在某些環(huán)境下,比如說效率必須放在第一位的時候,應(yīng)該將相關(guān)代碼用匯編語言編寫,其它部分可以采用C語言編寫,也就是C語言可以和匯編語言混合編程,以實現(xiàn)代碼編寫效率和執(zhí)行效率的最優(yōu)化。
3.2.2C51簡介
本書中的許多代碼是用KeilC51語言寫的,本模塊要介紹的是KeilC51語言,它是美國KeilSoftware公司(目前已被ARM公司收購)出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。KeilC51完全支持標(biāo)準(zhǔn)C語言指令,并且在標(biāo)準(zhǔn)C語言基礎(chǔ)之上做了擴(kuò)展,增加了很多用來優(yōu)化8051指令結(jié)構(gòu)的C的擴(kuò)展指令。C51不是一個通用的C語言編譯器,它首先的目標(biāo)是生成針對8051的最快和最緊湊的代碼。C51具有C語言編程的彈性和高效的代碼。
深入理解并應(yīng)用C51對標(biāo)準(zhǔn)ANSIC的擴(kuò)展是學(xué)習(xí)C51的關(guān)鍵之一。因為大多數(shù)擴(kuò)展功能都是直接針對8051系列CPU硬件的。這些擴(kuò)展有:
(1)?8051存儲類型及存儲區(qū)域。
(2)存儲模式。
(3)存儲類型聲明。
(4)變量類型聲明。
(5)位變量與位尋址。
(6)特殊功能寄存器(SFR)。
(7)?C51指針。
(8)函數(shù)屬性。
3.3C語言數(shù)據(jù)與運(yùn)算
3.3.1數(shù)據(jù)類型
KeilC有ANSIC的所有標(biāo)準(zhǔn)數(shù)據(jù)類型。除此之外,為了更加有利地利用8051的結(jié)構(gòu),還加入了一些特殊的數(shù)據(jù)類型,如表3.3所示。
1.標(biāo)準(zhǔn)C語言中的基本數(shù)據(jù)類型
在標(biāo)準(zhǔn)C語言中基本的數(shù)據(jù)類型為char、int、short、long、float和double、char、int、short、long又分為有符號(signed,通常省略不寫)和無符號(unsigned)兩類,在此不做詳細(xì)敘述。
2.?C51擴(kuò)展的數(shù)據(jù)類型
KeilC中的指針類型與標(biāo)準(zhǔn)C有所不同,C51編譯器提供兩個類型的指針:通用指針和指定存儲區(qū)指針。通用指針用三個字節(jié)保存,第一個字節(jié)是存儲類型,第二個是偏移的高字節(jié),第三是偏移的低字節(jié)。通用指針可訪問8051存儲空間內(nèi)的任何變量,許多C51庫函數(shù)因而用了這些指針類型。通過這些通用指針,函數(shù)可以訪問存儲區(qū)中的所有數(shù)據(jù)。指定存儲區(qū)的指針在指針的聲明中包含一個存儲類型標(biāo)識符,指向一個確定的存儲區(qū)。
C51擴(kuò)展了4種類型。下面分別介紹。
(1)?bit。
51系列單片機(jī)具有很強(qiáng)的位處理能力,相應(yīng)地,C51提供了bit類型。bit類型定義一個可直接位操作的二進(jìn)制位,可用在變量聲明、參數(shù)列表和函數(shù)返回值中。所有的bit變量放在8051內(nèi)部存儲區(qū)的位段(即bdata區(qū)),因為這區(qū)域只有16字節(jié)長,所以在某個范圍內(nèi)只能聲明最多128個位變量。
(2)?sbit。
可用sbit類型的變量尋址在bdata區(qū)定義的變量的二進(jìn)制位。
(3)?sfr特殊功能寄存器。
sfr也是C51擴(kuò)充的數(shù)據(jù)類型,占用一個內(nèi)存單元,值域為0~255,利用它可以訪問51單片機(jī)內(nèi)部的所有特殊功能寄存器。
(4)?sfr1616位特殊功能寄存器
在新一代的8051單片機(jī)中,特殊功能寄存器經(jīng)常組合成16位來使用。采用關(guān)鍵字sfr16可以定義這種16位的特殊功能寄存器。sfr16也是C51擴(kuò)充的數(shù)據(jù)類型,占用兩個內(nèi)存單元,值域為0~65?535。
3.3.2常量與變量
1.常量
在程序運(yùn)行過程中,其值不能被改變的量稱為常量。根據(jù)數(shù)據(jù)類型來劃分,常量分為整型常量、浮點型常量、字符型常量,還有字符串常量。
(1)整型常量。
整型常量可以是長整型、短整型、有符號型、無符號型,其取值范圍取決于類型的大小??梢灾付ㄒ粋€整型常量為十進(jìn)制、八進(jìn)制或十六進(jìn)制,如以下分別定義了十進(jìn)制、十六進(jìn)制、八進(jìn)制常量:
-129 0x12fe 0177
(2)浮點型常量。
一個浮點型常量由整數(shù)和小數(shù)兩部分構(gòu)成,中間用十進(jìn)制的小數(shù)點隔開。有些浮點數(shù)非常大或者非常小,用普通方法不容易表示,可以用指數(shù)方法表示。比如:3.14159是小數(shù)形式,而1.2345E-12和2.2323E+101都是指數(shù)形式(如同數(shù)學(xué)里面的科學(xué)計數(shù)法)。
(3)字符型常量。
字符型常量所表示的值是字符型變量所能包含的值,我們可以ASCII表達(dá)式來表示一個字符型常量,或者用轉(zhuǎn)義字符來表示一個字符型常量。
單引號內(nèi)加反斜杠表示轉(zhuǎn)義字符,\x表示字符ASCII編碼的十六進(jìn)制形式,\0表示字符ASCII編碼的八進(jìn)制數(shù)形式。如表3.4所示。
(4)字符串常量。
字符串常量就是一串字符,用雙引號括起來表示。字符串常量是一對用雙引號括起來的若干字符序列。字符串中字符的個數(shù)稱為字符的長度,長度為0的字符串稱為空串。
C語言中存儲字符串常量時,系統(tǒng)會在字符串的末尾自動加一個‘\0’作為字符串結(jié)束的標(biāo)志。
2.變量
變量代表內(nèi)存中具有特定屬性的一個存儲單元,它用來存放數(shù)據(jù),這就是變量的值,在程序運(yùn)行期間,這些值是可以改變的。變量名實際上是以一個名字對應(yīng)代表一個地址,在對程序編譯連接時由編譯系統(tǒng)給每一個變量名分配對應(yīng)的內(nèi)存地址。從變量中取值,實際上是通過變量名找到相應(yīng)的內(nèi)存地址,從該存儲單元中讀取數(shù)據(jù)。
C語言中的變量分為全局變量和局部變量。
(1)局部變量。
(2)全局變量。
3.3.3運(yùn)算符和表達(dá)式
1.運(yùn)算符
運(yùn)算符就是完成某種特定的運(yùn)算的符號。運(yùn)算符按其表達(dá)式中與運(yùn)算符的關(guān)系可分為單目運(yùn)算符、雙目運(yùn)算符和三目運(yùn)算符。單目就是指需要有一個運(yùn)算對象,雙目就要求有兩個運(yùn)算對象,三目則要三個運(yùn)算對象。
C語言的內(nèi)部運(yùn)算符很豐富,運(yùn)算符代表計算機(jī)執(zhí)行的某種操作。表3.5 給出了C語言提供的運(yùn)算符及其優(yōu)先級和結(jié)合性。
2.表達(dá)式
表達(dá)式則是由運(yùn)算及運(yùn)算對象所組成的具有特定含義的式子。C語言是一種表達(dá)式語言,表達(dá)式后面加“;”號就構(gòu)成一個表達(dá)式語句。表達(dá)式由常量、變量、運(yùn)算符組合而成。任何表達(dá)式都返回結(jié)果值,表達(dá)式返回的結(jié)果值是有類型的。表達(dá)式隱含的數(shù)據(jù)類型取決于組成表達(dá)式的變量和常量的類型。
任務(wù)4流水燈
1.任務(wù)目的進(jìn)一步熟悉單片機(jī)并行口的操作,了解單片機(jī)C語言循環(huán)語句的使用。
2.任務(wù)要求控制8個LED發(fā)光二極管循環(huán)依次點亮。
3.硬件電路本實驗的硬件電路設(shè)計與任務(wù)3完全相同(如圖3.2所示),通過P0口控制8個LED燈,低電平亮,高電平滅。
4.程序設(shè)計
3.4C語言的基本語句
3.4.1表達(dá)式語句和復(fù)合語句
1.表達(dá)式語句
C語言的表達(dá)式由運(yùn)算符、常量及變量構(gòu)成。通常C語言表達(dá)式的運(yùn)算基本遵循一般數(shù)學(xué)規(guī)則。同一表達(dá)式中允許出現(xiàn)不同類型常量及變量,C語言將它們變換為同一類型的量,C語言的編譯程序?qū)⑺胁僮鲾?shù)變換為與最大類型操作數(shù)同類型,變換以一次一個運(yùn)算的方式進(jìn)行。在51單片機(jī)的C語言中,則是加入分號“;”構(gòu)成表達(dá)式語句。
2.復(fù)合語句
復(fù)合語句是用花括號括起來的語句序列。C語言中的語句簡單地劃分為單條語句和復(fù)合語句兩類。單條語句是指只有一條語句,而復(fù)合語句是指多條語句的總稱。但是,多條語句用花括號括起來才稱復(fù)合語句,沒有用花括號括起的若干條單條語句只能稱為語句序列。所以,復(fù)合語句是一種特殊的語句序列,它被一對花括號括起來,它在程序中被看做是一條語句。一般地說,凡是可以出現(xiàn)一條語句的地方都可以出現(xiàn)復(fù)合語句。
復(fù)合語句是C語言程序中常用的語句形式之一。在復(fù)合語句內(nèi)部還可以包含有復(fù)合語句,即復(fù)合語句可以嵌套。復(fù)合語句常用作if語句的if體、else體和elseif體以及循環(huán)語句的循環(huán)體等。
3.4.2選擇語句
現(xiàn)代高級語言提供了三種結(jié)構(gòu)用于程序設(shè)計:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。選擇結(jié)構(gòu)又稱為分支結(jié)構(gòu),在選擇結(jié)構(gòu)程序設(shè)計中,根據(jù)條件的判斷情況需要選擇不同的語句組執(zhí)行。C語言提供了if語句和switch語句實現(xiàn)選擇結(jié)構(gòu)。if語句根據(jù)給定的條件表達(dá)式進(jìn)行判斷,決定執(zhí)行某個分支中的程序段。switch語句根據(jù)給定的整型表達(dá)式的值進(jìn)行判斷,然后決定執(zhí)行多個分支中的某一個分支。
1.?if語句
if語句有兩種形式。第一種形式:
圖3.11雙分支結(jié)構(gòu)的if語句
其語義是:如果表達(dá)式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句,其過程可表示如圖3.12所示。圖3.12單分支結(jié)構(gòu)的if語句
其語義是:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個值為真時,則執(zhí)行其對應(yīng)的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。如果所有的表達(dá)式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。if-else-if語句的執(zhí)行過程如圖3.13所示。
圖3.13多條件分支結(jié)構(gòu)的if語句
【例3.4】下面的程序使用了帶有肯定分支的if語句。一個按鍵KEY_ON接在P1.6與GND之間,按鍵松開時,P1.6讀入高電平,按鍵按下時,P1.6讀入低電平;另一個按鍵KEY_OFF接P1.7與GND之間。P1.1接一個LED發(fā)光二極管,按下KEY_ON后LED亮,按下KEY_OFF后LED滅。同時按下LED半亮,LED保持后松開鍵的狀態(tài),即ON亮OFF滅,如圖3.14所示。
圖3.14if語句的應(yīng)用
【例3.5】如圖3.15所示,利用4個按鍵控制蜂鳴器發(fā)音。4個按鍵分別連接至P1的第4至第7個引腳,蜂鳴器連接至P3.7,按下不同的按鍵,蜂鳴器發(fā)出不同的聲音。
圖3.154個按鍵控制發(fā)音
2.switch語句
前面學(xué)習(xí)了if語句,用多個if語句可以實現(xiàn)多方向條件分支,但是可以發(fā)現(xiàn),使用過多的if語句實現(xiàn)多方向分支會使條件語句嵌套過多,程序冗長,很不好讀。這時如果使用開關(guān)語句,不但可以達(dá)到處理多分支選擇的目的,而且還可以使程序結(jié)構(gòu)清晰。
其語義是:計算表達(dá)式的值,并逐個與其后的常量表達(dá)式值相比較,當(dāng)表達(dá)式的值與某個常量表達(dá)式的值相等時,即執(zhí)行其后的語句,然后不再進(jìn)行判斷,也就不再繼續(xù)執(zhí)行后面所有case后的語句。如表達(dá)式的值與所有case后的常量表達(dá)式均不相同時,則執(zhí)行default后的語句。
在使用switch語句時還應(yīng)注意以下幾點:
(1)在case后的各常量表達(dá)式的值不能相同,否則會出現(xiàn)錯誤。
(2)在case后,允許有多個語句,可以不用{}括起來。
(3)各case和default子句的先后順序可以變動,而不會影響程序執(zhí)行結(jié)果。
(4)?default子句可以省略不用。
(5)?break用于結(jié)束switch語句,可根據(jù)實際情況決定是否使用。
【例3.6】如圖3.16所示,在51單片機(jī)仿真線路中當(dāng)開關(guān)K1按下時,前兩只LED燈亮;當(dāng)開關(guān)K2按下時,前三只LED燈亮;當(dāng)開關(guān)K3按下時,前四只LED燈亮;當(dāng)開關(guān)K4按下時,前五只LED燈亮;否則,所有燈熄滅。
圖3.16四個按鍵分別控制LED亮滅
3.4.3循環(huán)語句
在許多實際問題中,需要進(jìn)行具有規(guī)律性的重復(fù)操作,如求累加和、數(shù)據(jù)塊的搬移等。而計算機(jī)的基本特征之一就是具有重復(fù)執(zhí)行一組語句的能力,即循環(huán)能力。利用這種循環(huán)能力,程序員只要編寫一個包含重復(fù)執(zhí)行語句的簡短程序,就能執(zhí)行所需的成千上萬次的重復(fù)操作。幾乎所有的應(yīng)用程序都包含有循環(huán)結(jié)構(gòu)。
作為構(gòu)成循環(huán)結(jié)構(gòu)的循環(huán)語句,一般是由循環(huán)體及循環(huán)條件兩部分組成的。一組被重復(fù)執(zhí)行的語句稱為循環(huán)體,能否繼續(xù)重復(fù)執(zhí)行下去則取決于循環(huán)條件。在C語言中用來實現(xiàn)循環(huán)的語句有以下三種:while語句、do-while語句和for語句。
1.while語句
while語句的一般形式為
while(表達(dá)式)
語句塊;
其中表達(dá)式是循環(huán)條件,語句為循環(huán)體。
while語句的語義是:計算表達(dá)式的值,當(dāng)值為真(非0)時,執(zhí)行循環(huán)體語句。while語句屬于當(dāng)型循環(huán),其執(zhí)行過程可用圖3.17表示。
圖3.17while語句
【例3.7】如圖3.18所示,在51單片機(jī)中計算P3.1上的開關(guān)K1按下的次數(shù),并將結(jié)果輸出到P1的LED上(燈滅表示1,燈亮表示0)。
按鈕開關(guān)K1的信號是:未按下時,輸出為高電平,按下時為低電平。所以按下K1后再放開K1,就會產(chǎn)生一個負(fù)向脈沖輸出到P3.1腳。欲判斷按鈕開關(guān)K1是否被按下后又被放開,必須先檢測到P3.1為0,然后再檢測到P3.1為1,即表示K1按下又放開。
圖3.18獨立按鍵控制LED燈亮滅
do-while語句的語法格式中,do是C語言的關(guān)鍵字,必須和while聯(lián)合使用。do-while循環(huán)由do開始,用while結(jié)束。在do和while之間的循環(huán)體內(nèi)有多個語句時,應(yīng)該用大括號括起來,組成復(fù)合語句。
do-while語句的執(zhí)行過程如下:
(1)執(zhí)行do后面循環(huán)體中的語句。
(2)計算while后一對圓括號中表達(dá)式的值。當(dāng)值為非零時,轉(zhuǎn)去執(zhí)行步驟(1);當(dāng)值為零時,執(zhí)行步驟(3)。
(3)退出dowhile循環(huán)。
如圖3.19所示,為do-while語句的執(zhí)行過程示意圖。
圖3.19do-while語句的執(zhí)行過程
3.for語句
在C語言中,for語句使用最為靈活。一般形式為
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
語句塊;
其執(zhí)行過程可用圖3.20表示,步驟如下:
(1)先求解表達(dá)式1。
(2)求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。
(3)求解表達(dá)式3。
(4)轉(zhuǎn)回上面第(2)步繼續(xù)執(zhí)行。
(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個語句。
圖3.20for語句
for循環(huán)中的表達(dá)式1(循環(huán)變量賦初值)、表達(dá)式2(循環(huán)條件)和表達(dá)式3(循環(huán)變量增量)都是選擇項,即可以缺省,但“;”不能省。
(1)省略了表達(dá)式2(循環(huán)條件),表示循環(huán)條件總是為真。
(2)3個表達(dá)式都可以省略。例如:
for(;;)語句塊;相當(dāng)于:
while(1)語句塊;
(3)表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零,就執(zhí)行循環(huán)體。
【例3.9】下面的程序?qū)崿F(xiàn)花樣流水燈,電路如圖3.21所示。P0口和P2口分別連接8個LED發(fā)光二極管,利用預(yù)定義模式實現(xiàn)花樣流水效果。
圖3.21花樣流水燈
4.break和continue語句在循環(huán)體中的作用
(1)?break語句。
前面已經(jīng)介紹過用break語句可以跳出switch語句體。在循環(huán)結(jié)構(gòu)中,也可應(yīng)用break語句跳出本層循環(huán)體,從而提前結(jié)束本層循環(huán)。
(2)?continue語句。
continue意為繼續(xù),它的作用及用法和break類似,重要區(qū)別在于:當(dāng)前循環(huán)遇到break,是直接結(jié)束循環(huán),而若遇到continue,則是停止當(dāng)前這一遍循環(huán),然后直接嘗試下一遍循環(huán)。可見,continue并不結(jié)束整個循環(huán),而僅僅是中斷這一遍循環(huán),然后跳到循環(huán)條件處,繼續(xù)下一遍的循環(huán)。當(dāng)然,如果跳到循環(huán)條件處,發(fā)現(xiàn)條件已不成立,那么循環(huán)也將結(jié)束,所以稱為嘗試下一遍循環(huán)。
在while和do-while循環(huán)中,continue語句使得流程直接跳到循環(huán)控制條件的測試部分,然后決定循環(huán)是否繼續(xù)進(jìn)行。在for循環(huán)中,遇到continue后,跳過循環(huán)體中余下的語句,而去對for語句中的“表達(dá)式3”求值,然后進(jìn)行“表達(dá)式2”的條件測試,最后根據(jù)“表達(dá)式2”的值來決定for循環(huán)是否執(zhí)行。
【例3.10】如圖3.22所示,在單片機(jī)上電后,全部LED不亮,按下K1,則8個LED中只有LED1熄滅,并開始循環(huán)流動。如果中間K2鍵被按下,所有LED再從頭開始循環(huán)流動顯示。
圖3.22break語句在按鍵中應(yīng)用
階段小結(jié)本模塊從任務(wù)入手,詳細(xì)介紹了MCS-51系列單片機(jī)的并行口的基本結(jié)構(gòu)、功能以及使用方式。同時也介紹了KeilC語言的一些基本知識,包括對標(biāo)準(zhǔn)C語言的擴(kuò)展,運(yùn)算符,表達(dá)式,選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)等。本模塊重點內(nèi)容如下:1.并行口的結(jié)構(gòu)和功能;2.并行口的應(yīng)用;3.?KeilC的存儲模式;4.?KeilC的數(shù)據(jù)類型;5.?KeilC的運(yùn)算符和表達(dá)式;6.?KeilC的選擇結(jié)構(gòu);模塊4定時與中斷系統(tǒng)任務(wù)5定時亮滅的小燈4.1C語言的函數(shù)4.2定時/計數(shù)器任務(wù)6人工控制的小燈4.3中斷系統(tǒng)階段小結(jié)
任務(wù)5定時亮滅的小燈
任務(wù)5定時亮滅的小燈
1.任務(wù)目的
通過定時亮滅的小燈電路的制作和軟件設(shè)計,了解單片機(jī)的定時/計數(shù)器系統(tǒng),熟悉定時/計數(shù)器的四種工作方式,掌握相關(guān)特殊功能寄存器的含義,掌握定時/計數(shù)器的初值計算和初始化方法。
2.任務(wù)要求
控制單片機(jī)P2口所接的8個LED管,使它們每隔1s亮滅變化一次。
3.電路設(shè)計
電路設(shè)計如圖4.1所示。
4.程序設(shè)計
圖4.1定時亮滅小燈電路
5.任務(wù)小結(jié)
本任務(wù)中利用定時/計數(shù)器進(jìn)行定時,與用循環(huán)結(jié)構(gòu)實現(xiàn)延時相比,可以實現(xiàn)精確的定時。當(dāng)實際應(yīng)用需要進(jìn)行精確定時時,不妨使用定時/計數(shù)器實現(xiàn)。
4.1C語言的函數(shù)
4.1.1C51語言程序的基本結(jié)構(gòu)
在C51語言中一個較大的程序一般由若干個小的程序模塊組成,每一個小的程序模塊用來實現(xiàn)一個特定的功能,這樣小的程序模塊就是由函數(shù)來完成的。函數(shù)是C語言程序的重要組成部分,使用它可以方便地實現(xiàn)程序的模塊化設(shè)計,這樣可以使程序的結(jié)構(gòu)清晰,可讀性好,而且易于擴(kuò)充。
C51語言程序的基本結(jié)構(gòu)如表4.1所示。
1.指定頭文件
指定頭文件的方式有如下兩種:
#include<頭文件的文件名>
#include“頭文件的文件名”
2.聲明區(qū)
聲明程序之中所使用的常數(shù)、變量、函數(shù),其作用域?qū)U(kuò)展到整個程序,包括主程序與所有函數(shù)。建議:若程序之中使用到函數(shù),則可在此先聲明所有使用到的函數(shù)。
3.主函數(shù)
主函數(shù)分為聲明區(qū)和程序區(qū),在聲明區(qū)里所聲明的常數(shù)、變量等,僅適用于主函數(shù)中,而不影響其他函數(shù)。
4.函數(shù)
函數(shù)是一種具有相對獨立的功能程序,其結(jié)構(gòu)與主函數(shù)類似。
4.1.2函數(shù)分類
1.標(biāo)準(zhǔn)函數(shù)
標(biāo)準(zhǔn)函數(shù)也稱為標(biāo)準(zhǔn)庫函數(shù),是系統(tǒng)提供的已設(shè)計好的函數(shù),用戶不必自己定義這些函數(shù),就可以直接調(diào)用。KeilC51編譯器提供了100多個標(biāo)準(zhǔn)庫函數(shù)供用戶使用。標(biāo)準(zhǔn)庫函數(shù)中的每個函數(shù)都在相應(yīng)的頭文件“.h”中有原型聲明,因此如果程序中使用了哪個庫函數(shù),在程序開頭必須包含相應(yīng)的“.h”頭文件。
2.用戶定義的函數(shù)
用戶定義的函數(shù)是用戶根據(jù)自己的需要編寫的用來解決具體問題的函數(shù),用戶定義的函數(shù)必須先定義之后才能被調(diào)用。
4.1.3函數(shù)定義
函數(shù)定義的一般格式為
類型說明符函數(shù)名(形式參數(shù)表)
{
局部變量定義;
函數(shù)體語句;
}
其中,“類型說明符”說明函數(shù)返回值的類型。返回值是指通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到的一個確定的值,如果被調(diào)用函數(shù)有返回值,可以通過return語句返回給主調(diào)函數(shù);如果不要返回值,則可在函數(shù)名稱左邊指定為void,或根本不指定。
“函數(shù)名”是函數(shù)的名字,是唯一標(biāo)識一個函數(shù)的名字,它的命名規(guī)則同變量完全一樣。在一個程序中不同函數(shù)的名字不能相同。
“局部變量定義”是對在函數(shù)內(nèi)部使用的局部變量進(jìn)行定義。
“函數(shù)體語句”是為完成該函數(shù)的特定功能而設(shè)置的各種語句。
4.1.4函數(shù)調(diào)用
C51語言程序中函數(shù)是可以互相調(diào)用的。所謂函數(shù)調(diào)用就是在一個函數(shù)體中引用另一個已經(jīng)定義了的函數(shù),前者稱為主調(diào)函數(shù),后者稱為被調(diào)用函數(shù)。C51語言中主調(diào)函數(shù)通過函數(shù)調(diào)用來使用函數(shù)。
1.函數(shù)調(diào)用的格式
函數(shù)調(diào)用的一般格式為
函數(shù)名(實際參數(shù)表)
其中“函數(shù)名”指出被調(diào)用的函數(shù);“實際參數(shù)表”中可以包含多個實際參數(shù),各個參數(shù)之間用逗號隔開。實際參數(shù)的作用是將它的值傳給被調(diào)用函數(shù)中的形式參數(shù)。
2.函數(shù)調(diào)用的方式
在C語言中可以采用三種方式完成函數(shù)的調(diào)用。
(1)函數(shù)語句。
在主調(diào)函數(shù)中將把函數(shù)調(diào)用作為一條語句。例如:
display();
這時不要求被調(diào)用函數(shù)返回一個確定的值,只要求函數(shù)完成一定的操作。
(2)函數(shù)表達(dá)式。
在主調(diào)函數(shù)中將函數(shù)調(diào)用作為一個運(yùn)算對象直接出現(xiàn)在一個表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時要求被調(diào)用函數(shù)返回一個確定的值以參加表達(dá)式的計算。
(3)函數(shù)參數(shù)。
在主調(diào)函數(shù)中將函數(shù)調(diào)用作為另一個函數(shù)調(diào)用的實際參數(shù)。
其中函數(shù)調(diào)用max(a,b)放在另一個函數(shù)調(diào)用max(a,max(a,b))的實際參數(shù)表中,以其返回值作為另一個函數(shù)調(diào)用的實際參數(shù)。這種在調(diào)用一個函數(shù)的過程中又調(diào)用另外一個函數(shù)的方式,稱為嵌套函數(shù)調(diào)用。
4.1.5函數(shù)聲明
C語言編譯系統(tǒng)是由上往下編譯的。一般被調(diào)函數(shù)放在主調(diào)函數(shù)后面的話,前面就該有聲明,不然C語言由上往下的編譯系統(tǒng)將無法識別。正如變量必須先聲明后使用一樣,函數(shù)也必須在被調(diào)用之前先聲明,否則無法調(diào)用。函數(shù)的聲明可以與定義分離,要注意的是一個函數(shù)只能被定義一次,但可以被聲明多次。
1.函數(shù)聲明格式
類型說明符函數(shù)名(形式參數(shù)表);
函數(shù)聲明由函數(shù)返回值數(shù)據(jù)類型、函數(shù)名和形式參數(shù)表組成。這三個元素被稱為函數(shù)原型,函數(shù)原型描述了函數(shù)的接口。定義函數(shù)的程序員提供函數(shù)原型,使用函數(shù)的程序員就只需要對函數(shù)原型編輯即可。
2.函數(shù)聲明與函數(shù)定義的區(qū)別
函數(shù)的聲明與函數(shù)的定義形式上十分相似,但是二者有著本質(zhì)上的不同。聲明是不開辟內(nèi)存的,僅僅告訴編譯器,要聲明的部分存在,要預(yù)留一點空間。定義則需要開辟內(nèi)存。
函數(shù)的定義是一個完整的函數(shù)單元:
(1)包含函數(shù)類型、函數(shù)名、形參及形參類型、函數(shù)體等。
(2)在程序中,函數(shù)的定義只能有一次。
(3)函數(shù)首部與花括號間不加分號。
函數(shù)聲明只是對編譯系統(tǒng)的一個說明:
(1)函數(shù)聲明是對定義的函數(shù)的返回值的類型說明,以通知系統(tǒng)在本函數(shù)中所調(diào)用的函數(shù)是什么類型。
(2)不包含函數(shù)體。
(3)調(diào)用幾次該函數(shù)就應(yīng)在各個主調(diào)函數(shù)中做相應(yīng)聲明。
(4)函數(shù)聲明是一個說明語句,必須以分號結(jié)束。
4.1.6函數(shù)應(yīng)用舉例
1.無參函數(shù)的應(yīng)用
【例4.1】使用無參延時函數(shù),實現(xiàn)P1口最低位對應(yīng)的發(fā)光管1s鐘閃爍一次
2.有參函數(shù)的應(yīng)用
【例4.2】在如圖4.2所示的電路中P3.6上輸出1kHz和500Hz的方波信號去驅(qū)動蜂鳴器,作為報警信號,要求1kHz信號響100ms,500Hz信號響200ms,如此交替進(jìn)行。
圖4.2蜂鳴器驅(qū)動電路
4.1.7函數(shù)編寫基本要求和原則
1.函數(shù)編寫的基本要求
(1)正確性:程序要實現(xiàn)設(shè)計要求的功能。
(2)穩(wěn)定性和安全性:程序運(yùn)行穩(wěn)定、可靠、安全。
(3)可測試性:程序便于測試和評價。
(4)規(guī)范/可讀性:程序書寫風(fēng)格、命名規(guī)則等符合規(guī)范。
(5)擴(kuò)展性:代碼為下一次升級擴(kuò)展留有空間和接口。
(6)全局效率:軟件系統(tǒng)的整體效率高。
(7)局部效率:某個模塊/子模塊/函數(shù)的本身效率高。
2.函數(shù)編原則
(1)單個函數(shù)的規(guī)模盡量限制在200行以內(nèi)(不包括注釋和空行)。
(2)分析模塊的功能及性能要求,據(jù)此來進(jìn)行模塊的函數(shù)劃分與組織。一個函數(shù)最好僅完成一件功能;為簡單功能編寫函數(shù),明確函數(shù)功能,精確(而不是近似)地實現(xiàn)函數(shù)設(shè)計;函數(shù)的功能應(yīng)該是可以預(yù)測的,也就是只要輸入數(shù)據(jù)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會計新員工轉(zhuǎn)正工作總結(jié)2024年
- 2025年度電梯遠(yuǎn)程監(jiān)控與故障診斷服務(wù)合同
- 二零二五年度個人住宅租賃合同范本(含租賃糾紛解決)
- 二零二五年度家居用品店轉(zhuǎn)讓與經(jīng)營合作協(xié)議書
- 2025年度軟件開發(fā)項目預(yù)收定金協(xié)議
- 二零二五年度金融產(chǎn)品定金收取合同
- 二零二五年度單位解除勞動合同經(jīng)濟(jì)補(bǔ)償金計算合同
- 2025年度診所與心理咨詢師合作合同
- 安防設(shè)備采購與銷售合同
- 二零二五暑期工勞務(wù)派遣與就業(yè)跟蹤服務(wù)合同
- 儲運(yùn)安全檢查分析(SCL)評價記錄
- 人教版六年級上冊道德與法治教案(5篇)
- 2024年無人駕駛環(huán)衛(wèi)行業(yè)研究報告-通渠有道
- (中職)中職生創(chuàng)新創(chuàng)業(yè)能力提升教課件完整版
- 中班健康課件《我不挑食》
- 人教版(2024新版)七年級上冊英語各單元重點語法知識點講義
- 生豬屠宰獸醫(yī)衛(wèi)生人員考試題庫答案(414道)
- 《完善中國特色社會主義法治體系》課件
- 2025版 高考試題分析-數(shù)學(xué)-部分4
- 湘教版三年級美術(shù)下冊教案全冊
- 重癥監(jiān)護(hù)-ICU的設(shè)置、管理與常用監(jiān)測技術(shù)
評論
0/150
提交評論