历史上的今天
返回首页

历史上的今天

今天是:2025年05月08日(星期四)

正在发生

2021年05月08日 | 8051单片机教程第十一课:算术运算类指令

2021-05-08 来源:eefocus

不带进位位的加法指令


ADDA,#DATA;例:ADDA,#10H


ADDA,direct;例:ADDA,10H


ADDA,Rn;例:ADDA,R7


ADDA,@Ri;例:ADDA,@R0


用途:将A中的值与其后面的值相加,最终结果否是回到A中。


例:MOVA,#30H


ADDA,#10H


则执行完本条指令后,A中的值为40H。


下面的题目自行练习


MOV34H,#10H


MOVR0,#13H


MOVA,34H


ADDA,R0


MOVR1,#34H


ADDA,@R1


带进位位的加法指令


ADDCA,Rn


ADDCA,direct


ADDCA,@Ri


ADDCA,#data


用途:将A中的值和其后面的值相加,并且加上进位位C中的值。


说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0-255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0-65535。如何合并呢?其实很简单,让我们看一个10进制数的例子:


66+78。


这两个数相加,我们根本不在意这的过程,但事实上我们是这样做的:先做6+8(低位),然后再做6+7,这是高位。做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们并没有意识到我们做了两次加法。之所以要分成两次来做,是因为这两个数超过了一位数所能表达的范置(0-9)。


在做低位时产生了进位,我们做的时候是在适当的位置点一下,然后在做高位加法是将这一点加进去。那么计算机中做16位加法时同样如此,先做低8位的,如果两数相加产生了进位,也要“点一下”做个标记,这个标记就是进位位C,在PSW中。在进行高位加法是将这个C加进去。例:1067H+10A0H,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是7,而1则到了PSW中的CY位了,换言之,CY就相当于是100H。然后再做10H+10H+CY,结果是21H,所以最终的结果是2107H。


带借位的减法指令


SUBBA,Rn


SUBBA,direct


SUBBA,@Ri


SUBBA,#data


