單片機(jī)原理與應(yīng)用-KFIL C項(xiàng)目教程(西電版)項(xiàng)目一 點(diǎn)亮一個(gè)發(fā)光二極管_第1頁(yè)
單片機(jī)原理與應(yīng)用-KFIL C項(xiàng)目教程(西電版)項(xiàng)目一 點(diǎn)亮一個(gè)發(fā)光二極管_第2頁(yè)
單片機(jī)原理與應(yīng)用-KFIL C項(xiàng)目教程(西電版)項(xiàng)目一 點(diǎn)亮一個(gè)發(fā)光二極管_第3頁(yè)
單片機(jī)原理與應(yīng)用-KFIL C項(xiàng)目教程(西電版)項(xiàng)目一 點(diǎn)亮一個(gè)發(fā)光二極管_第4頁(yè)
單片機(jī)原理與應(yīng)用-KFIL C項(xiàng)目教程(西電版)項(xiàng)目一 點(diǎn)亮一個(gè)發(fā)光二極管_第5頁(yè)
已閱讀5頁(yè),還剩178頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

工程一點(diǎn)亮一個(gè)發(fā)光二極管

1.1工程說(shuō)明1.2根底知識(shí)1.3工程實(shí)施1.4工程評(píng)價(jià)1.5拓展與提高1.1項(xiàng)目說(shuō)明

工程任務(wù)

利用MCS-51單片機(jī)(簡(jiǎn)稱51單片機(jī))的并行I/O口驅(qū)動(dòng)一個(gè)發(fā)光二極管,利用C51編程點(diǎn)亮該發(fā)光二極管。

知識(shí)培養(yǎng)目標(biāo)

(1)掌握微型計(jì)算機(jī)硬件系統(tǒng)的構(gòu)成。

(2)掌握51系列單片機(jī)的內(nèi)部結(jié)構(gòu)及存儲(chǔ)器配置。

(3)掌握51單片機(jī)的最小系統(tǒng)。

(4)掌握字節(jié)尋址與位尋址。

(5)掌握C51程序結(jié)構(gòu)及變量的定義。

(6)理解51系列單片機(jī)存儲(chǔ)器擴(kuò)展的方法。能力培養(yǎng)目標(biāo)

(1)能利用所學(xué)知識(shí)設(shè)計(jì)出所需原理圖。

(2)能利用所學(xué)知識(shí)正確地選擇元器件。

(3)能利用KEILC軟件建立工程文件。

(4)培養(yǎng)解決問(wèn)題的能力。

(5)培養(yǎng)溝通表達(dá)、團(tuán)隊(duì)協(xié)作的能力。1.2基礎(chǔ)知識(shí)

1.2.1微型計(jì)算機(jī)的硬件系統(tǒng)

計(jì)算機(jī)分為巨型機(jī)、大型機(jī)、中型機(jī)、小型機(jī)與微型機(jī)等類型。計(jì)算機(jī)的開展一是朝著高速度、大容量、高性能的巨型機(jī)方向開展,如我國(guó)的銀河系列巨型機(jī);二是朝著體積小、可靠穩(wěn)定、本錢低廉的微型機(jī)方向開展。而微型機(jī)也有兩個(gè)方向,一是朝著高速度、大容量、高性能的高檔PC機(jī)方向開展;二是朝著體積小、可靠穩(wěn)定、本錢低廉的單片機(jī)方向開展。下面以PC機(jī)為例介紹微型機(jī)硬件的構(gòu)成及各局部的作用。

微型計(jì)算機(jī)由硬件系統(tǒng)與軟件系統(tǒng)構(gòu)成,圖1-1所示為微型計(jì)算機(jī)硬件系統(tǒng)結(jié)構(gòu)圖。

由圖1-1可知,微型計(jì)算機(jī)的硬件系統(tǒng)由CPU、存儲(chǔ)器、I/O接口及外設(shè)四大局部組成,其中,CPU、存儲(chǔ)器、I/O接口之間是通過(guò)地址總線AB、數(shù)據(jù)總線DB、控制總線CB(簡(jiǎn)稱三總線)相連的。圖1-1微型計(jì)算機(jī)硬件系統(tǒng)結(jié)構(gòu)圖1.?CPU

CPU即中央處理單元,是執(zhí)行指令的部件。CPU通過(guò)執(zhí)行指令,在其管腳上發(fā)出一系列上下電平來(lái)指揮其他部件按要求工作,從而完成相應(yīng)的任務(wù)。由于單條指令的功能非常有限,因此CPU要執(zhí)行一系列有序排列的指令(即程序)才能完成某一任務(wù)。我們通常所說(shuō)的486、586、雙核或四核,就是指CPU,雙核的性能優(yōu)于586,四核肯定更好。僅由CPU這一個(gè)部件就可以大體上區(qū)分出計(jì)算機(jī)的性能,因此CPU是計(jì)算機(jī)系統(tǒng)中最重要的部件。CPU的外形結(jié)構(gòu)如圖1-2所示。圖1-2CPU的外形結(jié)構(gòu)2.存儲(chǔ)器

CPU要執(zhí)行的程序及程序所需的數(shù)據(jù)就儲(chǔ)存在存儲(chǔ)器中,或者說(shuō)CPU只執(zhí)行儲(chǔ)存在存儲(chǔ)器中的程序。每一塊存儲(chǔ)器內(nèi)部都有一定數(shù)量的存儲(chǔ)單元,與CPU通過(guò)三總線相連后,每一個(gè)存儲(chǔ)單元都有一個(gè)地址。存儲(chǔ)器的外形結(jié)構(gòu)如圖1-3所示。圖1-3存儲(chǔ)器的外形結(jié)構(gòu)存儲(chǔ)器是半導(dǎo)體集成器件,根據(jù)數(shù)據(jù)的存取方式分類,可分為:半導(dǎo)體存儲(chǔ)器可分為只讀存儲(chǔ)器(ROM)和隨機(jī)存取存儲(chǔ)器(RAM)兩大類。只讀存儲(chǔ)器(ROM)是一種非易失性存儲(chǔ)器,其特點(diǎn)是信息一旦寫入,就固定不變,掉電后,信息也不會(huì)喪失;隨機(jī)存取存儲(chǔ)器RAM是一種易失性存儲(chǔ)器,其特點(diǎn)是在使用過(guò)程中,信息可以隨機(jī)寫入或讀出,使用靈活,但信息不能永久保存,一旦掉電,信息就會(huì)自動(dòng)喪失。

我們購(gòu)置計(jì)算機(jī)時(shí),總要問(wèn)一下它的硬盤是多少G、內(nèi)存是多少G,G即GB,是存儲(chǔ)器的容量單位。在計(jì)算機(jī)內(nèi)部,數(shù)據(jù)、地址及指令都是用0或1表示的,二進(jìn)制代碼中的1個(gè)0或1稱為1位(bit),用b表示,位是存儲(chǔ)器的最小單位;連續(xù)的8個(gè)0或1稱為1個(gè)字節(jié)(Byte),用B表示,1B=8b,字節(jié)是存儲(chǔ)器的根本單位。常用存儲(chǔ)器容量單位還有千字節(jié)(KB)、兆字節(jié)(MB)、千兆字節(jié)(GB),它們之間的關(guān)系為

1KB?=?1024B?=?210B1MB?=?1024KB?=?220B

1GB?=?1024MB?=?230B

1個(gè)或幾個(gè)字節(jié)組成1個(gè)字,字是計(jì)算機(jī)內(nèi)部數(shù)據(jù)處理的根本單位。1個(gè)字所包含的0或1的位數(shù)稱為字長(zhǎng),典型計(jì)算機(jī)CPU的字長(zhǎng)有8位、16位、32位、64位,51系列單片機(jī)CPU的字長(zhǎng)是8位。讀和寫是存儲(chǔ)器的根本操作。CPU將數(shù)據(jù)存入存儲(chǔ)單元稱為寫操作,CPU取出存儲(chǔ)單元中的數(shù)據(jù)稱為讀操作。不管是讀還是寫,必須要在存儲(chǔ)器中找到該單元,即要給出該單元的地址,然后才能對(duì)之進(jìn)行讀或?qū)?。就像要到一棟樓房中去找某個(gè)人時(shí),必須知道他所在房間的房門號(hào)一樣,只不過(guò)存儲(chǔ)器中每個(gè)單元的地址與單元中存儲(chǔ)的數(shù)據(jù)都是用0、1表示的一串二進(jìn)制數(shù),初學(xué)時(shí)不容易區(qū)分。每個(gè)存儲(chǔ)單元中只能存放1個(gè)字節(jié),即8位0或1,16個(gè)二進(jìn)制位就要占用2個(gè)單元。每個(gè)存儲(chǔ)單元地址的位數(shù)與存儲(chǔ)器的容量有關(guān),存儲(chǔ)器的容量越大,地址的位數(shù)就越多。如果存儲(chǔ)器有2根地址線A1、A0,那么就有4個(gè)地址00、01、10、11,最多能區(qū)分4個(gè)存儲(chǔ)單元;3根地址線,那么有000~111共8個(gè)地址,最多能區(qū)分8個(gè)存儲(chǔ)單元;4根地址線可區(qū)分16個(gè)存儲(chǔ)單元;以此類推。因此,存儲(chǔ)器容量與地址線的關(guān)系為:容量?=?2nB,n為地址線的位數(shù)。如某存儲(chǔ)器有10根地址線A0~A9,那么其尋址范圍(即容量)為210B?=?1024B?=?1KB,地址范圍為000H~3FFH;容量為4KB的存儲(chǔ)器,由于4KB?=?212B,所以共需要12根地址線,地址范圍為000H~FFFH。3.?I/O接口

I/O接口是CPU與外設(shè)連接的橋梁,每一個(gè)I/O接口都有一個(gè)地址,稱做端口地址。不同的外設(shè)端口地址是不同的,CPU就是通過(guò)端口地址來(lái)區(qū)分各個(gè)外設(shè)的。

4.外設(shè)

外設(shè)可分為輸入設(shè)備與輸出設(shè)備,主要包括顯示器、鍵盤、鼠標(biāo)、打印機(jī)、耳麥、攝像頭、硬盤、光驅(qū)等。外部設(shè)備是根據(jù)不同的使用場(chǎng)合來(lái)配置的,辦公室里通常要配備打印機(jī),而網(wǎng)吧里那么不需要打印機(jī)。在這里一定要注意:硬盤及光驅(qū)也屬于外部設(shè)備,其作用是存儲(chǔ)程序或文件。硬盤外形如圖1-4所示。圖1-4硬盤硬盤與存儲(chǔ)器的區(qū)別:存儲(chǔ)器是半導(dǎo)體集成器件,其工作速度快,能與CPU的工作速度相匹配,但容量有限;而硬盤是磁介質(zhì)存儲(chǔ)器件,工作速度相對(duì)較慢,容量無(wú)限。通常將系統(tǒng)軟件或應(yīng)用軟件裝在硬盤中,在執(zhí)行某一程序時(shí)需要先將該程序從硬盤調(diào)入存儲(chǔ)器才能執(zhí)行。5.總線

在單片機(jī)系統(tǒng)中,CPU是核心器件,其他器件都要與之相連,并且要求各器件之間協(xié)調(diào)工作,這樣所需連線就很多,因此采用各個(gè)器件共同享用連線的方法,這些共同享用的連線就是總線??偩€好比高速公路,各種物資須經(jīng)過(guò)它進(jìn)行傳送,只是總線上傳送的是0或1。其中,為存儲(chǔ)器或I/O接口提供地址的所有連線稱為地址總線AB,用于選定某一存儲(chǔ)單元或I/O接口;控制各器件工作狀態(tài)的所有連線稱為控制總線CB,實(shí)現(xiàn)對(duì)選定單元的讀或?qū)?;用于傳輸?shù)據(jù)的公共連線稱為數(shù)據(jù)總線DB,對(duì)選定單元讀/寫的信息是通過(guò)數(shù)據(jù)總線DB傳送的。下面通過(guò)分析計(jì)算機(jī)的啟動(dòng)過(guò)程進(jìn)一步加深對(duì)計(jì)算機(jī)硬件系統(tǒng)的理解。

