参考资料:http://www.360doc.com/content/15/0719/00/12109864_485798838.shtml
寄存器地址及位地址声明的原因
reg51.h里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还要包括一些位地址的声明,如:sfr P1=0x80; sfr IE=0xA8; sbit EA=0xAF等
sfr P1=0x80 这句话表示:P1口所对应的特殊功能寄存器P1在内存中的地址为0x80,sbit EA = 0xAF这句话表示EA这一位的地址为0xAF;
sfr 表示特殊功能寄存器的意思,它是keil为能直接访问80C51中的SFR而提供的一个关键词,用法:sfr 特殊功能寄存器名=地址值
sbit 表示位的意思,编写程序时,如果需要操作寄存器的某一位(可位寻址的寄存器才能用)时,需要定义一个位变量,此时就要用到sbit。如sbit deng=P1^0, sbit EA = 0xAF;
sbit具体用法有三种:
第一种: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才能编译通过。
/*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串行数据接受
// P31TXD串行数据发送
// P32外部中断0信号申请
// P33外部中断1信号申请
// P34定时/计数器T0外部计数脉冲输入
// P35定时/计数器T1外部计数脉冲输入
// P36WR片外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 00区00H~07H
//0 11区08H~0fH
//1 02区10H~17H
//1 13区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位,其它的一般不用
//D7SMOD该位与串口通信波特率有关
//SMOD=0串口方式1 2 3波特率正常
//SMOD=1串口方式1 2 3波特率加倍
sfr TCON = 0x88; //定时器/计数器控制寄存器可以位寻址
//D7 TF1定时器1溢出标志位
//D6TR1定时器1运行控制位
//D5TF0定时器0溢出标志位
//D4TR0定时器0运行控制位
//D3IE1外部中断1请求标志
//D2IT1外部中断1触发方式选择位
//D1IE0外部中断0请求标志
//D0IT0外部中断0触发方式选择位
sfr TMOD = 0x89; //定时器/计数器工作方式寄存器不能位寻址
//确定工作方式和功能
//D7GATE门控制位
//GATE=0;定时器/计数器由TRX(x=0,1)来控制
//GATE=1;定时器/计数器由TRX(x=0,1)
//和外部中断引脚(init0,1)来共同控制
//D6C/T定时器、计数器选择位
//0选择定时器模式
//1选择计数器模式
//D5M1
//D4M0
//M1M0工作方式
//00方式013位定时器/计数器
//01方式116位定时器/计数器
//10方式28位自动重装定时器/计数器
//11方式3仅适用T0分成两个8位计数器,T1停止计数
//D3GATE门控制位
//GATE=0;定时器/计数器由TRX(x=0,1)来控制
//GATE=1;定时器/计数器由TRX(x=0,1)
//和外部中断引脚(init0,1)来共同控制
//D2C/T定时器、计数器选择位
//0选择定时器模式
//1选择计数器模式
//D1M1
//D0M0
//M1M0工作方式
//00方式013位定时器/计数器
//01方式116位定时器/计数器
//10方式28位自动重装定时器/计数器
//11方式3仅适用T0分成两个8位计数器,T1停止计数
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中断允许位 interr 2
//D1 ET0 定时器/计数器0中断允许位 interrupt 1
//D0 EX0 外部中断0中断允许位 interr 0
sfr IP = 0xB8; //中断优先级寄存器 可位寻址
//D7 NULL
//D6 NULL
//D5 NULL
//D4 PS 串行口中断定义优先级控制位
// 1 串行口中断定义为高优先级中断
// 2 串行口中断定义为低优先级中断
//
//D3 PT1
// 1 定时器/计数器1中断定义为高优先级中断
// 0 定时器/计数器1中断定义为低优先级中断
//D2 PX1
// 1 定时器/计数器0中断定义为高优先级
// 0 定时器/计数器0中断定义为低优先级
//D0 PX0
// 1 外部中断0定义为高优先级中断
// 0 外部中断0定义为低优先级中断
sfr SCON = 0x98; //串行口控制寄存器 可以进行位寻址
//D7 SM0
//D6 SM1
//方式 SM0 SM1 串行口工作方式
// 0 0 0 同步移位寄存器方式
// 1 0 1 10位异步收发(8位数据),波特率可变(定时器1溢出率控制)
// 2 1 0 11位异步收发(9位数据),波特率固定
// 3 1 1 11异步收发(9位数据),波特率可变(定时器1溢出率控制)
//D5 SM2 多机通信控制位 主要用于方式2和方式3
//D4 REN 允许串行接收位
//D3 TB8 方式2,3中发送数据的第9位
//D2 RB8 方式2,3中接收数据的第9位
//D1 T1 发送中断标志位
//D0 RI 接收中断标志位
sfr SBUF = 0x99; //串行数据缓冲区