<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國際加速解決方案。 廣告
                【81.1 節拍。】 單片機的C語言經過C編譯器后,翻譯成很多條機器指令,單片機逐條執行這些指令,每執行一條指令都是按照固定的節奏進行的,兩條指令之間是存在幾乎固定的時間間隔(實際上不是所有指令的間隔時間都絕對一致,這里方便理解暫時看作是一致),這就是節拍,每個節拍之間的時間間隔其實就是指令周期,因此,指令周期越短,節拍就越短,單片機的運算速度就越快。指令周期是由什么決定的呢?指令周期是由“心跳速度”和“心跳個數”決定的。指令周期都是由固定的N個“心跳個數”組成的,指令周期到底由多少個“心跳個數”組成?每種單片機每類指令各不一樣。我們用的51系列單片機,最短的單周期指令是由12個“心跳個數”組成,依次類推,雙周期指令由24個“心跳個數”組成,4周期指令由48個“心跳個數”組成。但是光有“心跳個數”還不夠,還必須搭配知道“心跳速度”才能最終計算出指令周期。這里的“心跳速度”就是晶振的頻率,“心跳個數”就是累計晶振的起振次數。比如,假設我們用的51單片機是12MHz(本教程實際用的是11.0592MHz),那么每個單周期的指令執行的時間是:12x(1/12000000)秒=1微秒。這個公式左邊的“12”代表“12個晶振起振的次數”,這個公式右邊的“(1/12000000)”代表晶振每起振1次所需要的單位時間。二者結合,剛好就是“心跳個數”乘以“單個心跳周期”等于指令周期,而指令周期就是節拍的時間。 ![](https://img.kancloud.cn/52/1a/521ad234fd8d5cdf42d846ef9291f45d_407x355.png) 圖81.1.1 單片機的晶振 【81.2 累計節拍次數產生延時時間。】 有了這個最原始的“節拍”概念,現在開始編寫一個練習程序,讓一個LED燈閃爍,閃爍的本質,就是讓一個LED燈先亮一會(“一會”就是延時),然后緊接著讓LED燈熄滅一會(“一會”就是延時),依次循環,在視覺上看到的連貫動作就是LED閃爍。這里的關鍵是如何產生這個“一會”的延時,本節教程所用的就是一個for循環來執行N條空指令,每執行一條空指令就需要消耗掉1個左右的指令周期的時間(大概1微秒左右),空指令執行的循環次數越多,產生的延時時間就越長。例子如下: ![](https://img.kancloud.cn/73/34/7334d9d189f0de190e15939b9fff75d9_214x279.png) 圖81.2.1 灌入式驅動8個LED \#include "REG52.H" sbit P0\_0=P0^0; //利用sbit和符號“^”的組合,把變量名字P0\_0與P0.0引腳關聯起來 unsigned long i; //for循環用的累計變量 //unsigned int i; //如果把for循環的變量i改成unsigned int類型,閃爍的頻率會加快。 void main() { while(1) { //第(1)步 P0\_0=0; //LED燈亮。 //第(2)步 for(i=0;i<5000;i++) //累計的循環次數越大,這里的延時就越長,“亮”持續的時間就越長。 { ; //分號代表一條空指令 } //第(3)步 P0\_0=1; //LED燈滅。 //第(4)步 for(i=0;i<5000;i++) //累計的循環次數越大,這里的延時就越長,“滅”持續的時間就越長。 { ; //分號代表一條空指令 } //第(5)步:這里已經觸碰到主循環while(1)的“底線”,所以接著跳轉到第(1)步繼續循環 } } 現象分析: 理論上,每執行1條指令大概1微秒左右,但是實際上,我們看到的實驗現象,發現累計循環才5000次,按理論計算,應該產生0.005秒左右的延時才合理,但是實際上居然能產生類似0.5秒的閃爍效果,中間相差100倍!為什么?C語言跟機器指令之間是存在翻譯的“中間商”環節,一條C指令并不代表一條機器指令,往往一條C指令翻譯后產生N條機器指令,比如上面的代碼,用到for循環變量i,用的是unsigned long變量,意味著4個字節,即使一條C語言賦值指令估計可能也要消耗4條單周期指令,在加上for循環的判斷指令,和累加指令,以及跳轉指令,所以我們看到的for(i=0;i<5000;i++)并不代表是真正僅僅執行了5000個指令周期,而是有可能執行了500000條指令周期!假如我們把上述代碼中的i改成unsigned int變量(2字節),是會看到閃爍的速度明顯加快的,其中原因就是C編譯器與機器指令之間存在翻譯后的“1對N”的關系。
                  <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>

                              哎呀哎呀视频在线观看