51单片机可以用reg52.h的头文件吗
所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如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语言对变量名的定义规则。除些外其它的则必须按照上面的格式写,如“名称变量位地址值”中“”,它是由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 © 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§ 奇偶校验位
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 波特率加倍
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
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 触发方式选择位
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
sfr TMOD = 0x89; //定时器/计数器 工作方式寄存器 不能位寻址
//确定工作方式和功能
//D7 GATE 门控制位
//GATE=0;定时器/计数器由TRX(x=0,1)来控制
//GATE=1;定时器/计数器由TRX(x=0,1)
//和外部中断引脚(init0,1)来共同控制
//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;定时器/计数器由TRX(x=0,1)来控制
//GATE=1;定时器/计数器由TRX(x=0,1)
//和外部中断引脚(init0,1)来共同控制
//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停止计数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
sfr TL0 = 0x8A; //定时器/计数器0高8位 容器 加1 计数器
sfr TL1 = 0x8B; //定时器/计数器1高8位 容器
sfr TH0 = 0x8C; //定时器/计数器0低8位 容器
sfr TH1 = 0x8D; //定时器/计数器1低8位 容器
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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定义为低优先级中断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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 方式2,3中发送数据的第9位
//D2 RB8 方式2,3中接受数据的第9位
//D1 TI 发送中断标志位
//D0 RI 接受中断标志位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
sfr SBUF = 0x99; //串行数据缓冲区
/*****************************************************************************
下面是位寻址区
上面做过解释的就不在下面一一解释了
1
2
3
1
2
3
******************************************************************************/
/* 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
单片机最大系统re,wr,psen,ale信号对应哪些引脚?
单片机最大系统的re,wr,psen,ale信号对应单片机的引脚是:RD、WR、PSEN、ALE。这4个引脚是在扩展外部程序存储器和数据存储器时才会用到。
8位单片机内部结构有哪些引脚
1、 RB:读\忙,低电平有效。2、 RE:读使能,低电平有效。3、CE:芯片选中使能,低电平有效。4、VCC:3.3V电源 5、Vss:地。6、 CLE:命令字输入使能。7、ALE:地址输入使能。8、WE:写使能输入,低电平有效。9、WP:写保护输入,低电平有效。10、D0-D7:8 位数据输入\/ 输出口。
单片机接口及原理中的jnz什么意思
你说的是51单片机汇编指令吧,JNZ rel J 表示跳转 N 表示非,不是 Z 代表0,rel表示相对值 因此该句意思是如果累加器A的内容不为零,则跳转到相对偏移量为rel的地方去执行程序,否则按顺序执行下一条指令
如何确定单片机音乐播放的音律和节拍计算
低1DO 262 1908 #4FA# 740 0676 1DO# 277 1805 中5SO 784 0638 低2RE 294 1700 #5SO# 831 0602 2RE# 311 1608 中6LA 880 0568 低3M 330 1516 #6LA# 932 0536 低4FA 349 1433 中7SI 988 0506 4FA# 370 1350 高1DO 1046 0478 低5SO 392 1276 #DO# 1109 0451 5SO# 415...
RE200B怎么与单片机相连
1、看你的问题就是想放大2倍接入5V单片机的A\/D~~你可以不用放大,直接把单片机的A\/D基准电压降低就可以,这个你看你的单片机数据手册。2、RE200 的源极电阻可以调整,由此可以调整输出增益及其它特性,这个要根据你的具体情况来做。3、一般来说,为了降低输出噪声,都会在放大部分整合一个低通滤波。
PIC16F877单片机的5个端口RA~RE各具什么特色?分别适用于什么场合...
当整体系统需要多单片机时,彼此可以经由并列传输接口来快速传输资料;PORTE 只有3条引脚的双向I\/O端口(RE0~RE2),有关的特殊寄存器有3个,它在基本输入\/输出功能的基础上,增加并行从动端口,模拟量输入功能。单片机上电之后,输出数据寄存器PORTE的值随机值,方向寄存器TRISC的值全为1,因此,起始...
用51单片机实现时钟功能程序???
;短转移指令的功能是先使程序计数器PC加1两次(即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。因此,短转移指令是一条相对转移指令,是一条双字节双周期指令 ORG0030H;指明后面的程序从程序存储器的0030H单元开始存放 DELAY200US:;@11.0592MHz NOP NOP NOP PUSH30H PUSH31H MOV...
单片机电动机保护器接线图
关键看你用什么485芯片,我用过MAX485,8脚DIP封装,挺好用的,下面是其典型连接图。 与单片机的连接很简单,RO接单片机的Rxd,DI接单片机的Txd,RE和DE可连在一起接单片机的某个输出脚,作为收\/发控制信号(高电 参考资料:叫人搞好点
人体红外感应RE200B,能不能直接和单片机连接?
不可以直接连,主要不是因为模拟和数字的问题,是因为,信号太弱了,建议加运放或者bis0001
求解单片机的问题?这是1602的写入指令,rs,re,en,为0 是什么意思_百度知 ...
rs是数据\\命令选择短(1\\0),
喻鲁聚苯: 其实这个头文件与你的单片机型号是对应的 比如51单片机 芯片有AT89C51,AT89C52,AT89S51,AT89S52那么你在keil编译软件中都可以用reg52.h这个头文件,因应他的内核是一样的,不同的只是flash大小ram大小,还有一些外设吧 所以要确定头文件,必须知道编译环境还有芯片.
临武县13882578613: 请问单片机程序的头文件 是不是要和单片机的型号相对应? - ?
喻鲁聚苯: 如果是新手的话,建议第一本入门书是郭天祥的那本51的教学书.买个板子,自己边看书边玩.光有理论不实践是一点效果都没有的.对于你的问题,不同单片机需要的头文件当然是不同的,需要和型号相对应.至于对应的是什么头文件,建议你去看该单片机datasheet,如果不懂看的话永远都不能达到一通百通.另,头文件的写法按理说和型号之间并不一定要有什么联系,关键是写这个头文件的人想起什么名,而不是它应该是个什么名,明白?至于你说的51,我们一般加入的头文件是reg52.h
临武县13882578613: KEIL中reg52.h为么不能用?总是报错 - ?
喻鲁聚苯: 的确,如果想用一个头文件的话,首先要确定keil里面有这个头文件,#include报错,说明你的keil里面没有这个头文件,那么你可以用#include代替reg52.h,因为51和52的单片机的管脚定义是一样的……
临武县13882578613: keil 中选择机型AT89S51,头文件能用#include<reg52.h>吗? - ?
喻鲁聚苯: 应该能
临武县13882578613: 单片机c语言编程的头文件要根据单片机的型号来更换吗? - ?
喻鲁聚苯: 51单片机的基本是可以通用的,你可以打开这些文件看一下,其实他们声明的大部分都一样的,只有一些特殊的功能才有点区别,不用到没关系了
临武县13882578613: 请问大家:51单片机编程时自己写一个头文件,放在哪可以随便调用呢? 就如调用reg52.h - ?
喻鲁聚苯: 跟对应的C文件放在一起,这样不会忘.如果是全局变量,宏定义之类没有对应C文件的,那就和main.c放在一起.
临武县13882578613: 单片机#include <REG51.H>和#include <REG52.H>有什么区别啊? - ?
喻鲁聚苯: 52的flash和ram地址有些扩充,所以除了极少数的情况,一般情况下是可以互换的,无需担心,因为若是特殊应用的话你或许就不会用51,52了,实际做产品的时候用51,52的人都是看重它通用的优势才用它的,把它当通用模块来用的
临武县13882578613: 单片机c语言中常用的头文件都有哪些?分别有什么作用啊? - ?
喻鲁聚苯: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> …… 这些都是头文件,他们分别有着各自的作用.相当于一个函数库,而你写程序时,需要用到一些基本运算时,不用自己写了,直接引用这个模块,提高了效率. 他...
临武县13882578613: AT89C51 AT89S52?
喻鲁聚苯: #include<reg52.h>兼容AT89c51单片机,就是说你不管用51还是52单片机,头文件用#include<reg52.h>就不会有问题
临武县13882578613: 单片机程序需要加哪些头文件 - ?
喻鲁聚苯: 根据你使用的不同的库函数决定!!C:\Keil\C51\hlp 目录中 看 c51.hlp文件 调试相关函数时比如使用对应的头文件