(玩电子) 电子技术学习与研讨
当时方位:单片机教程网 >> 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

宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论

相关文章