1)“文件包含”處理概念
所謂“文件包含”是指在一個文件內將另外一個文件的內容全部包含進來。因為被包含的文件中的一些定義和命令使用的頻率很高,幾乎每個程序中都可能要用到,為了提高編程效率,減少編程人員的重得勞動,將這些定義和命令單獨組成一個文件,如reg51.h,然后用#include<reg51.h>包含進來就可以了,這個就相當于工業(yè)上的標準零件,拿來直接用就可以了。
2)寄存器地址及位地址聲明的原因
其實相當于為這些內存地址取個名字。reg51.h里面主要是一些特殊功能寄存器的地址聲明,對可以位尋址的,還包括一些位地址的聲明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。
注意這里出現(xiàn)了一個使用很頻繁的sfr和sbit。
sfr 表示特殊功能寄存器的意思,它并非標準C 語言的關鍵字,而是Keil為能直接訪問80C51中的SFR 而提供了一個新的關鍵詞,其用法是:sfr 特殊功能寄存器名=地址值
(注意對于頭文件里“特殊功能寄存器名”,用戶實際上也可以修改 的,如P1=0x80,也可改為A1=0x80,但sfr和地址值則不能更改,否者會編譯出錯。)
sbit表示位的意思,它也是非標準C 語言的關鍵字,編寫程序時如需操作寄存器的某一位(可位尋址的寄存器才能用)時,需定義一個位變量,此時就要要到sbit,如sbit deng=P1^0,sbit EA = 0xAF;
需要注意的是,位定義時有些特殊,用法有三種:
第一種方法:sbit 位變量名=寄存器位地址值
第二種方法:sbit 位變量名=SFR名稱^寄存器位值(0-7)
第三種方法:sbit 位變量名=SFR地址值^寄存器位值
“名稱^變量位地址值”中“^”,它是由keil軟件的規(guī)定的 ,不能寫成其它的,只能這樣能才編譯通過。 以上是對寄存器地址和位地址的定義和聲明作了解釋,大家需要牢牢記住:只有對寄存器及相關位進行聲明地址后,我們才能對其進行賦相關的值,keil軟件才能編譯通過。
即:只有對寄存器及相關位進行聲明地址后,我們才能對其進行賦相關的值,keil軟件才能編譯通過。
3)REG51.H頭文件原文及解釋
下面的這些相當于給各寄存器起個別名,不過這個別名為了易于識別,對應的都是相應功能的寄存器名稱,例如sfr P0 = 0x80; //P0口,指的是用P0代替0x80。對P0的操作即是對0x80地址的操作。其中0x80是P0的地址。
* BYTE Register */
sfr P0 = 0x80; //P0口
sfr P1 = 0x90; //P1口
sfr P2 = 0xA0; //P2口
sfr P3 = 0xB0; //P3口
sfr PSW = 0xD0; //程序狀態(tài)字,具體位意義見位定義
sfr ACC = 0xE0; //累加器,程序員最常用的
sfr B = 0xF0; //寄存器,主要用于乘除
sfr SP = 0x81; //堆棧指針,初始化為07;先加1后壓棧,先出棧再減1,
sfr DPL = 0x82;
sfr DPH = 0x83; //數(shù)據指針,用途大
sfr PCON = 0x87; //電源控制
sfr TCON = 0x88; //Timer/Counter控制
sfr TMOD = 0x89; //Timer/Counter方式控制
sfr TL0 = 0x8A;
sfr TL1 = 0x8B; //
sfr TH0 = 0x8C; //存著當前的計數(shù)值
sfr TH1 = 0x8D; //
sfr IE = 0xA8; //好東西,中斷控制
sfr IP = 0xB8; //中斷優(yōu)先級控制,沒有設計過要求時間嚴格的系統(tǒng),所以至今沒有用過
sfr SCON = 0x98; //串口控制寄存器
sfr SBUF = 0x99; //串口緩沖寄存器
下面的這些可以用位操作,某寄存器某一位的位地址有可能和另一個寄存器的直接地址重合,但在使用時對位地址操作的指令與對直接地址的操作是不同的,所以不會混淆。
51單片機內部共有21個SFR,每個SFR占1個字節(jié),多數(shù)字節(jié)單元中的每一位又有專用的“位名稱”。這21個SFR又按是否可以位尋址分為兩大部分,ACC、IE、P1等11個可以位尋址,SP、TMOD等不可以位尋址。
sbit CY = 0xD7; //進位或借位,有就是1,沒有就是0
sbit AC = 0xD6; //輔助進借位,(麻煩b)
sbit F0 = 0xD5; //沒有具體用途,可以由用戶決定他的意義,所以它就沒有意義
sbit RS1 = 0xD4;
sbit RS0 = 0xD3; //工作寄存器選擇,這個在下面解釋
sbit OV = 0xD2; //over!溢出,有是1,沒有是0
sbit P = 0xD0; //奇偶校驗,奇數(shù)個1是1
sbit TF1 = 0x8F; //T1的中斷請求標志
sbit TR1 = 0x8E; //Timer 1 running,好記吧~
sbit TF0 = 0x8D; //
sbit TR0 = 0x8C; //把上面兩個1換成0
sbit IE1 = 0x8B; //interrupt external 1 外中斷請求標志
sbit IT1 = 0x8A; //interrupt triggle 1 外中斷觸發(fā)方式
sbit IE0 = 0x89;
sbit IT0 = 0x88; //同樣,把上面的兩個1換成0
sbit EA = 0xAF; //Enable all哇,重要,全局中斷控制,光著他,哈哈,什么都不用作了,就像放假一樣
sbit ES = 0xAC; //Enable Serial,開串口中斷
sbit ET1 = 0xAB; //Enable Timer/Counter 1
sbit EX1 = 0xAA; //Enable External 1
sbit ET0 = 0xA9; //Enable Timer/counter 0
sbit EX0 = 0xA8; //Enable External 0
sbit PS = 0xBC; //串行中斷優(yōu)先級
sbit PT1 = 0xBB; //T1優(yōu)先級
sbit PX1 = 0xBA; //外部中斷1優(yōu)先級
sbit PT0 = 0xB9; //
sbit PX0 = 0xB8; //上面兩個1換成0
//控制寄存器!。。
sbit RD = 0xB7; //讀
sbit WR = 0xB6; //寫
sbit T1 = 0xB5; //T/C1
sbit T0 = 0xB4; //T/C0
sbit INT1 = 0xB3; //外中斷1
sbit INT0 = 0xB2; //外中斷0
sbit TXD = 0xB1; //串行發(fā)送
sbit RXD = 0xB0; //串行接收
sbit SM0 = 0x9F; //
sbit SM1 = 0x9E; //串口工作方式
sbit SM2 = 0x9D; //什么鬼特征位,要用查書,或者等我以后解釋,啊哈
sbit REN = 0x9C; //串行接收允許
sbit TB8 = 0x9B; //收到的第九位
sbit RB8 = 0x9A; //要發(fā)的第九位
sbit TI = 0x99; //哇,熟悉吧,發(fā)送完成中斷標志
sbit RI = 0x98; //接收完成中斷標志
經過上面的操作,相應的名字即與相應的地址聯(lián)系了起來。使用該定義的名字即是對該內存的操作。(sfr P0 = 0x80; //P0口,該IO口對應地址0x80是硬件設計好的,把數(shù)據放入此處即可輸出該數(shù)據。)
4)可位尋址區(qū)(特對低128字節(jié)作了一個介紹)
51hei.png (172.93 KB, 下載次數(shù): 50)
下載附件
2019-12-20 00:33 上傳
51hei.png (266.06 KB, 下載次數(shù): 45)
下載附件
2019-12-20 00:33 上傳
從表中可以看到, “位地址4EH”,是在“字節(jié)地址29H”中,是第6位。
對位尋址區(qū)可以按照“位地址”來對某一個位單獨進行操作,也可以按照“字節(jié)地址”進行操作,即同時對八個位地址的內容進行操作。MCS-51系列單片機具有一套專用的“位操作”指令(又稱為布爾指令),可對這些位地址進行“與”、“或”、“非”等操作。這是該系列單片機的特色之一。
一般的8051芯片實際內部RAM只有128B從0x00-0x7F,而從0x80-0xFF則是SFR是CPU工作寄存器和各種外設寄存器都在此的區(qū)域。(也即是內存與外設統(tǒng)一編址,外設占用內存的地址)
完整的Word格式文檔51黑下載地址:
51頭文件.docx
(382.89 KB, 下載次數(shù): 31)
2019-12-18 20:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|