技术文档

单片机求余 自学单片机第十四篇下:运算方法

小编 2024-11-25 技术文档 23 0

自学单片机第十四篇下:运算方法

​关注一下,更多精彩等着你!

在程序的运行中,我们需要经常的操作端口状态,或者需要进行端口数据的转换和计算,还有的我们程序内部也会涉及大量的计算,在单片机中,有一套与我们数学计算中不太一样的计算方法,之前我们就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。

当然还有很多的运算方法,我们先介绍这几个,接下来的程序中会使用到,如果有什么疑问可以返回这篇文章查看一下,当然,要是有更好的建议或想法,欢迎留言或私信给我。

更多多内容,欢迎关注百家号:小亮谈电气。微信公众号:电气学苑。

单片机中各种周期的关系与定时器原理

时钟周期:

时钟周期也叫振荡周期或晶振周期,即晶振的单位时间发出的脉冲数,一般有外部的振晶产生,比如12MHZ=12×10的6次方,即每秒发出12000000个脉冲信号,那么发出一个脉冲的时间就是时钟周期,也就是1/12微秒。通常也叫做系统时钟周期。是计算机中最基本的、最小的时间单位。

在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。

机器周期:

在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。

在标准的51单片机中,一般情况下,一个机器周期等于12个时钟周期,也就是机器周期=12*时钟周期,(上面讲到的原因)如果是12MHZ,那么机器周期=1微秒。单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。

机器周期不仅对于指令执行有着重要的意义,而且机器周期也是单片机定时器和计数器的时间基准。例如一个单片机选择了12MHZ晶振,那么当定时器的数值加1时,实际经过的时间就是1us,这就是单片机的定时原理。

但是在8051F310中,CIP-51 微控制器内核采用流水线结构,与标准的 8051 结构相比指令执行速度有很大的提高。在一个标准的 8051 中,除 MUL和 DIV以外所有指令都需要 12 或 24 个系统时钟周期,最大系统时钟频率为 12-24MHz。而对于 CIP-51 内核,70%的指令的执行时间为 1或2个系统时钟周期,只有 4 条指令的执行时间大于 4 个系统时钟周期。 所以在计算定时器的值时要注意这里的变化。

指令周期:

指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

系统时钟:

系统时钟:系统时钟就是CPU指令运行的频率,这个才是CPU真正的频率。

单片机内部所有工作,都是基于由晶振产生的同一个触发信号源,由这个信号来同步协调工作步骤,我们把这个信号称为系统时钟,系统时钟一般由晶振产生,但在单片机内部系统时钟不一定等于晶振频率,有可能小于晶振频率,也有可能大于晶振频率,具体是多少由单片机内部结构决定,正常情况和晶振频率会存在一个整数倍关系。系统时种是整个单片机工作节奏的基准,它每振荡一次,单片机就被触发执行一次操作。

一般来说,单片机只有一个时钟源.用了外部晶振,就不用内部RC,用了内部RC,就不用外部晶振.振荡器振荡,产生周期波.单片机在这样的周期波的作用一下有规律的一拍一拍的工作,波的频率越高,单片工作得就越快,波的频率越低,单片机工作得就越慢。

有了以上的概念以后,就可以正确的理解定时器的工作原理了,在8051F310单片机中,有3个定时器,如果定时器1工作在模式1下,如工作模式1下,是16位的计时器,最大数值是65535,当再加1时(=65536),就会发生溢出,产生中断,所以如果我们要它计1000个数, 那么定时初值就是65536-1000,结果就是64536,这个值送给TH、TL,因为是16进制的,所以高位是64536/256取商,低位是64536%6取余。

再者,就是每一计数的时间是多久?一般我们取12M晶振时,一个周期刚好是1us,计数1000个就是1ms,这是因为标准的51单片机是12时钟周期的(STC有6时钟和1时钟方式)。那么,如果我们晶振是12M,就比较好算,如果是其它的,就用12去除好了。比如是6M的,那么就是12/6=2,每个计数是2us,那么你要定时1ms就只要计数500个即可以。

