51单片机位操作

合集下载

51单片机位操作指令

51单片机位操作指令

JC:如果Cy为1,则跳转到目标地址,否则执 行下一条指令 JNC:如果Cy为0,则跳转到目标地址,否则 执行下一条指令 JB:如果bit为1,则跳转到目标地址,否则执 行下一条指令 JNB:如果Cy为0,则跳转到目标地址,否则 执行下一条指令 JBC:如果bit为1,则先将bit清零,再跳转到 目标地址,否则执行下一条指令
位变量逻辑运算指令
ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit
C都是在前面的!
ANL:可寻址位和Cy执行“逻辑与”操作,结果 存放在Cy,不影响可寻址位
ORL:可寻址位和Cy执行“逻辑或”操作,结果 存放在Cy,不影响可寻址位
前面加一个“/”表示使用反码与Cy执行逻辑操 作,仍不影响可寻址位
• 可见20H是位地址还是字节地址要看另一个操 作数的类型。
分类:
1.位传送指令 2.位变量修改指令 3.位变量逻辑运算指令 4.位条件相对转移指令
位传送指令
MOV C,bit MOV bit,C
注意:这里的bit都是位地址
这组指令的功能是实现位累加器(CY)和其它位 地址之间的数据传递。
例: MOV C,30H ;位地址(30H)→ Cy
位操作指令
主讲人:王大臣
一位就是一盏灯的亮和灭
• 我们之前学的指令全都是用“字节”来介 绍的:字节的移动、加法、减法、逻辑运算、 移位等等。用字节来处理一些数学问题,比如 说:控制冰箱的温度、电视的音量等等很直观, 可以直接用数值来表示。可是如果用它来控制 一些开关的打开和合上,灯的亮和灭,就有些 不直接了?我们知道送往P1口的数值后并不能 马上知道哪个灯亮和来灭,而是要化成二进制 才知道。工业中有很多场合需要处理这类开关 输出,继电器吸合,用字节来处理就显示有些 麻烦,所以在8051单片机中特意引入一个位处 理机制。

51单片机位操作指令

51单片机位操作指令

51单片机位操作指令摘要:1.51 单片机简介2.位操作指令概述3.常见位操作指令a.位清零指令b.位置位指令c.位取反指令d.位测试指令4.位操作指令应用实例a.简单按键控制b.计数器应用c.矩阵键盘扫描5.位操作指令在51 单片机中的重要性正文:51 单片机是一种广泛应用的8 位微控制器,其功能强大且成本低廉,被广泛应用于嵌入式系统和自动控制领域。

在51 单片机的指令系统中,位操作指令占据着重要地位,它们可以实现对单片机内部寄存器和外设状态的快速操作。

位操作指令主要针对单个二进制位进行操作,包括位清零指令、位置位指令、位取反指令和位测试指令等。

这些指令可以实现对二进制数据的设置、检测和修改等功能,为实际应用提供了极大的便利。

位清零指令(如CLR)用于将指定寄存器的某一位设置为0。

例如,我们可以使用CLR P1.0 来将P1 寄存器的第0 位清零。

位置位指令(如SETB)则用于将指定寄存器的某一位设置为1。

例如,我们可以使用SETB P1.0 来将P1 寄存器的第0 位设置为1。

位取反指令(如CPL)用于将指定寄存器的某一位取反,即0 变1,1 变0。

例如,我们可以使用CPL P1.0 来将P1 寄存器的第0 位取反。

位测试指令(如JC、JNC、JB、JNB 等)用于根据指定寄存器的某一位的值来决定程序的执行流程。

例如,我们可以使用JC P1.0 来检查P1 寄存器的第0 位是否为1,若为1 则跳转到指定地址执行程序。

位操作指令在实际应用中有着广泛的应用。

例如,我们可以使用位清零指令和位置位指令来实现简单按键的控制,根据按键的状态来控制LED 灯的点亮和熄灭。

又如,我们可以使用位操作指令来实现计数器功能,通过位清零指令和位测试指令来计数和判断计数器是否达到预定值。

此外,位操作指令还可以应用于矩阵键盘扫描,通过位操作指令来检测并识别按键的按下。

总之,位操作指令在51 单片机中具有举足轻重的地位,掌握这些指令的使用方法对于进行51 单片机编程至关重要。

一个操作51单片机某几个IO口的方法

一个操作51单片机某几个IO口的方法

一个操作51单片机某几个IO口的方法
今天有同学学习《手把手教你学51单片机》过程中遇到一个关于51单片机IO口操作的问题,可能有其他同学有类似疑问,或者是其他同学根本没有考虑过这个疑问问题,我简单提一下,今后有类似问题也欢迎大家留言,我会给大家解释。

问题很简单,但是对于初学者常犯。

对于51单片机的P口来说,我们习惯上的赋值是P1 = 0xXX。

但是这样操作是一次性操作了8个IO口。

而有些情况下,我们只需要操作其中的几个而不是全部的时候,我们如何操作呢?如下图注释上边的部分,是我写的程序代码。

这个是操作51单片机P1口的低4位对步进电机进行操作的程序,在这个操作过程中,我们只使用到了P1口的低4位,因此我们希望高4位保持不变,只改变P1的低4位。

首先把P1进行一个备份到变量tmp中去,然后把变量tmp的经过两条语句,得到最终要赋值给P1的值以后,再一次性赋值给P0,这个方法大家都可以学习一下。

而注释下边的这段程序,是一位同学写的,这位同学的理由是下边这种写法,也没有改变P1的高4位。

