?? some.htm
字號:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft FrontPage 5.0">
<TITLE>初學單片機幾個不易掌握的概念</TITLE>
</HEAD>
<BODY background="../back.jpg">
<B><FONT FACE="宋體" LANG="ZH-CN" SIZE=6>
<P ALIGN="CENTER" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font size="2">初學單片機幾個不易掌握的概念</font></P>
</FONT>
<P ALIGN="CENTER" style="line-height: 150%; margin-top: 0; margin-bottom: 0"> </P>
<FONT FACE="黑體" LANG="ZH-CN" SIZE=5>
<P ALIGN="CENTER" style="line-height: 150%; margin-top: 0; margin-bottom: 0"></P>
</font></B><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0"> 隨著電子技術的迅速發(fā)展,計算機已深入地滲透到我們的生活中,許多電子愛好者開始學習單片機知識,但單片機的內容比較抽象,相對電子愛好者已熟悉的模擬電路、數字電路,單片機中有一些新的概念,這些概念非常基本以至于一般作者不屑去談,教材自然也不會很深入地講解這些概念,但這些內容又是學習中必須要理解的,下面就結合本人的學習、教學經驗,對這些最基本概念作一說明,希望對自學者有所幫助。</P>
</FONT>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋體" LANG="ZH-CN" SIZE=2> 一、總線:我們知道,一個電路總是由元器件通過電線連接而成的,在模擬電路中,連線并不成為一個問題,因為各器件間一般是串行關系,各器件之間的連線并不很多,但計算機電路卻不一樣,它是以微處理器為核心,各器件都要與微處理器相連,各器件之間的工作必須相互協(xié)調,所以就需要的連線就很多了,如果仍如同模擬電路一樣,在各微處理器和各器件間單獨連線,則線的數量將多得驚人,所以在微處理機中引入了總線的概念,各個器件共同享用連線,所有器件的</font><FONT FACE="Arial" SIZE=2>8</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>根數據線全部接到</FONT><FONT FACE="Arial" SIZE=2>8</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>根公用的線上,即相當于各個器件并聯起來,但僅這樣還不行,如果有兩個器件同時送出數據,一個為</FONT><FONT FACE="Arial" SIZE=2>0</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,一個為</FONT><FONT FACE="Arial" SIZE=2>1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,那么,接收方接收到的究竟是什么呢?這種情況是不允許的,所以要通過控制線進行控制,使器件分時工作,任何時候只能有一個器件發(fā)送數據(可以有多個器件同時接收)。器件的數據線也就被稱為數據總線,器件所有的控制線被稱為控制總線。在單片機內部或者外部存儲器及其它器件中有存儲單元,這些存儲單元要被分配地址,才能使用,分配地址當然也是以電信號的形式給出的,由于存儲單元比較多,所以,用于地址分配的線也較多,這些線被稱為地址總線。</font></P>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋體" LANG="ZH-CN" SIZE=2> 二、數據、地址、指令:之所以將這三者放在一起,是因為這三者的本質都是一樣的──數字,或者說都是一串‘</font><FONT FACE="Arial" SIZE=2>0</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>’和‘</FONT><FONT FACE="Arial" SIZE=2>1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>’組成的序列。換言之,地址、指令也都是數據。指令:由單片機芯片的設計者規(guī)定的一種數字,它與我們常用的指令助記符有著嚴格的一一對應關系,不可以由單片機的開發(fā)者更改。地址:是尋找單片機內部、外部的存儲單元、輸入輸出口的依據,內部單元的地址值已由芯片設計者規(guī)定好,不可更改,外部的單元可以由單片機開發(fā)者自行決定,但有一些地址單元是一定要有的(詳見程序的執(zhí)行過程)。數據:這是由微處理機處理的對象,在各種不同的應用電路中各不相同,一般而言,被處理的數據可能有這么幾種情況:</font></P>
<DIR><P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="Arial" SIZE=2>1</font><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>·地址(如</FONT><FONT FACE="Arial" SIZE=2>MOV	DPTR</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,</FONT><FONT FACE="Arial" SIZE=2>#1000H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>),即地址</FONT><FONT FACE="Arial" SIZE=2>1000H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>送入</FONT><FONT FACE="Arial" SIZE=2>DPTR</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>。</font></P>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="Arial" SIZE=2>2</font><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>·方式字或控制字(如</FONT><FONT FACE="Arial" SIZE=2>MOV	TMOD</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,</FONT><FONT FACE="Arial" SIZE=2>#3</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>),</FONT><FONT FACE="Arial" SIZE=2>3</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>即是控制字。</font></P>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="Arial" SIZE=2>3</font><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>·常數(如</FONT><FONT FACE="Arial" SIZE=2>MOV	TH0</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,</FONT><FONT FACE="Arial" SIZE=2>#10H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>)</FONT><FONT FACE="Arial" SIZE=2>10H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>即定時常數。</font></P></DIR>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="Arial" SIZE=2>4</font><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>·實際輸出值(如</FONT><FONT FACE="Arial" SIZE=2>P1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>口接彩燈,要燈全亮,則執(zhí)行指令:</FONT><FONT FACE="Arial" SIZE=2>MOV P1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,</FONT><FONT FACE="Arial" SIZE=2>#0FFH</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,要燈全暗,則執(zhí)行指令:</FONT><FONT FACE="Arial" SIZE=2>MOV P1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,</FONT><FONT FACE="Arial" SIZE=2>#00H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>)這里</FONT><FONT FACE="Arial" SIZE=2>0FFH</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>和</FONT><FONT FACE="Arial" SIZE=2>00H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>都是實際輸出值。又如用于</FONT><FONT FACE="Arial" SIZE=2>LED</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>的字形碼,也是實際輸出的值。</font></P>
<FONT FACE="宋體" LANG="ZH-CN" SIZE=2>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">理解了地址、指令的本質,就不難理解程序運行過程中為什么會跑飛,會把數據當成指令來執(zhí)行了。</P>
</FONT>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋體" LANG="ZH-CN" SIZE=2> 三、P0口、P2口和</font><FONT FACE="Arial" SIZE=2>P3</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>的第二功能用法</FONT><FONT FACE="Arial" SIZE=2>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>初學時往往對P0口、P2口和</FONT><FONT FACE="Arial" SIZE=2>P3</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>口的第二功能用法迷惑不解,認為第二功能和原功能之間要有一個切換的過程,或者說要有一條指令,事實上,各端口的第二功能完全是自動的,不需要用指令來轉換。如</FONT><FONT FACE="Arial" SIZE=2>P3.6</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>、</FONT><FONT FACE="Arial" SIZE=2>P3.7</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>分別是</FONT><FONT FACE="Arial" SIZE=2>WR</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>、</FONT><FONT FACE="Arial" SIZE=2>RD</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>信號,當微片理機外接</FONT><FONT FACE="Arial" SIZE=2>RAM</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>或有外部</FONT><FONT FACE="Arial" SIZE=2>I/O</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>口時,它們被用作第二功能,不能作為通用</FONT><FONT FACE="Arial" SIZE=2>I/O</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>口使用,只要一微處理機一執(zhí)行到</FONT><FONT FACE="Arial" SIZE=2>MOVX</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>指令,就會有相應的信號從</FONT><FONT FACE="Arial" SIZE=2>P3.6</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>或</FONT><FONT FACE="Arial" SIZE=2>P3.7</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>送出,不需要事先用指令說明。事實上‘不能作為通用</FONT><FONT FACE="Arial" SIZE=2>I/O</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>口使用’也并不是‘不能’而是(使用者)‘不會’將其作為通用</FONT><FONT FACE="Arial" SIZE=2>I/O</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>口使用。你完全可以在指令中按排一條</FONT><FONT FACE="Arial" SIZE=2>SETB
P3.7</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>的指令,并且當單片機執(zhí)行到這條指令時,也會使</FONT><FONT FACE="Arial" SIZE=2>P3.7</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>變?yōu)楦唠娖剑褂谜卟粫@么去做,因為這通常這會導致系統(tǒng)的崩潰(即死機)。</font></P>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋體" LANG="ZH-CN" SIZE=2> 四、程序的執(zhí)行過程</font><FONT FACE="Arial" SIZE=2>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>單片機在通電復位后</FONT><FONT FACE="Arial" SIZE=2>8051</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>內的程序計數器(</FONT><FONT FACE="Arial" SIZE=2>PC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>)中的值為‘</FONT><FONT FACE="Arial" SIZE=2>0000</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>’,所以程序總是從‘</FONT><FONT FACE="Arial" SIZE=2>0000</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>’單元開始執(zhí)行,也就是說:在系統(tǒng)的</FONT><FONT FACE="Arial" SIZE=2>ROM</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>中一定要存在‘</FONT><FONT FACE="Arial" SIZE=2>0000</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>’這個單元,并且在‘</FONT><FONT FACE="Arial" SIZE=2>0000</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>’單元中存放的一定是一條指令。</font></P>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋體" LANG="ZH-CN" SIZE=2> 五、堆棧</font><FONT FACE="Arial" SIZE=2>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>堆棧是一個區(qū)域,是用來存放數據的,這個區(qū)域本身沒有任何特殊之處,就是內部</FONT><FONT FACE="Arial" SIZE=2>RAM</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>的一部份,特殊的是它存放和取用數據的方式,即所謂的‘先進后出,后進先出’,并且堆棧有特殊的數據傳輸指令,即‘</FONT><FONT FACE="Arial" SIZE=2>PUSH</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>’和‘</FONT><FONT FACE="Arial" SIZE=2>POP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>’,有一個特殊的專為其服務的單元,即堆棧指針</FONT><FONT FACE="Arial" SIZE=2>SP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,每當執(zhí)一次</FONT><FONT FACE="Arial" SIZE=2>PUSH</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>指令時,</FONT><FONT FACE="Arial" SIZE=2>SP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>就(在原來值的基礎上)自動加</FONT><FONT FACE="Arial" SIZE=2>1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,每當執(zhí)行一次</FONT><FONT FACE="Arial" SIZE=2>POP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>指令,</FONT><FONT FACE="Arial" SIZE=2>SP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>就(在原來值的基礎上)自動減</FONT><FONT FACE="Arial" SIZE=2>1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>。由于</FONT><FONT FACE="Arial" SIZE=2>SP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>中的值可以用指令加以改變,所以只要在程序開始階段更改了</FONT><FONT FACE="Arial" SIZE=2>SP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>的值,就可以把堆棧設置在規(guī)定的內存單元中,如在程序開始時,用一條</FONT><FONT FACE="Arial" SIZE=2>MOV 	SP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,</FONT><FONT FACE="Arial" SIZE=2>#5FH</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>指令,就時把堆棧設置在從內存單元</FONT><FONT FACE="Arial" SIZE=2>60H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>開始的單元中。一般程序的開頭總有這么一條設置堆棧指針的指令,因為開機時,</FONT><FONT FACE="Arial" SIZE=2>SP</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>的初始值為</FONT><FONT FACE="Arial" SIZE=2>07H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>,這樣就使堆棧從</FONT><FONT FACE="Arial" SIZE=2>08H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>單元開始往后,而</FONT><FONT FACE="Arial" SIZE=2>08H</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>到</FONT><FONT FACE="Arial" SIZE=2>1FH</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>這個區(qū)域正是</FONT><FONT FACE="Arial" SIZE=2>8031</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=2>的第二、三、四工作寄存器區(qū),經常要被使用,這會造成數據的渾亂。不同作者編寫程序時,初始化堆棧指令也不完全相同,這是作者的習慣問題。當設置好堆棧區(qū)后,并不意味著該區(qū)域成為一種專用內存,它還是可以象普通內存區(qū)域一樣使用,只是一般情況下編程者不會把它當成普通內存用了。</font></P>
<P style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋體" LANG="ZH-CN" SIZE=2> 六、單片機的開發(fā)過程</font><FONT FACE="Arial" SIZE=2>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -