回覆列表
  • 1 # 使用者3926722064098

    我來回答:

    其實,STC大部分的微控制器都是51核心或是52核心的。所以在選晶片的時候,只要選一款51體系的晶片就可以。我們用STC的時候,選的都是89C51的晶片。

    但有一個問題要注意的就是: 在KEIL 模擬的時候,要注意區別,什麼可以模擬,什麼不可以模擬,這個就要求對51體系很懂。但如果你的水平足夠高,可以透過分析程式和藉助串列埠來判斷,就沒事。不要求模擬。、

    還有一個問題就是。大部分的STC的晶片,雖是51體系,但在51基礎上做了很大的改動。比如說,指令系統,雖沒有增減指令個數,但是,在時序上改動特別大。有些指令1個系統時針就完成了。這在延時,和外圍的介面,方面都要特別注意。一定要仔細看宏晶官網的資料。

    當然,官網上提供的資料,有些示例程式,不一定就是最好的。很的程式,都寫得很一般。甚至說很爛。不過,思路是對是。所以,示例程式,只是對你起一個指導做用。如果想寫出好的程式,大部分的功能,最好是都要經過測試。

    剛看了一下STC90c516RD+ 這晶片的功能並不是很強,只是FLASH達到了61K。當然,如果用到它增強方面的功能的話。就必須會定義特殊功能暫存器。下面附帶了。

    二, reg51.標頭檔案剖析

    我們平時寫微控制器應用程式的時候,所使用的標頭檔案大多都是用的的reg51.h或是用reg52.h。會寫C51的人都會用,但對其標頭檔案內部的定義有所瞭解的人確並不多。

    下面對其內部做詳細解釋,方便讀者作進一步的瞭解,並能運用各型別號的微控制器。因為增強型號的微控制器的增強功能都是透過特殊功能暫存器控制。

    開啟 reg52.h 標頭檔案,會發現是由大量的 sfr ,sbit的宣告組成,甚至於還有sfr16.其實這樣的宣告都是與微控制器內部功能暫存器(特殊功能暫存器)聯絡起來的,下面對其做出詳細解釋

    sfr: 宣告變數

    SFR 宣告一個變數,它的宣告與其它的C變數宣告基本相同,唯一的區別,SFR在宣告的同時為其指定特殊功能暫存器作為儲存地址,而不同於C變數宣告的整型,字元型等等由編譯器自動分配儲存空間。

    如reg52.h標頭檔案,第一條宣告就是sfr P0 = 0x80;

    此處宣告一個變數P0,並指定其儲存地址為特殊功能暫存器0x80;,在加入reg52.h標頭檔案後。編寫應用程式時P0就可以直接使用而無需定義,對P0的操作就是,對內部特殊功能暫存器(0x80對應用MCU的P0口)的操作,可進行讀寫操作。

    如果將第一條宣告改為sfr K0 = 0x80; 那麼,如果要把微控制器的P0口全部拉低,則不能寫P0=0x00;而應儲存後再在應用程式中寫成K0=0x00;否則編譯器會提示“P0為未定義識別符號”

    使用方法:

    sfr [variable] = [address] //為變數分配一個特殊功能暫存器。

    1 等號右邊,只能是十進位制,十六進位制整型的資料常量,,不允許帶運算子的表示式

    經典的8051核心支援的SFR地址從0x80H~0xFF 飛利浦80C51MX系列0x180H~0x1FF

    2 SFR不能聲明於任何函式內部,包括main函式。只能聲明於函式外。

    3 用SFR宣告一個變數後,不能用取地址運算子&獲取其地址, 編譯無法透過,編譯器會提示非法操作。

    4 有一點須特別注意,51核心0x80~0xff,為特殊功能暫存器地址區間,但並不是所有的地址都有定義,如果說你所用的MCU晶片上對於某個地址沒有定義,那麼用sfr在定義變數的時候,不要把變數的地址分配到未定義的特殊功能暫存器上,雖然編譯時能透過,用KEIL模擬時貌似是沒有問題,但下載到晶片裡執行時,是會出問題的。比如說,向一個未定義的特殊功能暫存器執行讀操作,讀出來的就是一個未知的數。(讀者可自行測試,先把串列埠通訊調通,然後做一個簡單的人機互動。讀出一個數後,再發給計算機,用串列埠除錯助手或是串列埠監控檢視。這用方法在模擬的時候很有用。)所以具體那些特殊功能暫存器能夠用,就要檢視你使用的晶片手冊。

    5 若遇到增強性的微控制器,只要知道其擴充套件的特殊功能暫存器的地址,用SFR定

    就可以很方便進行程式設計。

    sbit: 宣告變數

    sbit 同樣是宣告一個變數,和SFR 使用方法類似,但是SBIT是用來宣告一個位變數,因為,在51系列的應用中,非常有必要對SFR的單個位進行存取,而透過bit 資料型別,使其具備位定址功能。

    如,在reg52.h中有如下宣告

    sfr IE = 0xA8;

    sbit EA = IE^7;

    sbit ET2 = IE^5; //8052 only

    sbit ES = IE^4;

    sbit ET1 = IE^3;

    sbit EX1 = IE^2;

    sbit ET0 = IE^1;

    sbit EX0 = IE^0;

    所以,對EA的操作即是對IE最高位的操作。

    但如果想讓 SP DPL DPH PCON TMOC TL0 TL1 TH0 TH1 SBUF這些特殊功能暫存器具備位定址,採用上述如IE類似的定義,是不行的,雖然修改後,在編譯的時候不會出現錯誤,但只要用到你定義的位變數名時就會出錯。原因是,只有特殊功能暫存器的地址是8的倍數(十六進位制以0或8結尾)才能進行位定址。

    開啟reg52.h標頭檔案可以看到,所有用sbit聲明瞭的特殊功能暫存器的地址均是以0或8結尾

    如硬要達到上述要求,可用帶參的宏定義來完成。此處不做詳細說明(意義並不大)。

    下面對sbit的使用做詳細介紹:

    隨著8051的應用,非常有必要對特殊功能暫存器的單個bit位進行存取,C51編譯器透過sbit 資料型別,提供了對特殊功能暫存器的位操作。

    以下是sbit的三種應用形式:

    一, sbit name = sfr-name^bit-position;

    sfr PSW =0xD0;

    sfr IE =0xA8;

    sbit OV= PSW^2;

    sbit CY=PSW^7;

    sbit EA= IE^7;

    二, sbit name= sft-address^bit-position;

    sbit OV =0xD0^2;

    sbit CY =0xD0^7;

    sbit EA =0xA8^7;

    三, sbit name= sbit-address;

    sbit OV =0xD2;

    sbit CY =0xD7;

    sbit EA =0xAF;

    現對上述三種形式的宣告做必要的說明

    第一種形式sbit name = sfr-name^bit-position;如sbit OV= PSW^2; 當中的這個特殊功能暫存器必須在此之前已經用sfr 定義,否則編譯會出錯。

    bit-position範圍從0~7;

    第二種形式 sbit name= sft-address^bit-position如sbit OV =0xD0^2; 與第一種形式不同之外在於,此處直接使用PSW的地址.第一種形式須先定義PSW

    第三種形式. sbit name= sbit-address 如sbit OV =0xD2 是直接用的OV的地址

    OV的地址計算方式,是OV所在的暫存器地址加上OV的bit-position

    注意:

    不是所有的SFR都可位定址。只有特殊功能暫存器的地址是8的倍數(十六進位制以0或8結尾)才能進行位定址,並且sbit宣告的變數名,雖可以是任意取,但是最好不要以下劃線開頭,因為以下劃線開頭的都保留給了C51的標頭檔案做保留字。

    sfr16: 宣告變數

    許多8051的派生型微控制器,用兩個連續地址的特殊功能暫存器,來儲存一個16bit的值。例如,8052就用了0xCC和0xCD來儲存定時/計數暫存器2的高位元組和低位元組。編譯器提供sfr16這種資料型別,來儲存兩個位元組的資料。虛擬出一個16bit的暫存器。

    如下:

    sfr16 T2 = 0xCC

    儲存方面為小端儲存方式,低位元組在前,高位元組在後。定義時,只寫低位元組地址,如上,則定義T2為一個16位的特殊功能暫存器。 T2L= 0CCh, T2H= 0CDh

    使用方法:

    sfr [variable] = [low_address]

    1 等號右邊,只寫兩個特殊功能暫存器的低地址,且只能是十進位制,十六進位制的整型資料常量,不允許帶運算子的表示式

    2 SFR不能聲明於任何函式內部,包括main函式。只能聲明於函式外。

    3 用SFR宣告一個變數後,不能用取地址運算子&獲取其地址, 編譯無法透過,編譯器會提示非法操作。

    4 當你向一個sfr16寫入資料的時候,KEIL CX51 編譯器生成的程式碼,是先寫高位元組,後寫低位元組,(可透過返彙編視窗檢視)在有些情況下,這並非我們所想要的操作順序。使用時,須注意。

    5 當你所要寫入sfr16的資料,當是高位元組先寫還是低位元組先寫非常重要的時候,就只能用sfr 這個關鍵字來定義,並且任意時刻只儲存一個位元組,這樣操作才能保證寫入正確。

  • 中秋節和大豐收的關聯?
  • 光為led車燈質量怎樣?