表面看也没什么问题,但是实际上如果不利用tmp这个变量,P1就会产生一个错误的中间值。

P1= P1&0xF0;这条语句执行完毕以后,P1 = 0xX0;其中X是未知的,保持了之前P1的高4位的原值,而低4位是0;
再然后P1= P1|BeatCode[index];这样操作后,P1得到了最终的值。

但是这中间,P1 = 0xX0;这个值是我们根本不需要的一个错误值。

不要怕有问题,但是我也不希望没有经过思考的问题。

而这个问题,就是同学经过思考的问题,我认为很好,写出来提供给同学们共同学习。

51单片机学习06-位指令转移指令

51单片机学习06-位指令转移指令
目标地址 0002 减下一址 - 0013 获rel字节 FFEF 字节 rel的单字节补码 ∴rel= -128~+127(相对于下一指令址的跳转偏移量 的单字节补码 相对于下一指令址的跳转偏移量) 相对于下一指令址的跳转偏移量
Relative
执行相对转移: 执行相对转移:PC ←
目标地址 下一指令址 + 偏移量
硬件逻辑电路图
【例B3-14】如下控制梯形图,请用MCS-51程序实现: B3-14】如下控制梯形图,请用MCS-51程序实现: MCS 程序实现 MOV C , P1.3 ANL C , P1.2 ORL C , P2.1 ANL C , /P2.0 MOV P2.0 , C ;取P1.3 取 ;串联 串联P1.2 串联 ;并联 P2.1 并联 ;串联 P2.0常闭点 串联 常闭点 ;输出 P2.0 输出
ORG 0030H MAIN:MOV A , #56H ADD A , #67H DA A MOV 30H , A SJMP $ END
PC
;
目标地址 下一指令址 + 偏移量 0030H ← 0002H + 0046H
rel=[目标地址 下一指令址] 目标地址+ rel ;∴rel=[目标地址-下一指令址]低8位
【例3-12】 MOV 12】 MOV
C , 06H 20H.6 P1.0 ,C
90H或 90H或90H.0
;20H.6→Cy ;Cy→P1.0
P.45
【例3-13】 13】 CLR CLR CPL SETB C
24H.7
;0→Cy ;0→24H.7位 0→24H.7位 求反→21H.0位 ;21H.0 求反→21H.0位 ;1→P1.7位 1→P1.7位

51单片机位操作

51单片机位操作

C51单片机位操作方法C51对位的操控能力是非常强大的。

从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。

这也是在各个领域中都可以看到C的重要原因。

在这一节中将详细讲解C51中的位操作及其应用。

1、位运算符C51提供了几种位操作符,如下表所示:1)“按位与”运算符(&)参加运算的两个数据,按二进位进行“与”运算。

原则是全1为1,有0为0,即:0&0=0; 0&1=0; 1&0=0; 1&1=1;如下例:a=5&3; //a=(0b 0101) & (0b 0011) =0b 0001 =1那么如果参加运算的两个数为负数,又该如何算呢?会以其补码形式表示的二进制数来进行与运算。

a=-5&-3; //a=(0b 1011) & (0b1101) =0b 1001 =-7在实际的应用中与操作经常被用于实现特定的功能:1.清零“按位与”通常被用来使变量中的某一位清零。

如下例:a=0xfe; //a=0ba=a&0x55;//使变量a的第1位、第3位、第5位、第7位清零a= 0b2.检测位要知道一个变量中某一位是‘1’还是‘0’,可以使用与操作来实现。

a=0xf5; //a=0bresult=a&0x08; //检测a的第三位,result=03.保留变量的某一位要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。

a=0x55; //a=0ba=a&0x0f; //将高四位清零,而保留低四位a=0x052)“按位或”运算符(|)参与或操作的两个位,只要有一个为‘1’,则结果为‘1’。

即有‘1’为‘1’,全‘0’为‘0’。

0|0=0; 0|1=1; 1|0=1; 1|1=1;例如:a=0x30|0x0f; //a=(0b)|(0b)=(0b)=0x3f“按位或”运算最普遍的应用就是对一个变量的某些位置‘1’。

常见51单片机指令及详解

常见51单片机指令及详解

常见51单片机指令及详解1. 简介单片机是一种集成电路,具备处理和控制功能。

51单片机是指Intel公司推出的一系列8位单片机,常用于嵌入式系统和物联网设备。

本文将介绍一些常见的51单片机指令,并对其进行详解。

2. 数据传送指令2.1 MOV指令MOV指令用于将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。

例如:MOV A, #10 ;将立即数10传送给累加器AMOV R0, R1 ;将寄存器R1的值传送给R02.2 XCH指令XCH指令用于交换两个寄存器或内存位置中的数据。

例如:XCH A, B ;交换累加器A和B的值3. 算术运算指令3.1 ADD指令ADD指令用于将两个操作数相加,并将结果保存在累加器中。

例如:ADD A, B ;将累加器A和寄存器B的值相加,结果存储在A中3.2 SUBB指令SUBB指令用于将第二个操作数的补码与累加器的值相减,并将结果存储在累加器中。

例如:SUBB A, B ;将B的补码与累加器A的值相减,结果存储在A中4. 逻辑运算指令4.1 ANL指令ANL指令用于对两个操作数进行按位与运算,并将结果存储在目的操作数中。

例如:ANL A, B ;将累加器A和寄存器B的值按位与,结果存储在A 中4.2 ORL指令ORL指令用于对两个操作数进行按位或运算,并将结果存储在目的操作数中。

