|
1)“文件包含”處理概念
所謂“文件包含”是指在一個(gè)文件內(nèi)將另外一個(gè)文件的內(nèi)容全部包含進(jìn)來(lái)。因?yàn)楸话奈募械囊恍┒x和命令使用的頻率很高,幾乎每個(gè)程序中都可能要用到,為了提高編程效率,減少編程人員的重得勞動(dòng),將這些定義和命令單獨(dú)組成一個(gè)文件,如reg51.h,然后用#include<reg51.h>包含進(jìn)來(lái)就可以了,這個(gè)就相當(dāng)于工業(yè)上的標(biāo)準(zhǔn)零件,拿來(lái)直接用就可以了。
2)寄存器地址及位地址聲明的原因
其實(shí)相當(dāng)于為這些內(nèi)存地址取個(gè)名字。reg51.h里面主要是一些特殊功能寄存器的地址聲明,對(duì)可以位尋址的,還包括一些位地址的聲明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。
注意這里出現(xiàn)了一個(gè)使用很頻繁的sfr和sbit。
sfr 表示特殊功能寄存器的意思,它并非標(biāo)準(zhǔn)C 語(yǔ)言的關(guān)鍵字,而是Keil為能直接訪(fǎng)問(wèn)80C51中的SFR 而提供了一個(gè)新的關(guān)鍵詞,其用法是:sfr 特殊功能寄存器名=地址值
(注意對(duì)于頭文件里“特殊功能寄存器名”,用戶(hù)實(shí)際上也可以修改 的,如P1=0x80,也可改為A1=0x80,但sfr和地址值則不能更改,否者會(huì)編譯出錯(cuò)。)
sbit表示位的意思,它也是非標(biāo)準(zhǔn)C 語(yǔ)言的關(guān)鍵字,編寫(xiě)程序時(shí)如需操作寄存器的某一位(可位尋址的寄存器才能用)時(shí),需定義一個(gè)位變量,此時(shí)就要要到sbit,如sbit deng=P1^0,sbit EA = 0xAF;
需要注意的是,位定義時(shí)有些特殊,用法有三種:
第一種方法:sbit 位變量名=寄存器位地址值
第二種方法:sbit 位變量名=SFR名稱(chēng)^寄存器位值(0-7)
第三種方法:sbit 位變量名=SFR地址值^寄存器位值
“名稱(chēng)^變量位地址值”中“^”,它是由keil軟件的規(guī)定的 ,不能寫(xiě)成其它的,只能這樣能才編譯通過(guò)。 以上是對(duì)寄存器地址和位地址的定義和聲明作了解釋?zhuān)蠹倚枰卫斡涀。褐挥袑?duì)寄存器及相關(guān)位進(jìn)行聲明地址后,我們才能對(duì)其進(jìn)行賦相關(guān)的值,keil軟件才能編譯通過(guò)。
即:只有對(duì)寄存器及相關(guān)位進(jìn)行聲明地址后,我們才能對(duì)其進(jìn)行賦相關(guān)的值,keil軟件才能編譯通過(guò)。
3)REG51.H頭文件原文及解釋
下面的這些相當(dāng)于給各寄存器起個(gè)別名,不過(guò)這個(gè)別名為了易于識(shí)別,對(duì)應(yīng)的都是相應(yīng)功能的寄存器名稱(chēng),例如sfr P0 = 0x80; //P0口,指的是用P0代替0x80。對(duì)P0的操作即是對(duì)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)字,具體位意義見(jiàn)位定義
sfr ACC = 0xE0; //累加器,程序員最常用的
sfr B = 0xF0; //寄存器,主要用于乘除
sfr SP = 0x81; //堆棧指針,初始化為07;先加1后壓棧,先出棧再減1,
sfr DPL = 0x82;
sfr DPH = 0x83; //數(shù)據(jù)指針,用途大
sfr PCON = 0x87; //電源控制
sfr TCON = 0x88; //Timer/Counter控制
sfr TMOD = 0x89; //Timer/Counter方式控制
sfr TL0 = 0x8A;
sfr TL1 = 0x8B; //
sfr TH0 = 0x8C; //存著當(dāng)前的計(jì)數(shù)值
sfr TH1 = 0x8D; //
sfr IE = 0xA8; //好東西,中斷控制
sfr IP = 0xB8; //中斷優(yōu)先級(jí)控制,沒(méi)有設(shè)計(jì)過(guò)要求時(shí)間嚴(yán)格的系統(tǒng),所以至今沒(méi)有用過(guò)
sfr SCON = 0x98; //串口控制寄存器
sfr SBUF = 0x99; //串口緩沖寄存器
下面的這些可以用位操作,某寄存器某一位的位地址有可能和另一個(gè)寄存器的直接地址重合,但在使用時(shí)對(duì)位地址操作的指令與對(duì)直接地址的操作是不同的,所以不會(huì)混淆。
51單片機(jī)內(nèi)部共有21個(gè)SFR,每個(gè)SFR占1個(gè)字節(jié),多數(shù)字節(jié)單元中的每一位又有專(zhuān)用的“位名稱(chēng)”。這21個(gè)SFR又按是否可以位尋址分為兩大部分,ACC、IE、P1等11個(gè)可以位尋址,SP、TMOD等不可以位尋址。
sbit CY = 0xD7; //進(jìn)位或借位,有就是1,沒(méi)有就是0
sbit AC = 0xD6; //輔助進(jìn)借位,(麻煩b)
sbit F0 = 0xD5; //沒(méi)有具體用途,可以由用戶(hù)決定他的意義,所以它就沒(méi)有意義
sbit RS1 = 0xD4;
sbit RS0 = 0xD3; //工作寄存器選擇,這個(gè)在下面解釋
sbit OV = 0xD2; //over!溢出,有是1,沒(méi)有是0
sbit P = 0xD0; //奇偶校驗(yàn),奇數(shù)個(gè)1是1
sbit TF1 = 0x8F; //T1的中斷請(qǐng)求標(biāo)志
sbit TR1 = 0x8E; //Timer 1 running,好記吧~
sbit TF0 = 0x8D; //
sbit TR0 = 0x8C; //把上面兩個(gè)1換成0
sbit IE1 = 0x8B; //interrupt external 1 外中斷請(qǐng)求標(biāo)志
sbit IT1 = 0x8A; //interrupt triggle 1 外中斷觸發(fā)方式
sbit IE0 = 0x89;
sbit IT0 = 0x88; //同樣,把上面的兩個(gè)1換成0
sbit EA = 0xAF; //Enable all哇,重要,全局中斷控制,光著他,哈哈,什么都不用作了,就像放假一樣
sbit ES = 0xAC; //Enable Serial,開(kāi)串口中斷
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)先級(jí)
sbit PT1 = 0xBB; //T1優(yōu)先級(jí)
sbit PX1 = 0xBA; //外部中斷1優(yōu)先級(jí)
sbit PT0 = 0xB9; //
sbit PX0 = 0xB8; //上面兩個(gè)1換成0
//控制寄存器!!!!
sbit RD = 0xB7; //讀
sbit WR = 0xB6; //寫(xiě)
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; //什么鬼特征位,要用查書(shū),或者等我以后解釋?zhuān)」?br />
sbit REN = 0x9C; //串行接收允許
sbit TB8 = 0x9B; //收到的第九位
sbit RB8 = 0x9A; //要發(fā)的第九位
sbit TI = 0x99; //哇,熟悉吧,發(fā)送完成中斷標(biāo)志
sbit RI = 0x98; //接收完成中斷標(biāo)志 |
|