版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第4章章C51C51語(yǔ)言編程基礎(chǔ)語(yǔ)言編程基礎(chǔ) 2內(nèi)容概要內(nèi)容概要 本章在已掌握標(biāo)準(zhǔn)本章在已掌握標(biāo)準(zhǔn)C C語(yǔ)言前提下語(yǔ)言前提下,初步介紹如何如何使用使用C51C51來(lái)編寫(xiě)來(lái)編寫(xiě)89C5189C51單片機(jī)的應(yīng)用程序單片機(jī)的應(yīng)用程序。 C51C51是在標(biāo)準(zhǔn)是在標(biāo)準(zhǔn)C C的基礎(chǔ)上,根據(jù)單片機(jī)存儲(chǔ)器硬件的基礎(chǔ)上,根據(jù)單片機(jī)存儲(chǔ)器硬件結(jié)構(gòu)及內(nèi)部資源,擴(kuò)展了相應(yīng)的數(shù)據(jù)類(lèi)型和變量,結(jié)構(gòu)及內(nèi)部資源,擴(kuò)展了相應(yīng)的數(shù)據(jù)類(lèi)型和變量,而C51在語(yǔ)法規(guī)定、程序結(jié)構(gòu)與設(shè)計(jì)方法上,都與標(biāo)準(zhǔn)在語(yǔ)法規(guī)定、程序結(jié)構(gòu)與設(shè)計(jì)方法上,都與標(biāo)準(zhǔn)C C相同。相同。 本章重點(diǎn)介紹本章重點(diǎn)介紹C51C51對(duì)標(biāo)準(zhǔn)對(duì)標(biāo)準(zhǔn)C C所擴(kuò)展的部分所擴(kuò)展的
2、部分,并通過(guò)一些例程例程來(lái)介紹C51的程序設(shè)計(jì)思想。3單片機(jī)入門(mén)主要掌握以下知識(shí)和應(yīng)用單片機(jī)入門(mén)主要掌握以下知識(shí)和應(yīng)用 最小系統(tǒng)能夠運(yùn)行起來(lái)的必要條件。 1.電源 2.晶振3.復(fù)位電路 對(duì)單片機(jī)任意IO口的隨意操作 1.輸出控制電平高低 2.輸入檢測(cè)電平高低。 定時(shí)器:重點(diǎn)掌握最常用的方式2 中斷:外部中斷、定時(shí)器中斷、串口中斷 串口通信:?jiǎn)纹瑱C(jī)之間、單片機(jī)與計(jì)算機(jī)間4 目前51系列單片機(jī)編程的C語(yǔ)言都采用Keil C51(簡(jiǎn)稱(chēng)C51),C51是在是在標(biāo)準(zhǔn)標(biāo)準(zhǔn)C C語(yǔ)言語(yǔ)言基礎(chǔ)上發(fā)展起來(lái)的?;A(chǔ)上發(fā)展起來(lái)的。C51C51編程語(yǔ)編程語(yǔ)言與標(biāo)準(zhǔn)言與標(biāo)準(zhǔn)C C語(yǔ)言語(yǔ)言相同,也有自身特點(diǎn)。相同,也有自
3、身特點(diǎn)。 軟硬件軟硬件結(jié)合!結(jié)合!(編程過(guò)程要(編程過(guò)程要始終考慮硬件系統(tǒng)始終考慮硬件系統(tǒng)。) C語(yǔ)言是美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)制定的編程語(yǔ)言標(biāo)準(zhǔn),1987年ANSI公布87 ANSI C87 ANSI C,即標(biāo)準(zhǔn)C語(yǔ)言。KeilKeil C51 C51語(yǔ)語(yǔ)言言是在是在ANSI CANSI C的基礎(chǔ)上針對(duì)的基礎(chǔ)上針對(duì)5151單片機(jī)的硬件特點(diǎn)進(jìn)行的單片機(jī)的硬件特點(diǎn)進(jìn)行的擴(kuò)展,擴(kuò)展,并向51單片機(jī)上移植。 經(jīng)過(guò)多年努力,C51語(yǔ)言已經(jīng)成為公認(rèn)的高效、簡(jiǎn)潔而又貼近51單片機(jī)硬件的實(shí)用高級(jí)編程語(yǔ)言。4.1 4.1 編程語(yǔ)言編程語(yǔ)言Keil C51Keil C51簡(jiǎn)介簡(jiǎn)介5 C 語(yǔ)言具有結(jié)構(gòu)化和模塊
4、化特點(diǎn),便于閱讀和維護(hù)。 C 語(yǔ)言可移植性好,很多微控制器都支持C 編譯器。功能化的代碼能夠很方便的從一個(gè)工程移植到另一個(gè)工程,從而減少了開(kāi)發(fā)時(shí)間。提供的庫(kù)函數(shù)包含許多標(biāo)準(zhǔn)子程序,具有較強(qiáng)的數(shù)據(jù)處理能力。使用使用C C語(yǔ)言的優(yōu)點(diǎn)語(yǔ)言的優(yōu)點(diǎn)6使用使用C C語(yǔ)言的優(yōu)點(diǎn)語(yǔ)言的優(yōu)點(diǎn) C 語(yǔ)言編寫(xiě)的程序比匯編語(yǔ)言編寫(xiě)的程序更符合人們的思考習(xí)慣,寄存器分配,不同存儲(chǔ)器的尋址及數(shù)據(jù)類(lèi)型等細(xì)節(jié)交由編譯器管理,開(kāi)發(fā)者可以更專(zhuān)心的考慮算法,而不是考慮一些細(xì)節(jié)問(wèn)題。這樣可以減少編程出錯(cuò)的機(jī)率,從而提高開(kāi)發(fā)效率,減少調(diào)試的時(shí)間。 C 語(yǔ)言和微控制器是相對(duì)獨(dú)立的,開(kāi)發(fā)者不必知道處理器的具體內(nèi)部結(jié)構(gòu)和處理過(guò)程。當(dāng)用新型的
5、微控制器開(kāi)發(fā)程序時(shí),可以很快上手,減少學(xué)習(xí)時(shí)間和程序開(kāi)發(fā)時(shí)間。7C51C51與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C C的主要區(qū)別的主要區(qū)別:深入理解深入理解以及以及,是掌握,是掌握C51C51語(yǔ)言的語(yǔ)言的之一。之一。n(1 1)頭文件的差異)頭文件的差異 51系列單片機(jī)廠(chǎng)家有多個(gè),它們的差異在于內(nèi)部資差異在于內(nèi)部資源如定時(shí)器、中斷、源如定時(shí)器、中斷、I/OI/O等數(shù)量以及功能的不同等數(shù)量以及功能的不同,而對(duì)使用者來(lái)說(shuō),只需要將相應(yīng)的功能寄存器的頭文件加載在程序內(nèi),就可實(shí)現(xiàn)所具有的功能。因此,KeilKeil C51 C51系列的頭文件系列的頭文件集中體現(xiàn)了各系列芯片的不同資源及功能。(REG52.hREG52.h)
6、(2 2)數(shù)據(jù)類(lèi)型的不同)數(shù)據(jù)類(lèi)型的不同 電腦CPU是32位或64位,運(yùn)算能力強(qiáng),內(nèi)存大,大量使用float型與long int型變量。單片機(jī)一般為8位或16位,運(yùn)算能力較弱,以char型為主,int型為輔。 51系列單片機(jī)包含位操作空間和豐富的位操作指令,與 ANSI C 相比又?jǐn)U展了4種類(lèi)型,以便能夠靈活地進(jìn)行操作。8(3 3)數(shù)據(jù)存儲(chǔ)類(lèi)型的不同)數(shù)據(jù)存儲(chǔ)類(lèi)型的不同。C語(yǔ)言最初是為通用計(jì)算機(jī)設(shè)計(jì)的,在通用計(jì)算機(jī)中只有一個(gè)程序和數(shù)據(jù)統(tǒng)一尋址的內(nèi)存空間。而而5151系列單片機(jī)系列單片機(jī)有片內(nèi)、有片內(nèi)、外程序存儲(chǔ)器,還有片內(nèi)、外數(shù)據(jù)存儲(chǔ)器。外程序存儲(chǔ)器,還有片內(nèi)、外數(shù)據(jù)存儲(chǔ)器。標(biāo)準(zhǔn)標(biāo)準(zhǔn)C C并沒(méi)
7、有提供這部分存儲(chǔ)并沒(méi)有提供這部分存儲(chǔ)器的地址范圍的定義。器的地址范圍的定義。此外,對(duì)于AT89S51單片機(jī)中大量的特殊功能寄存器也沒(méi)有定義。(4 4)標(biāo)準(zhǔn))標(biāo)準(zhǔn)C C語(yǔ)言語(yǔ)言沒(méi)有沒(méi)有處理處理單片機(jī)中斷單片機(jī)中斷的定義的定義。而而C51C51中定義了專(zhuān)門(mén)的中斷函數(shù)。中定義了專(zhuān)門(mén)的中斷函數(shù)。(5 5)Keil C51與標(biāo)準(zhǔn)C的庫(kù)函數(shù)庫(kù)函數(shù)有較大的不同。 1 1)部分庫(kù)函數(shù)不適合于單片機(jī)系統(tǒng),被排除在)部分庫(kù)函數(shù)不適合于單片機(jī)系統(tǒng),被排除在C51C51語(yǔ)言之外,語(yǔ)言之外,如如圖形函圖形函 數(shù)數(shù)。2 2)有些庫(kù))有些庫(kù)函數(shù)繼續(xù)函數(shù)繼續(xù)使用,使用,但針對(duì)單片機(jī)硬件但針對(duì)單片機(jī)硬件特點(diǎn)做出相應(yīng)的開(kāi)發(fā)。特點(diǎn)
8、做出相應(yīng)的開(kāi)發(fā)。 例如庫(kù)函數(shù)例如庫(kù)函數(shù)printfprintf和和scanfscanf。(在標(biāo)準(zhǔn)。(在標(biāo)準(zhǔn)C C中用于打印和接收字符,在中用于打印和接收字符,在C51C51中用于中用于)。)。9(6 6)有差異有差異 由于由于5151單片機(jī)硬件資源有限,它的編譯單片機(jī)硬件資源有限,它的編譯系統(tǒng)不允許太多的程序嵌套。其次,標(biāo)準(zhǔn)系統(tǒng)不允許太多的程序嵌套。其次,標(biāo)準(zhǔn)C C所具備的遞歸特性所具備的遞歸特性不被不被C51C51語(yǔ)言支持。語(yǔ)言支持。 (7 7)目標(biāo)代碼)目標(biāo)代碼 電腦生成.exe格式,編譯完成后直接在電腦上運(yùn)行,單片機(jī)編譯生成.bin代碼文件,需要燒寫(xiě)到單片機(jī)中并結(jié)合外圍電路執(zhí)行。(8 8
9、)仿真調(diào)試)仿真調(diào)試 單片機(jī)的C程序在電腦上進(jìn)行編譯,然后需通過(guò)仿真器連接后進(jìn)行仿真調(diào)試,近年來(lái)隨著電路仿真軟件的不斷完善,也可通過(guò)proteus等軟件直接在電腦上進(jìn)行仿真調(diào)試。10 但是從數(shù)據(jù)運(yùn)算操作、程序控制語(yǔ)句以及函數(shù)但是從數(shù)據(jù)運(yùn)算操作、程序控制語(yǔ)句以及函數(shù)的使用上來(lái)說(shuō),的使用上來(lái)說(shuō),Keil C51Keil C51與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C C幾乎沒(méi)有什么明顯幾乎沒(méi)有什么明顯的差別。的差別。如果程序設(shè)計(jì)者具備了有關(guān)標(biāo)準(zhǔn)C的編程基礎(chǔ),只要注意Keil C51與標(biāo)準(zhǔn)C的不同之處,并熟悉AT89S51單片機(jī)的硬件結(jié)構(gòu),就能夠較快地掌握Keil C51的編程。關(guān)鍵字-編程語(yǔ)言保留的,它們具有固定名稱(chēng)和含義
10、。在程序編寫(xiě)中不允許用戶(hù)自己定義的標(biāo)識(shí)符與關(guān)鍵字相同!C51中的關(guān)鍵字除了有ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì))C標(biāo)準(zhǔn)的32個(gè)關(guān)鍵字外,還根據(jù)51單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的關(guān)鍵字。掌握不同之處從關(guān)鍵字開(kāi)始!關(guān)鍵字關(guān)鍵字用途用途說(shuō)明說(shuō)明bitbit位標(biāo)量聲明聲明一個(gè)位標(biāo)量或位類(lèi)型的函數(shù)聲明一個(gè)位標(biāo)量或位類(lèi)型的函數(shù)sbitsbit位標(biāo)量聲明聲明一個(gè)可位尋址變量聲明一個(gè)可位尋址變量sfrsfr特殊功能寄存器聲明聲明一個(gè)特殊功能寄存器聲明一個(gè)特殊功能寄存器sfr16sfr16特殊功能寄存器聲明聲明一個(gè)聲明一個(gè)1616位的特殊功能寄存器位的特殊功能寄存器datadata存儲(chǔ)器類(lèi)型說(shuō)明直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器直接尋
11、址的內(nèi)部數(shù)據(jù)存儲(chǔ)器bdatabdata存儲(chǔ)器類(lèi)型說(shuō)明可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器idataidata存儲(chǔ)器類(lèi)型說(shuō)明間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器pdatapdata存儲(chǔ)器類(lèi)型說(shuō)明分頁(yè)尋址的外部數(shù)據(jù)存儲(chǔ)器分頁(yè)尋址的外部數(shù)據(jù)存儲(chǔ)器xdataxdata存儲(chǔ)器類(lèi)型說(shuō)明外部數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存儲(chǔ)器codecode存儲(chǔ)器類(lèi)型說(shuō)明程序存儲(chǔ)器程序存儲(chǔ)器interruptinterrupt中斷函數(shù)說(shuō)明定義一個(gè)中斷函數(shù)定義一個(gè)中斷函數(shù)reentrantreentrant再入函數(shù)說(shuō)明定義一個(gè)再入函數(shù)定義一個(gè)再入函數(shù)usingusing寄存器組選擇選擇單片機(jī)的工作寄存器組選擇單片
12、機(jī)的工作寄存器組_at_at_絕對(duì)地址說(shuō)明為非位變量指定存儲(chǔ)空間絕對(duì)地址為非位變量指定存儲(chǔ)空間絕對(duì)地址smallsmall存儲(chǔ)模式選擇參數(shù)及局部變量放入可直接尋址的內(nèi)部參數(shù)及局部變量放入可直接尋址的內(nèi)部RAMRAMcompactcompact存儲(chǔ)模式選擇參數(shù)及局部變量放入分頁(yè)外部數(shù)據(jù)存儲(chǔ)區(qū)參數(shù)及局部變量放入分頁(yè)外部數(shù)據(jù)存儲(chǔ)區(qū)largelarge存儲(chǔ)模式選擇參數(shù)及局部變量放入分頁(yè)外部數(shù)據(jù)存儲(chǔ)區(qū)參數(shù)及局部變量放入分頁(yè)外部數(shù)據(jù)存儲(chǔ)區(qū)C51C51新增加的關(guān)鍵字新增加的關(guān)鍵字13:由源代碼文件生成目標(biāo)文件由源代碼文件生成目標(biāo)文件:包含了編譯器、鏈接器等開(kāi)發(fā)工具的組合包包含了編譯器、鏈接器等開(kāi)發(fā)工具的組合
13、包 將項(xiàng)目管理、源代碼編輯和程序編譯、鏈接、調(diào)試等各種工具組合在一個(gè)將項(xiàng)目管理、源代碼編輯和程序編譯、鏈接、調(diào)試等各種工具組合在一個(gè)功能強(qiáng)大的環(huán)境中,具有良好人機(jī)界面。功能強(qiáng)大的環(huán)境中,具有良好人機(jī)界面。8051單片機(jī)所使用的單片機(jī)所使用的C語(yǔ)言編譯器簡(jiǎn)稱(chēng)為語(yǔ)言編譯器簡(jiǎn)稱(chēng)為 Cx51例如包含例如包含Cx51、Ax51、BL51、LIB51、OH51、RTX51等等KEIL C51 4.2 Keil C514.2 Keil C51的開(kāi)發(fā)工具的開(kāi)發(fā)工具14Cx51.exe15C C語(yǔ)言結(jié)構(gòu)特點(diǎn)語(yǔ)言結(jié)構(gòu)特點(diǎn) 一個(gè)C程序由一個(gè)或多個(gè)函數(shù)組成,其中必須有一個(gè)用main命名的主函數(shù)。 每個(gè)函數(shù)由頭部和函數(shù)
14、體兩部分組成。 每個(gè)C語(yǔ)句以“;”結(jié)尾。 C程序的書(shū)寫(xiě)格式比較自由。 可以在程序的任何位置用/*.*/對(duì)C程序中的任何部分作注釋。 可以在行末用/追加注釋。16(一個(gè)或若干個(gè))(一個(gè)或若干個(gè))n 程序的入口程序的入口 函數(shù)名固定,且與書(shū)寫(xiě)的位置無(wú)關(guān)函數(shù)名固定,且與書(shū)寫(xiě)的位置無(wú)關(guān)n 有且僅有一個(gè)有且僅有一個(gè)n 庫(kù)函數(shù)或用戶(hù)自定義的函數(shù)庫(kù)函數(shù)或用戶(hù)自定義的函數(shù)n 可以有若干個(gè)可以有若干個(gè)C51程序大體上是若干函數(shù)的集合17單片機(jī)控制單片機(jī)控制LEDLED(電路圖)(電路圖)XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237
15、P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52C122pFC222pFC310uFX1CRYSTALD1LED-REDR
16、1220R210k18我的第一個(gè)程序(單片機(jī)控制我的第一個(gè)程序(單片機(jī)控制LEDLED點(diǎn)亮)點(diǎn)亮)#include sbit LED = P10;void main( )/主程序 LED = 0;/點(diǎn)亮LED while(1);19單片機(jī)控制單片機(jī)控制LEDLED閃爍(程序)閃爍(程序)#include #define uchar unsigned char#define uint unsigned intsbit LED = P10;void delay(uint x)/延時(shí)程序 uchar i; while(x-) for(i = 0;i 120; i+); void main()/主程序
17、 while(1) LED = LED; /LED燈閃爍 delay(400); 20KEILKEIL與與PROTEUSPROTEUS快速入門(mén)快速入門(mén) Keil C51Keil C51是美國(guó)是美國(guó)Keil SoftwareKeil Software公司出品的公司出品的5151系列兼容單系列兼容單片機(jī)片機(jī)C C語(yǔ)言軟件開(kāi)發(fā)系統(tǒng),與匯編相比,語(yǔ)言軟件開(kāi)發(fā)系統(tǒng),與匯編相比,C C語(yǔ)言在功能上、結(jié)語(yǔ)言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。用過(guò)匯編語(yǔ)言后再使用用過(guò)匯編語(yǔ)言后再使用C C來(lái)開(kāi)發(fā),體會(huì)更加深刻。來(lái)開(kāi)發(fā),體會(huì)更加深刻
18、。 Keil C51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開(kāi)發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。在開(kāi)發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語(yǔ)言的優(yōu)勢(shì)。 21 1、建立一個(gè)新工程 單擊Project菜單,在彈出的下拉菜單中選中New Project選項(xiàng),如圖3所示。圖3 新建工程文件KEIL C51KEIL C51快速入門(mén)快速入門(mén)22 2、然后選擇你要保存的路徑,輸入工程文件的名字, 如圖4所示,然后點(diǎn)擊保存。圖4 新建工程文件的保存路徑KEIL C51KEIL C51快速
19、入門(mén)快速入門(mén)23 3、這時(shí)會(huì)彈出一個(gè)對(duì)話(huà)框,要求你選擇單片機(jī)的型號(hào),你可以根據(jù)你使用的單片機(jī)來(lái)選擇,keil c51幾乎支持所有的51內(nèi)核的單片機(jī), 如圖所示,選擇89C51之后,右邊欄是對(duì)這個(gè)單片機(jī)的基本的說(shuō)明,然后點(diǎn)擊確定。圖5 選擇單片機(jī)的型號(hào)KEIL C51KEIL C51快速入門(mén)快速入門(mén)244、完成上一步驟后,屏幕如圖6所示。圖6 完成新建工程文件KEIL C51KEIL C51快速入門(mén)快速入門(mén)25 下面可以編寫(xiě)程序。 5、在圖2-7中,單擊“File”菜單,再在下拉菜單中單擊“New”選項(xiàng)。新建文件后屏幕如圖8所示。圖7 新建文檔圖8 完成 新建文檔KEIL C51KEIL C51
20、快速入門(mén)快速入門(mén)26 此時(shí)光標(biāo)在編輯窗口里閃爍,這時(shí)可以鍵入應(yīng)用程序了,建議首先保存該空白的文件,單擊菜單上的“File”,在下拉菜單中選中“Save As”選項(xiàng)單擊,屏幕如下圖所示,在“文件名”欄右側(cè)的編輯框中,鍵入欲使用的文件名,用C語(yǔ)言編寫(xiě)擴(kuò)展名為(.c)如果用匯編語(yǔ)言編寫(xiě)擴(kuò)展名必須為(.asm)。然后,單擊“保存”按鈕。 如圖8所示。圖8 保存新建文檔KEIL C51KEIL C51快速入門(mén)快速入門(mén)27 6、回到編輯界面后,單擊“Target 1”前面的“”號(hào),然后在“Source Group 1”上單擊右鍵,彈出菜單9。圖9 打開(kāi)添加文檔界面KEIL C51KEIL C51快速入門(mén)快
21、速入門(mén)28 然后單擊“Add File to Group Source Group 1”,屏幕如圖10所示。 圖10 添加文檔KEIL C51KEIL C51快速入門(mén)快速入門(mén)29選中main.c,然后單擊“Add ”屏幕如下圖所示。 注意到“Source Group 1”文件夾中多了一個(gè)子項(xiàng)“main.c”子項(xiàng)的多少與所增加的源程序的多少相同。 7、現(xiàn)在便可輸入程序了,輸入完畢進(jìn)行調(diào)試便可運(yùn)行。 圖10 完成添加文檔KEIL C51KEIL C51快速入門(mén)快速入門(mén)30Proteus Proteus 快速入門(mén)快速入門(mén) Proteus軟件和我們手頭的其他電路設(shè)計(jì)仿真軟件最大的不同即它的功能不是單一
22、的。它的強(qiáng)大的元件庫(kù)可以和任何電路設(shè)計(jì)軟件相媲美;它的電路仿真功能可以和Multisim相媲美,且獨(dú)特的單片機(jī)仿真功能是Multisim及其他任何仿真軟件都不具備的;它的PCB電路制版功能可以和Protel相媲美。它的功能不但強(qiáng)大,而且每種功能都毫不遜于Protel,是學(xué)習(xí)電子設(shè)計(jì)難得的一個(gè)工具軟件。31 ISIS智能原理圖輸入系統(tǒng),系統(tǒng)設(shè)計(jì)與仿真的基本平臺(tái)。 ARES 高級(jí)PCB布線(xiàn)編輯軟件。 在Proteus中,從原理圖設(shè)計(jì)、單片機(jī)編程、系統(tǒng)仿真到PCB設(shè)計(jì)一氣呵成,真正實(shí)現(xiàn)了從概念到產(chǎn)品的完整設(shè)計(jì)。Proteus 從原理圖設(shè)計(jì)到PCB設(shè)計(jì),再到電路板完成的流程如圖所示。32 數(shù)據(jù) 數(shù)據(jù)類(lèi)
23、型、數(shù)據(jù)結(jié)構(gòu)、存儲(chǔ)類(lèi)型 運(yùn)算 算術(shù)運(yùn)算、關(guān)系運(yùn)算、邏輯運(yùn)算、位操作 控制 順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、函數(shù)4.3 C514.3 C51語(yǔ)言程序設(shè)計(jì)基礎(chǔ)語(yǔ)言程序設(shè)計(jì)基礎(chǔ) C51 C51語(yǔ)言程序設(shè)計(jì)的三大要素語(yǔ)言程序設(shè)計(jì)的三大要素334.3.1 C514.3.1 C51數(shù)據(jù)類(lèi)型與存儲(chǔ)類(lèi)型數(shù)據(jù)類(lèi)型與存儲(chǔ)類(lèi)型 常量與變量 常量:程序運(yùn)行中值不能改變的量稱(chēng)為常量,常量存在于ROM中。 變量:變量代表存貯器中的一個(gè)或多個(gè)存儲(chǔ)單元,用來(lái)存放數(shù)據(jù),一般來(lái)講這些值在程序運(yùn)行中可以改變(只讀變量除外) 變量名命名規(guī)則:變量名只能由半角的字母、數(shù)字、下劃線(xiàn)組成,且第一個(gè)字符不能是數(shù)字。 變量存在的類(lèi)型稱(chēng)為變量存在
24、的類(lèi)型稱(chēng)為數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型。34C51C51數(shù)據(jù)類(lèi)型與標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型與標(biāo)準(zhǔn)C C數(shù)據(jù)類(lèi)型的最大不同之處:數(shù)據(jù)類(lèi)型的最大不同之處:位型位型。位型(位型(bit)字符型(字符型(char)整型(整型(int)長(zhǎng)整型(長(zhǎng)整型(long)浮點(diǎn)型(浮點(diǎn)型(float)雙精度浮點(diǎn)型(雙精度浮點(diǎn)型(double)數(shù)組類(lèi)型(數(shù)組類(lèi)型(array)結(jié)構(gòu)體類(lèi)型(結(jié)構(gòu)體類(lèi)型(struct)共用體(共用體(union)枚舉(枚舉(enum)基本類(lèi)型基本類(lèi)型構(gòu)造類(lèi)型構(gòu)造類(lèi)型指針類(lèi)型指針類(lèi)型空類(lèi)型空類(lèi)型數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型35C51C51數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型C51專(zhuān)用長(zhǎng)度取值范圍signed char單字
25、節(jié)-128 to +127unsigned char單字節(jié)0 to 255signed int2字節(jié)-32768 to +32767unsigned int2字節(jié)0 to 65535signed long4字節(jié)-2147483648 to +214746483647unsigned long4字節(jié)0 to 4294967295float4字節(jié)1.175494E-38 to 3.402823E+38double8字節(jié)1.175494E-308*13字節(jié)對(duì)象的地址36數(shù)據(jù)類(lèi)型C51專(zhuān)用長(zhǎng)度取值范圍bit專(zhuān)用1位0 或 1sbit專(zhuān)用1位0 或 1sfr專(zhuān)用1字節(jié)0 255sfr16專(zhuān)用2字節(jié)0 6
26、5535C51C51數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型3738C C語(yǔ)言的變量定義與賦值語(yǔ)言的變量定義與賦值 定義一個(gè)變量 先定義,后使用。例如:Int a; char b; 變量賦初值,C允許在定義變量的同時(shí)給變量賦初值。 例如: char c = a; int a = 7; int a,b,c=9; /定義a、b、c為整型變量,對(duì)c賦初值。 int a = 3,b = 3,c = 3; 錯(cuò)誤:int a=b=c=3;39 定義定義變量類(lèi)型變量類(lèi)型應(yīng)考慮如下問(wèn)題:應(yīng)考慮如下問(wèn)題:程序運(yùn)行時(shí)該變量可能的取值范圍,是否有負(fù)值,絕對(duì)值有多大,以及相應(yīng)需要的存儲(chǔ)空間大小。在夠用的情況下,盡量選擇8位即一個(gè)字節(jié)的cha
27、r型,特別是unsiged char。對(duì)于51系列這樣的定點(diǎn)機(jī)而言,浮點(diǎn)類(lèi)型變量將明顯增加運(yùn)算時(shí)間和程序長(zhǎng)度,如果可以的話(huà),盡量使用靈活巧妙的算法來(lái)避免浮點(diǎn)變量的引入。40C51C51的擴(kuò)展數(shù)據(jù)類(lèi)型的擴(kuò)展數(shù)據(jù)類(lèi)型(1 1)位變量)位變量bitbitbit的值可以是1(true), 也可以是0(false)。使用關(guān)鍵字使用關(guān)鍵字bitbit例如:例如:bit lockbit lock;/ /* *將將locklock定義為位變量定義為位變量* */ /bit direntionbit dirention;/ /* *將將directiondirection定義為位變量定義為位變量* */ /41
28、42C51C51的擴(kuò)展數(shù)據(jù)類(lèi)型的擴(kuò)展數(shù)據(jù)類(lèi)型(2 2)特殊功能寄存器)特殊功能寄存器sfrsfr AT89S51特殊功能寄存器在片內(nèi)RAM區(qū)的80HFFH之間,“sfrsfr” 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型占用一個(gè)內(nèi)存單元。利用它可訪(fǎng)問(wèn)AT89S51內(nèi)部的所有特殊功能寄存器。 例如:例如:sfr P1=0 x90sfr P1=0 x90這一語(yǔ)句定義P1口在片內(nèi)的寄存器,在后面語(yǔ)句中可用“P1=0 xff”(使P1的所有引腳輸出為高電平)之類(lèi)的語(yǔ)句來(lái)操作特殊功能寄存器。 標(biāo)準(zhǔn)SFR在reg51.h、reg52.h 等頭文件中已經(jīng)被定義,只要用文件包含做出申明即可使用。43(3 3)特殊功能寄存器)特殊功能寄
29、存器sfr16sfr16 “sfr16sfr16”數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型占用兩個(gè)內(nèi)存單元。sfr16和sfr一樣用于操作特殊功能寄存器。所不同的是它用于操作占兩個(gè)字節(jié)的特殊功能寄存器。 例如:例如: sfr16 DPTR=0 x82sfr16 DPTR=0 x82語(yǔ)句定義了片內(nèi)16位數(shù)據(jù)指針寄存器DPTR,其低8位字節(jié)地址為82H。在后面的語(yǔ)句中可以對(duì)DPTR進(jìn)行操作。44(4 4)特殊功能位)特殊功能位 sbitsbitsbitsbit 是指AT89C51片內(nèi)特殊功能寄存器的可尋址位。例如:例如: sfr PSW=0 xd0sfr PSW=0 xd0 ;/ /* *定義定義PSWPSW寄存器地址為
30、寄存器地址為0 xd00 xd0* */ /sbit PSW 2 = 0 xd2sbit PSW 2 = 0 xd2;/ /* *定義定義OVOV位為位為PSW.2PSW.2* */ /符號(hào)“”前面是特殊功能寄存器的名字,“”的后面數(shù)字定義特殊功能寄存器可尋址位在寄存器中的位置,取值必須是07。注意,不要把注意,不要把bitbit與與sbitsbit混淆?;煜?。bit用來(lái)定義普通的位變量,值只能是二進(jìn)制的0或1。而sbit定義的是特殊功能位。45#include sbit D3 = P22;void main() D3 = 0 ; /點(diǎn)亮LED while(1) /循環(huán),掛起 ; _ _ _
31、引用含有引用含有SFRSFR符號(hào)定義的頭文件符號(hào)定義的頭文件 定義符號(hào)定義符號(hào)D3D3為為P2P2口的第口的第2 2位位 D3D3可以換為其他自定義符號(hào),作可以換為其他自定義符號(hào),作用相同,如:用相同,如: sbit P2_2 = P22;sbit P2_2 = P22; 點(diǎn)亮發(fā)光二極管的功能語(yǔ)句點(diǎn)亮發(fā)光二極管的功能語(yǔ)句 while(1)while(1)無(wú)限循環(huán),用于程序的無(wú)限循環(huán),用于程序的反復(fù)執(zhí)行或者程序掛起,很重要!反復(fù)執(zhí)行或者程序掛起,很重要! 使用使用tabtab或者空格,使程序結(jié)構(gòu)或者空格,使程序結(jié)構(gòu)清晰,便于閱讀清晰,便于閱讀 適當(dāng)加入注釋?zhuān)咕幊趟悸非逦m當(dāng)加入注釋?zhuān)咕幊趟?/p>
32、路清晰,便于閱讀和后期的修改便于閱讀和后期的修改q sbit的使用46 89S51 89S51單片機(jī)的數(shù)據(jù)存儲(chǔ)類(lèi)型單片機(jī)的數(shù)據(jù)存儲(chǔ)類(lèi)型 8051系列微處理器采用了哈佛結(jié)構(gòu),即程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器是分離的。8051系列微處理器提供了三種不同類(lèi)型的存儲(chǔ)區(qū)域(memory areas): 程序存儲(chǔ)區(qū)(program memory) 內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(internal data memory) 外部數(shù)據(jù)存儲(chǔ)區(qū)(external data memory) 這三種存儲(chǔ)區(qū)域均從地址0開(kāi)始編址,通過(guò)采用不同的尋址指令來(lái)解決地址重疊的問(wèn)題。 47存儲(chǔ)類(lèi)型存儲(chǔ)類(lèi)型說(shuō)明說(shuō)明直接尋址的片內(nèi)數(shù)據(jù)存儲(chǔ)器(128B),訪(fǎng)問(wèn)
33、速度最快(00H-7FH)可位尋址的片內(nèi)數(shù)據(jù)存儲(chǔ)器(16B),允許位和字節(jié)混合訪(fǎng)問(wèn)(20H-2FH)間接訪(fǎng)問(wèn)的片內(nèi)數(shù)據(jù)存儲(chǔ)器(256B),全部片內(nèi)RAM空間(00H-FFH)分頁(yè)訪(fǎng)問(wèn)的片外數(shù)據(jù)存儲(chǔ)器(256B) 00H-FFH片外數(shù)據(jù)存儲(chǔ)器(64KB),訪(fǎng)問(wèn)速度相對(duì)比較慢 0000H-FFFFH程序存儲(chǔ)器(64KB) 0000H-FFFFHn C51數(shù)據(jù)的存儲(chǔ)類(lèi)型數(shù)據(jù)的存儲(chǔ)類(lèi)型 在討論在討論C51的數(shù)據(jù)類(lèi)型的時(shí)候,必須理解數(shù)據(jù)的的數(shù)據(jù)類(lèi)型的時(shí)候,必須理解數(shù)據(jù)的存儲(chǔ)類(lèi)型存儲(chǔ)類(lèi)型和它與和它與8051單片機(jī)單片機(jī)存儲(chǔ)器結(jié)構(gòu)存儲(chǔ)器結(jié)構(gòu)的關(guān)系的關(guān)系.48C51C51存儲(chǔ)類(lèi)型存儲(chǔ)類(lèi)型存儲(chǔ)器類(lèi)型存儲(chǔ)區(qū)域大小
34、對(duì)應(yīng)的匯編語(yǔ)句(了解)描述code程序存儲(chǔ)區(qū)64KBMOVC A,A+DPTR用來(lái)說(shuō)明常量data直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)128BMOV XX,#ADDR訪(fǎng)問(wèn)速度快idata間接尋址的內(nèi)部數(shù)據(jù)區(qū)256BMOV XX,Rn可訪(fǎng)問(wèn)整個(gè)內(nèi)部數(shù)據(jù)區(qū)域bdata位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)16B可使用位尋址或字節(jié)尋址來(lái)訪(fǎng)問(wèn)這一區(qū)域xdata外部數(shù)據(jù)存儲(chǔ)或64KBMOVX A,DPTR使用DPTR來(lái)訪(fǎng)問(wèn)外部數(shù)據(jù)存儲(chǔ)器49存儲(chǔ)區(qū)域的劃分存儲(chǔ)區(qū)域的劃分50(1 1)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)()內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(internal data memoryinternal data memory) 內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(internal
35、data memory),共256個(gè)字節(jié)。這部分主要是作為程序的數(shù)據(jù)段。 前128 字節(jié),稱(chēng)為DATA 區(qū)。該區(qū)可采用直接尋址方式來(lái)訪(fǎng)問(wèn)。DATA區(qū)也以用R0 和R1間接尋址訪(fǎng)問(wèn)。 后128個(gè)字節(jié),即從地址80H 開(kāi)始的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū),用做特殊功能寄存器區(qū)(special function register memory),簡(jiǎn)稱(chēng)SFR。這些特殊功能寄存器用來(lái)控制計(jì)時(shí)器,計(jì)數(shù)器,串行I/O,I/O端口和外設(shè)的工作。只能直接尋址 注意:特殊功能寄存器并未占用特殊功能寄存器區(qū)的所有地址單元,即特殊功能寄存器是離散分布。51內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)的DATA區(qū)又可以細(xì)分為三個(gè)子段:四個(gè)工作寄存器組,每個(gè)寄存器組
36、包含8個(gè)寄存器,四個(gè)寄存器組共32 個(gè)字節(jié)。由PSW 的RS1 和RS0選擇四組寄存器的任意一組作為當(dāng)前工作寄存器組。位尋址段BDATA, 包括16 個(gè)字節(jié),共128 位,每一位都可單獨(dú)尋址。也可以按字節(jié)進(jìn)行尋址。一般數(shù)據(jù)存儲(chǔ)器,僅能按字節(jié)尋址,共80個(gè)字節(jié)。內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(internal data memoryinternal data memory)52(2 2)外部數(shù)據(jù)存儲(chǔ)區(qū)()外部數(shù)據(jù)存儲(chǔ)區(qū)(external data memoryexternal data memory) 也稱(chēng)為XDATA 區(qū)。XDATA區(qū)和CODE 區(qū)一樣也采用16 位地址尋址,即尋址空間可達(dá)64
37、KB。 該區(qū)通常包括一些通用數(shù)據(jù)存儲(chǔ)器或者一些需要通過(guò)總線(xiàn)接口訪(fǎng)問(wèn)的外圍器件。 訪(fǎng)問(wèn)外部數(shù)據(jù)區(qū)比訪(fǎng)問(wèn)內(nèi)部數(shù)據(jù)區(qū)要慢,因?yàn)樵L(fǎng)問(wèn)外部數(shù)據(jù)區(qū)時(shí),必須先將要訪(fǎng)問(wèn)單元的16位地址裝載到數(shù)據(jù)指針寄存器DPTR中,然后才能通過(guò)DPTR采用間接訪(fǎng)問(wèn)方式來(lái)訪(fǎng)問(wèn)該單元。53 C51使用兩種修飾符來(lái)表示外部數(shù)據(jù)區(qū):xdata , pdata xdata :說(shuō)明外部數(shù)據(jù)空間的所有64KB的地址空間。 pdata :指向外部數(shù)據(jù)空間中的大小為一頁(yè)(256字節(jié))的數(shù)據(jù)存儲(chǔ)空間。 注意:某些新型的51芯片有更大的XRAM(如16M的XRAM),一般用far類(lèi)型來(lái)描述這些區(qū)域??梢苑謩e用 far 和const far 來(lái)訪(fǎng)問(wèn)
38、位于擴(kuò)充RAM空間中的變量和擴(kuò)充ROM空間中的常量。 某些單片機(jī)芯片提供了片內(nèi)的XRAM空間,這種空間也使用和傳統(tǒng)的外部數(shù)據(jù)空間相同的指令來(lái)訪(fǎng)問(wèn)外部數(shù)據(jù)存儲(chǔ)區(qū)(外部數(shù)據(jù)存儲(chǔ)區(qū)(external data memoryexternal data memory)54 說(shuō)明:某些系列的單片機(jī)(如8052) 有額外的128 字節(jié)的內(nèi)部RAM, 同樣位于從80H 開(kāi)始的內(nèi)部數(shù)據(jù)存儲(chǔ)地址空間中,稱(chēng)為IDATA區(qū)。IDATA 區(qū)的地址和SFR的地址是重疊的,必須使用不同的尋址方式的指令來(lái)解決地址重疊問(wèn)題。SFR區(qū)只能通過(guò)直接尋址來(lái)訪(fǎng)問(wèn), IDATA 區(qū)只能通過(guò)間接尋址來(lái)訪(fǎng)問(wèn)。內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(
39、internal data memoryinternal data memory)55(3 3)程序存儲(chǔ)區(qū)()程序存儲(chǔ)區(qū)(CODECODE) 程序存儲(chǔ)區(qū),也稱(chēng)為CODE 區(qū),常用來(lái)存放可執(zhí)行代碼。代碼區(qū)的地址位數(shù)為16 位,即尋址空間可達(dá)64K。 一般情況,程序存儲(chǔ)區(qū)是只讀的,除了保存可執(zhí)行代碼,還可用于保存各種常量值,查找表等固定的數(shù)據(jù)結(jié)構(gòu)。如:unsigned char code test=“hello!”;56存儲(chǔ)器類(lèi)型的變量聲明舉例存儲(chǔ)器類(lèi)型的變量聲明舉例char data var1;char code text = ENTER PARAMETER:;unsigned long xda
40、ta array100; float idata x,y,z;unsigned int pdata dimension;unsigned char xdata vector1044;說(shuō)明:說(shuō)明:聲明變量時(shí)聲明變量時(shí)存儲(chǔ)區(qū)修飾符和數(shù)存儲(chǔ)區(qū)修飾符和數(shù)據(jù)類(lèi)型修飾符的位據(jù)類(lèi)型修飾符的位置可以互換,即置可以互換,即char data x; 和和 data char x; 是完是完全等效的。不過(guò)從全等效的。不過(guò)從兼容性考慮,建議兼容性考慮,建議使用前一種格式。使用前一種格式。57變量類(lèi)型修飾符總結(jié)變量類(lèi)型修飾符總結(jié) data: 速度最快,可以讀或?qū)懖僮?,只?28字節(jié),可以省略,89C51單片機(jī)默認(rèn)的變量
41、存儲(chǔ)位置就是128字節(jié)的片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)。 idata: 速度較快,可以讀或?qū)懖僮?,只?28字節(jié),注意只存在于尾綴為52以上的單片機(jī)中,當(dāng)data數(shù)據(jù)不夠可用idata。 xdata: 速度較慢,可以讀或?qū)懖僮?,最多?4k字節(jié)(取決于外接的SRAM芯片容量),一般用于解決內(nèi)部SRAM不夠用同時(shí)對(duì)變量訪(fǎng)問(wèn)不需要非??斓膽?yīng)用場(chǎng)合。 code: 速度最慢,只讀,最多有64K字節(jié)(取決于內(nèi)部ROM與外部ROM容量之和)。一般用于存儲(chǔ)大量的只讀數(shù)據(jù)(如圖形液晶的數(shù)據(jù),文本數(shù)據(jù)等)58 定義數(shù)據(jù)的存儲(chǔ)類(lèi)型通常遵循如下原則:定義數(shù)據(jù)的存儲(chǔ)類(lèi)型通常遵循如下原則:只要條件滿(mǎn)足,盡量選擇內(nèi)部直接尋址的存儲(chǔ)類(lèi)型d
42、ata,然后選擇idata即內(nèi)部間接尋址。對(duì)于那些經(jīng)常使用的變量要使用內(nèi)部尋址。在內(nèi)在內(nèi)部數(shù)據(jù)存儲(chǔ)器數(shù)量有限或不能滿(mǎn)足要求的情況下才使用外部部數(shù)據(jù)存儲(chǔ)器數(shù)量有限或不能滿(mǎn)足要求的情況下才使用外部數(shù)據(jù)存儲(chǔ)器。數(shù)據(jù)存儲(chǔ)器。選擇外部數(shù)據(jù)存儲(chǔ)器可先選擇pdatapdata類(lèi)型,最后最后選用選用xdataxdata類(lèi)型類(lèi)型。 需指出,擴(kuò)展片外存儲(chǔ)器,原理上雖很簡(jiǎn)單,但在實(shí)際開(kāi)發(fā)中,很多時(shí)候,會(huì)帶來(lái)不必要的麻煩,如可能降低系統(tǒng)穩(wěn)定性、增加成本、拉長(zhǎng)開(kāi)發(fā)和調(diào)試周期等,推薦充分利用片內(nèi)推薦充分利用片內(nèi)存儲(chǔ)空間。存儲(chǔ)空間。59另外,通常的單片機(jī)應(yīng)用都是面對(duì)小型的控制,代碼比較短,對(duì)于程序存儲(chǔ)區(qū)的大小要求很低,常常
43、是片內(nèi)RAM很緊張而片內(nèi)Flash ROM很富裕,因此如果實(shí)時(shí)性要求不高,可考慮可考慮使用使用宏宏,以及將一些子函數(shù)的常量數(shù)據(jù)做成數(shù)據(jù)表,放置在程序存儲(chǔ)區(qū),當(dāng)程序運(yùn)行時(shí),進(jìn)入子函數(shù)動(dòng)態(tài)調(diào)用下載至RAM即可,退出子函數(shù)后立即釋放該內(nèi)存空間。60定義變量時(shí)如果省略定義變量時(shí)如果省略“存儲(chǔ)器類(lèi)型存儲(chǔ)器類(lèi)型”選項(xiàng),則按編譯時(shí)使用選項(xiàng),則按編譯時(shí)使用的存儲(chǔ)器模式的存儲(chǔ)器模式來(lái)使用默認(rèn)的存儲(chǔ)來(lái)使用默認(rèn)的存儲(chǔ)器類(lèi)型。器類(lèi)型。默認(rèn)存儲(chǔ)類(lèi)型為默認(rèn)存儲(chǔ)類(lèi)型為data,訪(fǎng)問(wèn)速度最快,容量小,訪(fǎng)問(wèn)速度最快,容量小默認(rèn)存儲(chǔ)類(lèi)型為默認(rèn)存儲(chǔ)類(lèi)型為pdata默認(rèn)存儲(chǔ)類(lèi)型為默認(rèn)存儲(chǔ)類(lèi)型為xdata,訪(fǎng)問(wèn)效率最低,代碼長(zhǎng),訪(fǎng)問(wèn)效
44、率最低,代碼長(zhǎng),容量大容量大 數(shù)據(jù)存儲(chǔ)模式數(shù)據(jù)存儲(chǔ)模式61存儲(chǔ)模式(存儲(chǔ)模式(memory modelsmemory models) 如果在變量聲明時(shí)未聲明變量的存儲(chǔ)器類(lèi)型,則該變量的存儲(chǔ)器類(lèi)型,由程序的存儲(chǔ)模式來(lái)決定。 小模式(small model):默認(rèn)data區(qū) 緊湊模式(compact model):默認(rèn)pdata區(qū) 大模式(large model):默認(rèn)xdata區(qū) 注意:除非應(yīng)用在特殊的場(chǎng)合,否則SMALL存儲(chǔ)模式可以提供最快和最有效的代碼。 624.3.2 C514.3.2 C51語(yǔ)言的特殊功能寄存器及位變量定義語(yǔ)言的特殊功能寄存器及位變量定義 特殊功能器的定義 (1)使用關(guān)鍵
45、字定義sfr sfr IE = 0 xA8; (2)通過(guò)頭文件訪(fǎng)問(wèn)SFR #include #include (3)特殊功能寄存器中的位定義 sbit CY = PSW7; sbit CY = 0 xD07; sbit CY = 0 xD7;63 位變量的C51定義 (1)位變量的C51定義 (2)函數(shù)可以包含類(lèi)型為bit的參數(shù),也可將其作為返回值。 (3)位變量不能定義指針和數(shù)組。644.3.3 C514.3.3 C51語(yǔ)言的絕對(duì)地址訪(fǎng)問(wèn)語(yǔ)言的絕對(duì)地址訪(fǎng)問(wèn)65絕對(duì)宏絕對(duì)宏以字節(jié)形式對(duì)以字節(jié)形式對(duì)code區(qū)尋址;區(qū)尋址;以字形式對(duì)以字形式對(duì)code區(qū)尋址區(qū)尋址;以字節(jié)形式對(duì)以字節(jié)形式對(duì)data
46、區(qū)尋址區(qū)尋址;以字形式對(duì)以字形式對(duì)data區(qū)尋址;區(qū)尋址;以字節(jié)形式對(duì)以字節(jié)形式對(duì)xdata區(qū)尋址區(qū)尋址;以字形式對(duì)以字形式對(duì)xdata區(qū)尋址區(qū)尋址;以字節(jié)形式對(duì)以字節(jié)形式對(duì)pdata區(qū)尋址區(qū)尋址;以字形式對(duì)以字形式對(duì)pdata區(qū)尋址。區(qū)尋址?!纠科瑑?nèi)RAM、片外RAM及I/O的定義的程序如下:#include /*先聲明,再使用先聲明,再使用XBYTE和和DBYTE#define PORTA XBYTE0 xFFC0 /*將PORTA定義為外部I/O口,地址為0 xFFC0*/#define NRAM DBYTE0 x40 /*將NRAM定義為片內(nèi)RAM,地址為0 x40*/ main(
47、 ) PORTA=0 x3D; /*數(shù)據(jù)3DH寫(xiě)入地址0 xFFC0的外部I/O端口PORTA */ NRAM=0 x01; /*將數(shù)據(jù)01H寫(xiě)入片內(nèi)RAM的40H單元*/ 6667【例例】使用關(guān)鍵字_at_實(shí)現(xiàn)絕對(duì)地址的訪(fǎng)問(wèn),程序如下:void main(void) data unsigned char y1_at_0 x50; /*在data 區(qū)定義字節(jié)變量y1,它的地址為50H*/ xdata unsigned int y2_at_0 x4000; /*在xdata區(qū)定義字變量y2,地址為4000H*/ y1=0 xff; y1=0 x1234; while(1); 6869 C51的基
48、本運(yùn)算與標(biāo)準(zhǔn)C類(lèi)似,主要包括:算數(shù)運(yùn)算;關(guān)系運(yùn)算;邏輯運(yùn)算;位運(yùn)算;賦值運(yùn)算及其表達(dá)式。 4.3.4 C514.3.4 C51的數(shù)據(jù)運(yùn)算的數(shù)據(jù)運(yùn)算70符號(hào)說(shuō)明+加法運(yùn)算-減法運(yùn)算*乘法運(yùn)算/除法運(yùn)算%取模運(yùn)算+自增1-自減1算術(shù)運(yùn)算符及其說(shuō)明算術(shù)運(yùn)算符及其說(shuō)明71 對(duì)于“/ /”和“% %”往往會(huì)有疑問(wèn)。這兩個(gè)符號(hào)兩個(gè)符號(hào)都涉及除法運(yùn)算,但“/”運(yùn)算是取商,而“%” 運(yùn)算為取余數(shù)。例如例如“5/35/3”的結(jié)果(商)的結(jié)果(商)為1,而“5%35%3”的結(jié)果的結(jié)果為2(余數(shù))。 自增和自減運(yùn)算符是使變量自動(dòng)加1或減1,自增和自減運(yùn)算符放在變量前和變量之后是不同的。+i+i,-i-i:在使用:在
49、使用i i之前,先使之前,先使i i值加(減)值加(減)1 1。i+i+,i-i-:在使用:在使用i i之后,再使之后,再使i i值加(減)值加(減)1 1。72 例如:例如:若i=4,則執(zhí)行x=+i時(shí),先使i加1,再引用結(jié)果,即x=5,運(yùn)算結(jié)果為i=5,x=5。再如:再如:若i=4,則執(zhí)行x=i+時(shí),先引用i值,即x=4,再使i加1,運(yùn)算結(jié)果為i=5,x=4。73符號(hào)說(shuō)明&邏輯與邏輯或!邏輯非74符號(hào)說(shuō)明大于=大于或等于=小于或等于=等于!=不等于75 位運(yùn)算是指進(jìn)行二進(jìn)制位的運(yùn)算,在單片機(jī)編程中,常需要處理二進(jìn)制位的問(wèn)題。 例如:例如: 將寄存器的某一位或某幾位置1、清0與取反;將
50、一個(gè)存儲(chǔ)單元中各二進(jìn)制位左移或右移N位,兩個(gè)數(shù)按位相加等等。 C語(yǔ)言中提供位運(yùn)算的功能,更加貼近單片機(jī)硬件,與其他高級(jí)語(yǔ)言相比,具有很大的優(yōu)越性。76符號(hào)含義&按位與|按位或按位異或按位取反。一元運(yùn)算符右移操作。右邊移出的位舍去,左邊移入的位對(duì)無(wú)符號(hào)數(shù)補(bǔ)0;對(duì)有符號(hào)數(shù)補(bǔ)符號(hào)位77 左移運(yùn)算符() 用來(lái)將一個(gè)數(shù)的各二進(jìn)位全部左移若干位,左高位溢出,右低位補(bǔ)0。 如b=a2;a=a2;a=2; a=15,左移2位等于多少? 高位左移后溢出,舍棄掉。在該數(shù)左移時(shí)被溢出舍棄的高位不包含1時(shí),左移1位相當(dāng)于該數(shù)乘以2. 152=? 143) 用來(lái)將一個(gè)數(shù)的各二進(jìn)位全部右移若干位,左高位補(bǔ)0,右低
51、位溢出。 如b=a2;a=a2;a=2; a=15,左移2位等于多少? 低位右移后溢出,舍棄掉。 152=? 142=?79 按位異或運(yùn)算符() 異或運(yùn)算符的規(guī)則是參加運(yùn)算的兩個(gè)二進(jìn)制位相同為0(假),相異為1(真)。即 00=0;01=1;10=1;11=0; 例如:0 x2D0 x0F=0 x22,將十六進(jìn)制數(shù)0 x2D與十六進(jìn)制數(shù)0 x0F進(jìn)行按位異或運(yùn)算,高四位保持不變,低四位全部翻轉(zhuǎn)。通過(guò)按位運(yùn)算可以實(shí)現(xiàn)對(duì)變量的某一位或某幾位取反操作。80取反運(yùn)算符() 是一個(gè)單目運(yùn)算符,用來(lái)對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即將0變1,1變0。例如48。 取反運(yùn)算符常與移位運(yùn)算符及按為與、按位或、按位異或運(yùn)
52、算符結(jié)合使用以實(shí)現(xiàn)對(duì)某一位或某幾位清0、置1、取反的操作。81按位與運(yùn)算符(&) 參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行與運(yùn)算。按位或運(yùn)算符(|) 參與按位或運(yùn)算的二進(jìn)制位中只要有一個(gè)為1,該位的結(jié)果為1 。 82編程實(shí)例編程實(shí)例( (流水燈編程演示)流水燈編程演示) 實(shí)現(xiàn)8位LED從左到右循環(huán) 實(shí)現(xiàn)8位LED左右來(lái)回循環(huán)L1L2L3L4L5L6L7L8L8L1L2L3L4L5L6L7XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P
53、0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52C122pFC222pFC310uFX1CRYSTALR910kR1220R3220R4220R5220R6220R2220R7220R8220D1LED-
54、REDD2LED-BLUED3LED-REDD4LED-BLUED5LED-REDD6LED-BLUED7LED-REDD8LED-BLUE83如何實(shí)現(xiàn)循環(huán)移位?如何實(shí)現(xiàn)循環(huán)移位?C51庫(kù)函數(shù)intrins.h函數(shù)原型 #include unsigned char _crol_(unsigned char c,unsigned char b);功能:將c向左循環(huán)移位b位函數(shù)原型 unsigned char _cror_(unsigned char c,unsigned char b);功能:將c向右循環(huán)移位b位用庫(kù)函數(shù)實(shí)現(xiàn)上述流水燈用庫(kù)函數(shù)實(shí)現(xiàn)上述流水燈例如: P0 = _cror_(P0,3
55、);/將P0帶位循環(huán)右移3位 84 例:unsigned char x=0 x55 ; unsigned char y=0 x37 ; unsigned char z; z=x&y ; 則z= z=x|y ; 則z= z=xy ; 則z= z=x; 則z= z=x1;則z=位運(yùn)算符舉例位運(yùn)算符舉例85位運(yùn)算編程小竅門(mén)(將某一位置位運(yùn)算編程小竅門(mén)(將某一位置1 1、置、置0 0、取反)、取反)將某一位置1(相應(yīng)位與1進(jìn)行按位或運(yùn)算) 例:P0 | = (1 n); /將P0的第n位置1,其它位不變將某一位置0 (相應(yīng)位與0按位進(jìn)行與運(yùn)算) 例:P0 & = (1 n); /將P0
56、的第n位置0,其它位不變將某一位取反(相應(yīng)位與1進(jìn)行按位異或運(yùn)算) 例:P0 = ( 1 n ) 86按位與的用途按位與的用途某一位或某幾位清零而其它位保持原值如 原有數(shù)在P0寄存器中,為01011010,現(xiàn)要將其第一位清0,其它位保持不變。 則可與11111101進(jìn)行按位與。 即 P0 = P0 & 0 xFD; 或 P0 &= 0 xFD 也可寫(xiě)成 P0 &= (11);P0 & = (1 n); /將P0的第n位置0,其它位不變87按位與的用途按位與的用途取一個(gè)數(shù)中的某些指定位例:取單片機(jī)P0口的P0.2位狀態(tài)(1或0)可這樣操作: if(P0 &
57、(12) ; else.;88按位異或的用途按位異或的用途將某一位或某幾位取反(相應(yīng)位與1進(jìn)行按位異或運(yùn)算) 例:P0 = ( 1 n )按位或的用途將某一位或某幾位置1(相應(yīng)位與1進(jìn)行按位或運(yùn)算) 例:P0 | = (1 n); /將P0的第n位置1,其它位不變。89賦值、指針和取值運(yùn)算符賦值、指針和取值運(yùn)算符符號(hào)說(shuō)明=賦值*指向運(yùn)算符&取地址90復(fù)合賦值運(yùn)算符 十種:, , , , ,。按優(yōu)先級(jí)順序結(jié)合運(yùn)算。 例如: a+=b 等價(jià)于a=(a+b) x*=a+b 等價(jià)于x=(x*(a+b) a&=b 等價(jià)于a=(a&b) a=4 等價(jià)于a=(a4) 算術(shù)運(yùn)算符、邏輯
58、運(yùn)算符、關(guān)系運(yùn)算算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、賦值運(yùn)算符的優(yōu)先級(jí)符、賦值運(yùn)算符的優(yōu)先級(jí)賦值運(yùn)算符的優(yōu)先級(jí)按照從右到左;其余都是從左到右。算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、賦值運(yùn)算符的優(yōu)先級(jí)符、賦值運(yùn)算符的優(yōu)先級(jí) 【例例】 編寫(xiě)程序?qū)U(kuò)展的某編寫(xiě)程序?qū)U(kuò)展的某I/O口口PORTA()的)的PORTA.4清清0 ,PORTA.0置為置為1,程序如下:,程序如下: #define #define PORTA XBYTE0 xFFC0 void main( ) PORTA= ?; 94 計(jì)算機(jī)程序是由若干條有序的語(yǔ)句組成的。在程序執(zhí)行過(guò)程中一般有以下幾種情況:
59、在程序執(zhí)行過(guò)程中,程序按語(yǔ)句的順序逐條執(zhí)行,這稱(chēng)為順序結(jié)構(gòu)。 在程序執(zhí)行過(guò)程中,根據(jù)特定的條件選擇執(zhí)行某些語(yǔ)句,即程序執(zhí)行的順序根據(jù)條件來(lái)選擇,這稱(chēng)為選擇結(jié)構(gòu)。 在程序執(zhí)行過(guò)程中,根據(jù)某個(gè)條件是否成立重復(fù)執(zhí)行一段程序,直到該條件不成立為止,即程序的執(zhí)行順序在某處循環(huán),這稱(chēng)為循環(huán)結(jié)構(gòu)。 程序是由順序、選擇、循環(huán)這三種結(jié)構(gòu)構(gòu)成的復(fù)雜組合。 4.3.5 C514.3.5 C51程序設(shè)計(jì)的三種基本結(jié)構(gòu)程序設(shè)計(jì)的三種基本結(jié)構(gòu)95 C語(yǔ)言的語(yǔ)句用來(lái)向計(jì)算機(jī)系統(tǒng)發(fā)出操作指令,C語(yǔ)言中語(yǔ)句是以分號(hào)為結(jié)束標(biāo)志的。 C語(yǔ)言中語(yǔ)句可分為以下幾類(lèi): 控制語(yǔ)句:控制程序運(yùn)行的語(yǔ)句。 空語(yǔ)句:只有一個(gè)分號(hào)的語(yǔ)句,稱(chēng)為空語(yǔ)
60、句,它不進(jìn)行任何操作。 表達(dá)式語(yǔ)句:表達(dá)式后面加上分號(hào)就構(gòu)成一個(gè)表達(dá)式語(yǔ)句。函數(shù)調(diào)用語(yǔ)句也是表達(dá)式語(yǔ)句,由函數(shù)調(diào)用加分號(hào)構(gòu)成。 復(fù)合語(yǔ)句:可以把多個(gè)語(yǔ)句用括起來(lái),就成為復(fù)合語(yǔ)句,多用于選擇或循環(huán)結(jié)構(gòu)中。 注釋語(yǔ)句:在C51中,由/*、*/符號(hào)對(duì)包含的內(nèi)容以及雙斜杠/后面的內(nèi)容均表示注釋語(yǔ)句。編程人員使用注釋語(yǔ)句來(lái)解釋程序的功能,標(biāo)注修改時(shí)間等。96語(yǔ)句功能ifelse條件語(yǔ)句for()循環(huán)語(yǔ)句while()循環(huán)語(yǔ)句dowhile()循環(huán)語(yǔ)句continue結(jié)束本次循環(huán)語(yǔ)句break中止執(zhí)行switch語(yǔ)句或循環(huán)語(yǔ)句switchcase多分支選擇語(yǔ)句goto轉(zhuǎn)向語(yǔ)句return從函數(shù)返回語(yǔ)句97 順序結(jié)構(gòu)順序結(jié)構(gòu)是從前往后依次執(zhí)行語(yǔ)句。從整體上看所有程序都是順序結(jié)構(gòu),只不過(guò)中間某些部分是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 競(jìng)聘述職報(bào)告范文
- 上海視覺(jué)藝術(shù)學(xué)院《人機(jī)工程學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海商學(xué)院《網(wǎng)絡(luò)廣告創(chuàng)意與設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 課題申報(bào)書(shū):二十世紀(jì)美國(guó)猶太文學(xué)中的哲學(xué)思想研究
- 課題申報(bào)書(shū):鄂西土家族吊腳樓營(yíng)造技藝保護(hù)與傳承的可持續(xù)發(fā)展研究
- 部編版語(yǔ)文三年級(jí)上冊(cè)期末試卷(含答案)
- 上海杉達(dá)學(xué)院《光電信息綜合二》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海農(nóng)林職業(yè)技術(shù)學(xué)院《醫(yī)學(xué)分子生物學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 專(zhuān)項(xiàng)08:現(xiàn)代文閱讀-【中職專(zhuān)用】2025年職教高考學(xué)業(yè)考試語(yǔ)文二輪專(zhuān)項(xiàng)突破(福建專(zhuān)用)
- -統(tǒng)編版語(yǔ)文五年級(jí)上冊(cè)語(yǔ)文單元習(xí)作變式題目知識(shí)復(fù)習(xí)講義
- 2024工貿(mào)企業(yè)重大事故隱患判定標(biāo)準(zhǔn)解讀
- 2024年上海高一數(shù)學(xué)試題分類(lèi)匯編:三角(解析版)
- 玻璃制造中的安全與職業(yè)健康考核試卷
- 大單品戰(zhàn)略規(guī)劃
- 2023年北京語(yǔ)言大學(xué)新編長(zhǎng)聘人員招聘考試真題
- 食品安全教育培訓(xùn)
- 管道保溫施工方案
- 工藝工程師招聘筆試題與參考答案(某大型集團(tuán)公司)
- 商務(wù)禮儀(通識(shí)課)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 智能工廠(chǎng)梯度培育要素條件
- 手術(shù)分級(jí)目錄(2023年修訂)
評(píng)論
0/150
提交評(píng)論