例如:ORL A, B ;将累加器A和寄存器B的值按位或,结果存储在A 中5. 跳转指令5.1 JMP指令JMP指令用于无条件跳转至指定的目标地址。

例如:JMP 2000H ;跳转至内存地址2000H处执行指令5.2 JZ指令JZ指令用于在累加器为零时跳转至指定的目标地址。

例如:JZ 3000H ;当累加器为零时,跳转至内存地址3000H处执行指令6. 输入输出指令6.1 IN指令IN指令用于将外部设备的数据输入到累加器或指定的寄存器中。

例如:IN A, P1 ;将P1端口的数据输入到累加器A中6.2 OUT指令OUT指令用于将累加器或指定的寄存器中的数据输出到外部设备。

51单片机指令表汇总

51单片机指令表汇总

51单片机指令表汇总51 单片机是一种广泛应用于电子工程和嵌入式系统开发的微控制器。

要熟练掌握 51 单片机的编程,了解其指令表是至关重要的。

下面就为大家汇总一下 51 单片机的常见指令。

数据传送类指令MOV 指令:这是最基本的数据传送指令,用于在寄存器之间、寄存器与存储器之间传送数据。

例如,“MOV A, 50H”就是将立即数 50H传送到累加器 A 中。

MOVX 指令:用于在片外数据存储器和累加器 A 之间进行数据传送。

比如“MOVX A, @DPTR”,将片外数据存储器中由数据指针 DPTR 所指定单元的内容传送到累加器 A 中。

MOVC 指令:用于访问程序存储器中的数据表格。

“MOVC A, @A+DPTR”是常见的用法。

算术运算类指令ADD 指令:实现加法运算。

像“ADD A, R0”就是将累加器 A 的内容和寄存器 R0 的内容相加,结果存放在累加器 A 中。

ADDC 指令:带进位加法指令。

考虑了上一次运算产生的进位标志。

SUBB 指令:用于减法运算,并且会考虑借位标志。

逻辑运算类指令ANL 指令:进行逻辑与操作。

例如“ANL A, R0”,将累加器 A 和寄存器 R0 的内容进行逻辑与运算,结果存放在累加器 A 中。

ORL 指令:执行逻辑或操作。

XRL 指令:实现逻辑异或运算。

控制转移类指令JC 指令:若进位标志为 1 则跳转。

JZ 指令:若累加器 A 的内容为 0 则跳转。

LJMP 指令:长跳转指令,可以跳转到 64KB 程序存储器空间的任意位置。

位操作类指令SETB 指令:将指定的位设置为 1。

例如“SETB P10”,将 P1 端口的第 0 位置 1。

CLR 指令:把指定的位清零。

这些只是 51 单片机指令的一部分,实际应用中还有更多的指令和组合使用方式。

在编程时,合理选择和运用这些指令能够实现各种复杂的功能。

比如,通过数据传送指令来初始化变量和读取外部数据;利用算术运算指令进行数值计算;借助逻辑运算指令处理逻辑关系;使用控制转移指令实现程序的分支和循环;运用位操作指令控制单个引脚的状态。

51单片机汇编语言教程:15课单片机位操作指令

51单片机汇编语言教程:15课单片机位操作指令

51 实验板推荐(点击下面的图片可以进入下载资料链接)
HJ-1G
HJ-3G
推荐使用慧净 51 实验板。推荐 51 学习网 淘宝网:/
推荐使用慧净 51 实验板。推荐 51 学习网 淘宝网:/
51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28 课)
位或指令 ORL C,bit ORL C,/bit 这个的功能大家自行分析吧,然后对照上面的例程,编一个验证程序,看看你相得对吗? 位条件转移指令 判 CY 转移指令 JC rel JNC rel 第一条指令的功能是如果 CY 等于1就转移,如果不等于1就次序执行。那么转移到什么地方 去呢?我们能这样理解:JC 标号,如果等于1就转到标号处执行。这条指令我们在上节课中 已讲到,不再重复。 第二条指令则和第一条指令相反,即如果 CY=0就转移,不等于0就次序执行,当然,我们也 同样理解: JNC 标号 判位变量转移指令 JB bit,rel JNB bit,rel 第一条指令是如果指定的 bit 位中的值是1,则转移,不然次序执行。同样,我们能这样理 解这条指令:JB bit,标号 第二条指令请大家先自行分析 下面我们举个例程说明: ORG 0000H LJMP START ORG 30H START:MOV SP,#5FH MOV P1,#0FFH MOV P3,#0FFH L1: JNB P3.2,L2 ;P3.2上接有一只按钮,它按下时,P3.2=0 JNB P3.3,L3 ;P3.3上接有一只按钮,它按下时,P3.3=0 LJM P L1 L2: MOV P1,#00H
推荐使用慧净 51 实验板。推荐 51 学习网 淘宝网:/
51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28 课)
MOV P1.0,CY ;将 P1.0的状态送给 CY。 位修正指令 位清0指令 CLR C ;使 CY=0 CLR bit ;使指令的位地址等于0。例:CLR P1.0 ;即使 P1.0变为0 位置1指令 SETB C ;使 CY=1 SETB bit ;使指定的位地址等于1。例:SETB P1.0 ;使 P.0变为1 位取反指令 CPL C ;使 CY 等于原来的相反的值,由1变为0,由0变为1。 CPL bit ;使指定的位的值等于原来相反的值,由0变为1,由1变为0。 例:CPL P1.0 以我们做过的实验为例,如果原来灯是亮的,则执行本指令后灯灭,反之原来灯是灭的,执 行本指令后灯亮。 位逻辑运算指令 位与指令 ANL C,bit ;CY 与指定的位地址的值相与,结果送回 CY ANL C,/bit ;先将指定的位地址中的值取出后取反,再和 CY 相与,结果送回 CY,但注意, 指定的位地址中的值本身并不发生变化。 例:ANL C,/P1.0 设执行本指令前,CY=1,P1.0等于1(灯灭),则执行完本指令后 CY=0,而 P1.0也是等于1。 可用下列程序验证: ORG 0000H AJMP START ORG 30H START: MOV SP,#5FH MOV P1,#0FFH SETB C ANL C,/P1.0 MOV P1.1,C ;将做完的结果送 P1.1,结果应当是 P1.1上的灯亮,而 P1.0上的灯还是不亮