设(每个H,(R2)=55H,CY=1,执行指令SUBBA,R2之后,A中的值为73H。


说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。


乘法指令


MULAB


此指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFFFFH(65535)时,0V置1(溢出),否则OV为0,而CY总是0。


例:(A)=4EH,(B)=5DH,执行指令


MULAB后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H。


除法指令


DIVAB


此指令的功能是将A中的8位无符号数除了B中的8位无符号数(A/B)。除法一般会出现小数,但计算机中可没法直接表达小数,它用的是我们小学生还没接触到小数时用的商和余数的概念,如13/5,其商是2,余数是3。除了以后,商放在A中,余数放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1。


加1指令


INCA


INCRn


INCdirect


INC@Ri


INCDPTR


用途很简单,就是将后面目标中的值加1。例:(A)=12H,(R0)=33H,(21H)=32H,(34H)=22H,DPTR=1234H。执行下面的指令:


INCA(A)=13H


INCR2(R0)=34H


INC21H(21H)=33H


INC@R0(34H)=23H


INCDPTR(DPTR)=1235H


后结果如上所示。


说明:从结果上看INCA和ADDA,#1差不多,但INCA是单字节,单周期指令,而ADD#1则是双字节,双周期指令,而且INCA不会影响PSW位,如(A)=0FFH,INCA后(A)=00H,而CY依然保持不变。如果是ADDA,#1,则(A)=00H,而CY一定是1。因此加1指令并不适合做加法,事实上它主要是用来做计数、地址增加等用途。另外,加法类指令都是以A为核心的,其中一个数必须放在A中,而运算结果也必须放在A中,而加1类指令的对象则广泛得多,可以是寄存器、内存地址、间址寻址的地址等等。


减1指令


减1指令


DECA


DECRN


DECdirect


DEC@Ri


与加1指令类似,就不多说了。


综合练习:


MOVA,#12H


MOVR0,#24H


MOV21H,#56H


ADDA,#12H


MOVDPTR,#4316H


ADDA,DPH


ADDA,R0


CLRC


SUBBA,DPL


SUBBA,#25H


INCA


SETBC


ADDCA,21H


INCR0


SUBBA,R0


MOV24H,#16H


CLRC


ADDA,@R0


先写出每步运行结果,然后将以上题目建入,并在软件仿真中运行,观察寄存器及有关单元的内容的变化,是否与自已的预想结果相同。


推荐阅读

史海拾趣

Crowd Supply公司的发展小趣事

近年来,电子行业面临着诸多挑战,如技术更新迅速、市场竞争激烈等。Crowd Supply作为行业的一员,也不可避免地受到了这些挑战的影响。然而,他们并没有因此而退缩,反而通过持续创新和优化平台服务来应对这些挑战。他们不断调整众筹策略,加强项目筛选和风险评估,以确保平台上项目的质量和成功率。同时,他们也积极寻求新的商业模式和合作机会,以拓展业务范围和提升盈利能力。

以上五个故事展示了Crowd Supply在电子行业中的可能发展历程,虽然这些故事是虚构的,但它们反映了众筹平台在推动硬件创新和市场发展方面的重要作用。通过不断创新和优化服务,Crowd Supply有望在未来继续发挥其在电子行业中的领导作用。

Crocus公司的发展小趣事

Crocus公司成立于XXXX年,是一家专注于先进隧道磁阻(TMR)传感器技术的研发与生产的企业。创立初期,公司面临着资金紧张、技术壁垒等重重困难。然而,凭借创始团队对TMR技术的深刻理解和坚定信念,Crocus逐渐在行业中崭露头角。他们不断投入研发,优化产品性能,为后续的快速发展奠定了坚实的基础。

A1 PROS公司的发展小趣事

在2006年至2007年期间,A1 PROS的技术实力得到了业界的广泛认可。韩国技术信用保证基金将A1 PROS评选为杰出技术公司,这是对A1 PROS在技术研发和创新方面所取得成就的肯定。同时,A1 PROS还被韩国工业银行选定为家族企业,获得了更多的资金支持和发展机会。

Fair Rite公司的发展小趣事

随着电子行业的快速发展,Fair Rite迅速捕捉到新的市场机遇。公司不断推出创新产品,以满足医疗、照明、汽车、通讯、航空、国防、智能能源和工业市场等领域的需求。Fair Rite通过技术创新和品质保证,赢得了客户的信赖和市场的认可。

启臣微(Chip)公司的发展小趣事

在人才方面,启臣微一直把人才作为公司发展的核心驱动力。公司建立了一套完善的人才培养机制,为员工提供广阔的职业发展空间和良好的工作环境。同时,公司还积极引进国内外优秀人才,为公司的创新发展注入了新的活力。这些优秀人才的加入,不仅提升了公司的技术水平和管理能力,也为公司的发展注入了新的动力。

Geyer Electronic E K公司的发展小趣事

在产品质量方面,启臣微始终坚持严格的标准和精细的工艺流程。公司建立了一套完善的质量管理体系,从原材料采购到产品出厂,每一个环节都经过严格把关。这种对品质的执着追求,让启臣微的产品在市场上赢得了良好的口碑,也为公司赢得了众多客户的信赖。

问答坊 | AI 解惑

转发:IC layout布局经验总结

布局前的准备: 1 查看捕捉点设置是否正确.08工艺为0.1,06工艺为0.05,05工艺为0.025. 2 Cell名称不能以数字开头.否则无法做DRACULA检查. 3 布局前考虑好出PIN的方向和位置 4 布局前分析电路,完成同一功能的MOS管画在一起 5 对两层金属走向预先 ...…

查看全部问答>

飞思卡尔的电子钟和电子琴的课程设计

飞思卡尔单片机的一个课程设计。现在分享了。…

查看全部问答>

如果单片机让某个IO口一直发信息却又悬空该引脚会怎么样?

如题,出出现什么情况?单片机烧毁?单片机不能正常工作?影响单片机的程序?对单片机及其程序没有任何影响?请高手不吝赐教!分不够再加!先谢谢了!…

查看全部问答>

帮忙看以下 这个GPIO驱动。。为什么我测不到波形了?

#include #include \"GpioDriver.h\" #include \"stdafx.h\" typedef struct _GPIO{         volatile unsigned int        PORTCFG0;                // 0 ...…

查看全部问答>

使用multi-bin(XIP)后系统变慢的问题

使用multi-bin(XIP)时发现进入桌面的时候很卡,在串口输出如下信息后要过半天才能看到桌面的部分图标,还有my device等图标要再过两秒才能显示出来。 Maximum Allowed Error 7: Explorer(V2.0) taskbar thread started. 所以看来可能是Explore ...…

查看全部问答>

鼠标放在系统托盘图标上没有提示信息(evc)

把鼠标移动到系统托盘图标上时,显示提示信息。我使用下面代码实现,可是鼠标放上去后,提示信息并没有出来。 BOOL CMKNKDlg::OnInitDialog() {         CDialog::OnInitDialog();         // Set t ...…

查看全部问答>

想在PDA上做一个串行通信的程序用来传送数据,但不知道选择什么样的PDA,急!

想在PDA上做一个串行通信的程序,用来和其他设备进行数据收发,但发现市面上大多数PDA都没有串口,不知道哪一款可以实现串行通信编程,那位大虾知道,麻烦告诉以下,谢谢了!…

查看全部问答>

RS232 9针转15针

请问如何把RS232 9针的接口转为 15针啊? 谢谢! 最好是完整的!…

查看全部问答>

高手帮忙选个型,升压驱动芯片

最近在做个设计,需要这么一款输入电压2.6-4.2V,输出恒定9V,峰值500ma的供电电源,给uc3525驱动供电。  或者12V,500ma更好了。   之前试用了tps61085 感觉驱动能力不足,3525不接负载的时候还能工作,接上负载pwm波形就很弱,导致无 ...…

查看全部问答>

问个关于UART的基础问题

想要用中断数据,FIFO的深度设置为1/8。比如我想要发送8个字符数据时,先在其他函数里面用UARTCharPut发送2个字符,引起UART_INT_RX中断,接下来应该在中断中发送剩余的6个字符还是完整的8个字符?…

查看全部问答>