单片机的c语言中位操作用法

上传人:mg****85 文档编号:44598726 上传时间:2018-06-14 格式:PDF 页数:16 大小:250.82KB
返回 下载 相关 举报
单片机的c语言中位操作用法_第1页
第1页 / 共16页
单片机的c语言中位操作用法_第2页
第2页 / 共16页
单片机的c语言中位操作用法_第3页
第3页 / 共16页
单片机的c语言中位操作用法_第4页
第4页 / 共16页
单片机的c语言中位操作用法_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《单片机的c语言中位操作用法》由会员分享,可在线阅读,更多相关《单片机的c语言中位操作用法(16页珍藏版)》请在金锄头文库上搜索。

1、风行下载2012 正式版官方下载:http:/ 正式版官方下载:http:/ C C C C 语言中位操作用法语言中位操作用法作者:郭天祥来源:转自更新时间:2008-12-4 21:50:22在对单处机进行编程的过程中, 对位的操作是经常遇到的。 C51 对位的操控能力是非常强大的。从这一点上,就可以看出 C 不光具有高级语言的灵活性,又有低级语言贴近硬件 的特点。这也是在各个领域中都可以看到 C 的重要原因。在这一节中将详细讲解 C51 中的位操作及其应用。1、位运算符C51 提供了几种位操作符,如下表所示:运算符含义运算符含义0 1 1如下例:a=5 /a=(0b 0101) /a=(0

2、b 1011) /a=0b11111110 a=a/使变量 a 的第 1 位、第 3 位、第 5 位、第 7 位清零 a= 0b 010101002.检测位要知道一个变量中某一位是1还是0 ,可以使用与操作来实现。a=0xf5; /a=0b 11110101 result=a /检测 a的第三位,result=03.保留变量的某一位要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。a=0x55; /a=0b 01010101a=a /将高四位清零,而保留低四位 a=0x05 2) “按位或”运算符()参与或操作的两个位,只要有一个为1 ,则结果为1 。即有1为1 ,全0为0 。0

3、|0=0; 0|1=1; 1|0=1; 1|1=1;例如: a=0x30|0x0f; /a=(0b00110000)|(0b00001111)=(0b00111111)=0x3f“按位或”运算最普遍的应用就是对一个变量的某些位置1 。如下例:a=0x00; /a=0b 00000000a=a|0x7f; /将 a 的低 7 位置为 1,a=0x7f风行下载2012 正式版官方下载:http:/ 正式版官方下载:http:/ XOR 运算符。当参与运算的两个位相同( 1与1或0与0 )时结果为0 。不同时为1 。即相同为 0,不同为 1。00=0; 01=1; 10=1;11=0;例如: a=0

4、x550x3f; /a=(0b01010101)(0b00111111)=(0b01101010)=0x6a异或运算主要有以下几种应用:1.翻转某一位当一个位与1作异或运算时结果就为此位翻转后的值。如下例:a=0x35; /a=0b00110101 a=a0x0f; /a=0b00111010 a 的低四位翻转关于异或的这一作用,有一个典型的应用,即取浮点的相反数, 具体的实现如下:f=1.23;/f 为浮点型变量值为 1.23f=f*-1; /f 乘以-1,实现取其相反数,要进行一次乘运算 f=1.23;(unsigned char *) /将浮点数 f 的符号位进行翻转实现取相反数2.保留

5、原值当一个位与0作异或运算时,结果就为此位的值。如下例:a=0xff; /a=0b11111111 a=a0x0f; /a=0b11110000 与 0x0f 作异或,高四位不变,低四位翻转3.交换两个变量的值,而不用临时变量要交换两个变量的值,传统的方法都需要一个临时变量。实现如下:void swap(unsigned char*pa,unsigned char *pb) unsigned char temp=*pa;/定义临时变量,将 pa 指向的变量值赋给它*pa=*pb;*pb=temp;/变量值对调而使用异或的方法来实现,就可以不用临时变量,如下: void swap_xor(uns

6、igned char *pa,unsigned char*pb)*pa=*pa*pb;*pb=*pa*pb;*pa=*pa*pb; /采用异或实现变量对调 从上例中可以看到异或运算在开发中是非常实用和神奇的。4) “取反”运算符()与其它运算符不同, “取反”运算符为单目运算符,即它的操作数只有一个。它的功能就是对操作数按位取反。也就是是1得0 ,是0得1 。 1=0; 0=1;如下例:a=0xff; /a=0b11111111a=a; /a=0b00000000风行下载2012 正式版官方下载:http:/ 正式版官方下载:http:/ 0 的有符号整型变量取相反数d=-1;/d 为有符号整

7、型变量,赋值为-1,内存表示为 0b11111111 11111111d=d+1; /取 d 的相反数,d=1,内存表示 0b 00000000 00000001此例运用了负整型数在内存以补码方式来存储的这一原理来实现的。 负数的补码方 式是这样的:负数的绝对值的内存表示取反加 1,就为此负数的内存表示。如-23 如果为八位有符号整型数,则其绝对值 23 的内存表示为 0b00010111,对其取反则为 0b11101000, 再加 1 为 0b11101001,即为 0XE9,与 Keil 仿真结果是相吻合的:2.增强可移植性关于“增强可移植性”用以下实例来讲解: 假如在一种单片机中 uns

