特殊功能寄存器SFR
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 特殊功能寄存器sfr
? ? ? sfr也是一種擴(kuò)充數(shù)據(jù)類型,點(diǎn)用一個(gè)內(nèi)存單元,值域?yàn)?~255。?
? ? ?利用它可以訪問(wèn)51單片機(jī)內(nèi)部的所有特殊功能寄存器。(sfr 是定義8 位的特殊功能寄存器而sfr16 則是用來(lái)定義16 位特殊功能寄存器)
?
(1) sbit 位變量名=位地址
? ? ? ?sbit ?P1_1 = Ox91;
這樣是把位的絕對(duì)地址賦給位變量.同sfr 一樣sbit 的位地址必須位于80H-FFH 之間.
?
(2) sbit 位變量名=特殊功能寄存器名^位位置
? ?sft ?P1= 0x90;
? sbit P1_1 = P1 ^ 1;
//先定義一個(gè)特殊功能寄存器名再指定位變量名所在的位置,當(dāng)可
尋址位位于特殊功能寄存器中時(shí)可采用這種方法
?
(3) sbit 位變量名=字節(jié)地址^位位置
? ?sbit P1_1 = 0x90 ^ 1;
這種方法其實(shí)和2 是一樣的,只是把特殊功能寄存器的位址直接用常數(shù)表示.
?
?在C51存儲(chǔ)器類型中提供有一個(gè)bdata 的存儲(chǔ)器類型,這個(gè)是指可位尋址的數(shù)據(jù)存儲(chǔ)器,位于單片機(jī)的可位尋址區(qū)中,可以將要求可位錄址的數(shù)據(jù)定義為bdata,
如:
unsigned char bdata ib; //在可位錄址區(qū)定義ucsigned char 類型的變量ib sbit ib7=ib^7 //用關(guān)鍵字sbit 定義位變量來(lái)獨(dú)立訪問(wèn)可尋址位對(duì)象的其中一位?
int bdata ab[2]; //在可位尋址區(qū)定義數(shù)組ab[2],這些也稱為可尋址位對(duì)象 sbit ab12=ab[1]^12;操作符"^"后面的位位置的最大值取決于指定的基址類型, char0-7,int0-15,long0-31.
/
?
sfr 并標(biāo)準(zhǔn)C 語(yǔ)言的關(guān)鍵字,而是Keil 為能直接訪問(wèn)80C51 中的SFR 而提供了一個(gè)新的關(guān)鍵詞,其用法是:
? ?sfrt 變量名=地址值。?
///?
二.符號(hào)P1_0 來(lái)表示P1.0 引腳。
?
在C 語(yǔ)言里,如果直接寫P1.0,C 編譯器并不能識(shí)別,而且P1.0 也不是一個(gè)合法的C
語(yǔ)言變量名,所以得給它另起一個(gè)名字,Keil C的關(guān)鍵字sbit 來(lái)定義,sbit 的用法有三種:
?
第一種方法:sbit 位變量名=地址值第二種方法:sbit 位變量名=SFR 名稱^變量位地址值第三種方法:sbit 位變量名=SFR 地址值^變量位地址值如定義PSW 中的OV 可以用以下三種方法:sbit OV=0xd2 (1)說(shuō)明:0xd2 是OV 的位地址值sbit OV=PSW^2 (2)說(shuō)明:其中PSW 必須先用sfr 定義好sbit OV=0xD0^2 (3)說(shuō)明:0xD0 就是PSW 的地址值因此這里用sfr P1_0=P1^0;就是定義用符號(hào)P1_0 來(lái)表示P1.0 引腳.
?
3).sbit可錄址位
sbit同位是C51中的一種擴(kuò)充數(shù)據(jù)類型,利用它可以訪問(wèn)芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。如先前我們定義了
?
sfr P1 = 0x90; //因P1端口的寄存器是可位尋址的,所以我們可以定義
?
sbit P1_1 = P1^1; //P1_1為P1中的P1.1引腳
?
//同樣我們可以用P1.1的地址去寫,如sbit P1_1 = 0x91;
?
| MCS-51單片機(jī)的特殊功能寄存器 | ||
| 符號(hào) | 地址 | 功能介紹 |
| B | F0H | B寄存器 |
| ACC | E0H | 累加器 |
| PSW | D0H | 程序狀態(tài)字 |
| TH2* | CDH | 定時(shí)器/計(jì)數(shù)器2(高8位) |
| TL2* | CCH | 定時(shí)器/計(jì)數(shù)器2(低8位) |
| RLDH* | CBH | 外部輸入(P1.1)計(jì)數(shù)器/自動(dòng)再裝入模式時(shí)初值寄存器高八位 |
| RLDL* | CAH | 外部輸入(P1.1)計(jì)數(shù)器/自動(dòng)再裝入模式時(shí)初值寄存器低八位 |
| T2CON* | C8H | T2定時(shí)器/計(jì)數(shù)器控制寄存器 |
| IP | B8H | 中斷優(yōu)先級(jí)控制寄存器 |
| P3 | B0H | P3口鎖存器 |
| IE | A8H | 中斷允許控制寄存器 |
| P2 | A0H | P2口鎖存器 |
| SBUF | 99H | 串行口鎖存器 |
| SCON | 98H | 串行口控制寄存器 |
| P1 | 90H | P1口鎖存器 |
| TH1 | 8DH | 定時(shí)器/計(jì)數(shù)器1(高8位) |
| TH0 | 8CH | 定時(shí)器/計(jì)數(shù)器0(高8位) |
| TL1 | 8BH | 定時(shí)器/計(jì)數(shù)器1(低8位) |
| TL0 | 8AH | 定時(shí)器/計(jì)數(shù)器0(低8位) |
| TMOD | 89H | T0、T1定時(shí)器/計(jì)數(shù)器方式控制寄存器 |
| TCON | 88H | T0、T1定時(shí)器/計(jì)數(shù)器控制寄存器 |
| DPH | 83H | 數(shù)據(jù)地址指針(高8位) |
| DPL | 82H | 數(shù)據(jù)地址指針(低8位) |
| SP | 81H | 堆棧指針 |
| P0 | 80H | P0口鎖存器 |
| PCON | 87H | 電源控制寄存器 |
#include<reg51.h> //包含51單片機(jī)寄存器定義的頭文件 void main(void) {P0=0xfe; //P0=1111 1110B,即P1.0輸出低電平 直接賦初值P0=0xfd;P0=0xff;P0=0x00;}//51單片機(jī)低電平有效 /#include<reg51.h> //控制p0連續(xù)閃爍 void delay() //延時(shí) {unsigned int i;for(i=0;i<20000;i++); } void main() { while(1){P0=0xfe;delay();P0=0xff;delay(); } } /// #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; void DelayMS(uint x) {uchar i;while(x--){ for(i=0;i<120;i++);} } void main() { while(1){LED=~LED;DelayMS(150); } } ///#include<reg51.h> //包含單片機(jī)寄存器的頭文件 sfr x=0x80; //P0口在存儲(chǔ)器中的地址是b0H, 通過(guò)sfr可定義8051內(nèi)核單片機(jī)//的所有內(nèi)部8位特殊功能寄存器,對(duì)地址x的操作也就是對(duì)P1口的操作//p1:90H//p2:A0H//P3:B0H /**************************************** 函數(shù)功能:延時(shí)一段時(shí)間 *****************************************/ void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++) ; //利用循環(huán)等待若干機(jī)器周期,從而延時(shí)一段時(shí)間} /***************************************** 函數(shù)功能:主函數(shù) ******************************************/ void main(void) {while(1){/x=0xfe; //第一個(gè)燈亮delay(); //調(diào)用延時(shí)函數(shù)x=0xfd; //第二個(gè)燈亮delay(); //調(diào)用延時(shí)函數(shù)x=0xfb; //第三個(gè)燈亮delay(); //調(diào)用延時(shí)函數(shù)x=0xf7; //第四個(gè)燈亮delay(); //調(diào)用延時(shí)函數(shù)P0=0xef; //第五個(gè)燈亮delay(); //調(diào)用延時(shí)函數(shù)P0=0xdf; //第六個(gè)燈亮delay(); //調(diào)用延時(shí)函數(shù)P0=0xbf; //第七個(gè)燈亮delay(); //調(diào)用延時(shí)函數(shù)P0=0x7f; //第八個(gè)燈亮delay(); //調(diào)用延時(shí)函數(shù) }} ///函數(shù)功能:用整形數(shù)據(jù)延時(shí)一段時(shí)間 ******************************************************/ void int_delay(void) //延時(shí)一段較長(zhǎng)的時(shí)間 {unsigned int m; //定義無(wú)符號(hào)整形變量,雙字節(jié)數(shù)據(jù),值域?yàn)?~65535for(m=0;m<36000;m++); //空操作 } /****************************************************** 函數(shù)功能:用字符型數(shù)據(jù)延時(shí)一段時(shí)間 ******************************************************/ void char_delay(void) //延時(shí)一段較短的時(shí)間 {unsigned char i,j; //定義無(wú)符號(hào)字符型變量,單字節(jié)數(shù)據(jù),值域0~255for(i=0;i<200;i++)for(j=0;j<180;j++); //空操作 }
總結(jié)
以上是生活随笔為你收集整理的特殊功能寄存器SFR的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python怎么创建txt文件啊_搞定P
- 下一篇: 蓝牙协议栈 电话免提协议HFP(Hand