(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> 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  特殊功能寄存器名=地址值(注意对于头文件里“特殊功能寄存器名”用户实际上部以修改的如校=x80,部改为=x80,但sfr  和地址值则不能更改否者会编译出错)
   sbit 表示位的意思它也是非标准C 语言的关键字编写程序时如需操作寄存器的某一位可位寻址的寄存器才能用时需定义一个位变量此本要要到sbit如sbit deng=P1^0,sbit EA   = 0xAF;需要注意的是位定义时行特殊 用法有三种

第一址法sbit 位变量名寄存器位地址值

第二址法sbit 位变量名SFR 名称^寄存器位值

第三址法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位地址内存等单片机学习过程中还会出现ROMRAM等名词可能大家觉得不是很好理解这里可以通俗的解释一下如下面三个图所尽
    我们把内存比作宾馆ROMRAMSFR相当于宾馆里具体的有三种不同功能楼层具体这个宾馆多少层即多少ROMRAMSFR视各个宾馆或者每种单片机而不同每层8个房间相当于8位每个房间要么住男人要么住女人相当于每位要么放入数字1要么放入数字0keil编译器就相当于宾馆的工作人员每去住旅馆相当写程序的过程住宾馆的人必须事先要给工作人员说你是哪一层哪一个房间即声明寄存器地址和位地址宾馆工作人员才能把你带到你的房间里去这里假设这个宾馆可以由每自己决定住哪个房间即只有对寄存器及相关位进行声明地址后我们才能对其进行赋相关的值keil软件才能编译通过
 


 
 

 
 

 
 

 

4REG51.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口此句话的意思是特殊功能寄存器校地址为x80 ,可位寻址,下同

                          //8位地址总线/数据总线一般不用而只作普通/口注意作/口用时硬件上需接上接电阻

sfr P1   = 0x90;   //准双向       IO      P1

 


sfr P2   = 0xA0;   //
准双向  IO      P2

                          //8位地址总线一般也作普通/用

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; // 可以位寻址语言编程时可不考虑思存器

                            //程序状态寄存器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编程时一般是用到ӣ停ϣ位其它的一般不用

                          //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

发表评论告诉好友收藏此文关闭窗口

文章评论

相关文章

Ƶ