當(dāng)我們按下計(jì)算機(jī)的電源開關(guān)后,CPU就開始執(zhí)行存儲(chǔ)器中的指令了。存儲(chǔ)器是由一系列存儲(chǔ)單元構(gòu)成的,通常每個(gè)單元能存儲(chǔ)8個(gè)二進(jìn)制位,即以字節(jié)為單位存儲(chǔ)信息,每8個(gè)二進(jìn)制位構(gòu)成一個(gè)字節(jié),如某一單元存儲(chǔ)的數(shù)值為10010111等。每個(gè)單元都有一個(gè)地址,究竟從哪個(gè)單元開始執(zhí)行呢?不同的CPU上電復(fù)位后開始執(zhí)行指令的地址是不同的,51系列單片機(jī)中的CPU從0000H單元開始執(zhí)行,而PC機(jī)中的CPU是從FFFF0H單元開始執(zhí)行的。這是第一步,即CPU得電后,它就要從存儲(chǔ)器中的某一單元開始執(zhí)行指令序列。如果PC機(jī)中的存儲(chǔ)器都是由RAM構(gòu)成的,那么這臺(tái)計(jì)算機(jī)就不能正常工作,因?yàn)樯想姾驲AM中的值是隨機(jī)的,它不可能完成任何任務(wù),因此PC機(jī)的存儲(chǔ)器必須由ROM與RAM兩局部組成。開機(jī)后,CPU先執(zhí)行ROM中的程序,這些程序是由生產(chǎn)廠家寫入的,叫做BIOS程序,即根本的輸入、輸出程序,功能是初始化主要接口,將硬盤上存儲(chǔ)的Windows操作系統(tǒng)的核心文件調(diào)入存儲(chǔ)器中,然后CPU從存儲(chǔ)器中執(zhí)行這些核心文件,計(jì)算機(jī)就處于Windows操作系統(tǒng)的管理之下,這時(shí)完成計(jì)算機(jī)的啟動(dòng)。計(jì)算機(jī)啟動(dòng)后,如果從桌面上或開始菜單下運(yùn)行Word,首先要從硬盤的某一路徑下找到應(yīng)用程序Word.exe,然后將該程序從硬盤調(diào)入存儲(chǔ)器中,CPU才能夠執(zhí)行該程序,進(jìn)入編輯狀態(tài)。1.2.2單片機(jī)結(jié)構(gòu)

1.單片機(jī)的概念

微型計(jì)算機(jī)是由CPU、存儲(chǔ)器、I/O接口及外設(shè)組成的,其中前三局部組成了計(jì)算機(jī)的主機(jī)。如將CPU、存儲(chǔ)器、I/O接口集成在一塊芯片上就構(gòu)成了單片機(jī),即單芯片微型計(jì)算機(jī)。單片機(jī)由于其低廉的價(jià)格,穩(wěn)定可靠的性能,因此在國(guó)防、交通、工農(nóng)業(yè)生產(chǎn)等各行各業(yè)都得到了廣泛的應(yīng)用。在日常生活中,如智能冰箱、智能空調(diào)、智能電飯鍋等,都離不開單片機(jī)的控制。目前生產(chǎn)單片機(jī)的公司非常多,如Intel、LG、STC、Atmel、Philips、Dallas、Winbond、Zilog、Microchip、Motorola等。由于Intel公司將MCS-51的核心技術(shù)授權(quán)給了很多其他公司,所以許多廠家生產(chǎn)的單片機(jī)與MCS-51單片機(jī)具有良好的兼容性,包括指令兼容、總線兼容與引腳兼容,這使51系列單片機(jī)成為事實(shí)上的單片機(jī)工業(yè)標(biāo)準(zhǔn)。2.?51系列單片機(jī)的內(nèi)部結(jié)構(gòu)

51系列單片機(jī)是Intel公司于20世紀(jì)80年代推出的8位單片機(jī),目前已經(jīng)有十多個(gè)品種,包括51子系列(如8031/8051/8751/8951)、52子系列(如8032/8052/8752/8952)。制造時(shí),一般采用HMOS工藝和CHMOS工藝,產(chǎn)品型號(hào)中凡帶C的為CHMOS工藝芯片,如80C51;不帶C的為HMOS工藝芯片,如8051。在功能上,51系列單片機(jī)有根本型和增強(qiáng)型兩類,以芯片型號(hào)的未位數(shù)字來(lái)區(qū)分?!?〞表示根本型,如8031/8051/8751/8951或80C31/80C51/87C51/89C51為根本型;“2〞表示增強(qiáng)型,如8032/8052/8752/8952或80C32/80C52/87C52/89C52為增強(qiáng)型。

表1-1為51系列單片機(jī)的主要型號(hào)及性能指標(biāo)。

51單片機(jī)的主要資源為:5V電源,8位CPU,4KB片內(nèi)程序存儲(chǔ)器(ROM),256B片內(nèi)數(shù)據(jù)存儲(chǔ)器(RAM),4個(gè)8位并行I/O口,1個(gè)全雙工串行口,2個(gè)可編程定時(shí)/計(jì)數(shù)器,5個(gè)中斷源,2個(gè)優(yōu)先級(jí),片外程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器最大可擴(kuò)展至64KB。51單片機(jī)的內(nèi)部結(jié)構(gòu)如圖1-5所示。表1-151系列單片機(jī)的主要型號(hào)及性能指標(biāo)

圖1-551單片機(jī)內(nèi)部結(jié)構(gòu)(1)?CPU。CPU是單片機(jī)的核心部件,通過(guò)執(zhí)行指令發(fā)出指揮信號(hào),協(xié)同其他部件完成相應(yīng)的任務(wù)。單片機(jī)執(zhí)行哪條指令受程序計(jì)數(shù)器PC控制,PC是一個(gè)16位計(jì)數(shù)器,具有自動(dòng)加1功能,最大尋址范圍為64KB。CPU每讀取一個(gè)字節(jié)的指令,PC就自動(dòng)加1,然后指向?qū)⒁獔?zhí)行的下一條指令,為讀取下一條指令作好準(zhǔn)備;當(dāng)下一條指令被取出執(zhí)行時(shí),PC的值又加1,這樣在PC的控制下,指令被一條條地順序執(zhí)行。假設(shè)當(dāng)執(zhí)行分支程序或調(diào)用子程序時(shí),是通過(guò)轉(zhuǎn)移或調(diào)用指令來(lái)改變PC值的,使其指向子程序?qū)?yīng)的地址處,那么開始執(zhí)行相應(yīng)的子程序。(2)存儲(chǔ)器。51單片機(jī)存儲(chǔ)器分為程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器,它們分開編址,這是51單片機(jī)的一個(gè)重要特點(diǎn)。

程序存儲(chǔ)器主要用來(lái)存放用戶編寫的程序及運(yùn)行該程序用到的數(shù)據(jù)、表格等,由只讀存儲(chǔ)器構(gòu)成,在51單片機(jī)芯片內(nèi)集成了4KB的ROM存儲(chǔ)器;數(shù)據(jù)存儲(chǔ)器用于存放輸入數(shù)據(jù)、輸出數(shù)據(jù)或運(yùn)算產(chǎn)生的中間結(jié)果等隨時(shí)有可能變動(dòng)的數(shù)據(jù),由隨機(jī)存取存儲(chǔ)器構(gòu)成,51單片機(jī)芯片內(nèi)集成了256B的RAM存儲(chǔ)器。當(dāng)51單片機(jī)內(nèi)部的程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器容量不夠用時(shí),可以進(jìn)行片外擴(kuò)展,最大容量可以擴(kuò)展至64KB;當(dāng)單片機(jī)的I/O接口不夠用時(shí),也可以進(jìn)行片外擴(kuò)展,片外擴(kuò)展的I/O接口與片外數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址。

(3)?I/O接口。51單片機(jī)的I/O接口是單片機(jī)控制外圍設(shè)備的重要接口,是與外設(shè)進(jìn)行信息交換的途徑。51單片機(jī)的I/O接口主要包括了并行口、串行口、定時(shí)/計(jì)數(shù)器及中斷控制器等。

并行口有P0、P1、P2、P3四個(gè),主要實(shí)現(xiàn)數(shù)據(jù)的并行輸入/輸出。所謂并行方式就是n位數(shù)據(jù)由n個(gè)通道同時(shí)傳送。串行口主要用于單片機(jī)與其他設(shè)備間采用串行方式傳送數(shù)據(jù)。所謂串行方式就是一個(gè)通道分時(shí)傳送n位數(shù)據(jù)。

定時(shí)/計(jì)數(shù)器有T0、T1兩個(gè),主要實(shí)現(xiàn)定時(shí)或計(jì)數(shù)功能。

中斷控制系統(tǒng)主要實(shí)現(xiàn)對(duì)2個(gè)外部中斷、2個(gè)定時(shí)/計(jì)數(shù)器中斷及1個(gè)串口中斷的管理。

3.?51單片機(jī)引腳說(shuō)明

51單片機(jī)的封裝有DIP、TQFP、PLCC等多種形式。DIP封裝的51單片機(jī)引腳圖及邏輯符號(hào)如圖1-6所示。圖1-651單片機(jī)引腳圖及邏輯符號(hào)單片機(jī)的40個(gè)引腳大致可分為電源、時(shí)鐘、控制引腳和并行I/O口四類。

1)電源

VCC——芯片電源,接+5V。

GND——接地端。

2)時(shí)鐘

XTAL1、XTAL2——外接晶振引腳。XTAL1是片內(nèi)振蕩電路的輸入端,XTAL2是片內(nèi)振蕩電路的輸出端。3)控制引腳

ALE/—地址鎖存允許/片內(nèi)EPROM編程脈沖。片外擴(kuò)展存儲(chǔ)器時(shí),ALE用于鎖存由P0口送出的低8位地址;功能,在對(duì)片內(nèi)EPROM編程期間,此引腳輸入編程脈沖。

—片外程序存儲(chǔ)器選通信號(hào)。

RST/VPD—復(fù)位/備用電源。RST(Reset)指復(fù)位信號(hào)輸入端,當(dāng)該引腳上所加高電平大于10ms時(shí),單片機(jī)進(jìn)行復(fù)位初始化操作,使單片機(jī)內(nèi)部的一系列存儲(chǔ)單元恢復(fù)到初始值,SP的值為07H,P0~P3的值為FFH,其余存放器的值為00H,且將程序計(jì)數(shù)器PC的值置為0000H。因此51單片機(jī)上電或復(fù)位后,是從0000H單元開始執(zhí)行程序的。VPD的功能是指在VCC掉電情況下所接的備用電源。/VPP——片內(nèi)、片外程序存儲(chǔ)器選擇端/片內(nèi)EPROM編程電源。51單片機(jī)內(nèi)部有4KB的ROM,當(dāng)接高電平時(shí),單片機(jī)先從片內(nèi)ROM中讀取指令數(shù)據(jù),片內(nèi)ROM讀完后自動(dòng)讀取片外ROM;當(dāng)接低電平時(shí),單片機(jī)直接讀取片外ROM?,F(xiàn)在的單片機(jī)芯片一般都具有片內(nèi)ROM,所以在設(shè)計(jì)電路時(shí)始終接高電平。VPP的功能是指片內(nèi)為EPROM芯片時(shí),在EPROM編程期間,施加編程電源VPP。4)并行I/O口

