<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 第三節:單片機最重要的一個特性 ## 【3.1 單片機的 “一”】 ![](https://img.kancloud.cn/ee/55/ee55481b13bed117d83fb7404caec983_506x321.png) 圖 3.1 單片機工作的最小系統 “道生一,一生二,二生三,三生萬物。”《道德經》認為,世間萬物,繽紛多彩,都源自一個東西,這個 “一” 的東西就是 “道”。電子世界也存在 “一”,這個 “一” 繁衍出手機、電腦、電視機、機器人等豐富多彩的電子世界,這個 “一” 就是單片機最重要的一個特性:“程序下載進內存后,單片機既可以通過管腳識別外部輸入的高低電平信號,也可以通過管腳對外部輸出不同時間長度的高低電平。” 這句話有 5 個關鍵詞 “程序、內存、管腳、電平、時間。” 下面我詳細解讀每個關鍵詞的含義,涉及到某些專用名詞如果不理解也沒關系,主要是讓大家有個感性的認識就足矣。 ## 【3.2 程序】 單片機程序有 3 種:C 程序、匯編程序、機器程序。能下載進單片機的只有機器程序,C 程序和匯編程序都不能直接下載進單片機,所以 C 程序和匯編程序都要經過編譯軟件翻譯成機器程序后,才能下載進單片機。程序是語言,語言是用來交流,交流就必須存在兩個對象,對象分別是程序員和單片機。程序員是人所以用 C 或者匯編語言,單片機是機器所以用機器語言,人和機是不同的世界,兩者交流就需要一個翻譯家,翻譯家就是編譯軟件,俗稱編譯器,它能把 C 語言或者匯編語言翻譯成單片機能識別的機器語言。機器語言就是 0101 的代碼,一般以十六進制的形式呈現。 理論上,程序員也可以拋開 C 和匯編語言,直接用機器語言做項目。我讀書時老師讓我們做實驗就是這么整。那時我還不知有燒錄器,老師讓我們先用匯編語言寫好程序,然后自己充當編譯器,對照匯編語言和機器語言的指令表,人工把匯編語言翻譯成十六進制的機器語言,最后把機器語言按字節一個一個的輸入到特定的實驗設備來觀察現象。現在回想起來,老師當時的初衷是讓我們了解編程語言的本質。 既然可以直接用機器語言做項目,為什么還要 C 語言或者匯編語言?在 C 語言或者匯編語言沒有誕生前,程序員就是通過在紙帶上打孔來代表 01 的機器語言,此時相當于結繩記事的原始階段。后來人類發明了匯編語言,通過英語單詞來表示 01 機器語言特定的指令語句,此時開始誕生了匯編語言的編譯器相當于進入象形文字的階段。再到后來人類又發明了 C 語言,通過數學符號和英語單詞來表達自己的邏輯,誕生了 C 語言的編譯器相當于進入了漢字白話文階段,從此程序員寫出來的 C 程序就非常方便移植,編輯,閱讀,傳播,繼承。現在單片機開發的主流是 C 語言,我本人出來工作后就沒有用過匯編做項目開發。C 語言是必修課,匯編語言是選修課;C 語言是白話文簡單易懂,匯編語言是文言文繁瑣難讀。當然匯編也有它的應用場合,匯編的翻譯效率高,往往是一句匯編語言對應一句機器語言,而一句 C 語言有可能對應幾句機器語言,這樣 C 程序的代碼效率在很大程度上取決于編譯器的水平,編譯器能不能幫你翻譯出高效的機器語言對于我們來說往往像黑盒子,不像匯編語言那么可控制。所以很多嵌入式系統某段要求簡潔高效的源代碼往往用匯編來寫,也有少數一些很便宜的單片機不提供 C 編譯器,只能用匯編語言開發。要不要學匯編,最好根據個人的工作需求來決定。 ## 【3.3 內存】 單片機就像 MP3,程序代碼就像歌曲,把不同的歌曲下載到 MP3 里就可以聽到不同的音樂,把不同的程序下載到單片機里,單片機就能做不同的事。能裝程序的單片機必然有內存,內存由 ROM 和 RAM 組成,ROM 和 RAM 都能裝東西,但各有不同。 ROM 的優點是存儲的東西斷電后不會丟失,缺點是存儲的東西上電后不能更改,想要改變 ROM 的內容除非重新下載程序,而且下載次數有限制,FLASH 的 ROM 最大次數通常是 10 萬次,而 OTP 的 ROM 只能下載 1 次,所以平時上電工作時 ROM 存儲的東西是不能更改的,某些具有 IAP 功能的高級單片機不在此討論范圍內。而 RAM 恰好反過來,RAM 的優點是存儲的東西上電后可以隨時被單片機更改,更改次數沒有限制,缺點是存儲的東西斷電后會丟失,沒有記憶功能。 ROM 和 RAM 各有特點,單片機從中各取所長。ROM 用來存儲不可更改的指令代碼和常量數據,ROM 的容量往往相當于代碼的容量。RAM 用來存儲可以被更改的變量數據,RAM 的容量往往相當于全局變量和局部變量的容量。不管是用 C 語言還是匯編,所寫的程序代碼就自然包含了指令代碼、常量數據、全局變量、局部變量,那么誰在幕后幫我們進行分類存儲,誰把一個程序代碼的一分為二讓它們在 ROM 和 RAM 里各就各位?是編譯器軟件和下載器 (燒錄器),編譯器除了把 C 語言翻譯成機器語言之外,還幫我們分好了類,分配好了存儲的地址和位置,下載器 (燒錄器) 再根據這些信息把程序存儲到內存中,這些工作一般不用程序員干預,它們自動完成。 ## 【3.4 管腳】 管腳是單片機與外部電路進行能量和信息交互的橋梁。有電源,復位,晶振和 IO 口這 4 類管腳。 第一類電源管腳。是給單片機內部電路供電的接口。單片機有兩種常用的供電電壓,一般是 3.3V 或者 5V,有的單片機兩種電壓都兼容。 第二類復位管腳。單片機上電后需要外部電路給它一個瞬間高電平或者低電平的復位信號,才能啟動工作。復位電路通常是由電容和電阻組成的充電電路來實現,也有一些系統是用專門的復位芯片來實現。 第三類晶振管腳。任何單片機想要工作必須要有晶振。單片機執行程序指令是按一個節拍一個節拍來執行的。這個節拍的時間就是由晶振產生,所以把晶振比喻成單片機的心臟是非常恰當的。現在也有很多單片機直接把晶振集成到內部,這類單片機不用外接晶振也可以。 第四類 IO 口管腳。這是跟我們編寫程序關聯最密切的管腳。前面提到的電源,復位,晶振這 3 種管腳是為了讓單片機能工作,俗稱單片機工作的三要素。而單片機工作的具體內容就是通過 IO 口管腳來體現的。比如,IO 口能識別按健的輸入,也能輸出驅動繼電器工作的開關信號,也能跟外圍器件進行通信。 ## 【3.5 電平】 電平就是電壓的兩種狀態,低或者高,低相當于程序里的 0,高相當于程序里的 1。單片機 IO 口管腳檢測到的電壓低于或等于 0.8V 時是低電平,程序里讀取到的是 0 數字。單片機 IO 口管腳檢測到的電壓高于或等于 2.4V 時是高電平,程序里讀取到的是 1 數字。必須注意的是,IO 口輸入的最大電壓不能超過單片機的供電電壓。單片機輸出的低電平是 0V,單片機輸出的高電平等于它的供電電壓值,往往是 3.3V 或者 5V。 ## 【3.6 時間】 時間是單片機程序必不可少的元素。跟外圍芯片通信的時序節拍需要時間,驅動發光二極管閃爍需要時間,工控自動化的某些延時需要時間。單片機的時間來源自兩方面。第一方面源自指令的周期時間。單片機是根據節拍來執行程序指令的,每執行一條指令都要消耗一點時間,只要讓程序執行的指令數量越多,產生的時間就越長,通過調整所執行指令的數量就可以得到所需的時間長度。第二方面源自單片機內部自帶的定時器。假如設置定時器每 20 毫秒產生一次中斷,現在要獲取 10 秒鐘的時間,只需在程序里統記 500 次定時中斷就可以了,因為 1 秒等于 1000 毫秒。指令和定時器這兩者的時間最后都來源于晶振。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看