51单片机按键使用及注意事项

51单片机按键使用及注意事项

51单片机按键使用及注意事项如下:
1.按键工作原理:按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,开
关断开。

在开发板上使用的按键及内部简易图按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态,如果按键按下,初始导通状态变为断开,初始断开状态变为导通。

2.按键电路接法:上拉是为了让引脚默认是高电平,但是上拉的力量扛不住接地,所以按键没有按
下时上拉的力量保证了IO引脚输入为1,而按下后绝对为0。

3.按键抖动:通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械点的弹性
作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。

抖动时间的长短由按键的机械特性决定的,一般为5ms到10ms。

4.按键消抖:有两种方式,一种是硬件消抖,另一种是软件消抖。

5.注意事项:CPU通过监测按键连接的IO引脚的电平输入是1还是0来得知外部有没有人按下
这个按键。

CPU在按键被按下的一瞬间检测到的信号是很多次的忽高忽低的电平信号,这种信号是不稳定
的。

因此,需要使用按键消抖的算法使单片机获取到正常稳定的信号。

总的来说,51单片机按键使用需要注意按键的电路接法、抖动以及消抖等问题。

在使用过程中,需要遵循相应的原理和注意事项,以确保按键的正常工作。

51单片机位及位操作指令

51单片机位及位操作指令

51 单片机位及位操作指令
我们已经习惯了位一位就是一盏灯的亮和灭,而我们学的指令却全都是用字节来介绍的:字节的移动、加法、减法、逻辑运算、移位等等。

用字节来处理一些数学问题,比如说:控制冰箱的温度、电视的音量等等很直观,可以直接用数值来表在。

可是如果用它来控制一些开关的打开和合上,灯的亮和灭,就有些不直接了?我们知道送往P1 口的数值后并不能马上知道哪个灯亮和来灭,而是要化成二进制才知道。

工业中有很多场合需要处理这类开关输出,继电器吸合,用字节来处理就显示有些麻烦,所以在8051 单片机中特意引入一个位处理机制。

位寻址区
在8051 中,有一部份RAM 和一部份SFR 是具有位寻址功能的,也就是说这些RAM 的每一个位都有自已的地址,可以直接用这个地址来对此进行操作。

内部RAM 的20H-2FH 这16 个字节,就是8031 的位寻址区。

看图1。

可见这里面的每一个RAM 中的每个位我们都可能直接用位地址来找到它们,
而不必用字节地址,然后再用逻辑指令的方式。

可以位寻址的特殊功能寄存器
8031 中有一些SFR 是可以进行位寻址的,这些SFR 的特点是其字节地址。

mcs51单片机位操作指令及编程举例

mcs51单片机位操作指令及编程举例

mcs51单片机位操作指令及编程举例MCS-51 单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集。

在进行位处理时,CY(就是我们前面讲的进位位)称位累加器。

有自已的位RAM,也就是我们刚讲的内部RAM 的20H-2FH 这16 个字节单元即128 个位单元,还有自已的位I/O 空间(即P0.0..P0.7,P1.0.P1.7,P2.0..P2.7,P3.0..P3.7)。

当然在物理实体上它们与原来的以字节寻址用的RAM,及端口是完全相同的,或者说这些RAM 及端口都能有两种使用办法。

(1)位传送指令MOV C,BITMOV BIT,C 这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。

例:MOV P1.0,CY ;将CY中的状态送到P1.0 管脚上去(如果是做算术运算,我们就能通过观察知道现在CY 是多少啦)。

MOV P1.0,CY ;将P1.0 的状态送给CY。

(2)位修正指令位清0 指令CLR C ;使CY=0CLR bit ;使指令的位地址等于0。

例:CLR P1.0 ;即使P1.0 变为0 位置1 指令SETB C ;使CY=1SETB bit ;使指定的位地址等于1。

例:SETB P1.0 ;使P.0 变为1 位取反指令CPL C ;使CY 等于原来的相反的值,由1 变为0,由0 变为1。

CPL bit ;使指定的位的值等于原来相反的值,由0 变为1,由1 变为0。

例:CPL P1.0 以我们做过的实验为例,如果原来灯是亮的,则执行本指令后灯灭,反之原来灯是灭的,执行本指令后灯亮。

(3)位逻辑运算指令位与指令ANL C,bit ;CY 与指定的位地址的值相与,结果送回CYANL C,/bit ;先将指定的位地址中的值取出后取反,再和CY 相与,结果送回CY,但注意,指定的位地址中的值本身并不发生变化。

例:ANL C,/P1.0 设执行本指令前,CY=1,P1.0 等于1(灯灭),则执行完本指令后CY=0,而P1.0 也是等于1。

51单片机io口的用法

51单片机io口的用法

