Chinaunix首页 | 论坛 | 博客
  • 博客访问: 498962
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: 嵌入式

2016-09-15 08:26:31

reg51.h中存在sfrsbit关键字。

sfr P0=0x80,意思是把单片机内部地址0x80处的寄存器重新起名字叫P0

这样就不用每次都繁琐的取地址,而却也不方便记忆。把它另外命名一个可以理解的名字,更好用也更合理。

SFR也是一种扩充数据类型,点用一个内存单元,值域为0255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90这一句定P1P1端口在片内的寄存器,在后面的语句中我们可以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。

sbitsfr类似,但是它是单独对一个位进行重命名,如sbit LED0 = P0 ^0就是对P0中的第0为进行了重命名。

sbit更像是类型定义,不像是变量定义。

sbit的用法和方法:

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

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

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

总结起来sfrsbit区别

         sfr 是定义字节的  8

         sbit 是定义位的   1

讲解:移位操作<<’ ‘>>

(1) 左移。C51中操作符为“<<’’,每执行一次左移指令,被操作的数将最高位移入单片机PSW寄存器的CY位,CY位中原来的数丢弃,最低位补0,其他位依次向左移动一位,如下图所示:

 

(2) 右移。C51中操作符为“>>’’,每执行一次右移指令,被操作的数将最低位移入单片机PSW寄存器的CY位,CY位中原来的数丢弃,最高位补0,其他位依次向右移动一位,如下图所示。

 

(3)循环左移。最高位移入最低位,其他位依次向左移一位。C语言中没有专门的指令,通过移位指令与简单逻辑运算可以实现循环左移,或直接利用C51库中自带的函数_crol_实现,如下图所示。_crol_函数所在的头文件是

 

(4)循环右移。最低位移入最高位,其他位依次向右移一位。C语言中没有专门的指令,通过移位指令与简单逻辑运算可以实现循环右移,或直接利用C51库中自带的函数-cror实现,如下图所示。_cror_函数所在的头文件是

 

讲解:psw寄存器

PSW (Program Status Word)全称为程序状态字标志寄存器,是一个8位寄存器,位于单片机片内的特殊功能寄存器区,字节地址DOH,用来存放运算结果的一些特征,如有无进位、借位等,使用汇编编程时PSW寄存器很有用,但在利用C语言编程时,编译器会自动控制该寄存器,很少人为操作它,大家只需做简单了解即可.其每位的具体含义如下图所示.

 

① CY一进位标志位,它表示运算是否有进位(或借位).如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0.

② AC一辅助进位标志,又称半进位标志,它指两个8位数运算低四位是否有半进位,即低四位相加(或相减)是否进位(或借位),如有AC1,否则为0e

 ③FO一由用户使用的一个状态标志位,可用软件来使它置1或清0,也可由软件来测试它,以控制程序的流向.

RS1, RSO-4组工作寄存器区选择控制位,在汇编语言中这两位用来选择4组工作寄存器区中的哪一组为当前工作寄存区.

 ⑤ov一溢出标志位,反映带符号数的运算结果是否有溢出.有溢出时,此位为1,否则为0.

① P一奇偶标志位,反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个I(11001100B,其中有41),则P0,否则P1.

/*--------------------------------------------------------------------------

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

 

阅读(524) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~