<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 在MCS51單片機(jī)中對(duì)特殊功能寄存器的C51定義

          在MCS51單片機(jī)中對(duì)特殊功能寄存器的C51定義

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          在開(kāi)始講對(duì)C51單片機(jī)中特殊寄存器(SPR)的定義前,先簡(jiǎn)單介紹下我們?cè)谶M(jìn)行51單片機(jī)開(kāi)發(fā)時(shí)經(jīng)??吹降膬蓚€(gè)關(guān)鍵字"sbit”和"sfr“:

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

          本文引用地址:http://www.ex-cimer.com/article/201611/318618.htm

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

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

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

          了解完了關(guān)于特殊功能寄存器的定義,有人又會(huì)產(chǎn)生疑問(wèn):

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

          例如:sbitP1^1=0x81;sfrSP=0x81;
          它們雖然都引用了同一個(gè)地址0×81,但是對(duì)于編譯器來(lái)說(shuō),這兩者的含義完全不同,前者因?yàn)橛衧fr關(guān)鍵字,所以是字節(jié)地址。后者因?yàn)槭莝bit關(guān)鍵字,所以是位尋址,表示的是一個(gè)bit。


          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();