51单片机io口的用法51单片机是一种经典的单片机系列,广泛应用于各种嵌入式系统中。

其IO口是单片机最基本的输入输出功能,可以用来连接外部设备和实现与外界的交互。

本文将介绍51单片机IO口的用法,并提供相关参考内容,帮助读者更好地理解和应用。

一、51单片机IO口简介51单片机的IO口是通过P0、P1、P2、P3四个寄存器来控制的。

其中P0口为8位双向I/O口,P1、P2、P3口为8位I/O 口,可以通过配置将其设置为输入(IN)或输出(OUT)模式。

在51单片机中,IO口的状态(高电平或低电平)决定了其在电路中的功能。

二、IO口的输入模式通过将IO口设置为输入模式,可以实现对外部信号的读取。

以下是51单片机IO口输入模式的几种常见应用:1. 按键输入:通过将IO口与按键连接,读取按键的状态(按下或松开)。

2. 传感器输入:通过将IO口与传感器连接,读取传感器的输出信号,如光线强度、温度等。

3. 外部信号输入:通过将IO口与其他设备连接,读取外部设备的状态或数据。

在使用IO口作为输入时,需要设置对应端口的引脚为输入模式,并读取相应寄存器的值进行判断。

三、IO口的输出模式通过将IO口设置为输出模式,可以实现对外部设备的控制。

以下是51单片机IO口输出模式的几种常见应用:1. LED显示:通过将IO口与LED连接,控制LED的闪烁、亮灭。

2. 电机驱动:通过将IO口与电机驱动芯片连接,控制电机的转动方向、速度。

3. 继电器控制:通过将IO口与继电器连接,控制继电器的开关状态。

在使用IO口作为输出时,需要设置对应端口的引脚为输出模式,并将相应寄存器的值设置为高电平或低电平。

四、IO口的控制方法有两种常见的方式可以控制51单片机的IO口:位操作和寄存器读写。

1. 位操作:通过对相应寄存器的位进行操作来控制IO口的状态。

例如,要将P1口的第0位设置为高电平,可以使用以下代码:P1_0 = 1;要将P1口的第1位设置为低电平,可以使用以下代码:P1_1 = 0;2. 寄存器读写:通过读写相应寄存器的值来控制IO口的状态。

51单片机或命令的用法

51单片机或命令的用法

51单片机或命令的用法51单片机是一种常见的微控制器,广泛应用于各种嵌入式系统中。

以下是51单片机常用指令的用法:1、数据传输指令数据传输指令主要用于在寄存器、内存单元和输入/输出端口之间进行数据传输。

MOV:将源操作数传送到目标操作数。

MOV A, #data:将8位立即数data传送到累加器A中。

MOV R0, R2:将寄存器R2的值传送到寄存器R0中。

MOV @R0, A:将累加器A的值传送到R0所指定的存储单元中。

MOV DPTR, #data:将16位立即数data传送到数据指针DPTR寄存器中。

2、算术指令算术指令主要用于对两个操作数进行算术运算,并将结果存储在目标操作数中。

ADD:将两个操作数相加,并将结果存储在目标操作数中。

ADD A, R1:将累加器A与R1的值相加,将结果存入累加器A中。

ADD A, #data:将累加器A与8位立即数data相加,将结果存入累加器A中。

ADDC:在相加时,将进位标志位C的状态自动加到结果的最低有效位上。

ADDC A, R2:将累加器A与R2的值以及进位标志位C相加,将结果存入累加器A中。

3、控制转移指令控制转移指令主要用于实现程序的跳转和流程控制。

AJMP:无条件跳转到指定地址。

LJMP:长跳转到指定地址。

SJMP:短跳转到指定地址。

4、位操作指令位操作指令主要用于对单个位进行操作。

SETB:设置位。

CLR:清除位。

CPL:取反位。

:定时器是51单片机中的一个重要模块,它可以用来产生精确的定时/计数功能,常用于测量时间间隔或者产生定时中断。

51单片机的定时器有三种工作模式:模式0(工作方式1):当m1,m2设置成0,0时,定时器/计数器就工作在方式0,工作方式0是一种13位定时器/计数器方式,可用来测量外信号的脉冲宽度所持续的时间。

模式1(工作方式2):工作方式1为16位定时器/计数其结构和操作与工作方式0基本相同,唯一的区别是工作方式1的计数器由tl0的8位和th0的8位共同组成16位的计数器,其定时时间为:t=(2^16-t0初值)×时钟周期×12 。

常见51单片机指令及详解

常见51单片机指令及详解

常见51单片机指令及详解数据传递类指令(1)以累加器为目的操作数的指令MOV A,RnMOV A,directMOV A,@RiMOV A,#data第一条指令中,Rn代表的是R0-R7。

第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的。

第四条指令是将立即数data送到A中。

下面我们通过一些例子加以说明:MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。

MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。

MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。

如执行命令前R1中的值为20H,则是将20H单元中的值送入A中。

MOV A,#34H ;将立即数34H送入A中,执行完本条指令后,A中的值是34H。

(2)以寄存器Rn为目的操作的指令MOV Rn,AMOV Rn,directMOV Rn,#data这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。

(3)以直接地址为目的操作数的指令MOV direct,A 例: MOV 20H,AMOV direct,Rn MOV 20H,R1MOV direct1,direct2 MOV 20H,30HMOV direct,@Ri MOV 20H,@R1MOV direct,#data MOV 20H,#34H(4)以间接地址为目的操作数的指令MOV @Ri,A 例:MOV @R0,AMOV @Ri,direct MOV @R1,20HMOV @Ri,#data MOV @R0,#34H(5)十六位数的传递指令MOV DPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。

