单片机头文件
- 格式:doc
- 大小:16.00 KB
- 文档页数:3
我们在用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)说明:0x88是IT0 的位地址值sbit deng=P1^2 (2)说明:其中P1 必须先用sfr 定义好sbit EA=0xA8^7 (3)说明:0xA8 就是IE寄存器的地址值以上三种定义方法需注意的是 IT0 deng EA可由用户随便定义,但必须满足C语言对变量名的定义规则。
STC12C5A60S2单片机寄存器头文件STC12C5A.H内容/**************** 8051内核特殊功能寄存器******************/sfr ACC = 0xE0; //累加器sfr B = 0xF0; //B寄存器sfr PSW = 0xD0; //程序状态字寄存器sbit CY = PSW^7; //进位标志位sbit AC = PSW^6; //辅助进位标志位sbit F0 = PSW^5; //用户标志位0sbit RS1 = PSW^4; //工作寄存器组选择控制位sbit RS0 = PSW^3; //工作寄存器组选择控制位sbit OV = PSW^2; //溢出标志位sbit F1 = PSW^1; //用户标志位1sbit P = PSW^0; //奇偶标志位sfr SP = 0x81; //堆栈指针寄存器sfr DPL = 0x82; //数据指针0低字节sfr DPH = 0x83; //数据指针0高字节/**************** 系统管理特殊功能寄存器******************/sfr PCON = 0x87; //电源控制寄存器sfr AUXR = 0x8E; //辅助寄存器sfr AUXR1 = 0xA2; //辅助寄存器1sfr WAKE_CLKO = 0x8F; //时钟输出和唤醒控制寄存器sfr CLK_DIV = 0x97; //时钟分频控制寄存器sfr BUS_SPEED = 0xA1; //总线速度控制寄存器/**************** 中断控制特殊功能寄存器******************/sfr IE = 0xA8; //中断允许寄存器sbit EA = IE^7; //总中断允许位sbit ELVD = IE^6; //低电压检测中断控制位sbit EADC = IE^5; //ADC中断允许控制位sbit ES = IE^4; //串口1中断允许位sbit ET1 = IE^3; //定时器1溢出中断允许位sbit EX1 = IE^2; //外部中断1允许位sbit ET0 = IE^1; //定时器0溢出中断允许位sbit EX0 = IE^0; //外部中断0允许位sfr IE2 = 0xAF; //中断允许寄存器2sfr IP = 0xB8; //中断优先级寄存器sbit PPCA = IP^7; //PCA中断优先级控制位sbit PLVD = IP^6; //低电压检测中断优先级控制位sbit PADC = IP^5; // ADC中断优先级控制位sbit PS = IP^4; //串口1中断优先级控制位sbit PT1 = IP^3; //定时器1中断优先级控制位sbit PX1 = IP^2; //外部中断1优先级控制位sbit PT0 = IP^1; //定时器0中断优先级控制位sbit PX0 = IP^0; //外部中断0优先级控制位sfr IPH = 0xB7; //中断优先级高位寄存器sfr IP2 = 0xB5; //第二中断优先级寄存器低字节sfr IPH2 = 0xB6; //第二中断优先级寄存器高字节/**************** I/O口特殊功能寄存器******************/sfr P0 = 0x80; //P0口寄存器sfr P0M1 = 0x93; //P0口工作模式寄存器1sfr P0M0 = 0x94; //P0口工作模式寄存器0sfr P1 = 0x90; //P1口寄存器sfr P1M1 = 0x91; //P1口工作模式寄存器1sfr P1M0 = 0x92; //P1口工作模式寄存器0sfr P1ASF = 0x9D; //P1口模拟量功能设置寄存器sfr P2 = 0xA0; //P2口寄存器sfr P2M1 = 0x95; //P2口工作模式寄存器1sfr P2M0 = 0x96; //P2口工作模式寄存器0sfr P3 = 0xB0; //P3口寄存器sbit T1 = P3^5; //定时器1外部输入sbit T0 = P3^4; //定时器0外部输入sbit INT1 = P3^3; //外部中断1sbit INT0 = P3^2; //外部中断0sbit TXD = P3^1; //串行输入通道sbit RXD = P3^0; //串行输出通道sfr P3M1 = 0XB1; //P3口工作模式寄存器1sfr P3M0 = 0xB2; //P3口工作模式寄存器0sfr P4 = 0xC0; //P4口寄存器sfr P4M1 = 0xB3; //P4口工作模式寄存器1sfr P4M0 = 0xB4; //P4口工作模式寄存器0sfr P4SW = 0xBB; //P4口功能切换寄存器sfr P5 = 0xC8; //P5口(只有P5.3、P5.2、P5.1、P5.0)sfr P5M1 = 0xC9; //P5口工作模式寄存器1sfr P5M0 = 0xCA; //P5口工作模式寄存器0/**************** 定时器特殊功能寄存器******************/sfr TCON = 0x88; //定时/计数控制寄存器sbit TF1 = TCON^7; //定时器1溢出中断标志sbit TR1 = TCON^6; //定时器1运行控制位sbit TF0 = TCON^5; //定时器0溢出中断标志sbit TR0 = TCON^4; //定时器0运行控制位sbit IE1 = TCON^3; //外部中断1请求标志sbit IT1 = TCON^2; //选择外部中断请求1为边沿触发方式的控制位sbit IE0 = TCON^1; //外部中断0请求标志sbit IT0 = TCON^0; //选择外部中断请求0为边沿触发方式的控制位sfr TMOD = 0x89; //定时/计数模式控制寄存器sfr TL0 = 0x8A; //定时/计数器0低字节sfr TH0 = 0x8C; //定时/计数器0高字节sfr TL1 = 0x8B; //定时/计数器1低字节sfr TH1 = 0x8D; //定时/计数器1高字节/**************** 串行口特殊功能寄存器******************/sfr SCON = 0x98; //串行口控制寄存器sbit SM0 = SCON^7; //串行口工作方式设定控制位0(与FE功能复用)sbit FE = SCON^7;sbit SM1 = SCON^6; //串行口工作方式设定控制位1sbit SM2 = SCON^5; //UART的SM2设定sbit REN = SCON^4; //接收允许位sbit TB8 = SCON^3; //发送数据的第九位sbit RB8 = SCON^2; //接收数据的第九位sbit TI = SCON^1; //发送中断标志sbit RI = SCON^0; //接收中断标志sfr SBUF = 0x99; //串口数据缓冲器sfr SADEN = 0xB9; //从机地址掩码寄存器sfr SADDR = 0xA9; //从机地址寄存器sfr S2CON = 0x9A; //串行口2控制寄存器sfr S2BUF = 0x9B; //串行口2数据缓冲器sfr BRT = 0x9C; //独立波特率定时器/**************** 看门狗定时器寄存器******************/sfr WDT_CONTR = 0xC1; //看门狗定时器控制寄存器/******************** PCA寄存器**********************/sfr CCON = 0xD8; //PCA控制寄存器sbit CF = CCON^7; //PCA计数器溢出(CH,CL由FFFF变为0000H)标志sbit CR = CCON^6; //PCA计数器计数允许控制位sbit CCF1 = CCON^1; //PCA模块1中断标志sbit CCF0 = CCON^0; //PCA模块0中断标志sfr CMOD = 0xD9; //PCA 工作模式寄存器sfr CL = 0xE9; //PCA 计数器低8位sfr CH = 0xF9; //PCA 计数器高8位sfr CCAPM0 = 0xDA; //PCA 模块0的工作模式寄存器sfr CCAPM1 = 0xDB; //PCA 模块1的工作模式寄存器sfr CCAP0L = 0xEA; //PCA 模块0捕捉/比较寄存器低8位sfr CCAP0H = 0xFA; //PCA 模块0捕捉/比较寄存器高8位sfr CCAP1L = 0xEB; //PCA 模块1捕捉/比较寄存器低8位sfr CCAP1H = 0xFB; //PCA 模块1捕捉/比较寄存器高8位sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM寄存器sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM寄存器/******************** ADC寄存器**********************/sfr ADC_CONTR = 0xBC; //ADC控制寄存器,本寄存器不支持位操作sfr ADC_RES = 0xBD; //ADC转换结果高8位寄存器sfr ADC_RESL = 0xBE; //ADC转换结果低2位寄存器/******************** SPI寄存器**********************/sfr SPSTAT = 0xCD; //SPI状态寄存器,本寄存器不支持位操作sfr SPCTL = 0xCE; //SPI控制寄存器sfr SPDAT = 0xCF; //SPI数据寄存器/***************** ISP_IAR_EEPROM寄存器*******************/sfr IAP_DATA = 0xC2; //ISP/IAP Flash数据寄存器sfr IAP_ADDRH = 0xC3; // ISP/IAP Flash地址高字节sfr IAP_ADDRL = 0xC4; // ISP/IAP Flash地址低字节sfr IAP_CMD = 0xC5; // ISP/IAP Flash命令寄存器sfr IAP_TRIG = 0xC6; // ISP/IAP Flash命令触发器sfr IAP_CONTR = 0xC7; //ISP/IAR控制寄存器。
单片机C语言头文件详解单片机中用c编程时头文件reg51.h及reg52.h解析我们在用c语言编程是往往第一行就是reg51.h或者其他的自定义头文件,我们怎么样来理解呢?1)“文件包含”处理。
程序的第一行是一个“文件包含”处理。
所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来。
程序中包含REG51.h文件的目的是为了要使用P1 (还有其他更多的符号)这个符号,即通知C 编译器,程序中所写的P1 是指80C51 单片机的P1 端口而不是其它变量。
这是如何做到的呢?打开reg51.h 可以看到这样的一些内容:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。
如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。
)/*---------------------------------------------------------REG51.HHeader 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 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;/* 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熟悉80C51 内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系。
如何高效编程之头文件在网上查了很长时间关于头文件的资料,但是发现很难找到适合我的;学单片机的朋友知道,很多程序经常要调用相同的函数,如果每写一个程序都把这些函数重新写一遍或者复制过来,那是很浪费时间的,现在我通过学习总结以及别人的经验,跟大家分享,欢迎大家转载学习;写程序最好是结构化编程,因为这样的程序看起来就不那么长了,一目了然,可以很快就知道这个程序实现什么功能,而且排错也非常简单;把常用的函数声明、自定义类型、外部变量的声明等写进头文件,与之配对的扩展名为.c的文件就写常用的函数,最好就写一个主函数;之前学的51单片机,现在玩430单片机,就以430单片机为例,其他编程软件道理与这个相同;在IAR下新建工程,包含了、和和是一对三个文件注:可包含多个配对的头文件和C文件;先把程序贴出来,再详解其中缘由;内容:include ""void main void{.....endif其中XXXX习惯大写,名称不要与关键字相同,习惯写法请参照上面的程序,ifndef XXXX define XXXX ..... endif的作用是有些头文件已经在其他文件里包含过了,但是你在这个文件也包含了,如果没有上面那一句,则编译器会报错:重复定义中用到了中的定义,则需要把mydefine包含进来,包含的意思是替换为的内容,即的完整内容为:include ""typedef unsigned int uint;typedef unsigned char uchar;void write_595uchar dat;void SegInitialvoid;void displong num;void delaysuint x;void delayuint x;/流水灯74hc595各引脚定义/define CLK0 P2OUT &= ~BIT4define CLK1 P2OUT |= BIT4define STB0 P2OUT &= ~BIT2define STB1 P2OUT |= BIT2define DS0 P2OUT &= ~BIT5define DS1 P2OUT |= BIT5/流水灯74hc595各引脚定义/define LEDOFF P5OUT = 0x00uchar dis_num={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uchar bitnum={0x01,0x02,0x04,0x08,0x10,0x20};uchar dispbuf6;//以下是延时函数void delayuint x{uint a,b;fora=x;a>0;a--forb=10000;b>0;b--;}//控制流水灯,使用STB,CLK,DSvoid write_595uchar dat{uint n;forn = 0;n<8;n++{ifdat&0x80 == 0x80DS1;elseDS0;dat <<= 1;CLK0;CLK1;}STB1;STB0;}/数码管显示初始化函数/void SegInitialvoid{P5DIR = 0XFF;P4DIR = 0XFF;P5OUT = 0X00;P4OUT = 0X00;}/数码管延时函数/void delaysuint x{for;x>0;x--;}/数码管显示函数位选 ~段选 P4/void displong num{uint i;dispbuf0 = num%10;dispbuf1 = num/10%10;dispbuf2 = num/100%10;dispbuf3 = num/1000%10;dispbuf4 = num/10000%10;dispbuf5 = num/100000%10;fori=0;i<6;i++{P4OUT = dis_numdispbufi;P5OUT = bitnumi;delays400;P5OUT=0X00;}}下面讲一下的功能,一些常用函数都写在里面,一般情况下我们写好头文件后不必对函数的原型进行深究,只需知道函数的功能即可,即头文件里的函数声明,多个C文件编译链接的时候,相当于主函数放在前面,其他函数放在后面,调用函数的时候就必须先对这些函数进行声明,否则编译器不知道你的函数原型是什么,而这些头文件就起到了函数声明的作用,所谓头文件就可以理解为在main函数前面事先要处理的程序即声明和定义;下面把这个结构化编程的等效程序贴出来,以方便大家理解:include ""typedef unsigned int uint;typedef unsigned char uchar;void write_595uchar dat;void SegInitialvoid;void displong num;void delaysuint x;void delayuint x;void main void{// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;SegInitial;long m = 0;while1{dispm;delay10;m++;ifm == 1000000m = 0;}}/流水灯74hc595各引脚定义/define CLK0 P2OUT &= ~BIT4define CLK1 P2OUT |= BIT4define STB0 P2OUT &= ~BIT2define STB1 P2OUT |= BIT2define DS0 P2OUT &= ~BIT5define DS1 P2OUT |= BIT5/流水灯74hc595各引脚定义/define LEDOFF P5OUT = 0x00uchar dis_num={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uchar bitnum={0x01,0x02,0x04,0x08,0x10,0x20};uchar dispbuf6;//以下是延时函数void delayuint x{uint a,b;fora=x;a>0;a--forb=10000;b>0;b--;}//控制流水灯,使用STB,CLK,DS void write_595uchar dat{uint n;forn = 0;n<8;n++{ifdat&0x80 == 0x80DS1;elseDS0;dat <<= 1;CLK0;CLK1;}STB1;STB0;}/数码管显示初始化函数/void SegInitialvoid{P5DIR = 0XFF;P4DIR = 0XFF;P5OUT = 0X00;P4OUT = 0X00;}/数码管延时函数/void delaysuint x{for;x>0;x--;}/数码管显示函数位选 ~段选 P4/void displong num{uint i;dispbuf0 = num%10;dispbuf1 = num/10%10;dispbuf2 = num/100%10;dispbuf3 = num/1000%10; dispbuf4 = num/10000%10; dispbuf5 = num/100000%10; fori=0;i<6;i++{P4OUT = dis_numdispbufi; P5OUT = bitnumi;delays400;P5OUT=0X00;}}。
单片机头文件的书写格式
1. 头文件保护:
在头文件的开头使用预处理指令 #ifndef、#define 和#endif 来防止头文件被多次包含。
例如:
#ifndef MY_HEADER_H.
#define MY_HEADER_H.
// 这里是头文件的内容。
#endif // MY_HEADER_H.
2. 包含其他头文件:
如果需要使用其他头文件中定义的内容,可以使用
#include 预处理指令将其包含进来。
例如:
#include <stdio.h>。
3. 声明常量和宏定义:
可以使用 #define 预处理指令来定义常量和宏。
例如:
#define LED_PIN 13。
4. 声明变量:
可以在头文件中声明变量,但通常建议只在需要在多个文件中共享的全局变量才这样做。
例如:
extern int global_variable;
5. 函数原型声明:
在头文件中通常会包含函数的原型声明,以便在其他文件中使用这些函数。
例如:
void setup();
void loop();
6. 注释:
在头文件中添加必要的注释,清晰地说明每个声明的作用和用法,以便其他人阅读和理解。
例如:
// 这个函数用于初始化系统。
void init_system();
总的来说,单片机头文件的书写格式应该清晰明了,注重可读性和可维护性,遵循一定的命名规范,同时需要注意头文件的重复包含和依赖关系,以确保程序的正确性和可移植性。
希望这些信息能够帮助到你。
C51编程中头文件的使用头文件在C51的编程中是不可缺少的部分。
本文将对keil C中常用头文件予以说明,并就如何编写头文件进行初步介绍。
一、C51常见本征函数库一些常见的头文件都是keil C自带的,在安装目录下的C51文件夹的INC中可以找到keilC中所有的芯片所对应的头文件。
51系列单片机在编程中常用的头文件有:AT89X51.H、INTRINS.H、ABSACC.H、MATH.H。
1、AT89X51.H——本征函数库头文件AT89X51.H是编程中必需要用到的专用寄存器文件。
它与INC中的头文件REG51.H所定义的内容是一样的。
主要用来定义特殊功能寄存器的位地址、程序状态寄存器的位地址、定时器/计数器控制寄存器的位地址、中断使能控制器位地址、单片机P3引脚特殊功能位地址、中断优先权控制寄存器位地址、串行口控制寄存器位地址。
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 P0口锁存器的地址sfr P1 = 0x90 P1口锁存器的地址sfr P2 = 0xA0 P2口锁存器的地址sfr P3 = 0xB0 P3口锁存器的地址sfr PSW = 0xD0 程序状态字sfr ACC = 0xE0 累加器sfr B = 0xF0 B寄存器sfr SP = 0x81 堆栈指针sfr DPL = 0x82 数据指针低位sfr DPH = 0x83 数据指针高位sfr PCON = 0x87 电源控制寄存器sfr TCON = 0x88 定时器/计数器控制寄存器sfr TMOD = 0x89 定时器/计数器方式控制寄存器sfr TL0 = 0x8A 定时器/计数器0(低字节)sfr TL1 = 0x8B 定时器/计数器1(低字节)sfr TH0 = 0x8C 定时器/计数器0(高字节)sfr TH1 = 0x8D 定时器/计数器1(高字节)sfr IE = 0xA8 中断允许控制寄存器sfr IP = 0xB8 中断优先级控制寄存器sfr SCON = 0x98 串行控制寄存器sfr SBUF = 0x99 串行缓冲器BIT Register 程序状态寄存器的地址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 T1计数溢出标志位sbit TR1 = 0x8E T1计数运行控制位sbit TF0 = 0x8D T0计数溢出标志位sbit TR0 = 0x8C T0计数运行控制位sbit IE1 = 0x8B 中断1边沿标志sbit IT1 = 0x8A 中断1控制位sbit IE0 = 0x89 中断0边沿标志位sbit IT0 = 0x88 中断0控制位IE 中断使能控制器位地址sbit EA = 0xAF 总中断控标志位sbit ES = 0xAC 串行中断标志位sbit ET1 = 0xAB T1计数中断标志位sbit EX1 = 0xAA 外部中断1标志位sbit ET0 = 0xA9 T0计数中断标志位sbit EX0 = 0xA8 外部中断0标志位IP 中断优先权控制寄存器位地址sbit PS = 0xBC 串行中断优先标志位sbit PT1 = 0xBB 计数器1中断优先标志位sbit PX1 = 0xBA 外部中断1优先标志位sbit PT0 = 0xB9 计数器0中断优先标志位sbit PX0 = 0xB8 外部中断0优先标志位P3 单片机P3引脚特殊功能位地址sbit RD = 0xB7 外部数据存储器的写入控制信号sbit WR = 0xB6 外部数据存储器的读取控制信号sbit T1 = 0xB5 定时器1外部中断sbit T0 = 0xB4 定时器0外部中断sbit INT1 = 0xB3 外部中断0sbit INT0 = 0xB2 外部中断1sbit TXD = 0xB1 串行输出口sbit RXD = 0xB0 串行输入口SCON 串行口控制寄存器位地址sbit SM0 = 0x9F 串行口模式的选择位sbit SM1 = 0x9E 串行口模式的选择位sbit SM2 = 0x9D 允许模式2和3的多机通讯控制位sbit REN = 0x9C 允许串行接收位sbit TB8 = 0x9B 在模式2和3下传送第9数据位sbit RB8 = 0x9A 在模式2和3下存放第9数据位sbit TI = 0x99 传送中断标志位sbit RI = 0x98 接收中断标志位#endif2、INTRINS.H——本征函数库头文件INTRINS.H主要用来定义空操作、判断并清零和字符及数字的循环移动。
文件下载完成后,文件格式改为.h后保存到头文件库中,如keil软件,找到keil安装文件:keil—>c51—>INC头文件如下//--------------------------------------------------------------------------------//新一代1T 8051系列单片机内核特殊功能寄存器C51 Core SFRs// 7 6 5 4 3 2 1 0 Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000//-----------------------------------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;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//--------------------------------------------------------------------------------//新一代1T 8051系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 2 1 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000// 7 6 5 4 3 2 1 0 Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000/*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1*///-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_W AKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAWAKEUP : PCA 中断可唤醒powerdown。
Reg51.h是头文件,是对单片机的特殊寄存器的定义。
另外,#include <reg51.h>与#include"reg51.h"是有区别的,使用< >包含头文件时,编译先进入到软件安装文件夹处开始搜索这个头文件,使用“”包含头文件时,编译先进入当前工程所在文件夹处开始搜索这个头文件。
Reg51.h在文件安装文件夹处存在,所以一般用#include<reg51.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 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 REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;
#endif。