定时器的初值跟定时器的工作方式,跟晶振频率都有关系。一个机器周期Tcy=晶振频率X12,计数次数N=定时时间t/机器周期Tcy,那么初值就X=65536-N,得出的数化成十六进制就行了。这里是用定时器O工作方式1做例子,如果是其它工作方式,就不能是65535了。工作方式0是8192,方式2,3是256。这里有一个公式:

TH=(65536-time/(12/ft))/256

其中,time就是要延时的100ms(要取100000us),ft是晶振频率。这个式子又可以简化成TH=(65536-time*ft/12)/256

TL=(65536-time*ft/12)%6

在一本书上还看到了这样计算定时初值的:

TH0=-(50235/256); //重装100ms定时初值

TL0=-(50235%6); ///这里使用的6M晶体,

这里是6M晶体,延时100ms,那么按上面讲的原理,6M是每个计数为2us,100ms定时就是计数50000个。

那么,定时器初值要 65536-50000=15536,转成16进是3CB0。这就是要送给TH(=3C) 和TL(=B0)的值。

程序中写 TH0=-(50235/256);其实它是这样的TH0=0x100-(50235/256); 在51中,取负数,其结果就是它的值取反+1,也可以用0x100(十进制的256)去减,结果是多少呢?结果就是3C

相关问答

单片机 除法指令计算公式?

单片机除法指令的计算公式如下:结果寄存器(quotient)=被除数寄存器(numerator)/除数寄存器(denominator)其中,被除数寄存器存储被除数的值,除数寄存...单...

如何解决51 单片机求余 速度慢的问题?

STC公司目前有很多单周期的51单片机(类似于AVR单片机),它可以明显的提升系统的运行速度,当然在单片机支持的晶振范围内,尽量选择频率较高的晶振也能提升系统...

单片机 TH0=(65535-1000)/256H0=(65535-1000)/256,意思为655...

[最佳回答]一个字节是8个位,能表示的数字范围是0~255TH0和TL0合起来表示一个16位数,TH0是高八位,TL0是低八位。获取一个16位数的高八位,方法就是除以256,获取...

单片机 中数制与数制的转换是怎样实现的? ?

单片机中数制与数制的转换是怎样实现的??关于数制之间的转换,其实在数字电路的书中会讲到,也很容易理解。在我们生活中,十进制经常被我们用到:数字0,1,2,3...

单片机 中0x08代表什么意思呢尤其是其中?

简单点说吧+-*/加减乘除是常用的运算,在计算机中还有%取余,也就是计算余数Num就是计算Num/10后的余数,相当于计算个位数,除此之外还有按位的计算,比如&(与),|...

单片机 的特点及应用?

基本特点如下:1、芯片虽小,五脏俱全,是单片机主要特点之一。其内部设有程序存储器、数据存储器、各种接口电路。而大型的处理器运算速度较高,运算器位数较多...

单片机 vpp全称是什么?

Vpp是一个符号,是指交流或脉冲信号的最低值到最高值的电压,也称峰峰值。不同芯片对Vpp的定义稍有不同,比如电压峰峰值,单片机中Vpp多数定义为编程电压。在示...

福建漳州业余大学是什么学校?

漳州电大、漳州夜大、漳州业余大学。福建省漳州业余大学现有校园面积14亩,校舍12114平方米。固定资产总值1000余万元,设备资产总值500余万元。拥有4间多媒体...

池州学院数学与计算机学院怎么样?设有哪些专业? 申请方

[回答]兼职、特聘、返聘)76人,其中教授3人,副教授20人,博士(含在读)12人,硕士(含在读)63人。教师中获陈香梅教育奖1人,省级模范教师称号1人,省级...教师...

4/3在c 语言是什么意思?

4/3在c语言是只四除以三取整除结果整数。a=4/3的意思是4整除3,得到整数值为1,未整除的舍弃,不四舍五入b=4%3的意思是4整除3后,取未整除的余数,比如4%...

猜你喜欢