其中高8位送入DPH,低8位送入DPL。

例:MOV DPTR,#1234H,则执行完了之后DPH中的值为12H,DPL中的值为34H。

51单片机数学运算

51单片机数学运算

51单片机数学运算51单片机是一种常用的微控制器,具有广泛的应用领域。

在数学运算方面,51单片机可以进行基本的算术运算、逻辑运算和位运算等。

本文将介绍51单片机在数学运算方面的应用。

一、算术运算51单片机可以进行加法、减法、乘法和除法等基本的算术运算。

通过使用相关的指令,可以将数值存储在寄存器中,并进行各种算术运算。

例如,可以使用ADD指令将两个数相加,并将结果保存在某个寄存器中。

类似地,可以使用SUB指令进行减法运算,MUL指令进行乘法运算,DIV指令进行除法运算。

二、逻辑运算51单片机可以进行与、或、非和异或等逻辑运算。

逻辑运算常用于判断条件、控制程序流程和实现逻辑控制等。

通过使用相关的指令,可以将两个数进行逻辑运算,并根据结果进行相应的处理。

例如,可以使用AND指令进行与运算,OR指令进行或运算,NOT指令进行非运算,XOR指令进行异或运算。

三、位运算51单片机可以进行位移、与、或、非和异或等位运算。

位运算常用于处理二进制数据和位控制等。

通过使用相关的指令,可以对数据进行位运算,并根据需要进行相应的处理。

例如,可以使用MOV指令将数据移动到某个寄存器中,使用AND指令进行与运算,使用OR指令进行或运算,使用NOT指令进行非运算,使用XOR指令进行异或运算。

四、数值转换51单片机可以进行十进制和二进制、十六进制之间的转换。

通过使用相关的指令和算法,可以将不同进制的数值进行转换,并进行相应的处理。

例如,可以使用MOV指令将十进制数值转换为二进制或十六进制数值,使用CLR指令清除数据,使用INC指令增加数据,使用DEC指令减少数据。

五、数学函数除了基本的算术运算和逻辑运算,51单片机还可以进行一些常用的数学函数计算。

通过使用相关的库函数和算法,可以进行数值的平方、开方、对数、三角函数等计算。

例如,可以使用库函数sqrt计算一个数的平方根,使用库函数log计算一个数的自然对数,使用库函数sin计算一个角度的正弦值。

51单片机位操作指令

51单片机位操作指令

51单片机位操作指令51单片机是一种非常常见的嵌入式微控制器,它具有强大的处理能力和广泛的应用领域。

位操作指令是51单片机编程中非常重要的一部分,它们可以直接对单片机的位进行操作,极大地提高了编程的灵活性和效率。

本文将按照不同的类型介绍51单片机的位操作指令。

一、逻辑位操作指令逻辑位操作指令主要用于逻辑运算,包括与、或、非和异或等操作。

其中,与操作用于将两个操作位逻辑相与,结果为1时置位;或操作用于将两个操作位逻辑相或,结果为1时置位;非操作用于将操作位取反,0变1,1变0;异或操作用于两个操作位逻辑相异时置位。

以与操作指令为例,其指令格式如下:ANL A, operand其中,A为累加器,operand为操作数。

执行这条指令后,累加器A的每一位与操作数operand的对应位进行逻辑与运算,结果为1时,对应位置位。

二、移位位操作指令移位位操作指令用于对操作位进行移位操作,包括循环左移、循环右移、逻辑左移和逻辑右移等。

移位操作可以将二进制数向高位或低位移动一位或多位。

以循环左移指令为例,其指令格式如下:RL A执行这条指令后,累加器A的每一位向左循环移动一位,最高位移到最低位,最低位移到次低位,以此类推。

三、组合位操作指令组合位操作指令可以对多个操作位进行组合操作,包括从一个整数中选择一个位、将选择的位放入目标位置、将目标位置的内容置位、将目标位置的内容清零等操作。

组合位操作指令可以灵活地对位进行选择和设置。

以选择位指令为例,其指令格式如下:B0 mov a, @r0执行这条指令后,将r0所指向的存储单元中的内容,也就是一个8位整数,移到累加器A,并且只取第0位的值。

这样就可以根据需要选取整数的某一个位进行操作。

四、控制位操作指令控制位操作指令主要用于控制操作位的状态,包括置位、清零、翻转和测试等操作。

通过对操作位的状态进行控制,可以实现对系统的控制和管理。

以测试位指令为例,其指令格式如下:JNB bit, addr执行这条指令后,如果bit位为0,则跳转到地址addr处继续执行程序。

单片机位操作的逻辑运算详解

单片机位操作的逻辑运算详解

单片机位操作的逻辑运算详解从51单片机转到其他的芯片时,总会遇到一个非常郁闷的问题,就是其他芯片有的也许没有位操作。

所以最大的问题就是通过逻辑操作来改变一个字节的某个位。

于是在这里总结一下关于位操作的一些表达式。

首先,对一个字节,8位也好,16位也好,32位也好,只有两种操作,一种叫置位,一种叫清零。

先从置位说起。

置位可以对全部位进行操作,也可以对某个位进行操作。

全部操作很简单直接赋值就ok了。

我们假设一个无符号字符型uchar为8位。

