中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在MCS-51單片機中對特殊功能寄存器的C51定義

發布時間:2020-07-18 10:15:28 來源:網絡 閱讀:4271 作者:行飛子 欄目:開發技術

在開始講對C51單片機中特殊寄存器(SPR)的定義前,先簡單介紹下我們在進行51單片機開發時經常看到的兩個關鍵字"sbit”和"sfr“:

sfr用于將一個單片機的特殊功能寄存器(specialfunctionregister)賦值給一個變量,這樣在后面的程序中就可以中這個變量指引(referto)該寄存器
sbit與sfr用法類似,只是sbit是位操作,用于將某個sfr中具體位賦值給一個變量,這樣后面程序就可用通過該變量為該位清0或置1。

接著我們以STC系列的51單片機為例簡單的了解下單片機的特殊功能寄存器布局,如下:

在MCS-51單片機中對特殊功能寄存器的C51定義

MCS-51單片機中,除了程序計數器PC和4組工作寄存器組外,其它所有的寄存器均為特殊功能寄存器(SPR),分散在片內RAM區的高128字節中,地址范圍為80H~0FFH。SFR中有11個寄存器具有位尋址能力,它們的字節地址都能被8整除,即字節地址是以8或0為尾數的。

為了能直接訪問這些SPR,FranklinC51提供了一種自主形式的定義方法,這種定義方法與標準C語言不兼容,只適合與對MCS-51系列單片機進行C語言編程,特殊的能寄存器C51定義的一般語法格式如下:
sfrsfr-name=intconstant;
“sfr”是定義語句的關鍵字,其后必須跟一個MSC-51單片機真實存在的特殊功能寄存器名,“=”后面必須是一個整型常數,不允許帶有運算符的表達式,是特殊功能寄存器“sfr-name”的字節地址,這個常數值的范圍必須在SFR地址范圍內,位于0x80~0xFF。
例如:
sfrSCON=0x98;    /* 串口控制寄存在器地址98H*/
sfrTMOD=0x89;   /*定時器/計數器方式控制寄存器地址89H*/
MCS-51系列單片機的特殊功能寄存器的數量與類型不盡相同,因此建議將所有特殊的“sfr”定義放入一個頭文件中,該文件應包括MCS-51單片機系列機型中的SFR定義。C51編譯器的“reg51.h”頭文件是這樣一個文件。
在新的MCS-51系列產品中,SFR在功能上經常組合為16位值,當SFR的高字節地址直接位于低字節之后時,對16位SFR的值可以直接進行訪問。例如52子系列的定時器/計數器2就是這種情況。為了有效地訪問這類SFR,可使用關鍵字“sfr16”來定義,其定義語句的語法格式與8位SFR相同,只是“=”后面的地址必須用16位于的SFR的低字節地址,即低字節地址作為“sfr16”的定義地址。例如:
sfr16T2=0xCC/*定時器/計數器2;T2低8位地址為0CCH,T2高8位地址為0CDH*/
這種定義適用于所有的新的16位SFR,但不能用于定時器/計數器0和1。
對于位尋址的SFR中的位,C51的擴充功能支持特殊位的定義,像SFR一樣不與標準C兼容,使用“sbit” 來定義位尋址單元。
定義語句的一般語法格式有如下三種:
第一種格式:sbitbit-name=sfr-name^intconstant ;
“sbit”是定義語句的關鍵字,后跟一個尋址位符號名(該位符號名必須是MCS-51單片機中規定的位名稱),“=”后的“sfr=name”中的位號,必須是0~7范圍中的數。例如:
sfrPSW=0Xd0;   /*定義PSW予寄存器地址為D0H*/
sfrOV=PSW^2;   /*定義OV位為PSW.2,地址為D2H/*
sfrCY=PSW^7;   /*定義CY位為PSW.7 地址為D7H^*/
第二種格式:sbitbit-name=intconstant^intconstant;
“=”后的intconstant為尋址地址們所在的特殊功能寄存器的字節地址,“^” 符號后的intconstant為尋址位在特殊功能寄存器中的位號。例如:
sbitOV=0Xd0^2; /*定義OV位地址是D0H字節中的第2位*/
sbitCY=0XD0^7; /*定義CY位地址是D0H字節中的第7位*/
第三種格式:sbitbit-name=intconstant;
“=”后的intconstant為尋址位的絕對地址。例如:
sbitOV=0XD2;    /*定義OV位地址為D2H*/
sbitOY=0XD7;    /*定義CY位地址為D7H*/
特殊功能位代表了一個獨立的定義類,不能與其它位定義和位域互換。

了解完了關于特殊功能寄存器的定義,有人又會產生疑問:

我們用sfrP0=0×80表示P0,用sfrSP=0×81表示SP,這個沒有歧義。但有疑問的是:假如用sbitP0_1=0×81表示P0口的第一位,那么我想表示SP寄存器的第0位怎么辦呢?如果也是定義成sbitSP_0=0×81那么明顯會有二義性,編譯器理解不了。其實這個問題是不存在的,從圖1中可以看出,SPR又可以分為兩個區域:可位尋址區和不可位尋址區。可位尋址區的寄存器地址能夠被8整除,而不可位尋址區的寄存器地址不滿足這一要求。因此例子中的sbitSP_0=0×81對于SP寄存器這是無效的應該寫成sfrSP=0x81。

例如:sbitP1^1=0x81;sfrSP=0x81;
它們雖然都引用了同一個地址0×81,但是對于編譯器來說,這兩者的含義完全不同,前者因為有sfr關鍵字,所以是字節地址。后者因為是sbit關鍵字,所以是位尋址,表示的是一個bit。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福安市| 清水县| 西平县| 马尔康县| 外汇| 甘德县| 澄江县| 垦利县| 淮南市| 星座| 永城市| 壶关县| 成都市| 崇礼县| 济宁市| 泗阳县| 桂东县| 施甸县| 台南市| 高雄市| 黄大仙区| 乌什县| 敦煌市| 广元市| 辉县市| 灵璧县| 古交市| 曲沃县| 都江堰市| 富顺县| 蕲春县| 鄂托克旗| 望奎县| 建水县| 邵阳市| 如皋市| 巨鹿县| 梓潼县| 高平市| 永清县| 萨嘎县|