27、關(guān)于單片機的一些基本概念
隨著電子技術(shù)的迅速發(fā)展,計算機已深入地滲透到我們的生活中,許多電子愛好者開始學(xué)習(xí)單片機知識,但單片機的內(nèi)容比較抽象,相對電子愛好者已熟悉的模擬電路、數(shù)字電路,單片機中有一些新的概念,這些概念非?;疽灾劣谝话阕髡卟恍既フ?,教材自然也不會很深入地講解這些概念,但這些內(nèi)容又是學(xué)習(xí)中必須要理解的,下面就結(jié)合本人的學(xué)習(xí)、教學(xué)經(jīng)驗,對這些最基本概念作一說明,希望對自學(xué)者有所幫助。
一、總線:我們知道,一個電路總是由元器件通過電線連接而成的,在模擬電路中,連線并不成為一個問題,因為各器件間一般是串行關(guān)系,各器件之間的連線并不很多,但計算機電路卻不一樣,它是以微處理器為核心,各器件都要與微處理器相連,各器件之間的工作必須相互協(xié)調(diào),所以就需要的連線就很多了,如果仍如同模擬電路一樣,在各微處理器和各器件間單獨連線,則線的數(shù)量將多得驚人,所以在微處理機中引入了總線的概念,各個器件共同享用連線,所有器件的8根數(shù)據(jù)線全部接到8根公用的線上,即相當(dāng)于各個器件并聯(lián)起來,但僅這樣還不行,如果有兩個器件同時送出數(shù)據(jù),一個為0,一個為1,那么,接收方接收到的究竟是什么呢?這種情況是不允許的,所以要通過控制線進行控制,使器件分時工作,任何時候只能有一個器件發(fā)送數(shù)據(jù)(能有多個器件同時接收)。器件的數(shù)據(jù)線也就被稱為數(shù)據(jù)總線,器件所有的控制線被稱為控制總線。在單片機內(nèi)部或者外部存儲器及其它器件中有存儲單元,這些存儲單元要被分配地址,才能使用,分配地址當(dāng)然也是以電信號的形式給出的,由于存儲單元比較多,所以,用于地址分配的線也較多,這些線被稱為地址總線。
二、數(shù)據(jù)、地址、指令:之所以將這三者放在一起,是因為這三者的本質(zhì)都是一樣的──數(shù)字,或者說都是一串‘0’和‘1’組成的序列。換言之,地址、指令也都是數(shù)據(jù)。指令:由單片機芯片的設(shè)計者規(guī)定的一種數(shù)字,它與我們常用的指令助記符有著嚴(yán)格的一一對應(yīng)關(guān)系,不能由單片機的開發(fā)者更改。地址:是尋找單片機內(nèi)部、外部的存儲單元、輸入輸出口的依據(jù),內(nèi)部單元的地址值已由芯片設(shè)計者規(guī)定好,不可更改,外部的單元能由單片機開發(fā)者自行決定,但有一些地址單元是一定要有的(詳見程序的執(zhí)行過程)。數(shù)據(jù):這是由微處理機處理的對象,在各種不一樣的應(yīng)用電路中各不相同,一般而言,被處理的數(shù)據(jù)可能有這么幾種情況:
1·地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。
2·方式字或控制字(如MOV TMOD,#3),3即是控制字。
3·常數(shù)(如MOV TH0,#10H)10H即定時常數(shù)。
4·實際輸出值(如P1口接彩燈,要燈全亮,則執(zhí)行指令:MOV P1,#0FFH,要燈全暗,則執(zhí)行指令:MOV P1,#00H)這里0FFH和00H都是實際輸出值。又如用于LED的字形碼,也是實際輸出的值。
理解了地址、指令的本質(zhì),就不難理解程序運行過程中為什么會跑飛,會把數(shù)據(jù)當(dāng)成指令來執(zhí)行了。
三、P0口、P2口和P3的第二功能使用辦法 開始學(xué)習(xí)時一般對P0口、P2口和P3口的第二功能使用辦法迷惑不解,認(rèn)為第二功能和原功能之間要有一個切換的過程,或者說要有一條指令,事實上,各端口的第二功能完全是自動的,不需要用指令來轉(zhuǎn)換。如P3.6、P3.7分別是WR、RD信號,當(dāng)微片理機外接RAM或有外部I/O口時,它們被用作第二功能,不能作為通用I/O口使用,只要一微處理機一執(zhí)行到MOVX指令,就會有對應(yīng)的信號從P3.6或P3.7送出,不需要事先用指令說明。事實上‘不能作為通用I/O口使用’也并不是‘不能’而是(使用者)‘不會’將其作為通用I/O口使用。你完全能在指令中按排一條SETB P3.7的指令,并且當(dāng)單片機執(zhí)行到這條指令時,也會使P3.7變?yōu)楦唠娖剑褂谜卟粫@么去做,因為這常常這會導(dǎo)致系統(tǒng)的崩潰(即死機)。
四、程序的執(zhí)行過程 單片機在通電復(fù)位后8051內(nèi)的程序計數(shù)器(PC)中的值為‘0000’,所以程序總是從‘0000’單元開始執(zhí)行,也就是說:在系統(tǒng)的ROM中一定要存在‘0000’這個單元,并且在‘0000’單元中存放的一定是一條指令。
五、堆棧 堆棧是一個區(qū)域,是用來存放數(shù)據(jù)的,這個區(qū)域本身沒有任何特殊之處,就是內(nèi)部RAM的一部份,特殊的是它存放和取用數(shù)據(jù)的方式,即所謂的‘先進后出,后進先出’,并且堆棧有特殊的數(shù)據(jù)傳輸指令,即‘PUSH’和‘POP’,有一個特殊的專為其服務(wù)的單元,即堆棧指針SP,每當(dāng)執(zhí)一次PUSH指令時,SP就(在原來值的基礎(chǔ)上)自動加1,每當(dāng)執(zhí)行一次POP指令,SP就(在原來值的基礎(chǔ)上)自動減1。由于SP中的值能用指令加以改變,所以只要在程序開始階段更改了SP的值,就能把堆棧設(shè)置在規(guī)定的內(nèi)存單元中,如在程序開始時,用一條MOV SP,#5FH指令,就時把堆棧設(shè)置在從內(nèi)存單元60H開始的單元中。一般程序的開頭總有這么一條設(shè)置堆棧指針的指令,因為開機時,SP的初始值為07H,這樣就使堆棧從08H單元開始往后,而08H到1FH這個區(qū)域正是8031的第二、三、四工作寄存器區(qū),經(jīng)常要被使用,這會造成數(shù)據(jù)的渾亂。不一樣作者編寫程序時,初始化堆棧指令也不完全相同,這是作者的習(xí)慣問題。當(dāng)設(shè)置好堆棧區(qū)后,并不意味著該區(qū)域成為一種專用內(nèi)存,它還是能象普通內(nèi)存區(qū)域一樣使用,只是一般情況下編程者不會把它當(dāng)成普通內(nèi)存用了。
六、單片機的開發(fā)過程 這里所說的開發(fā)過程并不是一般書中所說的從任務(wù)分析開始,我們假設(shè)已設(shè)計并制作好硬件,下面就是編寫軟件的工作。在編寫軟件之前,首先要確定一些常數(shù)、地址,事實上這些常數(shù)、地址在設(shè)計階段已被直接或間接地確定下來了。如當(dāng)某器件的連線設(shè)計好后,其地址也就被確定了,當(dāng)器件的功能被確定下來后,其控制字也就被確定了。然后用文本編緝器(如EDIT、CCED等)編寫軟件,編寫好后,用編譯器對源程序文件編譯,查錯,直到?jīng)]有語法錯誤,除了極簡單的程序外,一般應(yīng)用仿真機對軟件進行調(diào)試,直到程序運行正確為止。運行正確后,就能寫片(將程序固化在EPROM中)。在源程序被編譯后,生成了擴展名為HEX的目標(biāo)文件,一般編程器能夠識別這種格式的文件,只要將此文件調(diào)入即可寫片。在此,為使大家對整個過程有個認(rèn)識,舉一例說明:
表1
ORG 0000H
LJMP START
ORG 040H
START:
MOV SP,#5FH ;設(shè)堆棧
LOOP:
NOP
LJMP LOOP ;循環(huán)
END ;結(jié)束
表2
:03000000020040BB
?。?700400075815F000200431F
表3
02 00 40 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 75 81 5F 00 02 00 43
表1為源程序,表2是匯編后得到的HEX文件,表3是由HEX文件轉(zhuǎn)換成的目標(biāo)文件,也就是最終寫入EPROM的文件,它由編程器轉(zhuǎn)換得到,也能由HEXBIN一類的程序轉(zhuǎn)換得到。學(xué)過手工匯編者應(yīng)當(dāng)不難找出表3與表1的一一對應(yīng)關(guān)系,值得注意的是從02 00 40后開始的一長串‘FF’,直到75 81,這是由于偽指令:ORG 040H造成的結(jié)果。
七、仿真、仿真機 仿真是單片機開發(fā)過程中非常重要的一個環(huán)節(jié),除了一些極簡單的任務(wù),一般產(chǎn)品開發(fā)過程中都要進行仿真,仿真的主要目的是進行軟件調(diào)試,當(dāng)然借助仿真機,也能進行一些硬件排錯。一塊單片機應(yīng)用電路板包括單片機部份及為達到使用目的而設(shè)計的應(yīng)用電路,仿真就是利用仿真機來代替應(yīng)用電路板(稱目標(biāo)機)的單片機部份,對應(yīng)用電路部份進行測試、調(diào)試。仿真有CPU仿真和ROM仿真兩種,所謂CPU仿真是指用仿真機代替目標(biāo)機的CPU,由仿真機向目標(biāo)機的應(yīng)用電路部份供給各種信號、數(shù)據(jù),進行調(diào)試的辦法。這種仿真能通過單步運行、連續(xù)運行等多種辦法來運行程序,并能觀察到單片機內(nèi)部的變化,便于改正程序中的錯誤。所謂ROM仿真,就是用仿真機代替目標(biāo)機的ROM,目標(biāo)機的CPU工作時,從仿真機中讀取程序,并執(zhí)行。這種仿真其實就是將仿真機當(dāng)成一片EPROM,只是省去了擦片、寫片的麻煩,并沒有多少調(diào)試手段可言。常常這是二種不一樣類型的仿真機,也就是說,一臺仿真機不能既做CPU仿真,又做ROM仿真??赡艿那闆r下,當(dāng)然以CPU仿真好。以上是本人對單片機的理解,如有不對之處,請諸位大俠多多指點。發(fā)表您的高論。
評論
查看更多