51單片機(jī)有4個(gè)8位并行I/O端口:P0、P1、P2、P3,共占用了32個(gè)引腳,4個(gè)并行I/O口中的每一位都可以單獨(dú)控制。因此它們的字節(jié)地址和位地址分別是:

字節(jié)地址 位地址

P0口 P0.0~P0.7

P1口 P1.0~P1.7

P2口 P2.0~P2.7

P3口 P3.0~P3.7

4個(gè)并行端口中P1口只能用作I/O接口,其他3個(gè)端口除了用作I/O接口外還可實(shí)現(xiàn)其他功能。由并行總線進(jìn)行片外擴(kuò)展時(shí),P2口、P0口共同構(gòu)成地址總線,提供16位地址,P2口傳送A15~A8,P0口傳送A7~A0,P0口分時(shí)用作數(shù)據(jù)總線。

P3口的每一位都有獨(dú)立的功能,含義如下:

P3.0RXD,串行數(shù)據(jù)接收端;

P3.1TXD,串行數(shù)據(jù)發(fā)送端;

P3.2,外部中斷0輸入;

P3.3,外部中斷1輸入;P3.4T0,定時(shí)/計(jì)數(shù)器0的計(jì)數(shù)脈沖輸入;

P3.5T1,定時(shí)/計(jì)數(shù)器1的計(jì)數(shù)脈沖輸入;

P3.6,片外數(shù)據(jù)存儲(chǔ)器寫選通信號(hào);

P3.7,片外數(shù)據(jù)存儲(chǔ)器讀選通信號(hào)。

單片機(jī)引腳雖多,但要分類記憶就比較簡(jiǎn)單:電源2個(gè)(VCC和GND),晶振2個(gè),復(fù)位1個(gè),1個(gè),剩下還有34個(gè),29腳、30腳ALE只有片外擴(kuò)展數(shù)據(jù)/程序存儲(chǔ)器時(shí)才有特定用處,一般情況下不用考慮,最終就只剩下4個(gè)8位I/O口的32個(gè)引腳,這32個(gè)引腳的用法就是學(xué)習(xí)單片機(jī)的重點(diǎn)了。4.單片機(jī)最小系統(tǒng)

單片機(jī)最小系統(tǒng),或者稱為單片機(jī)最小應(yīng)用系統(tǒng),是指用最少的元件組成的單片機(jī)可以工作的系統(tǒng)。對(duì)51系列單片機(jī)來(lái)說(shuō),最小系統(tǒng)一般應(yīng)包括單片機(jī)、復(fù)位電路、時(shí)鐘電路,如圖1-7所示。

(1)單片機(jī):具有片內(nèi)ROM的51系列單片機(jī)或與51兼容的單片機(jī)。

(2)=1:表示單片機(jī)在復(fù)位后從片內(nèi)ROM的0000H單元開始執(zhí)行指令。圖1-751單片機(jī)最小系統(tǒng)(3)復(fù)位電路:為引腳RST提供單片機(jī)復(fù)位所需的高電平(>10ms)。51單片機(jī)常用復(fù)位電路如圖1-8所示,復(fù)位電路有上電自復(fù)位、上電自復(fù)位加手動(dòng)復(fù)位兩種復(fù)位方式。上電自復(fù)位電路是在系統(tǒng)剛上電時(shí),利用電容兩端電壓不能突變的工作原理,為RST引腳提供所需寬度的高電平,高電平持續(xù)的時(shí)間由電路中的RC值來(lái)決定,適中選取RC就可以使單片機(jī)實(shí)現(xiàn)上電自復(fù)位,一般推薦C取22μF,R取

10kΩ。上電自復(fù)位加手動(dòng)復(fù)位電路不僅可以實(shí)現(xiàn)上電自復(fù)位,而且在需要時(shí)也可以由按鍵來(lái)實(shí)現(xiàn)手動(dòng)復(fù)位。圖1-8復(fù)位電路(4)時(shí)鐘電路:為單片機(jī)提供工作所需的時(shí)鐘脈沖。在用串口通訊的場(chǎng)合,為了準(zhǔn)確地得到9600波特率和19200波特率,晶振必須為11.0592MHz;在精確定時(shí)的場(chǎng)合,可選用12MHz的晶振,以產(chǎn)生精確的μs級(jí)時(shí)間基準(zhǔn),從而方便定時(shí)操作。HOT-51實(shí)驗(yàn)板上的晶振為11.0592MHz。

因?yàn)樽钚∠到y(tǒng)中單片機(jī)未接任何外設(shè)(輸入或輸出設(shè)備),所以實(shí)際上單片機(jī)并不能完成任何具體的任務(wù)。5.?51單片機(jī)存儲(chǔ)器的配置

51系列單片機(jī)存儲(chǔ)器的特點(diǎn)是將程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器分開編址。按其物理結(jié)構(gòu)可分為片內(nèi)程序存儲(chǔ)器、片外程序存儲(chǔ)器、片內(nèi)數(shù)據(jù)存儲(chǔ)器、片外數(shù)據(jù)存儲(chǔ)器4個(gè)空間;按其邏輯結(jié)構(gòu)可分為程序存儲(chǔ)器、片外數(shù)據(jù)存儲(chǔ)器、片內(nèi)數(shù)據(jù)存儲(chǔ)器3個(gè)空間。51單片機(jī)存儲(chǔ)器的配置如圖1-9所示。圖1-951單片機(jī)存儲(chǔ)器配置1)程序存儲(chǔ)器

程序存儲(chǔ)器用于存放用戶編寫的程序及運(yùn)行該程序所用到的數(shù)據(jù)、表格等。片內(nèi)、片外程序存儲(chǔ)器統(tǒng)一編址,以程序計(jì)數(shù)器PC為地址指針,最大容量為64KB,地址范圍為0000H~FFFFH。單片機(jī)究竟是訪問(wèn)片內(nèi)ROM還是片外ROM由決定。當(dāng)端接低電平時(shí),CPU從片外程序存儲(chǔ)器中讀取程序,片內(nèi)4KB的ROM就好似不存在一樣;當(dāng)接高電平時(shí),?CPU先從片內(nèi)ROM中讀取程序,?當(dāng)PC的值超過(guò)片內(nèi)ROM的最大地址0FFFH時(shí),CPU才會(huì)自動(dòng)轉(zhuǎn)向片外ROM讀取程序。2)片外數(shù)據(jù)存儲(chǔ)器

在51單片機(jī)中,片外數(shù)據(jù)存儲(chǔ)器與接口是統(tǒng)一編址的,地址范圍為0000H~FFFFH,最大容量為64KB。通常情況下擴(kuò)展片外數(shù)據(jù)存儲(chǔ)器的主要原因是接口資源不夠,如控制系統(tǒng)中常用的A/D或D/A轉(zhuǎn)換器,由于51單片機(jī)內(nèi)部沒有集成這類接口,因此只能片外擴(kuò)展。3)片內(nèi)數(shù)據(jù)存儲(chǔ)器

片內(nèi)數(shù)據(jù)存儲(chǔ)器用于存放輸入數(shù)據(jù)、輸出數(shù)據(jù)或運(yùn)算產(chǎn)生的中間結(jié)果等隨時(shí)有可能變動(dòng)的數(shù)據(jù)。51單片機(jī)芯片內(nèi)的數(shù)據(jù)存儲(chǔ)器共有256B,分為兩局部:地址在00H~7FH范圍的低128B為用戶數(shù)據(jù)RAM;地址在80H~FFH范圍的高128B為特殊功能存放器(SFR)。

片內(nèi)低128B在結(jié)構(gòu)上又分為工作存放器區(qū)、位尋址區(qū)和用戶區(qū)。片內(nèi)數(shù)據(jù)存儲(chǔ)器配置如圖1-10所示。圖1-10片內(nèi)數(shù)據(jù)存儲(chǔ)器配置(1)工作存放器區(qū)。地址為00H~1FH的32個(gè)字節(jié)稱為工作存放器區(qū)。32個(gè)字節(jié)被平均分為四局部,稱為0~3區(qū)。每個(gè)工作存放器區(qū)均包含8個(gè)字節(jié),均命名為R0~R7。CPU任何時(shí)刻只能使用其中的一組工作存放器,CPU當(dāng)前正在使用的一組工作存放器由程序狀態(tài)字存放器PSW中的RS1、RS0確定,根據(jù)RS1、RS0的狀態(tài),才能獲得R0~R7的實(shí)際物理地址,如表1-2所示。

(2)位尋址區(qū)。地址為20H~2FH的16個(gè)單元是位尋址區(qū)。CPU不僅可以對(duì)這16個(gè)單元進(jìn)行字節(jié)尋址,也可以對(duì)這16個(gè)單元的128個(gè)二進(jìn)制位直接進(jìn)行位尋址,如“置1〞、“置0〞等操作。128個(gè)位地址為00H~7FH,位地址分配如表1-3所示。表1-2RS1、RS0與工作存放器的關(guān)系表1-3位地址分配表

字節(jié)尋址與位尋址是對(duì)存儲(chǔ)單元進(jìn)行讀/寫操作的兩種尋址方式。字節(jié)尋址時(shí)需給出存儲(chǔ)單元的字節(jié)地址,如P0、P1、20H等,讀/寫操作的對(duì)象是1個(gè)字節(jié)(8位二進(jìn)制數(shù)),如P0?=?30H、20H?=?56H等;位尋址時(shí)需給出可位尋址的存儲(chǔ)單元中某一位的位地址,如P0.1、P1.1、20H等,讀/寫操作的對(duì)象是1位二進(jìn)制數(shù),即0或1,如P0.1?=?0、20H?=?1。特別是20H?=?56H與20H?=?1的區(qū)別,前者執(zhí)行的結(jié)果是使20H單元的數(shù)值為56H即01010110B,由表1-3可知后者只是將24H單元的最低位置1。

字節(jié)尋址是C51編程時(shí)的根本尋址方式,51單片機(jī)中所有存儲(chǔ)單元均可字節(jié)尋址,但只有片內(nèi)RAM中20H~2FH這16個(gè)單元和字節(jié)地址能被0或8整除的特殊功能存放器可以位尋址。(3)用戶區(qū)。地址為30H~7FH的80個(gè)字節(jié)為用戶RAM區(qū),只能字節(jié)尋址。該區(qū)域主要用做堆棧、數(shù)據(jù)暫存。

(4)特殊功能存放器。片內(nèi)數(shù)據(jù)存儲(chǔ)器中地址為80H~FFH的高128B為特殊功能存放器區(qū),簡(jiǎn)稱為SFR區(qū)。SFR是51單片機(jī)內(nèi)部具有特殊用途的存放器(如并行口存放器、串行口、定時(shí)/計(jì)數(shù)器存放器等)的總稱,主要用于管理單片機(jī)內(nèi)的功能部件,如定時(shí)/計(jì)數(shù)器、中斷系統(tǒng)等。在這128個(gè)字節(jié)中,只用了其中21個(gè)(51系列單片機(jī))或27個(gè)(52系列單片機(jī)),字節(jié)地址以0或8結(jié)尾的SFR既可以進(jìn)行字節(jié)尋址,又可以進(jìn)行位尋址。特殊功能存放器(SFR)如表1-4所示。對(duì)SFR區(qū)中沒有使用的單元進(jìn)行讀/寫操作是無(wú)意義的。表1-4特殊功能存放器(SFR)下面介紹幾種常用的特殊功能存放器:

①累加器A—?最常用的一個(gè)8位專用存放器,?用于向CPU提供運(yùn)算所需的操作數(shù),運(yùn)算后的結(jié)果也存于A中。

②存放器B—?一個(gè)8位存放器,主要用于乘、除法指令。

