自学单片机第十四篇下:运算方法
关注一下,更多精彩等着你!
在程序的运行中,我们需要经常的操作端口状态,或者需要进行端口数据的转换和计算,还有的我们程序内部也会涉及大量的计算,在单片机中,有一套与我们数学计算中不太一样的计算方法,之前我们就C语音做过简单的介绍,今天,就编程中的运算方法,我们进行简单的复习和运用练习。
1,《+》加
这个是加号,跟数学的+号,含义一样,运用方法也是一样的。都是两个加数相加得出一个结果,这个结果就是两个数的和。
例如:1+1=2。
2,《++》连加
这个是程序中比较常见的一种用法,含义是在原有数据的基础上加上1,属于累积加法的一种简写。就等同于x=x+1,简化书写,大家都明白其含义也就可以了。
例如:a=a+1,b++。
3,《-》减
这个就是同+一样的,一个数学运算,就是减法。
例如:2-1=1。
4,《--》连减
这个是连续减1,跟连续加1的使用方法一样。也是相当于x=x-1。属于简写。
例如:a=a-1,b--。
5,《*》乘法
同样是数学基本运算,运算法则与数学一致。
例如:4*5=20,c=a*4。
6,《/》整除
这个是除法,用法与数学一致,但有一点不同,这个运算符号,仅会对除得的结果整数部分进行保存,余数就会舍弃。相当于只取整数部分,小数部分就丢了。
例如:3/2=1.5(这是数学方法),3/2=1(这是程序结果)
因此在使用中应牢记,避免出现错误。如果我们需要用到小数部分,需要进行相应的处理才可以。不然直接得出的结果只有整数。而小数部分要靠下边的取余来解决。
7,《%》取余
由于除法在程序中无法获取小数部分,所以,我们增加了取余的算法,就是相当于把没除尽的数单独取出来。
例如:15%4=3。
15除以4,得到整数是3,因为3乘4是12,余下15减12等于3。所以余数就是3。
再比如:3%2=1,20%15=5。
如果我用《/》法得到了整数,那如何得到小数部分并显示呢?余数只是余下了多少,并不是小数。一般的,可以这么处理。
例如:
6/5=1是整数部分,保存为一个变量A,
6%5=1是余数部分,保存为一个变量B,
然后将B=B*10,扩大十倍,余数1就变成了10。
C=B/5,C中的数就是2=10/5,第一位小数就取出来了。
B=B%5。这样,B=10%5=0,就意味着除尽了。在显示时,整数放一块,小数放一块,中间用小数点隔开就可以了。
这就完成了小数的计算。
当然也有其它方法,这就是为了说明取余的用法。
8,《&》与
逻辑算法是处理数据位用的,在高中学的,与门或门非门等。与的意思是都要有,1与1等于1,1与0等于0,0与0等于0。
都为真才输出真,其一为假就是假。
例如:1010&1101=1000。
一般的可以用它来使某一位清零,比如原来有一个数1101,我想把它的第三位清零。就可以操作:
1101&1011=1001。
这样第三位清了,其它保持不变。假如此时第二位由0变成了1,在操作时,
1111&1011=1011。
第二位会随之变动,因为1与1为1,1与0为0,所以只有我们提供0去操作,才会出现改变。用1就不会改变。在后期端口操作时会用到。
9,《|》或
同样是基本逻辑运算,有其一为1,就为1,有其一为真,即是真。
1或1等于1,1或0等于0,0或0等于0。也就是说,任何结果只要和1或,就会输出1。
例如:1101|1010=1111。
一般的,可以用它来对某一位进行置1,用法与&基本相似。例如1000,我们将其第一位置1,就可以写成:
1000|0001=1001
如果此时第三位发生了变化,从0变成了1,写成1100,这时我们对第一位置1,写成:
1100|0001=1101
可以看出,对其他位没有影响,这就相当于我们可以对其中一位进行操作,而不用去定义单独的一位了。减少了程序的结构。
10,《!》非
在逻辑中,这是不的意思,例如与=号放一起!=,就是不等于的意思。
例如:a!=b。
就是说a的值与b不相等。用法简单。
11,《~》取反
也可以说是按位取反,就是把一个数据的每一位,0变成1,1变成0。
例如:~1001=0110
这个在我们使用中,可以用来对端口进行关闭或打开操作,或者对数据进行变换,传输中加密。
12,《<<》左移位
这是将一个数据组,最左边的一位移除,然后右边空出的一位用0补齐。
例如:1001<<1=0010,1010<<1=0100
当然也是可以一次移动多位,1010<<2=1000.
13,《>>》右移位
这个是跟左移位一样的,就是把最低位移除,最高位用0补齐。
14,《【】》数组
常用的函数方式,有时我们会使用一些数据组,如果单独去定义,就需要很多的变量名,于是我们就会采用数组的方式,把数据保存在数组中,使用时取出即可。也有一些是固定的数据,我们存储在数组中,使用时直接调用即可。
例如:led【5】={1,2,5,6,8}。
意思是一个叫led的数组中,有五个元素,分别是1,2,5,6,8.如果我们要取出某一个元素,就可以直接操作,a=led【2】,这里的2,相当于取出的是第三个元素5,【】括号中的数是元素的脚码,是从0开始的,【0】对应的是元素1,【1】对应的是元素2,【2】对应的是元素5,【3】对应的是元素6,【4】对应的是元素8。
当然还有很多的运算方法,我们先介绍这几个,接下来的程序中会使用到,如果有什么疑问可以返回这篇文章查看一下,当然,要是有更好的建议或想法,欢迎留言或私信给我。
更多多内容,欢迎关注百家号:小亮谈电气。微信公众号:电气学苑。
单片机中数的表示及运算
单片机中的数是以二进制表示的,分为有符号数和无符号数两种。
有符号数的表示方法
有符号数是指有“ + (正)”、“ − (负)”符号的数。由于单片机采用二进制数,所以只有“1 ”和“0”两种数字,其中用“ 0 ”表示“ + ”,用“ 1 ”表示“ − ” 。单片机中的数据一般只有8位,一般规定最高位为符号位,因为要用1位表示数的符号,所以只有7位用来表示数值,可以表示− 127~+128。
有符号数的表示方法有 3 种:原码、反码和补码。同一有符号数,用 3 种表示方法得到的数是不同的。下面用3种方法来表示两个有符号数+1011101和− 1011101。
(1)原码
用“1”表示“−”,用“0”表示“+”,其他各数保持不变,采用这种方法表示出来的数称为原码。
+1011101用原码表示是01011101,可写成[01011101] 原。
− 1011101用原码表示是11011101,可写成[11011101] 原。
(2)反码
反码是在原码的基础上求得的。对于正的有符号数,其反码与原码相同;对于负的有符号数,其反码除符号位与原码相同外,其他各位数由原码各位数取反得到。
+1011101用反码表示是01011101,可写成[01011101] 反。
− 1011101用反码表示是10100010,可写成[10100010] 反。
(3)补码
补码是在反码的基础上求得的。对于正的有符号数,其补码与反码、原码相同;对于负的有符号数,其补码除符号位与反码一致外,其他数由反码加1得到。
+1011101用补码表示是01011101,可写成[01011101] 补。
− 1011101用补码表示是10100011,可写成[10100011] 补。
有符号数的运算
用原码表示有符号数简单、直观,但在单片机中,如果采用原码进行减法运算,需要很复杂的硬件电路;如果用补码,可以将减法运算变为加法运算,从而省去减法器而简化硬件电路。
例如:用二进制减法运算和补码加法运算分别计算35 − 21。
① 二进制减法运算:35 − 21=00100011 − 00010101=00001110
② 用补码加法运算。
先将算式转换成补码形式,35 − 21=[+35]+[ − 21]= [00100011] 原 +[10010101] 原 =[00100011] 反+ [11101010] 反 =[00100011] 补 +[11101011] 补。
再对补码进行二进制加法运算:
从上面的运算过程可以看出,补码的符号也参与运算,在8位单片机中,由于数据长度只能有8位,上式结果有9位,第9位会自然丢失,补码加法的运算结果与二进制减法的运算结果是一样的,都是00001110=14。
由此可见,用补码的形式进行运算,可以将减法运算转换为加法运算,运算结果仍是正确的,所以单片机普遍采用补码的形式表示有符号数。
无符号数的表示方法
无符号数因为不用符号位, 8 位全部用来表示数据,所以这种方法可以表示的数据范围是 0 ~ 255 。 8位二进制数的不同表示方式的换算关系见表1-6。
表1-6 8位二进制数的不同表示方式的换算关系
表1-6
续表
表1-6
从表1-6中可以看出,对于同一个二进制数,当采用不同的表示方式时,得到的数值是不同的,特别是大于10000000的有符号数。若想确切知道单片机中的二进制数所对应的十进制数是多少,先要了解该二进制数是有符号数还是无符号数,再换算出该二进制数对应的十进制数。
相关问答
﹠﹦~在 单片机的运算中 是什么意思怎么算如TA1CCTL0& =~再如...[最佳回答]由于处理器寄存器包含很多bit,每位有不同的意思,所以通常在操作这些寄存时某位时,需要不改变其他位,所以有如上做法:A&=B,将A值的B位清零A|=B...
51 单片机 orl是什么意思?ORL能将某些位置一,对于想置一的位与行“或”逻辑,对于想保持原来的位与0进行“或”逻辑。单片机也被称为单片微控器,属于一种集成式电路芯片。在单片机中主...
关于 单片机中 addc的 运算 ?您说的可能是汇编语言中“带进位加法”指令吧?它的含义是:做加法时,如果上文留下来有进位标志,则要多加1。在多字长的运算中,这是一个很常用的指令。例如...
DS18b20 中的 温度值 单片机 可以直接用来 运算 吗?比如我令温度值...[最佳回答]你令温度值DQ=P1.3,这是什么逻辑啊?你可以写y=DQ*3;但没有任何实际意义,因为y的值要么为0,要么就是3,无出其2,DQ只是18b20的一个IO借口而已,具体温...
单片机中的 除法指令如何 运算 ?在单片机中,除法指令通常使用算法来执行。这些算法可以是硬件实现的,也可以是软件实现的。硬件实现的算法通常使用移位和减法操作来进行除法运算。软件实现的...
单片机 cpl是什么?单片机cpl指汇编指令,是一个逻辑运算指令,是单片机中直接寻址位取反的指令,作用是将存储器的指定数据中的每一位转变为逻辑反的数据。CPL为单片机ConversePo...
单片机中 计算串行口的波特率时,根据波特率是公式计算,我总是...波特率的单位是:波特/秒,也就是一秒内接收到多少个字符,根据你单片机的晶振频率、机器周期设定波特率,也就是设定在定时器中的初值,此时为了精确,要...
想用 单片机 测量温度,热电阻温度计算公式为:T1=1/[ln(Rt / R)/B+1/T2],怎样用C语言表示此公式?C语言里面有专门的数学库函数,写的时候带上头文件#includeC语言里面有专门的数学库函数,写的时候带上头文件#include这里选用函数doublelog(doublex)返回的...
单片机 程序不懂。TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%6;//这个程序里面的256是什么?因为单片机TH0,TL0是2个8位的寄存器,最大256。而TMOD=0x01是定时器方式1,定时时间最多65536,要赋值直接运算的话还要算完在转换为16进制,在分成高8位和低8...
单片机中 计算串行口的波特率时,根据波特率是公式计算,我总是...波特率的单位是:波特/秒,也就是一秒内接收到多少个字符,根据你单片机的晶振频率、机器周期设定波特率,也就是设定在定时器中的初值,此时为了精确,要...