(玩電子) 電子技術學習與研究
                      當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

                      51單片機頭文件reg51.h詳解

                      作者:huqin   來源:本站原創   點擊數:x  更新時間:2013年12月30日   【字體:

                      我們在用c語言編程時往往第一行就是頭文件,51單片機為reg51.h或reg52.h,51單片機相對來說比較簡單,頭文件里面內容不多,像飛思卡爾、ARM系列的單片機頭文件往往內容就非常多,盡管如此,對一些初次接觸單片機的朋友來說,51的頭文件還是搞不太清楚,今天具體來說明一下。
                             1
                      文件包含處理概念

                       

                      所謂文件包含是指在一個文件內將另外一個文件的內容全部包含進來。因為被包含的文件中的一些定義和命令使用的頻率很高,幾乎每個程序中都可能要用到,為了提高編程效率,減少編程人員的重得勞動,將這些定義和命令單獨組成一個文件,如reg51.h,然后用#include<reg51.h>包含進來就可以了,這個就相當于工業上的標準零件,拿來直接用就可以了。
                           2寄存器地址及位地址聲明的原因 
                          reg51.h里面主要是一些特殊功能寄存器的地址聲明,對可以位尋址的,還包括一些位地址的聲明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。

                      sfr P1 = 0x90這句話表示:P1口所對應的特殊功能寄存器P1在內存中的地址為0x80,sbit EA=0xAF這句話表示EA這一位的地址為0xAF。
                              注意這里出現了一個使用很頻繁的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 地址值^寄存器位值

                      如:

                      sbit IT0=0x88 1)說明:0x88IT0 的位地址值

                      sbit  deng=P1^2 2)說明:其中P1 必須先用sfr 定義好

                      sbit EA=0xA8^7 3)說明:0xA8 就是IE寄存器的地址值
                          以上三種定義方法需注意的是 IT0 deng EA可由用戶隨便定義,但必須滿足C語言對變量名的定義規則。除些外其它的則必須按照上面的格式寫,如名稱^變量位地址值中“^”,它是由keil軟件的規定的 ,不能寫成其它的,只能這樣能才編譯通過。
                          以上是對寄存器地址和位地址的定義和聲明作了解釋,大家需要牢牢記住:只有對寄存器及相關位進行聲明地址后,我們才能對其進行賦相關的值,keil軟件才能編譯通過。至于說為什么,這可能一句話兩句話也說不清楚。
                            3內存、SFR、位、地址等的通俗解釋 

                      前面講到了寄存器地址地址(前提能位尋址)聲明的目的是為告訴C編譯器相應寄存器及其位在內存中的地址,這樣我們對寄存器及一些位賦的變量和數值才能正確保存,然后才能供CPU正確的調用,完成相應的功能。
                          上段文字出現了寄存器(SFR)、位,地址、內存等,單片機學習過程中還會出現ROM、RAM等名詞,可能大家覺得不是很好理解,這里可以通俗的解釋一下,如下面三個圖所示。
                          我們把內存比作賓館ROM、RAM、SFR相當于賓館里具體的有三種不同功能樓層(具體這個賓館多少層即多少ROM、RAM、SFR,視各個賓館或者每種單片機而不同),每層8個房間相當于8位,每個房間要么住男人要么住女人相當于每位要么放入數字1要么放入數字0,keil編譯器就相當于賓館的工作人員旅客去住旅館相當寫程序的過程住賓館的人必須事先要給工作人員說你是哪一層哪一個房間(即聲明寄存器地址和位地址,)賓館工作人員才能把你帶到你的房間里去(這里假設這個賓館可以由旅客自己決定住哪個房間)即:只有對寄存器及相關位進行聲明地址后,我們才能對其進行賦相關的值,keil軟件才能編譯通過。
                       


                       
                       

                       
                       

                       
                       

                       

                      4)REG51.H頭文件原文及解釋
                         打開reg51.h 可以看到這樣的一些內容(此文件一般在C:\KEIL\C51\INC ,INC文件夾根目錄里有不少頭文件,并且里面還有很多以公司分類的文件夾,里面也都是相關產品的頭文件。如果我們要使用自己寫的頭文件,使用的時候只需把對應頭文件拷貝到INC文件夾里就可以了。)

                          下面附出頭文件的原文,并把注釋文件一并附后。 


                      /*--------------------------------------------------------------------------

                       

                      REG51.H

                       

                      Header file for generic 80C51 and 80C31 microcontroller.

                      Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.

                      All rights reserved. 

                      --------------------------------------------------------------------------*/

                       

                      #ifndef __REG51_H__

                      #define __REG51_H__

                       

                      /*  BYTE Register  */

                              

                       sfr P0   = 0x80;   //三態雙向     IO      P0口 此句話的意思是:特殊功能寄存器 P0 地址為0x80 ,可位尋址,下同

                                                //8位地址總線/數據總線(一般不用而只作普通I/O口,注意作I/O口用時,硬件上需接上接電阻)

                      sfr P1   = 0x90;   //準雙向       IO      P1

                       


                      sfr P2   = 0xA0;   //
                      準雙向  IO      P2

                                                //8位地址總線,一般也作普通I/O用

                      sfr P3   = 0xB0;   //雙功能

                                                //1.準雙向      IO      P3

                                              //2.  P30              RXD串行數據接受

                                             //    P31              TXD串行數據發送

                                                //     P32              外部中斷0     信號申請

                                               //     P33              外部中斷1     信號申請

                                                  //     P34              定時/計數器T0     外部計數脈沖輸入

                                                  //     P35              定時/計數器T1     外部計數脈沖輸入

                                                  //     P36              WR  片外RAM寫脈沖信號輸入

                                                  //     P37           RD  片外ram讀脈沖信號輸入

                      sfr PSW  = 0xD0; // 可以位尋址(C語言編程時可不考慮此寄存器)

                                                  //程序狀態寄存器Program Status WORD  (程序狀態信息)

                                                  //psw.7(CY)    進位標志

                                                  //psw.6(AC)輔助進位標志位低四位向高四位進位或借位時   AC=1

                                                  //主要用于十進制調整

                                                  //psw.5(F0)用戶可自定義的程序標志位

                                                 //psw.4(RS1)

                                                  //psw.3(RS0)

                                                  //工作寄存器選擇位

                                                  //任一時刻只有一組寄存器在工作

                                                  //0 0  0     00H~07H

                                                  //0 1   1     08H~0fH

                                                  //1 0   2     10H~17H

                                                  //1 1   3     18H~1FH

                                                  //psw.2(OV)    溢出標志位

                                                  //psw.1(   )      保留為 ,不可使用

                                                  //psw.0(P)              奇偶校驗位

                       

                      sfr ACC  = 0xE0;     //累加器A     特殊功能寄存器    可位尋址

                      sfr B    = 0xF0;        //寄存器B      主要用于乘除運算

                      sfr SP   = 0x81;       //堆棧指針寄存器SP    存放站定棧頂地址、

                      sfr DPL  = 0x82;      //

                      sfr DPH  = 0x83;     //數據指針寄存器DPTR、//對片外RAM及擴展IO進行存取用的地址指針

                       

                      sfr PCON = 0x87; //電源控制寄存器  、不能位尋址             

                                                 //管理單片機的電源部分包括上電復位、掉電模式、空閑模式等

                                                 //單片機復位時PCON被全部清0,編程時一般是用到SMOD位,其它的一般不用

                                                //D7 SMOD該位與串口通信波特率有關

                                                //SMOD=0     串口方式1 2 3 波特率正常

                                                //SMOD=1     串口方式1 2 3 波特率加倍

                                    

                       

                       

                       

                      sfr TCON = 0x88;  //定時器/計數器    控制寄存器   可以位尋址                                                          
                               
                      //D7  TF1       
                      定時器1溢出標志位

                                                  //D6       TR1      定時器1運行控制位

                                                  //D5       TF0        定時器0溢出標志位

                                                  //D4     TR0        定時器0運行控制位

                                                  //D3       IE1         外部中斷1請求標志

                                                  //D2       IT1         外部中斷1 觸發方式選擇位

                                                  //D1       IE0       外部中斷0請求標志

                                                  //D0     IT0         外部中斷0 觸發方式選擇位

                       

                       

                      sfr TMOD = 0x89; //定時器/計數器    工作方式寄存器    不能位尋址

                                                  //確定工作方式和功能                                                  

                                                  //D7 GATE     門控制位

                                                  //GATE=0;定時器/計數器由TRXx=01)來控制

                                                  //GATE=1;定時器/計數器由TRXx=01

                                                  //和外部中斷引腳(init01)來共同控制

                                                  //D6  C/T      定時器、計數器選擇位

                                                  //     0    選擇定時器模式

                                                  //     1     選擇計數器模式

                                                  //D5       M1        

                                                  //D4       M0

                                                  //M1       M0         工作方式

                                                  //0   0            方式0     13位定時器/計數器

                                                  //0   1          方式1     16位定時器/計數器

                                                  //1   0          方式2     8位自動重裝定時器/計數器

                                                  //1   1          方式3     僅適用T0      分成兩個8位計數器,T1停止計數

                                                  //D3 GATE     門控制位

                                                  //GATE=0;定時器/計數器由TRXx=01)來控制

                                                  //GATE=1;定時器/計數器由TRXx=01

                                                  //和外部中斷引腳(init01)來共同控制

                                                  //D2  C/T             定時器、計數器選擇位

                                                  //0  選擇定時器模式

                                                  //1   選擇計數器模式

                                                  //D1       M1        

                                                  //D0       M0

                                                  //     M1 M0         工作方式

                                                  //     0     0     方式0     13位定時器/計數器

                                                  //     0     1     方式1   16位定時器/計數器

                                                  //     1     0     方式2   8位自動重裝定時器/計數器

                                                  //     1     1     方式3   僅適用T0      分成兩個8位計數器,T1停止計數

                       

                      sfr TL0  = 0x8A;    //定時器/計數器08     容器   1 計數器

                      sfr TL1  = 0x8B;    //定時器/計數器18     容器

                      sfr TH0  = 0x8C;    //定時器/計數器08     容器

                      sfr TH1  = 0x8D;    //定時器/計數器18     容器

                       

                       

                       

                      sfr IE   = 0xA8;                 //中斷允許寄存器          可以位尋址

                                                                //D7  EA         全局中斷允許位

                                                                //D6       NULL

                                                                //D5       ET2        定時器/計數器2中斷允許位     interrupt 5

                       

                                                                //D4  ES          串行口中斷允許位        interrupt 4

                       

                                                                //D3  ET1        定時器/計數器1中斷允許位     interrupt 3

                       

                                                                //D2  EX1        外部中斷1中斷允許位      interrupt 2

                       

                                                                 //D1  ET0        定時器/計數器0中斷允許位  interrupt 1

                       

                                                                 //D0  EX0        外部中斷0中斷允許位     interrupt 0

                        

                      sfr IP   = 0xB8;        //中斷優先級寄存器   可進行位尋址

                                                   //D7 NULL

                                                      //D6 NULL

                                                       //D5       NULL

                                                                       //D4       PS          串行口中斷定義優先級控制位

                                                                       //            1            串行口中斷定義為高優先級中斷

                                                                       //            0            串行口中斷定義為低優先級中斷

                                                                       //         

                                                                       //D3       PT1       

                                                                       //            1     定時器/計數器1中斷定義為高優先級中斷

                                                                       //            0     定時器/計數器1中斷定義為低優先級中斷

                                                                       //D2 PX1

                                                                       //            1            外部中斷1定義為高優先級中斷

                                                                       //            0          外部中斷1定義為低優先級中斷

                                                                       //D1       PT0       

                                                                       //            1     定時器/計數器0中斷定義為高優先級中斷

                                                                       //            0     定時器/計數器0中斷定義為低優先級中斷

                                                                       //D0 PX0

                                                                       //            1            外部中斷0定義為高優先級中斷

                                                                       //            0          外部中斷0定義為低優先級中斷

                       

                       

                       

                      sfr SCON = 0x98;   //串行口控制寄存器     可以進行位尋址          

                                                    //D7   SM0             

                                                     //D6       SM1

                                                     //     SM0      SM1              串行口工作方式

                                                     //     0           0            同步移位寄存器方式

                                                   //     0         1            10位異步收發(8位數據),波特率可變(定時器1溢出率控制)

                                                     //   1         0            11位異步收發(9位數據),波特率固定

                                                     //     1         1            11異步收發(9位數據)  ,波特率可變(定時器1溢出率控制)

                                                     //D5       SM2            多機通信控制位    主要用于方式2和方式3

                                                     //D4       REN            允許串行接收位

                       

                                                     //D3       TB8        方式23中發送數據的第9

                                                     //D2       RB8      方式23中接受數據的第9

                       

                                                     //D1       TI           發送中斷標志位

                                                    //D0       RI         接受中斷標志位

                       

                       

                      sfr SBUF = 0x99;    //串行數據緩沖區

                       

                      /*****************************************************************************

                                                                              下面是位尋址區

                                                                上面做過解釋的就不在下面一一解釋了

                      ******************************************************************************/

                      /*  BIT Register  */    

                      /*  PSW   */

                      sbit CY   = 0xD7;

                      sbit AC   = 0xD6;

                      sbit F0   = 0xD5;

                      sbit RS1  = 0xD4;

                      sbit RS0  = 0xD3;

                      sbit OV   = 0xD2;

                      sbit P    = 0xD0;

                       

                      /*  TCON  */

                      sbit TF1  = 0x8F;

                      sbit TR1  = 0x8E;

                      sbit TF0  = 0x8D;

                      sbit TR0  = 0x8C;

                      sbit IE1  = 0x8B;

                      sbit IT1  = 0x8A;

                      sbit IE0  = 0x89;

                      sbit IT0  = 0x88;

                       

                      /*  IE   */

                      sbit EA   = 0xAF;

                      sbit ES   = 0xAC;

                      sbit ET1  = 0xAB;

                      sbit EX1  = 0xAA;

                      sbit ET0  = 0xA9;

                      sbit EX0  = 0xA8;

                       

                      /*  IP   */

                      sbit PS   = 0xBC;

                      sbit PT1  = 0xBB;

                      sbit PX1  = 0xBA;

                      sbit PT0  = 0xB9;

                      sbit PX0  = 0xB8;

                       

                      /*  P3  */

                      sbit RD   = 0xB7;

                      sbit WR   = 0xB6;

                      sbit T1   = 0xB5;

                      sbit T0   = 0xB4;

                      sbit INT1 = 0xB3;

                      sbit INT0 = 0xB2;

                      sbit TXD  = 0xB1;

                      sbit RXD  = 0xB0;

                       

                      /*  SCON  */

                      sbit SM0  = 0x9F;

                      sbit SM1  = 0x9E;

                      sbit SM2  = 0x9D;

                      sbit REN  = 0x9C;

                      sbit TB8  = 0x9B;

                      sbit RB8  = 0x9A;

                      sbit TI   = 0x99;

                      sbit RI   = 0x98;

                       

                      #endif

                      發表評論】【告訴好友】【收藏此文】【關閉窗口

                      文章評論

                      相關文章

                      富二代国产视频