③程序狀態(tài)字(PSW)—?一個(gè)8位存放器,反映了指令執(zhí)行后CPU的工作狀態(tài)。?PSW的一些位由用戶軟件設(shè)置,有些位那么在指令執(zhí)行后由硬件自動(dòng)設(shè)置。程序狀態(tài)字(PSW)存放器的格式如表1-5所示。表1-5程序狀態(tài)字(PSW)存放器PSW.7(CY)——進(jìn)位/借位標(biāo)志。有進(jìn)位/借位時(shí),CY=1;無(wú)進(jìn)位/借位時(shí),CY=0。位操作時(shí)作累加位使用。

PSW.6(AC)——輔助進(jìn)位/借位標(biāo)志。低4位向高4位進(jìn)位或借位時(shí),AC=1;否那么AC=0。常用于十進(jìn)制調(diào)整。

PSW.5(F0)——用戶標(biāo)志位,由用戶定義的標(biāo)志位。

PSW.4、PSW.3(RS1和RS0)——當(dāng)前工作存放器區(qū)選擇位,如表1-2所示。

PSW.2(OV)—溢出標(biāo)志。如果兩個(gè)有符號(hào)數(shù)的運(yùn)算結(jié)果超過(guò)了8位二進(jìn)制數(shù)所能表示數(shù)據(jù)的范圍(-128~+127)時(shí)表示產(chǎn)生溢出,OV=1;無(wú)溢出時(shí),OV=0。PSW.1—保存位,未使用。

PSW.0(P)—奇偶校驗(yàn)位。累加器A中1的個(gè)數(shù)為奇數(shù)時(shí),P=1;1的個(gè)數(shù)為偶數(shù)時(shí),P=0。

④數(shù)據(jù)指針DPTR—一個(gè)16位存放器,也可拆成兩個(gè)8位存放器DPH和DPL使用,其中DPH為高8位,DPL為低8位。DPTR存放的是片外數(shù)據(jù)存儲(chǔ)器中某存儲(chǔ)單元的地址,CPU通過(guò)DPTR訪問(wèn)片外數(shù)據(jù)存儲(chǔ)器。⑤堆棧指針SP—堆棧就是一段連續(xù)存儲(chǔ)單元,位于片內(nèi)RAM的用戶區(qū)中,堆棧中數(shù)據(jù)的存取原那么是“后進(jìn)先出〞,堆棧的具體位置由堆棧指針SP來(lái)決定。堆棧指針SP是一個(gè)8位存放器,它指示堆棧頂部在片內(nèi)RAM中的位置。設(shè)置堆棧主要是為了保護(hù)斷點(diǎn)和現(xiàn)場(chǎng),單片機(jī)無(wú)論是轉(zhuǎn)入子程序或執(zhí)行中斷效勞程序,執(zhí)行完后都要返回主程序,在轉(zhuǎn)入子程序和中斷效勞程序前,必須將斷點(diǎn)地址、重要的數(shù)據(jù)保存在堆棧中,否那么返回時(shí)CPU就不知道原來(lái)程序執(zhí)行到哪一步,應(yīng)該從何處開始接著往下執(zhí)行了,斷點(diǎn)地址的存取是由硬件自動(dòng)完成的。⑥P0~P3并行口存放器—通過(guò)對(duì)存放器P0~P3的讀/寫,就可以實(shí)現(xiàn)數(shù)據(jù)從相應(yīng)并行I/O口的輸入/輸出。假設(shè)要使P0口8個(gè)引腳全部輸出高電平,只要將FFH寫入P0口即可,即P0?=?0xff。1.2.3數(shù)制及轉(zhuǎn)換

首先我們來(lái)看下面3個(gè)式子是否正確。

1+1=1;

1+1=2;

1+1=10。

應(yīng)當(dāng)說(shuō),這3個(gè)式子都是正確的。1+1=1是邏輯運(yùn)算,邏輯運(yùn)算表示的是事物之間的因果關(guān)系,不表示大?。?+1=2當(dāng)然是我們最熟悉的十進(jìn)制運(yùn)算;1+1=10仍是數(shù)值運(yùn)算,只不過(guò)是用二進(jìn)制表示數(shù)的大小,逢二進(jìn)一。因此,數(shù)制是表示數(shù)大小的一種方法。我們最熟悉的是十進(jìn)制數(shù),但在數(shù)字電路中只有高、低兩種電平,這就決定了數(shù)字電路是以二進(jìn)制數(shù)為根底的。CPU是數(shù)字電路開展取得的偉大成果之一,它是典型的數(shù)字產(chǎn)品,因此CPU只能處理二進(jìn)制信息。但是通常在計(jì)算機(jī)系統(tǒng)中,根本的存儲(chǔ)單位為字節(jié),即8位二進(jìn)制數(shù),如一存儲(chǔ)單元的值為00111100B,寫這樣一串二進(jìn)制數(shù)很容易出錯(cuò),不如寫成十六進(jìn)制數(shù)3CH方便,因此需要熟悉二進(jìn)制、十六進(jìn)制及其轉(zhuǎn)換。1.二進(jìn)制

任意一個(gè)二進(jìn)制數(shù)都是由0或1兩個(gè)數(shù)碼組成的,二進(jìn)制數(shù)的運(yùn)算規(guī)律為“逢二進(jìn)一〞,其權(quán)為2n,后綴為B。如二進(jìn)制數(shù)1101B按權(quán)的展開式為

1101B?=?1?×?23?+?1?×?22?+?0?×?21?+?1?×?20?=?13

2.十六進(jìn)制

十六進(jìn)制數(shù)的數(shù)碼有16個(gè),分別為0~9和A~F,A~F表示十進(jìn)制數(shù)10~15。其運(yùn)算規(guī)律為“逢十六進(jìn)一〞,其權(quán)為16n,后綴為H,如8CH。用C語(yǔ)言編程時(shí),在十六進(jìn)制數(shù)的前面加“0x〞,如0x8C。3.二進(jìn)制數(shù)與十六進(jìn)制數(shù)的轉(zhuǎn)換

(1)二進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)的方法:從二進(jìn)制的最低位開始,每四位為一組,最后缺乏4位時(shí)補(bǔ)0,然后分別轉(zhuǎn)換為十六進(jìn)制數(shù)碼。如11010110B,可分為1101與0110兩組,那么對(duì)應(yīng)的十六進(jìn)制數(shù)為D6H。

(2)十六進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的方法:將每個(gè)十六進(jìn)制數(shù)碼用四位二進(jìn)制數(shù)替代。如89H,8對(duì)應(yīng)的二進(jìn)制數(shù)是1000,9對(duì)應(yīng)的二進(jìn)制數(shù)是1001,所以89H=10001001B。1.2.451單片機(jī)存儲(chǔ)器的擴(kuò)展

當(dāng)單片機(jī)片內(nèi)資源不夠時(shí),需要片外擴(kuò)展程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器。由于單片機(jī)技術(shù)的進(jìn)步,目前單片機(jī)程序存儲(chǔ)器的容量根本都能滿足要求,不需要擴(kuò)展,但是由于單片機(jī)提供的I/O接口有限,控制任務(wù)復(fù)雜時(shí)經(jīng)常需要擴(kuò)展接口,而51單片機(jī)中接口地址與片外數(shù)據(jù)存儲(chǔ)器是統(tǒng)一編址的,因此存儲(chǔ)器的擴(kuò)展對(duì)于單片機(jī)的應(yīng)用仍有重要的意義。

1.存儲(chǔ)器引腳介紹

CPU與存儲(chǔ)器之間通過(guò)三總線相連,因此存儲(chǔ)器應(yīng)提供地址、數(shù)據(jù)、控制三類引腳。1)?ROM存儲(chǔ)器

ROM存儲(chǔ)器在工作時(shí),只允許讀出不允許寫入,掉電后信息不喪失,在51單片機(jī)中用作程序存儲(chǔ)器,因此ROM型存儲(chǔ)器控制線除片選外只需要一個(gè)控制信號(hào)。?一個(gè)ROM存儲(chǔ)器應(yīng)具有如下引腳:

()—片選端,低電平有效。當(dāng)為低電平時(shí),允許對(duì)存儲(chǔ)器進(jìn)行讀操作;當(dāng)為高電平時(shí),芯片不工作。

—輸出使能端,低電平有效。當(dāng)為低電平時(shí),存儲(chǔ)單元與數(shù)據(jù)線相連可以讀出數(shù)據(jù);當(dāng)為高電平時(shí),存儲(chǔ)單元與數(shù)據(jù)線之間為高阻狀態(tài),即斷開,不能讀出數(shù)據(jù)。An~A0—地址線。用于傳送待讀單元的地址,A0為最低位。

D7~D0—數(shù)據(jù)線。用于傳送選定單元中存儲(chǔ)的數(shù)據(jù),D0為最低位。

圖1-11(a)所示為8KBROM存儲(chǔ)器的邏輯圖,由于8KB=213B,所以訪問(wèn)該存儲(chǔ)器共需A12~A013根地址線。只有當(dāng)、同時(shí)有效為0時(shí),由地址線A12~A0選定存儲(chǔ)單元的數(shù)據(jù)才會(huì)送至數(shù)據(jù)線D7~D0,實(shí)現(xiàn)讀操作。只要

、有任意一個(gè)為無(wú)效狀態(tài)1,存儲(chǔ)單元與數(shù)據(jù)線之間呈高阻狀態(tài),就不能讀出存儲(chǔ)單元的數(shù)據(jù)。圖1-11存儲(chǔ)器的邏輯圖2)?RAM存儲(chǔ)器

RAM存儲(chǔ)器在51單片機(jī)中用作數(shù)據(jù)存儲(chǔ)器,可隨機(jī)讀寫,掉電后信息會(huì)喪失,因此它與ROM的區(qū)別主要在控制線上。除了片選端外,RAM還需要(讀信號(hào))、(寫信號(hào))兩個(gè)控制信號(hào),和不能同時(shí)處于有效狀態(tài)。圖1-11(b)所示為8KBRAM的邏輯圖。

當(dāng)=1無(wú)效時(shí),該存儲(chǔ)器不工作;當(dāng)=0有效時(shí),如果與均無(wú)效,這時(shí)數(shù)據(jù)線與內(nèi)部存儲(chǔ)單元之間為高阻狀態(tài),既不能讀出也不能寫入數(shù)據(jù);當(dāng)、同時(shí)有效為0時(shí),才能讀出由地址線A12~A0選定單元中存儲(chǔ)的數(shù)據(jù),實(shí)現(xiàn)讀操作;當(dāng)、同時(shí)有效為0時(shí),可將數(shù)據(jù)存入由地址線A12~A0選定的單元,實(shí)現(xiàn)寫操作。2.?51單片機(jī)三總線結(jié)構(gòu)

在進(jìn)行片外擴(kuò)展連接時(shí),51單片機(jī)要提供三類總線以便與其他器件交換信息,51單片機(jī)的三總線結(jié)構(gòu)如圖1-12所示。

51單片機(jī)進(jìn)行片外擴(kuò)展時(shí),提供16位地址總線、8位數(shù)據(jù)總線及所需的控制線。地址總線的高8位由P2口提供,低8位由P0口提供,當(dāng)?shù)刂沸畔⒃诘刂房偩€上穩(wěn)定后,在地址允許鎖存端ALE鎖存脈沖的作用下,將P0口的低8位地址信息存入片外地址鎖存器中,然后將P0口用作數(shù)據(jù)總線發(fā)送數(shù)據(jù)。控制信號(hào)線有3個(gè),其中、是片外數(shù)據(jù)存儲(chǔ)器的讀/寫控制信號(hào),是片外程序存儲(chǔ)器的讀選通信號(hào)。圖1-12單片機(jī)片外擴(kuò)展三總線3.?51單片機(jī)與存儲(chǔ)器的擴(kuò)展連接

