新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > C51—運算量(重點:特殊功能寄存器變量、位變量

        C51—運算量(重點:特殊功能寄存器變量、位變量

        作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏
        C51就是c語言for 51單片機,這里邊還是有很多不同的,在c語言里運算量相信都知道那叫一個簡單,直接int, float就哦了,當然這里也可以直接int, float,但是他們還是有不同的,這里就介紹一下運算量中的不同!,相同的我就直接跳過~(果斷不說了,不同的對于以后c語言開發(fā)51單片機還是相當有用的,慢慢的就會體會到了~~~~~,尤其是特殊功能寄存器變量、位變量、還有絕對地址的訪問!

        C51的運算量(只說重點~):

        本文引用地址:http://www.104case.com/article/201611/321506.htm

        C51中的運算量主要是常量和變量。

        1、常量

        常量是指在程序執(zhí)行過程中不能改變的量。在C51中支持整型常量、浮點型常量、字符型常量和字符串型常量。

        1)整型常量

        2)浮點型常量

        3)字符型常量

        4)字符串型常量

        2、變量

        變量就是在程序運行過程中可以改變的量唄。

        一個變量有兩部分組成:變量名和變量值。每個變量都有一個變量名,在存儲器中占用一定的存儲單元,變量的數(shù)據(jù)類型不同,占用的存儲單元數(shù)就不同。在存儲單元中存放的內容就是變量值。

        1)數(shù)據(jù)類型說明符

        在定義變量時必須通過數(shù)據(jù)類型說明符來指明變量的數(shù)據(jù)類型,指明變量在存儲器中占用的字節(jié)數(shù)。可以使基本數(shù)據(jù)類型說明符,也可以是組合數(shù)據(jù)類型說明符,還可以是typedef或者#define定義的類型別名(這里一定要注意typedef一般用來定義別名!盡量不要用#define啊~~我就不解釋了,太專業(yè)了~~不過用宏定義就一定要用#define)

        例如:

        typedef unsigned char uchar; //這個是有;的

        typedef unsigned int uint;

        或者:

        #define uchar unsigned char //這個就沒有; 而且它們兩個定義相反

        #define uint unsigned int

        2)變量名

        變量名有兩種:普通變量和指針變量。他們的區(qū)別是指針變量名前面帶“*”號。

        3)存儲種類

        存儲種類是指變量在程序執(zhí)行過程中的作用范圍。C51變量的存儲種類有4種,分別是:自動(auto)、外部(extern)、靜態(tài)(static)和存儲器(register)。

        a、auto

        當定義它的函數(shù)體或者復合語句執(zhí)行時,C51才為該變量分配內存空間,結束時占用的內存空間釋放。自動變量一般分配在內存的堆棧空間中。定義變量時,如果缺省存儲種類,則默認為此。

        b、extern

        被定以后分配固定的內存空間,在程序整個執(zhí)行時間內都有效,知道程序結束時才釋放。

        c、static

        使用static定義的變量成為外部變量,可分為內部靜態(tài)變量和外部靜態(tài)變量。在函數(shù)體內部定義的靜態(tài)變量為內部靜態(tài)變量,它在對應的函數(shù)體內有效,一直存在,但在函數(shù)體外不可見。這樣不僅使變量在定義它的函數(shù)體外可以被保護,還可以實現(xiàn)當離開函數(shù)體時值不被改變。外部靜態(tài)變量是在函數(shù)體外定義的靜態(tài)變量,它在程序中一直存在,但在定義的范圍之外是不可見的。如在多文件或者多模塊處理中(這點很重要,以后會用到很多,尤其是多模塊,寫大程序必須具備的),外部靜態(tài)變量只在文件內部或者模塊內部有效。

        d、register

        它定義的變量存放在CPU內部的寄存器中,處理速度快,但是數(shù)目有限。

        4)存儲器類型

        存儲器類型用來指明變量所處的單片機的存儲區(qū)域情況。類型如下:

        data:直接尋址的片內RAM低128B,訪問速度快

        bdata:片內RAM的可位尋址區(qū)(20H~2FH),允許字節(jié)和位混合訪問

        idata:間接尋址訪問的片內RAM,允許訪問全部片內RAM

        pdata:用Ri簡潔訪問的片外RAM低256B

        xdata:用DPTR間接訪問的片外RAM,允許訪問全部64KB片外RAM

        code:程序存儲器ROM64KB

        注意:定義變量時可以省略“存儲類型”,省略時C51編譯器將按存儲模式默認存儲器類型。具體的存儲情況啊~~一會你就知道了,繼續(xù)往下看~~哈

        例如:

        char data var1; //在片內RAM低128B定義用直接尋址方式訪問的自足型變量var1

        unsigned char bdata var2; //在片內RAM位尋址區(qū)(20H~2FH)單元定義可字節(jié)處理和位處理的無符號字符型變量var2

        5)特殊功能寄存器變量

        在51單片機中有很多特殊功能寄存器(不過這些有些東西還是不需要我們來關心的~~~因為在調用#include"reg52.h"的時候里面都給你整好了),通過這些特殊功能寄存器可以控制51單片機的定時器、計數(shù)器、串口、I/0及其他功能部件(這里很重要的~~~~~~),沒一個特殊功能寄存器再片內RAM中都對應一個字節(jié)單元或者兩個字節(jié)單元。

        在C51中,允許用戶對這些特殊功能寄存器進行訪問,但是訪問時需要通過sfr或者sfr16類型說明符進行定義,定義是需要指明他們所對應的片內RAM單元的地址。(你過關不用擔心,直接調用#include"reg52.h"就哦了~)

        例如:

        sfr PSW=0xd0;

        sfr SCON=0x98;

        sfr16 DPTR=0x82;

        6)位變量

        在C51中,允許用戶通過位類型符定義位變量。

        位類型符有兩個:bit和sbit。可以定義兩種位變量。

        a、bit型位變量

        在格式中可以加上各種修飾,但是要注意存儲器類型只能是bdata、data、idata,只能是片內RAM的可位尋址區(qū),嚴格來說只能是bdata。

        例如:

        bit bdata a1;

        b、sbit型位變量

        sbit位類型符用于定義在可位尋址字節(jié)或者特殊功能寄存器中的位,定義時需要指明其位地址,可以使位直接地址,可以是可位尋址變量帶位號,也可以是特殊功能寄存器名帶位號。

        例如(這些東西都在#include"reg52.h"中):

        sbit OV=0xd2;

        sbit CY=0xd7;

        unsigned char bdata flag;

        sbit flag_0=flag^0; //字節(jié)地址與位號之間、特殊功能寄存器與位號之間一般用“^”作間隔

        sfr P1=x090;

        sbit P1_1=P1^1;

        3、存儲模式(個人感覺真的用不到這些東東了,因為你丫的要是嫌小可以換個大的,而且還相當?shù)谋阋藒~~~,我以前試過擴展一個RAM和ROM,擦不成啊~~)

        C51編譯器支持3種存儲模式:SMALL模式、COMPACT模式和LARGE模式。不同的存儲模式對變量默認的存儲器類型不一樣。

        1)SMALL模式

        SMALL模式成為小編譯模式,在SMALL模式下,編譯時函數(shù)參數(shù)以及變量被默認在片內RAM中,存儲類型為data。

        2)COMPACT模式

        COMPACT模式稱為緊湊編譯模式,在COMPACT模式下,編譯時函數(shù)參數(shù)和變量被默認在片外RAM的低256B空間,存儲類型為pdata。


        上一頁 1 2 下一頁

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 临清市| 吐鲁番市| 茂名市| 无极县| 云浮市| 新田县| 乌鲁木齐市| 东平县| 靖州| 鲜城| 隆尧县| 铁岭市| 罗源县| 拉孜县| 汾阳市| 工布江达县| 岳普湖县| 博客| 马山县| 镇远县| 大庆市| 恭城| 婺源县| 江陵县| 青浦区| 临沧市| 嵊泗县| 浑源县| 偃师市| 和田县| 广德县| 稻城县| 闻喜县| 依安县| 奉节县| 贵州省| 康平县| 霍邱县| 额尔古纳市| 平阴县| 仙居县|