单片机所有头文件的意义_单片机头文件定义的变量在其他文件怎么不能用 - CSDN
精华内容
参与话题
  • 单片机C语言编程,所有心得都在这里了...

    万次阅读 多人点赞 2018-03-31 10:50:01
    这个8*8按键程序的过程中,不管是在自己写还是参考别人程序的过程中,发现自己对C语言有些基本知识点和编程规范有很多不懂的地方,有些是自己以前的编程习惯不好,有些就是基础知识不扎实的表现,所以总结出来。...
        

    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

    这个8*8按键程序的过程中,不管是在自己写还是参考别人程序的过程中,发现自己对C语言有些基本知识点和编程规范有很多不懂的地方,有些是自己以前的编程习惯不好,有些就是基础知识不扎实的表现,所以总结出来。


    一、.H文件与.C文件的关系:

    迄今为止,写过的程序都是一些很简单的程序,从来没有想到要自己写.H文件,也不知道.H文件到底什么用,与.C文件什么关系。只是最近写键盘程序,参考别人的程序时,发现别人写的严格的程序都带有一个“KEY.H”,里面定义了.C文件里用到的自己写的函数,如Keyhit()、Keyscan()等。


    经过查找资料得知,.H文件就是头文件,估计就是Head的意思吧,这是规范程序结构化设计的需要,既可以实现大型程序的模块化,又可以实现根各模块的连接调试。


    1、.H文件介绍:

    在单片机C程序设计中,项目一般按功能模块化进行结构化设计。将一个项目划分为多个功能,每个功能的相关程序放在一个C程序文档中,称之为一个模块,对应的文件名即为模块名。一个模块通常由两个文档组成,一个为头文件*.h,对模块中的数据结构和函数原型进行描述;另一个则为C文件*.c ,对数据实例或对象定义,以及函数算法具体实现。


    2、.H文件的作用

    作为项目设计,除了对项目总体功能进行详细描述外,就是对每个模块进行详细定义,也就是给出所有模块的头文件。通常H头文件要定义模块中各函数的功能,以及输入和输出参数的要求。模块的具体实现,由项目组成根据H文件进行设计、编程、调试完成。为了保密和安全,模块实现后以可连接文件OBJ、或库文件LIB的方式提供给项目其他成员使用。由于不用提供源程序文档,一方面可以公开发行,保证开发人员的所有权;另一方面可以防止别人有意或无意修改产生非一致性,造成版本混乱。所以H头文件是项目的详细设计和团队工作划分的依据,也是对模块进行测试的功能说明。要引用模块内的数据或算法,只要用包含include指定模块H头文件即可。


    3、.H文件的基本组成

    /*如下为键盘驱动的头文档*/

    #ifndef _KEY_H_ //防重复引用,如果没有定义过_KEY_H_,则编译下句

    #define _KEY_H_ //此符号唯一, 表示只要引用过一次,即#i nclude,则定义符号_KEY_H_

    /

    char keyhit( void ); //击键否

    unsigned char Keyscan( void ); //取键值

    /

    #endif


    二、尽量使用宏定义#define

    开始看别人的程序时,发现程序开头,在文件包含后面有很多#define语句,当时就想,搞这么多标示符替换来替换去的,麻不麻烦啊,完全没有理解这种写法的好处。原来,用一个标示符表示常数,有利于以后的修改和维护,修改时只要在程序开头改一下,程序中所有用到的地方就全部修改,节省时间。


    #define KEYNUM 65//按键数量,用于Keycode[KEYNUM]

    #define LINENUM 8//键盘行数

    #define ROWNUM 8//键盘列数


    注意的地方:

    1、宏名一般用大写

    2、宏定义不是C语句,结尾不加分号


    三、不要乱定义变量类型

    以前写程序,当需要一个新的变量时,不管函数内还是函数外的,直接在程序开头定义,虽然不是原则上的错误,但是很不可取的作法。


    下面说一下,C语言中变量类型的有关概念:


    从变量的作用范围来分,分为局部变量和全局变量:


    1、全局变量:是在函数外定义的变量,像我以前定义在程序开头的变量都是全局变量,这里我就犯了一个大忌,使用了过多的全局变量。

    带来的问题有两个:一是,全局变量在程序全部执行过程中都占用资源;二是,全局变量过多使程序的通用性变差,因为全局变量是模块间耦合的原因之一。


    2、局部变量:在函数内部定义的变量,只在函数内部有效。


    从变量的变量值存在的时间分为两种:

    1、静态存储变量:程序运行期间分配固定的存储空间。


    2、动态存储变量:程序运行期间根据需要动态地分配存储空间。


    具体又包括四种存储方式:auto static register extern

    1、局部变量,不加说明默认为auto型,即动态存储,如果不赋初值,将是一个不确定的值。而将局部变量定义为static型的话,则它的值在函数内是不变的,且初值默认为0。


    static unsigned char sts;//按键状态变量

    static unsigned char Nowkeycode;//此时的键码

    static unsigned char Prekeycode;//上一次的键码

    static unsigned char Keydowntime;//矩形键盘按下去抖时间变量

    static unsigned char Keyuptime;//矩形键盘释放去抖时间变量

    static unsigned char Onoffdowntime;//关机键按下去抖时间变量

    static unsigned char Onoffuptime;//关机键释放去抖时间变量

    static unsigned char onoff_10ms; //判断关机键中断次数变量,累计150次大约为3S,因为前后进了两个10ms中断


    2、全局变量,编译时分配为静态存储区,可以被本文件中的各个函数引用。如果是多个文件的话,如果在一个文件中引用另外文件中的变量,在此文件中要用extern说明。不过如果一个全局变量定义为static的话,就只能在此一个文件中使用。


    四、特殊关键字const volatile的使用

    1、const

    const用于声明一个只读的变量

    const unsigned char a=1;//定义a=1,编译器不允许修改a的值

    作用:保护不希望被修改的参数

    const unsigned char Key_code[KEYNUM]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

    0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,

    0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,

    0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,

    0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,

    0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,

    0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,

    0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,

    0x41

    };//键码

    const unsigned char Line_out[LINENUM]={0xFE,0xFD,0xFB,0xf7,0xEF,0xDF,0xBF,0x7F};//行输出编码

    const unsigned char Row_in[ROWNUM]={0xFE,0xFD,0xFB,0xf7,0xEF,0xDF,0xBF,0x7F};//列输入编码


    2、volatile

    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

    static int i=0;

    int main(void)

    {

    ...

    while (1)

    {

    if (i)

    dosomething();

    }

    }

    /* Interrupt service routine. */

    void ISR_2(void)

    {

    i=1;

    }


    程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。


    一般说来,volatile用在如下的几个地方:


    1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

    2、多任务环境下各任务间共享的标志应该加volatile;

    3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。

    640?

    1.一个嵌入式老鸟的肺腑之言:空有一腔热血还远远不够!

    2.Linux 基金会开放ACRN管理程序,用于物联网和嵌入式设备设计!

    3.详解嵌入式Linux工程师的成长经历

    4.什么是C语言的可移植?

    5.区块链技术的最大价值归宿:物联网

    6.做了整整八年模电,却说自己根本没入门,咋回事?

    640?wx_fmt=gif

    免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

    展开全文
  • 单片机-头文件

    千次阅读 2020-02-06 20:34:01
    在代码中引用头文件,其实际意义是将头文件中的所用内容都放到引用头文件的地方 下面是reg52.h头文件的内容: /*-------------------------------------------------------------------------- REG52.H Header ...

    reg52.h头文件的作用

    • 在代码中引用头文件,其实际意义是将头文件中的所用内容都放到引用头文件的地方
      下面是reg52.h头文件的内容:
    /*--------------------------------------------------------------------------
    REG52.H
    
    Header file for generic 80C52 and 80C32 microcontroller.
    Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
    All rights reserved.
    --------------------------------------------------------------------------*/
    
    #ifndef __REG52_H__
    #define __REG52_H__
    
    /*  BYTE Registers  */
    sfr P0    = 0x80;
    sfr P1    = 0x90;
    sfr P2    = 0xA0;
    sfr P3    = 0xB0;
    sfr PSW   = 0xD0;
    sfr ACC   = 0xE0;
    sfr B     = 0xF0;
    sfr SP    = 0x81;
    sfr DPL   = 0x82;
    sfr DPH   = 0x83;
    sfr PCON  = 0x87;
    sfr TCON  = 0x88;
    sfr TMOD  = 0x89;
    sfr TL0   = 0x8A;
    sfr TL1   = 0x8B;
    sfr TH0   = 0x8C;
    sfr TH1   = 0x8D;
    sfr IE    = 0xA8;
    sfr IP    = 0xB8;
    sfr SCON  = 0x98;
    sfr SBUF  = 0x99;
    
    /*  8052 Extensions  */
    sfr T2CON  = 0xC8;
    sfr RCAP2L = 0xCA;
    sfr RCAP2H = 0xCB;
    sfr TL2    = 0xCC;
    sfr TH2    = 0xCD;
    
    
    /*  BIT Registers  */
    /*  PSW  */
    sbit CY    = PSW^7;
    sbit AC    = PSW^6;
    sbit F0    = PSW^5;
    sbit RS1   = PSW^4;
    sbit RS0   = PSW^3;
    sbit OV    = PSW^2;
    sbit P     = PSW^0; //8052 only
    
    /*  TCON  */
    sbit TF1   = TCON^7;
    sbit TR1   = TCON^6;
    sbit TF0   = TCON^5;
    sbit TR0   = TCON^4;
    sbit IE1   = TCON^3;
    sbit IT1   = TCON^2;
    sbit IE0   = TCON^1;
    sbit IT0   = TCON^0;
    
    /*  IE  */
    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;
    
    /*  IP  */
    sbit PT2   = IP^5;
    sbit PS    = IP^4;
    sbit PT1   = IP^3;
    sbit PX1   = IP^2;
    sbit PT0   = IP^1;
    sbit PX0   = IP^0;
    
    /*  P3  */
    sbit RD    = P3^7;
    sbit WR    = P3^6;
    sbit T1    = P3^5;
    sbit T0    = P3^4;
    sbit INT1  = P3^3;
    sbit INT0  = P3^2;
    sbit TXD   = P3^1;
    sbit RXD   = P3^0;
    
    /*  SCON  */
    sbit SM0   = SCON^7;
    sbit SM1   = SCON^6;
    sbit SM2   = SCON^5;
    sbit REN   = SCON^4;
    sbit TB8   = SCON^3;
    sbit RB8   = SCON^2;
    sbit TI    = SCON^1;
    sbit RI    = SCON^0;
    
    /*  P1  */
    sbit T2EX  = P1^1; // 8052 only
    sbit T2    = P1^0; // 8052 only
              
    /*  T2CON  */
    sbit TF2    = T2CON^7;
    sbit EXF2   = T2CON^6;
    sbit RCLK   = T2CON^5;
    sbit TCLK   = T2CON^4;
    sbit EXEN2  = T2CON^3;
    sbit TR2    = T2CON^2;
    sbit C_T2   = T2CON^1;
    sbit CP_RL2 = T2CON^0;
    
    #endif
    
    展开全文
  • STARTUP.A51//启动文件.清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数 <reg51.h> //特殊寄存器的字节地址和位地址,sfr定义字节变量... //定义了一些外部函数,在C51单片机编程中,头文件IN...

    STARTUP.A51//启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数

    <reg51.h>  //特殊寄存器的字节地址和位地址,sfr定义字节变量、sbit定义位变量,用通俗名作为变量名,并赋地址值,从而用名称来使用这些特殊寄存器。

    <intrins.h> //定义了一些外部函数,在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便.

    /*--------------------------------------------------------------------------
    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;
    sfr P1 = 0x90;
    sfr P2 = 0xA0;
    sfr P3 = 0xB0;
    sfr PSW = 0xD0;
    sfr ACC = 0xE0;
    sfr B = 0xF0;
    sfr SP = 0x81;
    sfr DPL = 0x82;
    sfr DPH = 0x83;
    sfr PCON = 0x87;
    sfr TCON = 0x88;
    sfr TMOD = 0x89;
    sfr TL0 = 0x8A;
    sfr TL1 = 0x8B;
    sfr TH0 = 0x8C;
    sfr TH1 = 0x8D;
    sfr IE = 0xA8;
    sfr IP = 0xB8;
    sfr SCON = 0x98;
    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

     

    /*--------------------------------------------------------------------------
    INTRINS.H

    Intrinsic functions for C51.
    Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
    All rights reserved.
    --------------------------------------------------------------------------*/

    #ifndef __INTRINS_H__
    #define __INTRINS_H__

    extern void _nop_ (void);
    extern bit _testbit_ (bit);
    extern unsigned char _cror_ (unsigned char, unsigned char);
    extern unsigned int _iror_ (unsigned int, unsigned char);
    extern unsigned long _lror_ (unsigned long, unsigned char);
    extern unsigned char _crol_ (unsigned char, unsigned char);
    extern unsigned int _irol_ (unsigned int, unsigned char);
    extern unsigned long _lrol_ (unsigned long, unsigned char);
    extern unsigned char _chkfloat_(float);

    #endif

     

    关于sfr、sbit://如同int、char...

    sfr 似乎不是标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。

    例:sfr P1 = 0x90;

    这样的一行即定义P1 与地址0x90 对应,P1 口的地址就是0x90.

    SFR的定义在头文件reg51.h或reg52.h中。

     

    在C51里,利用sbit可访问RAM中可寻址位或SFR中可寻址位。

    如果直接写P1.0,C 编译器并不能识别,而且P1.0 也不是一个合法的C语言变量名,所以得给它另起一个名字,比如P1_0,可是P1_0 是不是就是P1.0呢?C 编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit 来定义,sbit 的用法有三种:

    第一种方法:sbit 位变量名=地址值

    第二种方法:sbit 位变量名=SFR 名称^变量位地址值

    第三种方法:sbit 位变量名=SFR 地址值^变量位地址值

    例如,定义P1 中的P1.1脚可以用以下三种方法:

    sbit P1_1=0x92 (1)说明:0x92是P1.1 的位地址值

    sbit P1_1=P1^1 (2)说明:其中P1必须先用sfr 定义好

    sbit P1_1=0x90^2 (3)说明:0x90 就是P1的地址值

    因此这里用sfr P1_0=P1^0;就是定义用符号P1_0 来表示P1.0 引

     

    sfr 是定义8 位(范围0~255)的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器, 如8052 的T2 定时器,可以定义为: 
    sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH 

    在KEIL中,汇编是从ORG 000H开始启动,那么它在C51中是如何启动MAIN()函数的呢?实际上是C51中有一个启启动程序STARTUP.A51,它总是和C程序一起编译和链接的.
    启动文件STARTUP.A51中包含目标板启动代码,可在每个project中加入这个文件,只要复位,则该文件立即执行,其功能包括
    z 定义内部RAM大小、外部RAM大小、可重入堆栈位置
    z 清除内部、外部或者以此页为单元的外部存储器
    z 按存储模式初使化重入堆栈及堆栈指针
    z 初始化8051硬件堆栈指针
    z 向main( )函数交权
     
    开发人员可修改以下数据从而对系统初始化
    常数名 意义
    IDATALEN                  待清内部RAM长度
    XDATA START           指定待清外部RAM起始地址
    XDATALEN                 待清外部RAM长度
    IBPSTACK                  是否小模式重入堆栈指针需初始化标志,1为需要。缺省为0
    IBPSTACKTOP           指定小模式重入堆栈顶部地址
    XBPSTACK                是否大模式重入堆栈指针需初始化标志,缺省为0
    XBPSTACKTOP         指定大模式重入堆栈顶部地址
    PBPSTACK                是否Compact重入堆栈指针,需初始化标志,缺省为0
    PBPSTACKTOP         指定Compact模式重入堆栈顶部地址
    PPAGEENABLE         P2初始化允许开关
    PPAGE                      指定P2值
    PDATASTART          待清外部RAM页首址
    经常可能需要修改的地方:(红色)
    XDATASTART EQU 0H ;                     the absolute start-address of XDATA memory
    XDATALEN EQU 0H ;                          the length of XDATA memory in bytes.
     
    XBPSTACK EQU 0 ;                            set to 1 if large reentrant is used.
    XBPSTACKTOP EQU 0FFFFH+1;      set top of stack to highest location+1.
     
    PPAGEENABLE EQU 0 ;                     set to 1 if pdata object are used.
    PPAGE EQU 0 ;                                  define PPAGE number.

     

    当在kiel  C中新建项目时,会问:
    Copy standard 8051 Starup Code to Project Forder and add file to Project?
    翻译为:复制8051启动代码到项目并和添加文件到项目?

    其实无论您选是还是否,您的代码中都将包含该文件。
    该文件的作用是 初始化 内外部 RAM使其清零,另外还初始化SP等。
    如果上述提示框您选否,对哪些RAM清零将采用默认的方式。
    如果您想改变RAM清零区域(假如希望复位时某些RAM不被清零时会很有用。),您可以选是,这样该文件的一个副本将添加到您的项目,您可以根据需要改写此文件。

    其他SP,SAMLL/COMPACT、LARGE模式的重入函数的堆栈和指针的初始化等和RAM的道理是一样的。

    转载于:https://www.cnblogs.com/cj2014/p/3849706.html

    展开全文
  • 51头文件总结

    千次阅读 2016-10-03 19:46:51
    1)“文件包含”处理概念    所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程...

    1)“文件包含”处理概念 

      

    所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如reg51.h,然后用#include<reg51.h>包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。

    2)寄存器地址及位地址声明的原因

     

    其实相当于为这些内存地址取个名字。reg51.h里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如sfr P1=0x80; sfr IE=0xA8;sbit 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地址值^寄存器位值

    “名称^变量位地址值”中“^”,它是由keil软件的规定的 ,不能写成其它的,只能这样能才编译通过。  以上是对寄存器地址和位地址的定义和声明作了解释,大家需要牢牢记住:只有对寄存器及相关位进行声明地址后,我们才能对其进行赋相关的值,keil软件才能编译通过。

    即:只有对寄存器及相关位进行声明地址后,我们才能对其进行赋相关的值,keil软件才能编译通过。

     

    3REG51.H头文件原文及解释

    下面的这些相当于给各寄存器起个别名,不过这个别名为了易于识别,对应的都是相应功能的寄存器名称,例如sfr P0 = 0x80; //P0口,指的是用P0代替0x80。对P0的操作即是对0x80地址的操作。其中0x80是P0的地址。

    * BYTE Register */
    sfr P0 = 0x80; //P0

    sfr P1 = 0x90; //P1

    sfr P2 = 0xA0; //P2口
    sfr P3 = 0xB0; //P3口
    sfr PSW = 0xD0; //程序状态字,具体位意义见位定义
    sfr ACC = 0xE0; //累加器,程序员最常用的
    sfr B = 0xF0; //寄存器,主要用于乘除
    sfr SP = 0x81; //堆栈指针,初始化为07;先加1后压栈,先出栈再减1,
    sfr DPL = 0x82;
    sfr DPH = 0x83; //数据指针,用途大
    sfr PCON = 0x87; //电源控制
    sfr TCON = 0x88; //Timer/Counter控制
    sfr TMOD = 0x89; //Timer/Counter方式控制
    sfr TL0 = 0x8A;
    sfr TL1 = 0x8B; //
    sfr TH0 = 0x8C; //存着当前的计数值
    sfr TH1 = 0x8D; //

    sfr IE = 0xA8; //好东西,中断控制
    sfr IP = 0xB8; //
    中断优先级控制,没有设计过要求时间严格的系统,所以至今没有用过
    sfr SCON = 0x98; //串口控制寄存器
    sfr SBUF = 0x99; //串口缓冲寄存器


    下面的这些可以用位操作,某寄存器某一位的位地址有可能和另一个寄存器的直接地址重合,但在使用时对位地址操作的指令与对直接地址的操作是不同的,所以不会混淆。

    51单片机内部共有21个SFR,每个SFR占1个字节,多数字节单元中的每一位又有专用的“位名称”。这21个SFR又按是否可以位寻址分为两大部分,ACC、IE、P1等11个可以位寻址,SP、TMOD等不可以位寻址。


    sbit CY = 0xD7; //进位或借位,有就是1,没有就是0
    sbit AC = 0xD6; //辅助进借位,(麻烦b)
    sbit F0 = 0xD5; //没有具体用途,可以由用户决定他的意义,所以它就没有意义
    sbit RS1 = 0xD4;
    sbit RS0 = 0xD3; //工作寄存器选择,这个在下面解释
    sbit OV = 0xD2; //over!溢出,有是1,没有是0
    sbit P = 0xD0; //奇偶校验,奇数个1是1


    sbit TF1 = 0x8F; //T1
    的中断请求标志
    sbit TR1 = 0x8E; //Timer 1 running
    ,好记吧~
    sbit TF0 = 0x8D; //
    sbit TR0 = 0x8C; //
    把上面两个1换成0
    sbit IE1 = 0x8B; //interrupt external 1
    外中断请求标志
    sbit IT1 = 0x8A; //interrupt triggle 1
    外中断触发方式
    sbit IE0 = 0x89;
    sbit IT0 = 0x88; //
    同样,把上面的两个1换成0


    sbit EA = 0xAF; //Enable all
    哇,重要,全局中断控制,光着他,哈哈,什么都不用作了,就像放假一样
    sbit ES = 0xAC; //Enable Serial,
    开串口中断
    sbit ET1 = 0xAB; //Enable Timer/Counter 1
    sbit EX1 = 0xAA; //Enable External 1
    sbit ET0 = 0xA9; //Enable Timer/counter 0
    sbit EX0 = 0xA8; //Enable External 0


    sbit PS = 0xBC; //
    串行中断优先级
    sbit PT1 = 0xBB; //T1
    优先级
    sbit PX1 = 0xBA; //
    外部中断1优先级
    sbit PT0 = 0xB9; //
    sbit PX0 = 0xB8; //
    上面两个1换成0

    //控制寄存器!!!!
    sbit RD = 0xB7; //

    sbit WR = 0xB6; //

    sbit T1 = 0xB5; //T/C1
    sbit T0 = 0xB4; //T/C0
    sbit INT1 = 0xB3; //
    外中断1
    sbit INT0 = 0xB2; //
    外中断0
    sbit TXD = 0xB1; //
    串行发送
    sbit RXD = 0xB0; //
    串行接收


    sbit SM0 = 0x9F; //
    sbit SM1 = 0x9E; //
    串口工作方式
    sbit SM2 = 0x9D; //
    什么鬼特征位,要用查书,或者等我以后解释,啊哈
    sbit REN = 0x9C; //
    串行接收允许
    sbit TB8 = 0x9B; //
    收到的第九位
    sbit RB8 = 0x9A; //
    要发的第九位
    sbit TI = 0x99; //
    哇,熟悉吧,发送完成中断标志
    sbit RI = 0x98; //
    接收完成中断标志

    经过上面的操作,相应的名字即与相应的地址联系了起来。使用该定义的名字即是对该内存的操作。(sfr P0 = 0x80; //P0口,该IO口对应地址0x80是硬件设计好的,把数据放入此处即可输出该数据。)

    4)可位寻址区(特对低128字节作了一个介绍)

     

     

    从表中可以看到,位地址4EH”,是在字节地址29H”中,是第6位。

    对位寻址区可以按照位地址来对某一个位单独进行操作,也可以按照字节地址进行操作,即同时对八个位地址的内容进行操作。MCS-51系列单片机具有一套专用的位操作指令(又称为布尔指令),可对这些位地址进行等操作。这是该系列单片机的特色之一。


    一般的8051芯片实际内部RAM只有128B从0x00-0x7F,而从0x80-0xFF则是SFR是CPU工作寄存器和各种外设寄存器都在此的区域。(也即是内存与外设统一编址,外设占用内存的地址)

    展开全文
  • 在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明...
  • 单片机两大延时方法总结

    万次阅读 2017-03-25 10:00:41
    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU...单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和
  • 80C51常用头文件

    千次阅读 2018-01-29 10:30:50
    80C51常用头文件:reg51.h、math.h、ctype.h、stdio.h、stdlib.h、absacc.h、intrins.h。 (1)reg51.h 定义51系列单片机特殊功能寄存器和特殊位。 (2)absacc.h 访问绝对地址头文件。当用绝对地址...
  • PIC18F4520单片机AD转换程序与注释

    千次阅读 2012-12-15 16:04:19
    /*包含头文件:该头文件位于D:\Program Files\Microchip\mplabc18\v3.40\h下,这下面是不同型号的单片机头文件定义,使用时把相应的头文件包含进来就可以了*/#includeconst unsigned char seg[10]={0x3f,0x06,0x5b...
  • 头文件的嵌套

    千次阅读 2014-12-25 22:16:43
    接触STM32已有一段时间了,但是真正学到的似乎不是很多,按照普遍的学习方法——先学习硬件配置,再根据提供的开发指南和官方的datasheet熟悉常用的内部结构和编程技巧,到亲自动手操作,模仿、验证、尝试……这个...
  • AT89C51单片机制作一个密码锁)前言所需基础工具准备代码截图模块使用介绍必学几部分键值判断头文件意义typedef 和 sbit方法键值判断case 0xebmodifykeyLCD1602、24C02学习建议 前言 设计一个基本实现密码锁功能的...
  • 头文件AT89X51.H和reg52.h的区别

    千次阅读 2017-04-18 14:08:52
    前言心血来潮说捣鼓捣鼓基于51单片机的超声波模块,也就是市面上买的模块HC-SR04,从网上找了驱动代码,自己新建keil工程打开一看发现,这个头文件AT89X52.H,我就奇怪了,平常学的51单片机视频不都是reg52.h么?...
  • 单片机C语言如何产生随机数 随机数在单片机的应用中也是很多的,当然产生随机数的方法有很多,当中有一个就是利用单片机定时器,取出未知的定时器THX和TLX的值,再加以运算得到一个规定范围内的随机数值。这做法也是...
  • stdio .h 头文件定义了三个变量类型、一些宏和各种函数来执行输入和输出。 库变量 下面是头文件 stdio.h 中定义的变量类型: 序号 变量 &amp; 描述 1 size_t 这是无符号整数类型,它是 sizeof ...
  • 单片机关键字sfr和sbit的理解

    万次阅读 2016-07-24 13:26:37
    单片机C语言编程中,扩充了两个关键字sfr和sbit。 sfr(Special Function Register特殊功能寄存器的缩写),sbit(特殊功能寄存器位),与定义一般的int、char型变量不同,这两个字定义的并不是变量,而作为特殊功能...
  • 1、个人原创,代码已经在兆讯系列的芯片上验证OK; 2、验证方法,整合代码到系统中,控制GPIO口输出方波,...4、代码的实现,参照Linux中udelay()、mdelay()的实现方法,用Linux思想去开发单片机,具有极强的参考意义
  • 太原理工大学机器人团队20天学习打卡day15(51单片机初步(番外)) 不定期更新。.../定义头文件,有些c基础应该都知道为什么,其实就是因为后面的P1这些符号要表示实际意义,所以要用到reg51.h。/ sbit ...
  • 延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机...
  • 51单片机开发工具是使用的Keil,一个继承开发..., 该头文件包含了单片机定义的引脚地址,如P2的地址;有人可能问为什么是reg52.h而不是reg51.h,其实都可以的,因为我用的是89C52,所以包含了reg52.h,其实reg51.h和re
  • 基于51单片机的智能电子秤

    千次阅读 多人点赞 2019-02-23 13:48:29
    本电子秤系统利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再...
  • 做公号两月,遇到一些初学单片机的同学,刚刚入手做单片机开发,还没有涉及到使用RTOS,且刚入手直接上RTOS可能会有些难度,有的使用的相对较老单片机资源还有限,也不适合跑RTOS。或者使用RTOS,在整体思路上比较...
1 2 3 4 5 ... 20
收藏数 1,571
精华内容 628
关键字:

单片机所有头文件的意义