圖1-13所示為某單片機(jī)控制系統(tǒng)片外存儲(chǔ)器擴(kuò)展連接圖,試分析芯片RAM與ROM的地址范圍。

不管是ROM還是RAM,要使其工作,片選端必須有效,圖1-13中端與3線-8線譯碼器的端相連,要使

端有效,那么A15、A14、A13這3根地址線的信號(hào)必須為001。當(dāng)A12~A0全為低電平時(shí),選中ROM與RAM中的最低地址單元;當(dāng)A12~A0全為高電平時(shí),選中ROM與RAM中的最高地址單元。故這兩塊存儲(chǔ)器的地址范圍為0010000000000000B~0011111111111111B,即2000H~3FFFH。ROM與RAM兩個(gè)芯片的地址范圍完全一樣,發(fā)送一個(gè)地址會(huì)同時(shí)選中兩個(gè)單元,這兩個(gè)單元不會(huì)沖突。通過(guò)讀取地址為2000H單元的數(shù)據(jù),就可以看出ROM與RAM區(qū)別如下:

(1)由地址總線P2、P0口輸出16位地址0010000000000000B,即2000H。

(2)當(dāng)?shù)刂房偩€上的地址信號(hào)穩(wěn)定后,由地址信號(hào)允許鎖存端ALE發(fā)出鎖存脈沖,將P0口的低8位地址鎖存在鎖存器中。

(3)由P2口、鎖存器提供的16位地址,選中存儲(chǔ)器ROM與RAM中的2000H單元,但此刻選中單元與數(shù)據(jù)線之間仍呈高阻狀態(tài)。圖1-13單片機(jī)存儲(chǔ)器擴(kuò)展連接圖(4)CPU根據(jù)指令碼區(qū)分出是訪問(wèn)ROM還是RAM。如果是訪問(wèn)ROM的指令,那么使有效,、無(wú)效,故只能讀出ROM中2000H單元的數(shù)據(jù),而RAM中2000H單元由于控制信號(hào)無(wú)效,故與數(shù)據(jù)總線斷開;如果是讀RAM的指令,那么使、無(wú)效,有效,只能讀出RAM中2000H單元的數(shù)據(jù)。

從(4)可以看出,片外程序存儲(chǔ)器ROM與片外數(shù)據(jù)存儲(chǔ)器RAM的地址范圍相同,都為2000H~3FFFH,但由于使用不同的控制信號(hào),所以不會(huì)產(chǎn)生沖突。當(dāng)然在片外擴(kuò)展時(shí),也可為ROM、RAM分配不同的地址空間。1.2.5C51根底

1.計(jì)算機(jī)編程語(yǔ)言簡(jiǎn)介

單片機(jī)是一種大規(guī)模的數(shù)字集成電路,它只能識(shí)別0和1,因此最早的程序就是由一連串的0和1組成的。這種由二進(jìn)制代碼0和1表示的,能被計(jì)算機(jī)直接識(shí)別和執(zhí)行的語(yǔ)言稱為機(jī)器語(yǔ)言,由機(jī)器語(yǔ)言編寫的程序可以被CPU直接執(zhí)行,并且速度快。例如要將30H賦給累加器A,那么機(jī)器碼為0111010000110000B,可表示為74H30H。由于機(jī)器語(yǔ)言難記、難寫、難讀,因此人們將這種由0、1組成的指令用英文助記符來(lái)表示,并稱為匯編語(yǔ)言。如上述任務(wù)可用指令MOVA,#30H來(lái)實(shí)現(xiàn)。用匯編語(yǔ)言編寫的源程序,CPU不能直接執(zhí)行,必須通過(guò)匯編程序?qū)R編語(yǔ)言源程序翻譯成機(jī)器語(yǔ)言程序后才可運(yùn)行。匯編語(yǔ)言目前在控制領(lǐng)域的應(yīng)用仍然十分廣泛,它的效率高、實(shí)時(shí)性強(qiáng),但是匯編語(yǔ)言與機(jī)器語(yǔ)言一樣都是面向機(jī)器的,這使匯編語(yǔ)言程序的移植性差,要求編程者對(duì)硬件一定要十分熟悉,初學(xué)者較難熟練掌握。為了更好地開發(fā)利用計(jì)算機(jī),產(chǎn)生了高級(jí)語(yǔ)言。高級(jí)語(yǔ)言接近于數(shù)學(xué)語(yǔ)言與自然語(yǔ)言,是目前絕大多數(shù)編程者的選擇。與匯編語(yǔ)言相比,它不但將許多相關(guān)的機(jī)器指令合成為單條指令,并且去掉了與具體操作有關(guān)但與完成工作無(wú)關(guān)的細(xì)節(jié),例如堆棧、存放器等,這樣不僅為編程者帶來(lái)了方便還縮短了源程序。目前高級(jí)語(yǔ)言種類很多,如C語(yǔ)言、FORTRAN、VB、PASCAL等。不管是用何種高級(jí)語(yǔ)言編寫的源程序,CPU都不能直接執(zhí)行,均必須通過(guò)相應(yīng)的編譯程序?qū)⑵浞g成機(jī)器語(yǔ)言程序(稱為目標(biāo)程序)后,CPU才能

執(zhí)行。由于C語(yǔ)言功能豐富,表達(dá)能力強(qiáng),使用靈活方便,應(yīng)用面廣,兼顧了多種高級(jí)語(yǔ)言的特點(diǎn),目標(biāo)程序效率高,能直接對(duì)計(jì)算機(jī)硬件進(jìn)行操作,因此針對(duì)51單片機(jī)的C51語(yǔ)言已成為專業(yè)化的實(shí)用高級(jí)語(yǔ)言,在控制領(lǐng)域越來(lái)越多的人選用C語(yǔ)言作為開發(fā)工具。2.?C51程序結(jié)構(gòu)

一個(gè)C51源程序可以由一個(gè)或多個(gè)源文件組成,每個(gè)源文件可由一個(gè)或多個(gè)函數(shù)組成,因此C51采用函數(shù)結(jié)構(gòu)。一個(gè)源程序不管由多少個(gè)源文件組成,都有一個(gè)且只能有一個(gè)main函數(shù),即主函數(shù),不管main()函數(shù)寫于何處,程序總是從main()函數(shù)開始執(zhí)行,最后回到main()函數(shù)結(jié)束。main()函數(shù)可調(diào)用其他函數(shù),但不能被調(diào)用;其他函數(shù)也可以互相調(diào)用;中斷函數(shù)不能被任何函數(shù)調(diào)用,包括主函數(shù)。編寫C51源程序時(shí),常采用的結(jié)構(gòu)如下所示:函數(shù)一般由函數(shù)定義和函數(shù)體兩局部組成。函數(shù)定義局部包括函數(shù)類型、函數(shù)名、形式參數(shù)等,函數(shù)名后面必須跟一個(gè)圓括號(hào)();形式參數(shù)在()內(nèi)定義。函數(shù)體由一對(duì)花括號(hào)“{}〞括起來(lái)。如果一個(gè)函數(shù)內(nèi)有多個(gè)花括號(hào),那么最外層的一對(duì)“{}〞為函數(shù)體的內(nèi)容。函數(shù)體一般由聲明語(yǔ)句和執(zhí)行語(yǔ)句兩局部組成。聲明語(yǔ)句用于定義函數(shù)中用到的變量,也可對(duì)函數(shù)體中調(diào)用的函數(shù)進(jìn)行聲明。執(zhí)行語(yǔ)句由假設(shè)干語(yǔ)句組成,用于完成一定的功能。如果函數(shù)體只有一對(duì)花括號(hào)“{}〞時(shí),稱之為空函數(shù),什么也不做。C51中的每條語(yǔ)句必須以分號(hào)“;〞作為結(jié)束符,但是預(yù)處理命令、函數(shù)定義和花括號(hào)“}〞之后不能加分號(hào)“;〞。只有一個(gè)分號(hào)的語(yǔ)句稱為空語(yǔ)句。例如:要實(shí)現(xiàn)z=x+y,x、y、x為整數(shù),可寫作:

intx,y,z;

main()

{

x=5; //給x、y賦值

y=6;

z=x+y;

}

為了使源程序便于閱讀和維護(hù),C51源程序書寫時(shí)應(yīng)遵循如下規(guī)那么:

(1)每行只寫一個(gè)說(shuō)明或一條語(yǔ)句。

(2)用“{}〞括起來(lái)的局部,通常表示了程序的某一層次結(jié)構(gòu)。{}一般與該結(jié)構(gòu)語(yǔ)句的第一個(gè)字母對(duì)齊,并單獨(dú)占一行。

(3)低一層次的語(yǔ)句或說(shuō)明可比高一層次的語(yǔ)句或說(shuō)明縮進(jìn)后書寫。

(4)用“/*……*/〞或“//〞作注釋,以增加程序的可讀性。

(5)?C51對(duì)字母的大小寫比較敏感,在程序中,同一個(gè)字母的大小寫系統(tǒng)是作不同處理的。

編程時(shí)力求遵循這些規(guī)那么,以養(yǎng)成良好的編程習(xí)慣。3.?C51中的根本數(shù)據(jù)類型

1)變量

變量的值在程序運(yùn)行過(guò)程中是可以變化的,C51中用到的所有變量必須作強(qiáng)制定義,即先定義后使用。一般從數(shù)據(jù)類型、存儲(chǔ)類型、作用域三個(gè)方面定義一個(gè)變量,在本節(jié)中,僅介紹變量的數(shù)據(jù)類型,存儲(chǔ)類型、作用域在后續(xù)工程中介紹。

數(shù)據(jù)類型是根據(jù)被定義變量的性質(zhì)、表示形式、占據(jù)存儲(chǔ)空間的多少以及構(gòu)造特點(diǎn)對(duì)變量進(jìn)行定義的,即定義了變量的大小。常用的數(shù)據(jù)類型有根本數(shù)據(jù)類型、構(gòu)造數(shù)據(jù)類型、指針類型、空類型4大類。(1)根本數(shù)據(jù)類型。根本數(shù)據(jù)類型最主要的特點(diǎn)是其值不可以再分解為其他類型,根本數(shù)據(jù)類型是自我說(shuō)明的。根本數(shù)據(jù)類型是最根本的,C51中常用的根本數(shù)據(jù)類型及其大小如表1-6所示。

表1-6中,bit、sbit、sfr、sfr16為C51的擴(kuò)充數(shù)據(jù)類型,主要是針對(duì)51系列單片機(jī)而設(shè)置的。51單片機(jī)內(nèi)部有21個(gè)特殊功能存放器,每個(gè)存放器在存儲(chǔ)器中都分配有唯一的地址和名稱,單片機(jī)只能識(shí)別地址。我們記憶名稱較為方便、快捷,因此當(dāng)我們編程讀寫這些存放器時(shí),必須要在程序開始時(shí)用關(guān)鍵字sfr、sfr16對(duì)這些存放器加以定義,實(shí)際就是給每個(gè)存放器起一個(gè)我們已經(jīng)約定好的名字,這樣編譯器才能將這些名稱與RAM中的存儲(chǔ)單元進(jìn)行綁定,對(duì)它進(jìn)行讀/寫操作。當(dāng)然也可以起其他的名字,但是不利用互相交流和學(xué)習(xí)。表1-6C51根本數(shù)據(jù)類型及其大?、賡fr——定義一個(gè)8位特殊功能存放器。一般形式為

sfr8位SFR名稱=地址;

例如:

sfrP0=0x80;

