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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                【58.1 const與code的關系。】 const與code都是語法的修飾關鍵詞,放在所定義的數據前面時有“不可更改”之意。在C語言語法中,const像普通話全國通用,是標準的語言;而code像地方的方言,僅僅適合針對51單片機的C51編譯器環境。而其它大多數單片機的C編譯器并不支持code,只支持const。比如PIC,STM32等單片機的C編譯器都是只認const而不認code的。通常情況下,const定義的數據都是放在ROM的,但是51單片機的C51編譯器是例外,它并不把const定義的數據放在ROM區,只有用code關鍵詞時它才會把數據放在ROM區,這一點相對其它大多數的單片機來說是不一樣的。因為本教程是用51單片機的C51編譯器,所以用code來替代const。本節教程所提到的const,在實際編程時都用code來替代。 【58.2 const(或code)在定義數據時的終極目的。】 在數據定義分配的應用中,const的終極目的是為了節省RAM的開銷。從“讀”和“寫”的角度分析,數據有兩種:“能讀能寫”和“只能讀”這兩種。 “能讀能寫”的數據占用RAM內存,叫變量,C語言語法上定義此類數據時“無”const前綴。 “只能讀”的數據占用ROM內存,叫常量, C語言語法上定義此類數據時“有”const前綴。單片機的ROM容量比RAM容量往往大幾十倍甚至上百倍,相比之下,RAM的資源顯得比較稀缺。因此,把某些只需“讀”而不需“寫”的數據定義成const放在ROM,就可以節省RAM的開銷。 【58.3 const(或code)的應用場合。】 const可以定義單個常量,也可以定義常量數組。定義單個常量時,通常應用在某個出現在程序多處并且需要經常調整的“閥值”參數,方便“一鍵更改”的操作。所謂“一鍵更改”,就是只要改一次const所定義初始化的某個常量,整個程序多次出現的此常量就自動更改了。定義常量數組時,通常應用在某個數據轉換表,把某些固定的常量預先放到常量數組,通過數組的下標來“查表”。 【58.4 const(或code)的語法格式。】 定義單個常量和常量數組時的語法是以下這個樣子的: const unsigned char x=10; //定義單個常量。加了const。 const unsigned char y\[12\]={31,28,31,30,31,30,31,31,30,31,30,31}; //定義常量數組。加了const。 【58.5 const(或code)的“能讀”和“不可寫”概念】 所謂“讀”和“寫”的能力,其實就是看某數能在賦值符號“=”的“右邊”還是“左邊”的能力。普通的變量,既可以在賦值符號“=”的“右邊”(能讀),也可以在賦值符號“=”的“左邊”(能寫)。比如,下面的寫法是合法的: unsigned char k=1; //這是普通的變量,無const前綴。 unsigned char n=2; //這是普通的變量,無const前綴。 n=k; //k出現在賦值符號“=”的右邊,表示能讀。合法。 k=n; //k出現在賦值符號“=”的左邊,表示能寫,可更改之意。合法。 但是如果一旦在普通的變量前面加了const(或code)關鍵詞,就會發生“化學變化”,原來的“變量”就變成了“常量”,常量只能“讀”,不能“寫”。比如: const unsigned char c=1; //這是常量,有const前綴。 unsigned char n=2; //這是普通的變量,無const前綴。 n=c; //c是常量,能讀,這是合法的。這行代碼是語法正確的。 c=n; //c是常量,不能寫,這是非法的,C編譯器不通過。這行代碼是語法錯誤的。 【58.6 const(或code)能在函數內部定義嗎?】 const(或code)能在函數內部定義嗎?能。語法是允許的。當在函數內部定義數據成const(或者code),在數據的存儲結構上,數據也是放在ROM區的(實際上在51單片機里想把數據放在ROM只能用code而不能用const),把數據定義在函數內部,就只能在這個函數里面用,不能被其它函數調用。在作用域的問題上,const(或者code)的常量數據跟其它變量的數據是一樣的。比如: void HanShu(void) { const unsigned char c=1; //在函數內部定義的const常量也是放在ROM區存儲。 unsigned char n=2; n=c; //c是常量,在函數內部定義,只能在當前這個HanShu函數里調用。 } 【58.7 例程練習和分析。】 本教程使用的是51單片機的C51編譯器,編寫程序時為了讓常量數據真正存儲在ROM區,因此,本教程的程序例子都是用code替代const。 本例程講兩個例子,一個是單個常量,一個是常量數組。 (1)單個常量。舉的例子是“閥值”的“一鍵更改”應用。根據考試的分數,分兩個等級。凡是大于或者等于90分的就是“優”,串口助手輸出顯示“1”。凡是小于90分的就是“良”,串口助手輸出顯示“0”。這里的“90分”就是我所說的“閥值”概念,只要用一個const定義一個常量數據來替代“90”,當需要調整“閥值”時,只要更改一次此定義的常量數值就可以達到“一鍵更改”之目的。 (2)常量數組。舉的例子是,查詢2017年12個月的某個月的總天數,用兩種思路實現,一種是switch分支語句來實現,另一種是const常量數組的“查表”思路來實現。通過對比這兩種思路,你會發現const常量數組在做“轉換表”這類“查表”項目時的強大優越性。 /\*---C語言學習區域的開始。-----------------------------------------------\*/ //函數的聲明。 unsigned char HanShu\_switch(unsigned char u8Month); unsigned char HanShu\_const(unsigned char u8Month); //數據的定義。 code unsigned char Cu8Level=90; //需要調整“閥值”時,只需更改一次這里的“90”這個數值。 code unsigned char Cu8MonthBuffer\[12\]= //每個月對應的天數。從數組下標0開始,0代表1月... {31,28,31,30,31,30,31,31,30,31,30,31}; unsigned char a; //用來接收函數返回的結果。 unsigned char b; unsigned char c; unsigned char d; //函數的定義。 unsigned char HanShu\_switch(unsigned char u8Month) //用switch分支來實現。 { switch(u8Month) { case 1: //1月份的天數 return 31; case 2: //2月份的天數 return 28; case 3: //3月份的天數 return 31; case 4: //4月份的天數 return 30; case 5: //5月份的天數 return 31; case 6: //6月份的天數 return 30; case 7: //7月份的天數 return 31; case 8: //8月份的天數 return 31; case 9: //9月份的天數 return 30; case 10: //10月份的天數 return 31; case 11: //11月份的天數 return 30; case 12: //12月份的天數 return 31; default: //萬一輸錯了其它范圍的月份,就默認返回30天。 return 30; } } unsigned char HanShu\_const(unsigned char u8Month) //用const常量數組的“查表”來實現。 { unsigned char u8GetDays; u8Month=u8Month-1; //因為數組下標是從0開始,0代表1月份,1代表2月份。所以減去1。 u8GetDays=Cu8MonthBuffer\[u8Month\]; //這就是查表,馬上獲取常量數組表格里固定對應的天數。 return u8GetDays; } void main() //主函數 { //第(1)個例子 if(89>=Cu8Level) //大于或者等于閥值,就輸出1。 { a=1; } else //否則輸出0。 { a=0; } if(95>=Cu8Level) //大于或者等于閥值,就輸出1。 { b=1; } else //否則輸出0。 { b=0; } //第(2)個例子 c=HanShu\_switch(2); //用switch分支的函數獲取2月份的總天數。 d=HanShu\_const(2); //用const常量數組“查表”的函數獲取2月份的總天數。 View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 View(b); //把第2個數b發送到電腦端的串口助手軟件上觀察。 View(c); //把第3個數c發送到電腦端的串口助手軟件上觀察。 View(d); //把第4個數d發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:0 十六進制:0 二進制:0 第2個數 十進制:1 十六進制:1 二進制:1 第3個數 十進制:28 十六進制:1C 二進制:11100 第4個數 十進制:28 十六進制:1C 二進制:11100 分析: a為0。 b為1。 c為28。 d為28。 【58.8 如何在單片機上練習本章節C語言程序?】 直接復制前面章節中第十一節的模板程序,練習代碼時只需要更改“C語言學習區域”的代碼就可以了,其它部分的代碼不要動。編譯后,把程序下載進帶串口的51學習板,通過電腦端的串口助手軟件就可以觀察到不同的變量數值,詳細方法請看第十一節內容。
                  <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>

                              哎呀哎呀视频在线观看