且最低位为0,也就是说0-7位,而不是1-8位,那么改变值的状态只需要直接等于就ok了uchar a=0;a=0xfe;这样的话,就让a的低1-7位置1,a的0位不变但这样做有一个问题,我每次改变数值时,还要先打开计算器,然后设置到2进制功能,然后要把我要选择的位输入进去,比如100,然后按16进制功能。

然后计算器显示4。

我觉得这样很麻烦。

咋办呢,结果前辈们就想出了一个法子。

通过位移的方法改变一个为,就变成了这样uchar a=0;a = (1<<5);这样做的话,就把a的第6位(注意是第6为不是第5位,因为数据最低位是0,而不是1,因为我总是搞混,所以也告诫大家,小心着方面的错误,如果搞混,你的数据有可能出错)置1。

那么a的值用2进制表示的话那就是00100000b,那么可能又会有人问,如果我想把第2和第3位置1怎么办呢?那么你可以这样uchar a=0;a = (3<<1);这样做的意思是将二进制(11)位移到第二位的地方。

那么第二位,是第一个1,第三位是第二个1。

同理假如让第3位和低5位为1,第4位为0,怎么办。

uchar a=0;a = (5<<2);这样就可以实现101位移到第3位了,以上,基本是置位的大概操作了,当然这只是一次性的。

也就是说,如果我希望1次只操作一个位,比如当a=00000001b时,我希望a的第二位也置1,且第一位仍然保持1,怎么办呢?那也有办法,可以采用与操作。

51单片机位操作

51单片机位操作

C51单片机位操作方法[日期:2010-10-21 ] [来源:本站原创作者:佚名] [字体:大中小] (投递新闻)C51对位的操控能力是非常强大的。

从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。

这也是在各个领域中都可以看到C的重要原因。

在这一节中将详细讲解C51中的位操作及其应用。

1、位运算符C51提供了几种位操作符,如下表所示:运算符含义运算符含义&按位与~取反|按位或<<左移^按位异或>>右移1)“按位与”运算符(&)参加运算的两个数据,按二进位进行“与”运算。

原则是全1为1,有0为0,即:0&0=0; 0&1=0; 1&0=0; 1&1=1;如下例:a=5&3; //a=(0b 0101) & (0b 0011) =0b 0001 =1那么如果参加运算的两个数为负数,又该如何算呢?会以其补码形式表示的二进制数来进行与运算。

a=-5&-3; //a=(0b 1011) & (0b1101) =0b 1001 =-7在实际的应用中与操作经常被用于实现特定的功能:1.清零“按位与”通常被用来使变量中的某一位清零。

如下例:a=0xfe; //a=0b 11111110a=a&0x55;//使变量a的第1位、第3位、第5位、第7位清零a= 0b 01010100 2.检测位要知道一个变量中某一位是‘1’还是‘0’,可以使用与操作来实现。

a=0xf5; //a=0b 11110101result=a&0x08; //检测a的第三位,result=03.保留变量的某一位要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。

a=0x55; //a=0b 01010101a=a&0x0f; //将高四位清零,而保留低四位a=0x052)“按位或”运算符(|)参与或操作的两个位,只要有一个为‘1’,则结果为‘1’。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C51单片机位操作方法[日期:2010-10-21 ] [来源:本站原创作者:佚名] [字体:大中小] (投递新闻)C51对位的操控能力是非常强大的。

从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。

这也是在各个领域中都可以看到C的重要原因。

在这一节中将详细讲解C51中的位操作及其应用。

1、位运算符C51提供了几种位操作符,如下表所示:运算符含义运算符含义&按位与~取反|按位或<<左移^按位异或>>右移1)“按位与”运算符(&)参加运算的两个数据,按二进位进行“与”运算。

原则是全1为1,有0为0,即:0&0=0; 0&1=0; 1&0=0; 1&1=1;如下例:a=5&3; //a=(0b 0101) & (0b 0011) =0b 0001 =1那么如果参加运算的两个数为负数,又该如何算呢?会以其补码形式表示的二进制数来进行与运算。

a=-5&-3; //a=(0b 1011) & (0b1101) =0b 1001 =-7在实际的应用中与操作经常被用于实现特定的功能:1.清零“按位与”通常被用来使变量中的某一位清零。

如下例:a=0xfe; //a=0b 11111110a=a&0x55;//使变量a的第1位、第3位、第5位、第7位清零a= 0b 01010100 2.检测位要知道一个变量中某一位是‘1’还是‘0’,可以使用与操作来实现。

a=0xf5; //a=0b 11110101result=a&0x08; //检测a的第三位,result=03.保留变量的某一位要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。

a=0x55; //a=0b 01010101a=a&0x0f; //将高四位清零,而保留低四位a=0x052)“按位或”运算符(|)参与或操作的两个位,只要有一个为‘1’,则结果为‘1’。

即有‘1’为‘1’,全‘0’为‘0’。

0|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=0x7f3)“异或”运算符(^)异或运算符^又被称为XOR运算符。

当参与运算的两个位相同(‘1’与‘1’或‘0’与‘0’)时结果为‘0’。

不同时为‘1’。

即相同为0,不同为1。

0^0=0; 0^1=1; 1^0=1;1^1=0;例如:a=0x55^0x3f; //a=(0b01010101)^(0b00111111)=(0b01101010)=0x6a 异或运算主要有以下几种应用:1.翻转某一位当一个位与‘1’作异或运算时结果就为此位翻转后的值。