P0口是單片機(jī)4個(gè)并行I/O口中的一個(gè),由表1-3可知它在片內(nèi)RAM中的地址是80H。通過(guò)這樣定義后,編譯器就會(huì)知道,P0就代表了80H單元,對(duì)P0口進(jìn)行讀/寫操作實(shí)際上是對(duì)80H單元進(jìn)行讀/寫。例如,執(zhí)行語(yǔ)句“P0=0xfe;〞結(jié)果是使P0.0為低電平,P0.1~P0.7為高電平,指令采用字節(jié)尋址同時(shí)設(shè)置P0口的8個(gè)輸出位。

②sfr16?——定義一個(gè)16位特殊功能存放器。一般形式為

sfr1616位SFR名稱=地址;

③sbit——定義位地址,即可位尋址的特殊功能存放器中的某一位地址。一般形式為

sbit位地址名=位地址;

式中位地址一般有三種形式:直接位地址、特殊功能存放器字節(jié)地址值帶位號(hào)、特殊功能存放器名稱帶位號(hào)。如采用特殊功能存放器名稱帶位號(hào)時(shí),需在定義位地址之前用sfr/sfr16對(duì)特殊功能存放器進(jìn)行定義,且字節(jié)地址與位號(hào)之間、特殊功能存放器名稱與位號(hào)之間用“^〞作間隔。例如:

sbitled1=0x80; //直接位地址

sbitled1=0x80^0; //特殊功能存放器字節(jié)地址值帶位號(hào)

sbitled1=P0^0; //特殊功能存放器名稱帶位號(hào)

上述3條指令的作用都是給P0口最低位的位地址P0.0起名字為led1,由led1可以知道該引腳外接一個(gè)發(fā)光二極管,可提高程序的可讀性;如果外接一按鍵時(shí),可定義為sbitkey=P0^0;。如在程序中執(zhí)行語(yǔ)句“l(fā)ed1=0;〞的結(jié)果就是使P0.0引腳輸出低電平,P0.1~P0.7保持原狀態(tài)不變。對(duì)P0~P3進(jìn)行位尋址時(shí)需先定義位地址。④bit——定義位變量,一般形式為

bit位變量名;

例如:

bitb1;

定義了一個(gè)位變量b1,編譯時(shí)由系統(tǒng)將b1與位尋址區(qū)(片內(nèi)RAM的20H~2FH單元)中128個(gè)位地址中的一個(gè)綁定(由編譯器決定)。當(dāng)b1被修改后,b1對(duì)應(yīng)的位地址所在字節(jié)單元的內(nèi)容也會(huì)隨之改變。關(guān)鍵字bit與sbit的區(qū)別在于,sbit用于定義51單片機(jī)內(nèi)部可以位尋址的特殊功能存放器的某一位,定義的同時(shí)需要給出位地址(在片內(nèi)RAM高128B),位地址與名稱之間的關(guān)系要符合表1-4;而bit定義的是任意的位變量,名稱可以由用戶隨便命名,位變量對(duì)應(yīng)的位地址由編譯器在編譯時(shí)給出(在片內(nèi)RAM低128B的位尋址區(qū)),在定義位變量的同時(shí)是否賦初值由需要而定。

如果每次編程時(shí)都重新定義SFR,去查找SFR的實(shí)際地址,這樣做勢(shì)必很麻煩,也沒有必要。在頭文件reg51.h或reg52.h中,已經(jīng)對(duì)51或52系列單片機(jī)中用到的特殊功能存放器和可位尋址位作了定義,我們可以通過(guò)文件包含命令直接使用。reg51.h或reg52.h中的局部?jī)?nèi)容如下:sfrP0=0x80;

sfrP1=0x90;

……

sbitCY=PSW^7;

sbitAC=PSW^6;

(2)構(gòu)造數(shù)據(jù)類型。構(gòu)造數(shù)據(jù)類型是根據(jù)已定義的一個(gè)或多個(gè)數(shù)據(jù)類型用構(gòu)造的方法來(lái)定義的,即一個(gè)構(gòu)造類型的值可以分解成假設(shè)干個(gè)“成員〞或“元素〞,每個(gè)“成員〞都是一個(gè)根本數(shù)據(jù)類型或又是一個(gè)構(gòu)造類型。在C語(yǔ)言中,數(shù)組類型、結(jié)構(gòu)類型、聯(lián)合類型都屬于構(gòu)造類型。(3)指針類型。指針是一種特殊的,同時(shí)又具有重要作用的數(shù)據(jù)類型。指針的值是存儲(chǔ)器中某個(gè)單元的地址,根據(jù)指針的值可以取出該單元中存儲(chǔ)的數(shù)據(jù)。雖然指針變量的取值類似于整型量,但它們是兩個(gè)類型完全不同的量,因此不能混為一談。

(4)空類型。在調(diào)用函數(shù)時(shí),通常應(yīng)向調(diào)用者返回一個(gè)函數(shù)值。如果調(diào)用后不需要返回函數(shù)值時(shí),可將該函數(shù)定義為空類型,其類型說(shuō)明符為void。

定義變量時(shí),變量名要“見名知義〞,除此之外還應(yīng)注意以下幾點(diǎn):①允許在一個(gè)類型說(shuō)明符后,說(shuō)明多個(gè)相同類型的變量,各變量名之間用逗號(hào)分隔。類型說(shuō)明符與變量名之間至少用一個(gè)空格間隔,最后一個(gè)變量名之后必須以“;〞號(hào)結(jié)尾。

在定義變量的同時(shí)可以為其賦初值,這種方法稱為初始化。一般形式為

類型說(shuō)明符變量1=值1,變量2=值2,……;

例如:

unsignedchara=4,b=45,c=0x45;

unsignedintx=32,y=344,z=7544;

應(yīng)注意,在定義中不允許連續(xù)賦值,如unsignedchara=b=c=5是不合法的。②變量定義必須放在變量使用之前,一般是放在函數(shù)體的開頭局部。

③給變量賦適宜的數(shù)值。定義了變量的數(shù)據(jù)類型后,編譯器編譯時(shí)就會(huì)根據(jù)該變量的數(shù)據(jù)類型在單片機(jī)的存儲(chǔ)器中為其分配一定的空間,變量的數(shù)據(jù)類型不相同,所分配的存儲(chǔ)單元也就不同,為了合理地利用單片機(jī)的存儲(chǔ)空間,編程時(shí)就要設(shè)定適宜的數(shù)據(jù)類型。變量的數(shù)據(jù)類型確定后,變量數(shù)據(jù)的大小就受到了限制,編程時(shí)就不能隨意給一個(gè)變量賦值了。例如:

unsignedchara;定義了一個(gè)無(wú)符號(hào)字符變量a,編譯器就分配1個(gè)存儲(chǔ)單元用于存放a的數(shù)值,如果給a賦大于255的數(shù)值,如a=987;時(shí),由于存放987需要2個(gè)存儲(chǔ)單元,所以數(shù)據(jù)就會(huì)喪失,影響程序的執(zhí)行結(jié)果。

④定義變量時(shí),要考慮51單片機(jī)內(nèi)存儲(chǔ)器容量。51單片機(jī)內(nèi)片內(nèi)數(shù)據(jù)存儲(chǔ)器256B中僅低128B由用戶使用,片內(nèi)程序存儲(chǔ)器也只有4KB,因此定義變量類型時(shí),最好結(jié)合實(shí)際情況,盡可能定義為unsignedchar、signedchar類型,然后定義為unsignedint、signedint類型,充分利用51單片機(jī)有限的存儲(chǔ)器實(shí)現(xiàn)各種控制功能。⑤在C51源程序中,如果出現(xiàn)數(shù)據(jù)類型不一致的情況,會(huì)按照隱式轉(zhuǎn)換的順序進(jìn)行轉(zhuǎn)換。例如:

bit→char→int→long→float

signed→unsigned

也就是說(shuō),當(dāng)一個(gè)bit量與一個(gè)int量進(jìn)行運(yùn)算時(shí),系統(tǒng)會(huì)自動(dòng)將位變量bit變?yōu)檎土縤nt,然后再與int量進(jìn)行運(yùn)算,結(jié)果為int量。

2)常量

常量在程序執(zhí)行時(shí)是不會(huì)改變的。常量也有數(shù)據(jù)類型,在源程序中,常量是可以不經(jīng)定義而直接引用的。最常用的是整型常量即整常數(shù):十進(jìn)制整數(shù)如10、240等;十六進(jìn)制整數(shù)要加前綴“0x〞或“0X〞,如0x30、0xfe等。注意:0xfe與0xFE都是正確的。4.文件預(yù)處理

C51編譯器在對(duì)源程序進(jìn)行編譯之前,先要對(duì)程序中的一些特殊命令進(jìn)行預(yù)處理。預(yù)處理命令主要包括宏定義define和文件包含include。預(yù)處理命令以符號(hào)“#〞開頭。

(1)宏定義#define。宏定義#define的功能是用一個(gè)指定的標(biāo)識(shí)符來(lái)代表一個(gè)字符串或常量。其一般形式為

#define標(biāo)識(shí)符字符串(或常量)

例如:

#defineBYTEunsignedcharunsignedchar的另一個(gè)名字就是BYTE,然后可以用BYTE來(lái)定義數(shù)據(jù)類型。例如:

BYTEx;

BYTEy;

那么變量x、y為unsignedchar型。

(2)文件包含#include。所謂文件包含是指一個(gè)源文件可以包含另一個(gè)源文件,通過(guò)命令#include來(lái)實(shí)現(xiàn)。其一般形式為

#include“文件名〞

或#include<文件名>

文件包含的執(zhí)行過(guò)程如圖1-14所示。預(yù)處理時(shí),先把“文件名〞指定的文件內(nèi)容復(fù)制到文件包含命令所在的位置,再對(duì)合并后的文件進(jìn)行編譯。

文件包含在C51編程時(shí)非常有用,它可以最大限度地防止編程人員重復(fù)勞動(dòng),提高工作效率。例如,在編寫51單片機(jī)的應(yīng)用程序時(shí),第一條總是寫“#include<reg51.h>或#include<reg52.h>〞,它的作用就是將特殊功能存放器定義頭文件reg51.h或reg52.h包含到自已的源文件中,就不必再對(duì)特殊功能存放器重新定義了。圖1-14文件包含示意圖另外,利用C51的庫(kù)函數(shù)能使程序代碼簡(jiǎn)單、結(jié)構(gòu)清晰。每個(gè)庫(kù)函數(shù)在相應(yīng)的頭文件中給出了函數(shù)原型聲明,用戶使用這些庫(kù)函數(shù)時(shí),在源文件開始處利用#include,將相關(guān)的函數(shù)聲明頭文件包含進(jìn)來(lái),系統(tǒng)在編譯連接時(shí)會(huì)將該函數(shù)的程序代碼從函數(shù)庫(kù)中調(diào)出,嵌入到源文件中。在下例中,通過(guò)math.h頭文件中的externfloatsin(floatval)聲明語(yǔ)句,系統(tǒng)在編譯連接時(shí)會(huì)將sin(x)的源代碼從函數(shù)庫(kù)中調(diào)出,嵌入到該程序中,用戶不必了解sin(x)實(shí)現(xiàn)的方法。例如:

#include<math.h>

floatx,y;

main()

{

x=1.23;

y=sin(x);

}C51常用頭文件如下:

reg51.h/reg52.h 定義了51/52系列單片機(jī)中的特殊功能存放器與可位尋址的SFR的位地址

intrins.h 定義了C51的內(nèi)部函數(shù)

math.h 定義了常用的數(shù)學(xué)函數(shù)

absacc.h 包含允許直接訪問(wèn)51單片機(jī)各存儲(chǔ)區(qū)的宏定義

stdio.h 定義了51單片機(jī)的串口輸入/輸出函數(shù)

string.h 定義了字符串操作函數(shù)

stdlib.h 定義了動(dòng)態(tài)內(nèi)存分配函數(shù)5.?while語(yǔ)句

