<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                【80.1 不再依賴第11節模板程序。】 前面大量的章節主要是講C語言本身的基礎知識,因此每次的練習例程都要依賴第11節的模板程序。從本節開始,正式進入到單片機主題,如果沒有特殊說明,以后的練習程序就不再需要依賴第11節模板程序,可以脫離模板單飛了。 【80.2 寄存器。】 寄存器是跨越在軟件與硬件之間的橋梁,單片機的C語言想控制單片機引腳輸出0V或者5V的物理電壓,本質就是通過往寄存器里填數字,往哪個寄存器填數字,填什么樣的數字,對應的引腳就輸出什么樣的電壓。至于“為什么往寄存器填數字就會在引腳上輸出對應的電壓”這個問題,對于我們“應用級”工程師來說是一個黑匣子。我們寫軟件的最底層就是操作到“寄存器”這個層面,至于“寄存器與物理電壓之間是如何關聯如何實現”的這個問題,其實是“芯片級”半導體工程師所研究的事,因為單片機本身其實就是一個成品,我們從“芯片級”半導體工程師那里拿到這個成品,這個成品的說明書告訴了我們該成品的每個寄存器的作用,我們只能在這個基礎上去做更上層的應用。該說明書其實就是大家通常所說的芯片的datasheet。 寄存器在單片機C語言層面,是一個全局變量,是一個具備特定名字的全局變量,是一個被系統征用的全局變量。寄存器的名字就像古代皇帝的名字,所有普通老百姓的變量名字都要“避尊者諱”,不能跟寄存器的名字重名,否則C編譯器就編譯不通過。 ![](https://img.kancloud.cn/84/4f/844f279fd38792c47dbbebcb24194881_332x352.png) 圖80.2.1 單片機的32個IO口引腳 本教程用的STC89C52單片機IO口寄存器有4個,分別是P0,P1,P2,P3這4個寄存器,每個寄存器都是一個8位的全局變量,每一位代表控制一個單片機的IO口引腳,因此,該單片機一共有32個(4乘以8)IO口引腳,每個引腳都是可以單獨控制的(俗稱位操作)。往該位填入0,對應的引腳就輸出0V的物理電壓。往該位填入1,對應的引腳就輸出5V的物理電壓。 【80.3 C語言操作IO口寄存器。】 C語言操作單片機IO口寄存器,以便在對應的引腳上輸出對應的物理電壓,有兩種方式。一種是并口的方式,另外一種是位操作的方式。并口方式,一次操作8個位(8個引腳),往往用在并口數據總線上。位操作方式,一次操作1個位(1個引腳),該方式因為單獨控制到某個引腳,所以應用更加靈活廣泛。 并口方式。并口方式的時候,可以直接對P0,P1,P2,P3這4個寄存器賦值,就像對一個unsigned char的全局變量賦值一樣。比如: \#include "REG52.H" void main() { P0=0xF0; //直接對P0賦值0xF0,意味著P0口的8個引腳,高4位全部輸出5V,低4位全部輸出0V。 while(1) { } } “P0=0xF0”這行代碼,把十六進制的0xF0分解成二進制11110000來理解,P0.7,P0.6,P0.5,P0.4這4個引腳分別輸出5V物理電壓,而P0.3,P0.2,P0.1,P0.0這4個引腳分別輸出0V物理電壓。 位操作方式。并口方式因為一次操作就綁定了8個引腳,是非常不方便的,因此,位操作就顯得特別靈活實用,你可以直接操作P0,P1,P2,P3這4組引腳中(共32個)的某1個引腳,而不影響其它引腳的狀態。比如,P1.4引腳是屬于P1組的8個引腳中的某1個引腳,如果想直接位操作P1.4引腳,要用到特定的關鍵詞sbit和符號“^”這個組合,sbit和符號“^”的組合類似宏定義,使用方式如下。 \#include "REG52.H" sbit P1\_4=P1^4; //利用sbit和符號“^”的組合,把變量名字P1\_4與P1.4引腳關聯起來 void main() { P1\_4=0; //P1.4引腳輸出0V物理電壓,而不影響其它P1口引腳的狀態。 while(1) { } } 【80.4 點亮LED。】 LED燈要有電流通過,才會發光。要有電流通過,必須要有電壓的“正壓差”,“壓差”可以用水壓來比喻。 比如在2樓的水,對于1樓來說,它就有“正壓差”(2減去1等于“正1”),因此只要構成回路(有水管),2樓的水是可以往1樓流動的。 比如在2樓的水,對于3樓來說,它雖然有壓差,但是有的只是“負壓差”(2減去3等于“負1”),因此哪怕構成回路(有水管),2樓的水也是不可以往3樓流動的。 比如在2樓的水,對于同樓層的2樓來說,它的壓差是0壓差(2減去2等于“0壓差”),因此哪怕構成回路(有水管),2樓的水也是不可以在2樓之間流動的。 上面三個比喻很關鍵,精髓在于是否有“正壓差”。要點亮一個LED燈,并不是說你單片機引腳直接輸出一個5V的物理電壓就能點亮的,還要看它構成的整個LED燈回路,也就是實際的電路圖是什么樣的。在本教程的原理圖中,我們點亮LED燈是采樣“灌入式”的電路,也就是單片機輸出5V電壓的時候LED燈是熄滅的,而輸出0V物理電壓時LED燈反而是被點亮的。如下兩個圖: ![](https://img.kancloud.cn/73/34/7334d9d189f0de190e15939b9fff75d9_214x279.png) 圖80.4.1 灌入式驅動8個LED ![](https://img.kancloud.cn/c5/df/c5df9e1e88df6a05af50ebda8e480441_200x259.png) 圖80.4.2 灌入式驅動4個LED 現在根據這原理圖,編寫一個并口和位操作的練習例子,直接把程序燒錄進開發板,就可以看到對應的LED燈的狀態。 \#include "REG52.H" sbit P1\_4=P1^4; //利用sbit和符號“^”的組合,把變量名字P1\_4與P1.4引腳關聯起來 void main() { P0=0xF0; //直接對P0賦值0xF0,意味著P0口的8個引腳,高4位全部輸出5V,低4位全部輸出0V。 P1\_4=0; //P1.4引腳輸出0V物理電壓,而不影響其它P1口引腳的狀態。 while(1) { } } 現象分析: “P0=0xF0”直接對P0賦值0xF0,意味著P0口的8個引腳,高4位全部輸出5V(LED燈反而滅),低4位全部輸出0V(LED燈反而被點亮)。 “P1\_4=0”P1.4引腳輸出0V物理電壓(LED燈反而被點亮)。
                  <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>

                              哎呀哎呀视频在线观看