#include <reg51.h>是 c51(用于單片機開發的一種c語言)的頭檔案。
類似于頭檔案 AT89X51.h。
這兩個頭檔案基本是一樣的,隻是在使用時對位的定義不一樣,
at89x51.h 檔案中對 P1.1的操作是寫成 P1_1;
reg51.h 檔案中的操作則寫成 P1^1。
打開 reg51.h 可以看到這樣的一些内容:
此檔案一般在 C:\KEIL\C51\INC 下 ,INC 檔案夾根目錄裡有不少頭檔案,并且裡面還有很多以公司分類的檔案夾,裡面也都是相關産品的頭檔案。
如果我們要使用自己寫的頭檔案,使用的時候隻需把對應頭檔案拷貝到 INC 檔案夾裡就可以了。
sfr 并非标準C語言的關鍵字,而是 Keil 為能直接通路 80C51 中的 SFR 而提供了一個新的關鍵詞,其用法是:sfrt 變量名=位址值。
符号 P1_0 來表示 P1.0 引腳。
在C語言裡,如果直接寫 P1.0,C編譯器并不能識别,而且 P1.0 也不是一個合法的語言變量名,是以得給它另起一個名字,這裡起的名為 P1_0, 可是 P1_0 是不是就是 P1.0呢?
你這麼認為,C 編譯器可不這麼認為,是以必須給它們建立聯系,這裡使用了 Keil C 的關鍵字 sbit 來定義,
sbit 的用法有三種:
第一種方法:sbit 位變量名=位址值
第二種方法:sbit 位變量名=SFR 名稱^變量位位址值
第三種方法:sbit 位變量名=SFR 位址值^變量位位址值
如定義 PSW 中的 OV 可以用以下三種方法:
sbit OV=0xd2 (1)說明:0xd2 是 OV 的位位址值
sbit OV=PSW^2 (2)說明:其中 PSW 必須先用 sfr 定義好
sbit OV=0xD0^2 (3)說明:0xD0 就是 PSW 的位址值
是以這裡用 sfr P1_0=P1^0;就是定義用符号 P1_0 來表示 P1.0 引腳,如果你願意也可以起 P10 一類的名字,隻要下面程式中也随之更改就行了。
1)“檔案包含”處理概念
所謂“檔案包含”是指在一個檔案内将另外一個檔案的内容全部包含進來。因為被包含的檔案中的一些定義和指令使用的頻率很高,幾乎每個程式中都可能要用到,為了提高程式設計效率,減少程式設計人員的重得勞動,将這些定義和指令單獨組成一個檔案,如 reg51.h 然後用#include<reg51.h>包含進來就可以了,這個就相當于工業上的标準零件,拿來直接用就可以了。
2)寄存器位址及位位址聲明的原因
reg51.h 裡面主要是一些特殊功能寄存器的位址聲明,對可以位尋址的,還包括一些位位址的聲明,如果如 sfr P1=0x80; sfr IE=0xA8; sbit EA=0xAF 等。
sfr P1 = 0x90 這句話表示:P1 口所對應的特殊功能寄存器,P1在記憶體中的位址為0x90。
sbit EA=0xAF 這句話表示:EA 這一位的位址為 0xAF。
程式狀态寄存器 Program Status WORD=PSW (程式狀态資訊)
3)記憶體、SFR、位、位址等的通俗解釋
前面講到了寄存器位址和位位址(前提能位尋址)聲明的目的是為告訴 C 編譯器相應寄存器及其位在記憶體中的位址,這樣我們對寄存器及一些位賦的變量和數值才能正确儲存, 然後才能供 CPU 正确的調用,完成相應的功能。上段文字出現了寄存器(SFR)、位、位址、記憶體等,單片機學習過程中還會出現ROM、RAM 等名詞,可能大家覺得不是很好了解,這裡可以通俗的解釋一下。
我們把記憶體比作飯店,ROM、RAM、SFR 相當于飯店裡具體的有三種不同功能樓層(具體這個飯店多少層即多少 ROM、RAM、SFR,視各個飯店或者每種單片機而不同),每層 8個房間相當于8位,每個房間要麼住男人要麼住女人相當于每位要麼放入數字1要麼放入數字0,keil 編譯器就相當于飯店的從業人員,旅客去住旅館相當寫程式的過程,住飯店的人必須事先要給從業人員說你是哪一層哪一個房間(即聲明寄存器位址和位位址,)飯店從業人員才能把你帶到你的房間裡去(這裡假設這個飯店可以由旅客自己決定住哪個房間)。
即:隻有對寄存器及相關位進行聲明位址後,我們才能對其進行賦相關的值,keil 軟體才能編譯通過。
我的GitHub位址:
https://github.com/heizemingjun我的部落格園位址:
http://www.cnblogs.com/chenmingjun我的螞蟻筆記部落格位址:
http://blog.leanote.com/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】