while語(yǔ)句是C51中的循環(huán)語(yǔ)句,它的一般形式為

while(表達(dá)式)

{

語(yǔ)句;(可為空語(yǔ)句)

}

說(shuō)明:表達(dá)式為循環(huán)條件,語(yǔ)句為循環(huán)體。

特點(diǎn):先判斷表達(dá)式,后執(zhí)行循環(huán)體語(yǔ)句。

while語(yǔ)句執(zhí)行時(shí)先判斷表達(dá)式的值,如果表達(dá)式的值為真,就執(zhí)行循環(huán)體語(yǔ)句;假設(shè)表達(dá)式的值為假,那么直接執(zhí)行while后面的語(yǔ)句。while語(yǔ)句執(zhí)行流程如圖1-15所示。圖1-15while語(yǔ)句執(zhí)行流程圖注意:

(1)在C語(yǔ)言中,真是指“非0〞,假是指“0〞,例如1、2、10等任何非零的數(shù)值都為真。

(2)表達(dá)式可以是一個(gè)常數(shù)、一個(gè)關(guān)系表達(dá)式、一個(gè)邏輯表達(dá)式或一個(gè)帶返回值的函數(shù)。

(3)循環(huán)體語(yǔ)句可以是空語(yǔ)句,即“;〞。

(4)當(dāng)循環(huán)體語(yǔ)句只有一條語(yǔ)句時(shí),可不寫大括號(hào)?!皐hile(1);〞是最簡(jiǎn)單的while語(yǔ)句,它的表達(dá)式為1,永遠(yuǎn)為真,而它的循環(huán)體為空語(yǔ)句,什么也不需要做,所以while語(yǔ)句構(gòu)成了一個(gè)死循環(huán),一直執(zhí)行空語(yǔ)句,相當(dāng)于使單片機(jī)停機(jī)。在C語(yǔ)言中,while的循環(huán)體語(yǔ)句中一定要有使循環(huán)趨于結(jié)束的語(yǔ)句,以免構(gòu)成死循環(huán);而在C51中,卻常常需要形成死循環(huán)。這也是C語(yǔ)言與C51的區(qū)別之一。

“while(1);〞中的分號(hào)“;〞一定不能省,否那么會(huì)將while(1)后的第一條語(yǔ)句作為它的循環(huán)體,后面沒有語(yǔ)句時(shí),那么是錯(cuò)誤的while語(yǔ)句。

例如:試分析下述3個(gè)while語(yǔ)句的循環(huán)體。①while(1)

P0=0x88;

P1=0x33;

②while(1);

P0=0x88;

P1=0x33;

③while(1)

{

P0=0x88;

P1=0x33;

}根據(jù)while語(yǔ)句的要求可知,第一個(gè)while語(yǔ)句的循環(huán)體為“P0=0x88;〞,語(yǔ)句“P1=0x33;〞不被執(zhí)行;第二個(gè)while語(yǔ)句的循環(huán)體為“;〞,語(yǔ)句“P0=0x88;P1=0x33;〞不被執(zhí)行;第三個(gè)while語(yǔ)句的循環(huán)體為“P0=0x88;P1=0x33;〞,反復(fù)執(zhí)行這兩條語(yǔ)句。1.3項(xiàng)目實(shí)施

1.3.1硬件設(shè)計(jì)方案

發(fā)光二極管(LED)是最簡(jiǎn)單的輸出設(shè)備,通過(guò)它的亮、滅可以反映出程序運(yùn)行的結(jié)果。發(fā)光二極管的內(nèi)部為一個(gè)PN結(jié),具有單向?qū)щ娦?,?dāng)給LED加正向電壓時(shí),可以發(fā)出不同顏色的光。由于發(fā)光二極管為非線性元件,因此當(dāng)驅(qū)動(dòng)LED時(shí),應(yīng)該串接限流電阻,限流阻值的大小應(yīng)根據(jù)LED所需的工作電流來(lái)選擇。常用發(fā)光二極管的工作電壓VD一般為1.5V~2V,工作電流ID一般取10mA~20mA。I/O接口是單片機(jī)與外設(shè)交換信息的橋梁,圖1-16中給出了用51單片機(jī)的并行I/O口驅(qū)動(dòng)發(fā)光二極管的三種連接方法。當(dāng)I/O口輸出低電平時(shí),方式2、方式3中所接LED均可正偏;當(dāng)I/O口輸出高電平時(shí),方式1所接LED正偏。但是不是三種連接方法都能點(diǎn)亮LED,還要先了解一下51單片機(jī)并行I/O口的帶負(fù)載能力。51單片機(jī)所接負(fù)載一般有灌電流負(fù)載和拉電流負(fù)載兩種情況。灌電流負(fù)載是指當(dāng)并行I/O口輸出低電平時(shí),負(fù)載電流由外設(shè)流入單片機(jī)I/O口,I/O口被動(dòng)接受負(fù)載電流,所以稱之為灌電流,此時(shí)所接外設(shè)稱為灌電流負(fù)載,如圖1-16中的方式2、方式3;拉電流負(fù)載是指當(dāng)并行I/O口輸出高電平時(shí),單片機(jī)I/O口主動(dòng)給負(fù)載提供輸出電流,所以稱之為拉電流,此時(shí)所接負(fù)載稱為拉電流負(fù)載,如圖1-16中的方式1。圖1-1651單片機(jī)驅(qū)動(dòng)發(fā)光二極管51單片機(jī)的帶負(fù)載能力如何呢?查閱相關(guān)資料可知,當(dāng)51單片機(jī)I/O口輸出高電平時(shí),P0口可接8個(gè),P1~P3僅能驅(qū)動(dòng)3個(gè)TTL門電路,而每個(gè)門電路的輸入電流是μA級(jí),因此可知并行I/O口能提供的拉電流非常?。籌/O口能承受的灌電流較為特殊,一個(gè)I/O口允許灌入的最大電流為10mA,8位I/O接口P1~P3口允許灌入的總電流之和不超過(guò)15mA,P0口較大可達(dá)26mA,P0~P3允許灌入的電流之和不能超過(guò)71mA。由此可見,單片機(jī)帶灌電流負(fù)載的能力要遠(yuǎn)遠(yuǎn)大于帶拉電流負(fù)載的能力。

根據(jù)51單片機(jī)的帶負(fù)載能力,可知在方式1中,當(dāng)I/O口輸出高電平使LED滿足正偏條件時(shí),卻無(wú)法提供LED所需的工作電流,因此方式1的接法是錯(cuò)誤的。在方式2中,當(dāng)I/O口輸出低電平VOL(0.3V)時(shí),LED正向偏置,電流灌入I/O口,當(dāng)電流小于單個(gè)I/O口允許的灌電流時(shí),就可以平安點(diǎn)亮LED。該方式適合于LED工作電流較小、數(shù)量較多但不同時(shí)點(diǎn)亮的場(chǎng)合。限流電阻R為

式中,VD、ID為L(zhǎng)ED的工作電壓、電流。當(dāng)LED的參數(shù)為2V/10mA時(shí),R?=?270Ω。在方式3中,利用三極管來(lái)驅(qū)動(dòng)LED,灌入I/O口的是三極管的基極電流,因此是正確的。該方式適用于LED工作電流較大或數(shù)量較多且同時(shí)點(diǎn)亮的場(chǎng)合。例如:要求用P0口連接8個(gè)LED,每個(gè)LED工作電流為20mA,且8個(gè)LED可能同時(shí)點(diǎn)亮?xí)r,方式3是唯一平安可靠的接法。方式3原理如圖1-17所示,三極管構(gòu)成了一個(gè)電子開關(guān),由單片機(jī)控制電子開關(guān),當(dāng)I/O口輸出低電平時(shí),三極管飽和導(dǎo)通相當(dāng)于開關(guān)閉合,由VCC提供LED所需工作電流,點(diǎn)亮LED;當(dāng)I/O口輸出高電平時(shí),三極管截止相當(dāng)于開關(guān)斷開,LED不能點(diǎn)亮。圖1-17發(fā)光二極管驅(qū)動(dòng)方式3等效電路為了保證I/O口輸出低電平VOL=0.3V時(shí)(即三極管基極輸入電壓),三極管可以工作于飽和區(qū),需要選取適宜的R1、R2。假設(shè)三極管β=100,LED的參數(shù)為2.2V/20mA,三極管的飽和壓降UCE?=?0.3V,那么

當(dāng)VCC?=?5V時(shí),R2?=?120Ω。

如何選擇R1呢?當(dāng)三極管工作在飽和區(qū)時(shí),必須滿足βIb>Ic,且Ib<10mA(一個(gè)I/O口允許的灌電流),由圖1-17可知,Ib=(VCC-UBE-VOL)/R1,Ic=ID,因此R1應(yīng)滿足

式中,當(dāng)VCC?=?5V、UBE?=?0.7V時(shí),R1?<?20kΩ。取R1?=?10kΩ時(shí),Ib?=?0.4mA滿足

Ib?<?10mA,應(yīng)選R1?=?10kΩ。

根據(jù)工程一的要求,確定本工程采用方式2在P2口連接8個(gè)發(fā)光二極管。工程一硬件電路如圖1-18所示。圖1-18工程一硬件電路圖1.3.2軟件設(shè)計(jì)方案

1.點(diǎn)亮一個(gè)發(fā)光二極管

工程要求編程點(diǎn)亮圖1-18中的一個(gè)發(fā)光二極管,下面以點(diǎn)亮P2.0所接LED0為例介紹軟件設(shè)計(jì)。

編程依據(jù):當(dāng)I/O口輸出低電平時(shí),點(diǎn)亮該I/O口所接LED;當(dāng)I/O口輸出高電平時(shí),該I/O口所接LED熄滅。

51單片機(jī)的4個(gè)并行I/O口P0~P3尋址方式靈活,既可字節(jié)尋址,也可位尋址。字節(jié)尋址是一次向P2口發(fā)送一個(gè)字節(jié)即8位二進(jìn)制數(shù),但是只有最低位P2.0是我們需要的,根據(jù)編程依據(jù)使P2.0為低電平0;P2.1~P2.7沒有用,可以為任意值,但是為了與P2.0作區(qū)別,全取1,最終P2口的數(shù)據(jù)見表1-7。表1-7P2口的數(shù)據(jù)

1)源程序(字節(jié)尋址)

#include<reg51.h> //包含頭文件reg51.h

main() //主函數(shù)

{

P2=0xFE; //字節(jié)尋址,點(diǎn)亮LED0、熄滅LED1~LED7

while(1); //動(dòng)態(tài)停機(jī)

}命令“#include<reg51.h>〞的作用是將頭文件reg51.h中定義51單片機(jī)特殊功能存放器的全部?jī)?nèi)容包含在該源程序中,在此就不必再定義了。編譯時(shí),是先將reg51.h中的全部?jī)?nèi)容復(fù)制到命令“#include<reg51.h>〞所在位置后,再進(jìn)行編譯。如果沒有這條文件包含命令時(shí),需要添加上語(yǔ)句“sfrP2=0xA0;〞,否那么編譯器就不知將P2的數(shù)值存往何處。注意:頭文件reg51.h或reg52.h中定義的所有名稱均為大寫字母,如果后面使用時(shí)寫成小寫字母,編譯器將會(huì)不認(rèn)識(shí)“p2〞,會(huì)提示“未定義(undefine)〞?!?/〞為注釋符號(hào),每個(gè)“//〞只能注釋一行。添加注釋后,可方便閱讀程序。

語(yǔ)句“P2=0xFE;〞為字節(jié)尋址,同時(shí)控制P2口的8個(gè)I/O引腳,0xFE是十六進(jìn)制整數(shù),轉(zhuǎn)換為二進(jìn)制數(shù)11111110后,只有P2.0為0,因此圖1-18中LED0點(diǎn)亮、LED1~LED7熄滅。