8、igned char 类型是八个位(1 个字节) ,那么一个此类型的变量 a=0x67,对其最低位清零。则可以用以下方法:a=0x67; /a=0b 0110 0111a=a /a=0b 0110 0110上面的程序似乎没有什么问题,使用 0xfe 这一因子就可以实现一个 unsigned char 型的 变量最低位清零。但如果在另一种单片机中的 unsigned char 类型被定义为 16 个位(两个字节) ,那么这种方法就会出错,如下:b=0x6767; /假设 b为另一种单片机中的 unsigned char 类型变量, 值为 0b 0110 0111 01100111b=b /如果此

9、时因子仍为 0xfe 的话,则结果就为 0b 0000 0000 0110 0110 即 0x0066,而与 0x6766 不相吻合上例中的问题就是因为不同环境中的数据类型差异所造成的,即程序的可移植性不好。对于这种情况可以采用如下方法来解决:a=0x67; /a=0b 0110 0111a=a /在不同的环境中1 将自动匹配运算因子,实现最后一位清零a=0x66 其中 1 为 0b11111110b=0x6767; /a=0b 0110 0111 0110 0111b=a /1=0b 1111 111111111110,b=0b 0110 0111 0110 0110 ,即 0x67665)

10、左移运算符(1表示将 a 的各位向右移动 1 位。 与左移相对应的, 左移一位就相当于除以 2, 右移 N 位,就相当于除以 2N。 在右移的过程中,要注意的一个地方就是符号位问题。对于无符号数右移时左边高位移和0 。对于有符号数来说,如果原来符号位为0 ,则左边高位为移入0 ,而如果符号位为1 ,则左边移入0还是1就要看实际的编译器了,移入0的称为“逻辑右移” ,移入1的称为“算术右移” 。Keil 中采用“算术右移”的方式来进行编译。如下: d=-32; /d 为有符号整型变量,值为-32,内存表示为 0b 11100000d=d1;/右移一位 d 为 0b 11110000 即-16,K

11、eil 采用“算术逻辑“进行编译7)位运算赋值运算符在对一个变量进行了位操作中, 要将其结果再赋给该变量, 就可以使用位运算赋值运算符。位运算赋值运算符如下:/a=0b 00000000d=0xffff; /d=0b11111111 11111111d /a 为无符号型, 左边添 0, 补齐为 0b 00000000 00000000, d=0b 00000000 00000000用 TX-1C开发板学习单片机的看门狗 作者:郭天祥来源:原创更新时间:2008-11-25 22:36:56“看门狗”概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰, 造成程序

12、的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状 态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watch dog)。加入看门狗电路的目的是使单片机可以在无人状态下实现连续工作,其工作过程如下:看门狗芯片和单片机的一个 I/O 引脚相连,该 I/O 引脚通过单片机的程序控制,使它定时地往看门狗芯片的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他 控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,

13、给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号, 便将它和单片机复位引脚相连的引脚上送出一个复位信号, 使单片机发生复位,从而单片机将从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。 通常看门狗电路需要一个专门的看门狗芯片连接单片机来实现, 不过这样会给电路设计带来复杂,STC单片机内部自带有看门狗,通过对相应特殊功能寄存器的设置就可实现看门狗的应用,STC89 系列单片机内部有一个专门的看门狗定时器寄存器,Watch Dog Timer寄存器,其相应功能见下个知识点。风行下载2012 正式版官方下载:http:/ 正式版官方下载:

14、http:/ E1H,不能位寻址,该寄存器用来管理 STC单片机的看门狗控制部分,包括启停看门狗、设置看门狗溢出时间等。单片机复位时该寄存器不一定全部被清 0,在 STC下载程序软件界面上可设置复位关看门狗或只有停电关看门狗的选择, 大家根据需要可做出适合自己设计系统的选择。 其各位 的定义如表 4.2.1 所示。表 1 看门狗定时器寄存器(WDT_CONTR)位序号D7 D6 D5 D4 D3 D2 D1 D0位符号-EN_WDTCLR_WDTIDLE_WDTPS2 PS1 PS0EN_WDT:看门狗允许位,当设置为“1”时,启动看门狗。 CLR_WDT :看门狗清“0”位,当设为“1”时,

15、看门狗定时器将重新计数。硬件自动清“0”此位。IDLE_WDT:看门狗“IDLE”模式位,当设置为“1”时,看门狗定时器在单片机的“空闲模式”计数,当清“0”该位时, 看门狗定时器在单片机的“空闲模式”时不计数。 PS2、PS1、PS0:看门狗定时器预分频值,不同值对应预分频数如表 4.2.2 所示。表 2 12M 晶振看门狗定时器预分频值PS2 PS1 PS0 预分频数看门狗溢出时间000265.5ms0014131.0ms 0108262.1ms01116524.2ms100321.0485s101642.0971s110128 4.1943s 111256 8.3886s看门狗溢出时间与预分频数有直接的关系,公式如下:看门狗溢出时间=(N预分频数32768)/晶振频率上式中 N 表示 STC单片机的时钟模式,STC 单片机有两种时钟模式:单倍速,也就是12 时钟模式,这种时钟模式下,STC单片机与其它公司 51 单

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号