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

2021-01-12 電子產品世界

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

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

本文引用地址:http://www.eepw.com.cn/article/201611/318618.htm

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

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。


相關焦點

  • 單片機的特殊功能寄存器
    在單片機中有一些獨立的存儲單元是用來控制這些器件的,被稱之為特殊功能寄存器(SFR)。<特殊功能寄存器地址映象表(一)><特殊功能寄存器地址映象表(二)><特殊功能寄存器地址映象表(三)>這是個什麼東西,可不能從名字上理解,它是一個寄存器,而不是一個做加法的東西,為什麼給它這麼一個名字呢?或許是因為在運算器做運算時其中一個數一定是在ACC中的緣故吧。它的名字特殊,身份也特殊,稍後我們將學到指令,能發現,所有的運算類指令都離不開它。2、B:一個寄存器。在做乘、除法時放乘數或除數,不做乘除法時,隨你怎麼用。3、PSW:程序狀態字。
  • 從零開始51單片機教程——連載8 特殊功能寄存器
    詳細介紹什麼是寄存器 寄存器能做什麼通過前面的學習,我們已知單片機的內部有ROM、有RAM、有並行I/O口,那麼,除了這些東西之外,單片機內部究竟還有些什麼,這些個零碎的東西怎麼連在一起的,讓我們來對單片機內部的寄存器作一個完整的功能分析吧!
  • 51特殊功能寄存器
    這128個單元中,特殊功能寄存器僅佔用了21個單元,其餘單元51單片機不能對它們進行讀/寫操作(即不能作內部數據存儲器使用)。單元地址可被8整除的SFR可位尋址。如圖1)累加器A或特殊功能寄存器ACC累加器為8位寄存器,用於存放操作數,也可用來存放運算的中間結果。A和ACC雖是同一個寄存器,但是在指令中它們卻是有區別的。
  • 8051單片機特殊功能存儲器SFR基礎詳解
    8051單片機共有21個專用寄存器,現把其中部分寄存器簡單介紹如下:程序計數器(PC—Program Counter)。在實訓中,我們已經知道PC是一個16位的計數器,它的作用是控制程序的執行順序。
  • 單片機與C語言——keil c51教程:數據類型
    6. bit位標量bit位標量是C51編譯器的一種擴充數據類型,利用它可定義一個位標量,但不能定義位指針,也不能定義位數組。它的值是一個二進位位,不是0就是1,類似一些高級語言中的Boolean類型中的True和False。7. sfr特殊功能寄存器sfr也是一種擴充數據類型,點用一個內存單元,值域為0~255。
  • Keil C51的一些有趣特性
    Keil C51的一些有趣特性 Keil c51號稱作為51系列單片機最好的開發環境,大家一定都很熟悉。回答這個問題之前我們先來了解keil c51的幾個有趣的特性(不考慮重入函數)。 一、函數在調用前定義與在調用後定義產生的代碼是有很大差別的(特別是在優化級別大於3級時)。
  • 基於C51單片機的遙控小車設計與製版
    硬體方案確定如下:在現有電動車模型的基礎上,加裝無線控制模塊,電機驅動模塊,實現對電動車的無線遙控,並將數據傳送至單片機進行處理,然後由單片機根據所接收到檢測的數據實現對電動車的控制。三、單片機簡介1、89c51硬體結構
  • 單片機關鍵字寄存器和運算符
    存儲類型說明在程序執行過程中不可更改的常量值continue程序語句轉向下一次循環default程序語句Switch語句中的失敗選擇項do程序語句構成do..while關鍵字用 途說 明bit位標量聲明聲明一個位標量或位類型的函數sbit位標量聲明聲明一個可位尋址變量Sfr特殊功能
  • 單片機C語言code與data的作用
    code的作用是告訴單片機,我定義的數據要放在ROM(程序存儲區)裡面,寫入後就不能再更改,其實是相當與彙編裡面的尋址MOVC(好像是),因為
  • 寄存器物理地址映射到結構體封裝的寄存器的過程
    二、對這一方式的分析與總結也就是關於單片機寄存器封裝問題:最近在學習嵌入式linux過程中,看到 DM368因為嵌入式linux開發沒有像單片機一樣的編譯軟體,系統文件不是編譯軟體本身自帶的。嵌入式編程需要自己找到需要用的模塊的頭文件,來操作相應的寄存器,編寫相應的驅動。於是乎,在看別人的程序時,迷迷糊糊的就從主程序看到了驅動程序,又看到了底層操作寄存器的程。為了徹底搞懂嵌入式程序,終於注意到了以前單片機編程時沒怎麼注意過的結構體封裝寄存器,映射物理地址。
  • 單片機C語言教程:C51函數
    其實一直出現在例子中的 main()也算是一個函數,只不過它比較特殊,編譯時以它做為程序的開始段。但是 標準的函數不足以滿足使用者的特殊要求,因此 C 語言允許使用者根據需要編寫特定功能的 函數,要調用它必須要先對其進行定義。定義的模式如下:函數類型 函數名稱(形式參數表){函數體}函數類型是說明所定義函數返回值的類型。返回值其實就是一個變量,只要按變量類型來定義函數類型就行了。
  • 單片機彙編指令入門學習和查看
    在進行彙編程序設計時,MSP430的指令系統是程序的主體,但為了方便程序編制,還定義了一些指令,這些指令不參與和影響程序的執行,也不在計算機中運行,這類指令稱為偽指令。一般彙編器偽指令能幫助用戶完成以下事情:·將代碼和數據彙編到規定的段中·在存儲器中用未初始化的變量保留空間·控制彙編後列表文件的格式·初始化存儲器·彙編條件塊·定義全局變量·規定彙編器可以從中獲得宏的庫
  • 單片機定時器/計數器基本原理
    單片機定時器/計數器基本原理 目前常用的單片機中往往都配備了定時器/計數器。我們主要要求掌握T0和T1的結構和功能。學習中要注意從電路結構上來理解功能的實現。定時器/計數器方式寄存器TMOD和定時器/計數器控制寄存器TCON是用以設定定時器/計數器的工作方式、定時或計數功能,控制啟動或停止以及產生溢出中斷的重要模塊,應該對這兩個寄存器中的逐位的定義和功能進行學習和掌握。
  • PIC單片機C語言程序實例
    要學會用C函數實現所需功能的方法。實際上,每個C函數都相當於一個功能模塊,一個C函數便可實現一種功能。      此外,用C語言開發PIC單片機應用產品,必須具有PIC單片機彙編語言知識。如果你已經掌握了用彙編語言編寫PIC單片機源程序的方法,最好將編寫成功的PIC單片機彙編語言源程序,逐個用C語言源文件代換,從中體會C語言的優越性。
  • 通俗易懂講PIC單片機:從一竅不通到入門進步
    在我們的例句中,向GPIO寄存器寫入了2,常數2的八位二進位表示是「00000010」 因此如果此時GP0, Gp1等都已經被定義成輸出的話,那麼GP1輸出高電平(接LED燈亮),GP0 輸出低電平(所接led燈熄) 。  截止到現在,你已經學會如何控制管腳的電平高低了。
  • 基於STM32單片機的功能及特點
    基於STM32單片機的功能及特點 工程師周亮 發表於 2018-10-17 16:51:36 為什麼要學STM32?
  • 8051單片機模塊化編程技巧
    而且目前單片機的教材還是側重於彙編語言。因此學習用單片機彙編語言程序進行結構化設計還是很有必要的。我們知道C51 語言是函數式語言,其程序由函數構成,每一個源程序有且只有一個主函數main() 和若干個函數組成。其中每一個函數都用於完成某一特定任務。也就是說,一個項目若具有幾個功能,實現這些功能就會需要由若干個任務來完成,那麼它的源程序中就會有若干個或以上的函數。
  • HT46ru232單片機簡介
    低功耗、I/O 使用靈活、可編程分頻器、計數器、振蕩類型選擇、多通道 A/D 轉換、脈寬調製功能、IIC 接口、UART 總線,暫停和喚醒功能,使這款單片機可以廣泛應用於傳感器的 A/D 轉換、馬達控制、工業控制、消費類產品,子系統控制器等。 HT46ru232單片機有兩種封裝形式,一為下圖所示,28腳的DIP封裝,另外一種為48腳的SOP封裝。
  • 平凡單片機教學 第六講 單片機內部結構分析(五)
    在單片機中有一些獨立的存儲單元是用來控制這些器件的,被稱之為特殊功能寄存器(SFR)。事實上,我們已接觸過P1這個特殊功能寄存器了,還有哪些呢?看表1符號地址功能介紹BF0HB寄存器ACCE0H累加器PSWD0H程序狀態字IPB8H中斷優先級控制寄存器P3B0H
  • 單片機快速入門實驗:控制LED閃爍發光
    ●LPC900系列單片機簡介LPC900系列單片機是國際著名半導體廠商Philips公司(http://www.scn.semiconductors.philips.com/)推出的新一代80C51內核單片機。LPC900兼容標準80C51的指令系統和特殊功能寄存器(SFR),如果學過80C51單片機,則很容易入門。