本工程的任務(wù)非常簡(jiǎn)單,只用一條語(yǔ)句就可實(shí)現(xiàn)功能,之后單片機(jī)就無(wú)事可做,但是51單片機(jī)是不能停機(jī)的,除非給它斷電,“while(1);〞語(yǔ)句的作用就是讓單片機(jī)停止,但又不是真正的停機(jī),它仍在執(zhí)行“while(1);〞,因此稱之為動(dòng)態(tài)停機(jī)。2)源程序(位尋址)

位尋址時(shí)只需為P2.0發(fā)送點(diǎn)亮LED0所需的低電平0。

#include<reg51.h>

sbitLED0=P2^0;//給P2.0起名字為L(zhǎng)ED0

main()

{

LED0=0; //位尋址,點(diǎn)亮LED0、熄滅LED1~LED7

while(1); //動(dòng)態(tài)停機(jī)

}51單片機(jī)的4個(gè)并行I/O口都是可以位尋址的,采用位尋址也可點(diǎn)亮一個(gè)LED,大家可能會(huì)想,不是已經(jīng)將頭文件reg51.h包含進(jìn)來(lái)了嗎?為什么還要用語(yǔ)句“sbitLED0=P2^0;〞定義P2.0呢?在KEILC中選中頭文件reg51.h,單擊鼠標(biāo)右鍵,在快捷菜單中,選中“openreg51.h〞就可以翻開該文件。瀏覽該文件可以看到,4個(gè)并行I/O口P0~P3只定義了字節(jié)地址,并沒有定義每一個(gè)的位地址,所以在對(duì)P0~P3的任意位進(jìn)行位尋址時(shí),源程序中必須用關(guān)鍵字“sbit〞進(jìn)行定義。語(yǔ)句“sbitLED0=P2^0;〞的作用是給P2口的最低位P2.0重新起了一個(gè)名字LED0,當(dāng)然你可以給它起其他的任何名字,但最好能見名知意。語(yǔ)句“LED0=0;〞的作用是使引腳P2.0輸出低電平,所接LED0正偏點(diǎn)亮。源程序中我們并沒有控制P2口的P2.1~P2.7,為什么LED1~LED7也和字節(jié)尋址時(shí)一樣熄滅?這是因?yàn)閳D1-18電路中的復(fù)位電路在上電自復(fù)位后,P0~P3的初值為全1,即FFH。

2.點(diǎn)亮假設(shè)干發(fā)光二極管

學(xué)會(huì)點(diǎn)亮一個(gè)發(fā)光二極管后,用相同的方法可以點(diǎn)亮8個(gè)發(fā)光二極管中的任意個(gè)。例如,點(diǎn)亮LED1、3、5、7四個(gè)發(fā)光二極管時(shí),如果采用字節(jié)尋址,那么P2口的數(shù)據(jù)見

表1-8。表1-8P2口的數(shù)據(jù)

1)源程序(字節(jié)尋址)

#include<reg51.h> //包含頭文件reg51.h

main() //主函數(shù)

{

while(1) //死循環(huán)

P2=0x55; //字節(jié)尋址,點(diǎn)亮LED1、3、5、7,熄滅LED0、2、4、6

}2)源程序(位尋址)

位尋址時(shí),每條語(yǔ)句只能點(diǎn)亮或熄滅一個(gè)LED。編程時(shí)需要先用關(guān)鍵字“sbit〞定義P2.1、P2.3、P2.5、P2.7四個(gè)I/O口,在主函數(shù)中,用4條位尋址語(yǔ)句才能夠點(diǎn)亮4個(gè)發(fā)光二極管。

#include<reg51.h>

sbitLED1=P2^1; //定義P2.1為L(zhǎng)ED1

sbitLED3=P2^3; //定義P2.3為L(zhǎng)ED3

sbitLED5=P2^5; //定義P2.5為L(zhǎng)ED5

sbitLED7=P2^7; //定義P2.7為L(zhǎng)ED7

main(){

while(1) //死循環(huán)

{

LED1=0; //位尋址,點(diǎn)亮LED1

LED3=0; //位尋址,點(diǎn)亮LED3

LED5=0; //位尋址,點(diǎn)亮LED5

LED7=0; //位尋址,點(diǎn)亮LED7

}

}通過(guò)比較前述兩段源程序可以看出,當(dāng)點(diǎn)亮的發(fā)光二極管較多時(shí),位尋址的源程序會(huì)很長(zhǎng),而字節(jié)尋址不管點(diǎn)亮8個(gè)發(fā)光二極管中的幾個(gè),都只需要一條語(yǔ)句。因此編程時(shí)要依據(jù)實(shí)際情況選擇適宜的尋址方式,字節(jié)尋址適用于操作位數(shù)較多的情況,而位尋址那么適合于操作位數(shù)較少的情況。

再比較本工程中的四段源程序,可以發(fā)現(xiàn),在點(diǎn)亮一個(gè)發(fā)光二極管的源程序中,向I/O口發(fā)送一次代碼后,while語(yǔ)句使CPU無(wú)數(shù)遍執(zhí)行空語(yǔ)句,相當(dāng)于動(dòng)態(tài)停機(jī);而在點(diǎn)亮假設(shè)干個(gè)發(fā)光二極管的源程序中,將發(fā)送代碼的語(yǔ)句作為while的循環(huán)體,因此單片機(jī)上電后,CPU是在無(wú)數(shù)遍地向I/O口發(fā)送代碼。1.3.3程序調(diào)試

1.實(shí)驗(yàn)板電路分析

HOT-51實(shí)驗(yàn)板上,8個(gè)LED的連接方法如圖1-19所示,采用圖1-19中的方式2,8個(gè)LED與P0口相連。由于未加驅(qū)動(dòng)電路,考慮到P0口的帶負(fù)載能力,所以在練習(xí)編程時(shí),每次盡可能只點(diǎn)亮一個(gè)發(fā)光二極管,如果點(diǎn)亮假設(shè)干個(gè)發(fā)光二極管,那么可縮短實(shí)驗(yàn)板的通電時(shí)間。圖1-19HOT-51實(shí)驗(yàn)板LED電路2.?KEILC介紹

單片機(jī)的程序設(shè)計(jì)要在特定的編譯器中進(jìn)行,編譯器可以完成源程序的編輯、編譯等工作,生成可下載文件,現(xiàn)在最常用的是Keil公司的μVision集成開發(fā)環(huán)境,它支持C51語(yǔ)言和匯編語(yǔ)言的程序設(shè)計(jì)。

KeilμVision2中有一工程管理器,用于管理工程文件。KeilμVision2在使用時(shí)要先新建工程,然后再新建源程序文件,當(dāng)源程序文件編輯好后,最后通過(guò)編譯生成可下載文件。

(1)啟動(dòng)。從開始菜單或桌面上啟動(dòng)KeilμVision2,圖1-20中圈出的即為“KeilμVision2〞圖標(biāo),啟動(dòng)后界面如圖1-20所示。圖1-20KeilμVision2主窗口

(2)新建工程。

①創(chuàng)立新工程。選擇按鈕“Project\NewProject〞,出現(xiàn)如圖1-21對(duì)話框。選擇好存儲(chǔ)路徑,鍵入工程名稱后單擊“保存〞按鈕。工程的擴(kuò)展名為.uv2。

(2)新建工程。

①創(chuàng)立新工程。選擇按鈕“Project\NewProject〞,出現(xiàn)如圖1-21對(duì)話框。選擇好存儲(chǔ)路徑,鍵入工程名稱后單擊“保存〞按鈕。工程的擴(kuò)展名為.uv2。

如果使用前一次創(chuàng)立的工程,選擇“Project\OpenProject〞,再?gòu)膹棾龅拇翱谥羞x擇已有的工程即可。圖1-21創(chuàng)立新工程窗口②選擇單片機(jī)型號(hào)。選擇好存儲(chǔ)路徑、鍵入工程名稱后單擊“保存〞按鈕,彈出如圖1-22所示單片機(jī)型號(hào)選擇窗口,選擇“Atmel\AT89S51或AT89S52〞,單擊“確定〞按鈕,將出現(xiàn)如圖1-23所示的提示窗口,單擊“是〞按鈕,新工程創(chuàng)立成功。

在工程工作區(qū)窗口ProjectWorkspace顯示框內(nèi),單擊文件夾Target1左側(cè)的符號(hào)“+〞,展開后如圖1-24所示。在后面編輯源程序時(shí),Target1應(yīng)一直保持展開狀態(tài)。圖1-22單片機(jī)型號(hào)選擇窗口圖1-23提示窗口圖1-24新建工程后工程工作區(qū)窗口③選擇創(chuàng)立擴(kuò)展名為.HEX的文件。單擊圖1-25(a)所圈快捷圖標(biāo)或選擇“Project\BuildTarget〞,會(huì)彈出如圖1-25(b)所示窗口,單擊第三個(gè)選項(xiàng)“Output〞,選中“CreateHEXFile〞,單擊“確定〞按鈕即可。

每次新建工程后,都需作此選擇。HEX文件的名稱默認(rèn)與工程名相同,也可以在圖1-25(b)中的“NameofExecutable〞后鍵入所需名稱;HEX的文件默認(rèn)與工程存放在同一文件夾,也可單擊圖1-25(b)中“SelectFolderforObjects...〞按鈕,在彈出的窗口中重新選擇存儲(chǔ)路徑。圖1-25創(chuàng)立擴(kuò)展名為?.HEX的文件窗口(3)新建源程序文件。

①創(chuàng)立新的源程序文件。單擊“File\New〞后,會(huì)彈出如圖1-26所示的文本編輯窗口。

②保存源程序文件。選擇“File\Saveas〞,會(huì)彈出如圖1-27所示的窗口,選擇好存儲(chǔ)路徑(和工程保存在同一文件夾),并鍵入源程序文件名(注意:一定要鍵入源程序文件擴(kuò)展名?.c),如“一個(gè)LED(位尋址).c〞,單擊“保存〞按鈕后進(jìn)入編輯界面。源程序文件在先保存后編輯時(shí),C51的關(guān)鍵字將會(huì)高亮顯示,以便檢查錯(cuò)誤。圖1-26創(chuàng)立新的源程序文件窗口圖1-27C51源程序文件保存窗口

③將新建的源程序文件添加至工程中。如圖1-28(a)所示,在工程工作區(qū)窗口ProjectWorkspace顯示框內(nèi),展開文件夾Target1左側(cè)的符號(hào)“+〞,再右擊文件夾“SourceGroup1〞,將彈出圖1-28(a)所示界面,單擊“AddFilestoGroup‘SourceGroup1’〞后,會(huì)彈出如圖1-28(b)所示對(duì)話框,選擇剛剛創(chuàng)立的源程序文件“一個(gè)LED(位尋址).c〞后,單擊“Add〞,再單擊“Close〞關(guān)閉該對(duì)話框。源程序文件添加后工程工作區(qū)窗口如圖1-28(c)所示,多了一行顯示,即剛添加的源程序文件名。如果不需要文件夾“SourceGroup1〞中的源文件,可以用鼠標(biāo)左鍵單擊不需要的“文件名〞,彈出如圖1-28(d)所示界面,選擇“RemoveFile‘一個(gè)LED(位尋址).c’〞,將其從“SourceGroup1〞移除后,可重新添加新的源程序文件。

文件夾“SourceGroup1〞中可以添加假設(shè)干個(gè)源文件,但是一個(gè)工程中只能有一個(gè)主函數(shù),因此在針對(duì)HOT-51實(shí)驗(yàn)板練習(xí)時(shí),每次只能添加

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論