如下例:a=0x35; //a=0b00110101a=a^0x0f; //a=0b00111010 a的低四位翻转关于异或的这一作用,有一个典型的应用,即取浮点的相反数,具体的实现如下:f=1.23; //f为浮点型变量值为1.23f=f*-1; //f乘以-1,实现取其相反数,要进行一次乘运算f=1.23;((unsigned char *)&f)[0]^=0x80; //将浮点数f的符号位进行翻转实现取相反数2.保留原值当一个位与‘0’作异或运算时,结果就为此位的值。

如下例:a=0xff; //a=0b11111111a=a^0x0f; //a=0b11110000 与0x0f作异或,高四位不变,低四位翻转3.交换两个变量的值,而不用临时变量要交换两个变量的值,传统的方法都需要一个临时变量。

实现如下:void swap(unsigned char *pa,unsigned char *pb){unsigned char temp=*pa;//定义临时变量,将pa指向的变量值赋给它*pa=*pb;*pb=temp;//变量值对调}而使用异或的方法来实现,就可以不用临时变量,如下:void swap_xor(unsigned 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=0b000000001.对小于0的有符号整型变量取相反数d=-1;//d为有符号整型变量,赋值为-1,内存表示为0b 11111111 11111111d=~d+1; //取d的相反数,d=1,内存表示0b 00000000 00000001此例运用了负整型数在内存以补码方式来存储的这一原理来实现的。

负数的补码方式是这样的:负数的绝对值的内存表示取反加1,就为此负数的内存表示。

如-23如果为八位有符号整型数,则其绝对值23的内存表示为0b00010111,对其取反则为0b11101000,再加1为0b11101001,即为0XE9,与Keil仿真结果是相吻合的:2.增强可移植性关于“增强可移植性”用以下实例来讲解:假如在一种单片机中unsigned char类型是八个位(1个字节),那么一个此类型的变量a=0x67,对其最低位清零。

则可以用以下方法:a=0x67; //a=0b 0110 0111a=a&0xfe; //a=0b 0110 0110上面的程序似乎没有什么问题,使用0xfe这一因子就可以实现一个unsigned char型的变量最低位清零。

但如果在另一种单片机中的unsigned char类型被定义为16个位(两个字节),那么这种方法就会出错,如下:b=0x6767; //假设b为另一种单片机中的unsigned char 类型变量,值为0b 0110 0111 0110 0111b=b&0xfe; //如果此时因子仍为0xfe的话,则结果就为0b 00000000 0110 0110 即0x0066,而与0x6766不相吻合上例中的问题就是因为不同环境中的数据类型差异所造成的,即程序的可移植性不好。

对于这种情况可以采用如下方法来解决:a=0x67; //a=0b 0110 0111a=a&~1; //在不同的环境中~1将自动匹配运算因子,实现最后一位清零a=0x66 其中~1为0b 11111110b=0x6767; //a=0b 0110 0111 0110 0111b=a&~1; //~1=0b 1111 1111 1111 1110,b=0b 0110 0111 01100110 ,即0x67665)左移运算符(<<)左移运算符用来将一个数的各位全部向左移若干位。

如:a=a<<2表示将a的各位左移2位,右边补0。

如果a=34(0x22或0b00100010),左移2位得0b10001000,即十进制的136。

高位在左移后溢出,不起作用。

从上例可以看到,a被左移2位后,由34变为了136,是原来的4倍。

而如果左移1位,就为0b01000100,即十进制的68,是原来的2倍,很显然,左移N位,就等于乘以了2N。

但一结论只适用于左移时被溢出的高位中不包含‘1’的情况。

比如:a=64; //a=0b 0100 0000a=a<<2; //a=0b 0000 0000其实可以这样来想,a为unsigned char型变量,值为64,左移2位后等于乘以了4,即64X4=256,而此种类型的变量在表达256时,就成为了0x00,产生了一个进位,即溢出了一个‘1’。

在作乘以2N这种操作时,如果使用左移,将比用乘法快得多。

因此在程序中适应的使用左移,可以提高程序的运行效率。

6)右移运算符右移与左移相类似,只是位移的方向不同。

如:a=a>>1表示将a的各位向右移动1位。

与左移相对应的,左移一位就相当于除以2,右移N位,就相当于除以2N。

在右移的过程中,要注意的一个地方就是符号位问题。

对于无符号数右移时左边高位移和‘0’。

对于有符号数来说,如果原来符号位为‘0’,则左边高位为移入‘0’,而如果符号位为‘1’,则左边移入‘0’还是‘1’就要看实际的编译器了,移入‘0’的称为“逻辑右移”,移入‘1’的称为“算术右移”。

Keil中采用“算术右移”的方式来进行编译。

如下:d=-32; //d为有符号整型变量,值为-32,内存表示为0b 11100000d=d>>1;//右移一位d为0b 11110000 即-16,Keil采用"算术逻辑"进行编译7)位运算赋值运算符在对一个变量进行了位操作中,要将其结果再赋给该变量,就可以使用位运算赋值运算符。

位运算赋值运算符如下:&=, |=,^=,~=,<<=, >>=例如:a&=b相当于a=a&b,a>>=2相当于a>>=2。

8)不同长度的数据进行位运算如果参与运算的两个数据的长度不同时,如a为char型,b为int型,则编译器会将二者按右端补齐。

如果a为正数,则会在左边补满‘0’。

若a为负数,左边补满‘1’。

如果a为无符号整型,则左边会添满‘0’。

a=0x00; //a=0b 00000000d=0xffff; //d=0b 11111111 11111111d&=a; //a为无符号型,左边添0,补齐为0b 00000000 00000000,d=0b 00000000 00000000。

相关文档
最新文档