历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2021年12月03日 | 基于51单片机设计N字节十六进制除法

2021-12-03 来源:eefocus

1、思路

借用十进制除法竖式计算的思路,作十六进制的除法竖式计算。


将除数3字节与被除数高3字节对齐,除完后保存当前字节的商和余数,将被除数往低顺延一个字节,再执行新一轮的除法。被除数有6字节,除数有3字节,故除法需执行4轮。这是最外层的循环。


每一轮的除法可转换为多次减法,需要注意的是,对被除数来说减法需要一直执行到最高字节,以保证借位执行无误。这是中间层的循环。


每一轮的减法由单个字节的减法循环组成,减的过程中考虑借位。由于除数只有3个字节,执行完此3次减法后,除数再往上的字节内容为00H,减法就变成了XXH-CY-00H,即纯粹的借位。


为了判断中间层循环什么时候结束,需要额外写一个子程序来比较减数与被减数的大小,这个子程序只做比较,不改变存储内容,返回后能还原寄存器的值。


2、流程图

根据上述思路绘制的流程图如下:

FlowChart

顺便一提,这里的流程图是使用SmartDraw官网(https://www.smartdraw.com/)在线编辑器绘制的,有一说一,还挺好用的,安利一下QwQ


3、源代码

这里分享一下本项目的源代码


首先需要声明的是,在本代码中被除数从高到低依次存于25H ~ 20H六个字节,除数由高到低依次存于32H ~ 30H三个字节


主程序如下:


MOV R0,#23H ;首轮除法的被除数起始字节,也是余数的存储字节

MOV R1,#30H ;除数起始字节

MOV R2,#3 ;要被减的字节数

MOV R3,#43H ;当前字节的商存储地址

MOV R4,#4 ;总共要进行的错位除法次数(最外层循环次数)

MINUS2:

CLR C

ACALL COMPARE ;比较除数与被除数大小

JC NEXTCIR ;若除数大于被除数,进入下一轮循环


MINUS1: ;化除法为减法,一次减法从当前字节循环至被除数最高字节

MOV A,@R0

SUBB A,@R1

MOV @R0,A ;存余数

INC R0

INC R1

DJNZ R2,MINUS1

CLR C

MOV R2,B

ACALL BACK ;调整R0和R1的值,便于下一轮循环

MOV A,R3

MOV R1,A

MOV A,@R1

ADDC A,#01H ;一次减法执行完等同于商加一

MOV @R1,A ;存商

MOV R1,#30H

SJMP MINUS2


NEXTCIR: ;当高3字节的减法执行至被减数小于减数,往低字节顺延一个字节,进行下一个大循环

DEC R0

INC R2

DEC R3

DJNZ R4,MINUS2

Loop:

      jmp Loop


子程序如下:


COMPARE: ;比较被减数与减数大小的子程序

;不改变存储内容

MOV B,R2 ;使用B寄存器保护R2的值

INCOMPARE: ;若减到最高位产生借位,CY=1,被减数小于减数

MOV A,@R0

SUBB A,@R1

INC R0

INC R1

DJNZ R2,INCOMPARE

MOV R2,B ;归还R2

BACK: ;将寄存器内容恢复到调用子程序之前

DEC R0

DEC R1

DJNZ R2,BACK

MOV R2,B

RET


这里需要说明一下,如果你要像我一样使用ACALL来调用子程序的话,最好设定一下主程序和子程序的代码存储地址。主程序可以使用从0030H开始的存储,即ORG 0030H,子程序的代码存储地址不能超出ACALL的调用范围,按照我的主程序代码长度,设为ORG 0100H是可以的。


当然,也可以直接使用LCALL,比较省事。


4、测试结果

我们随便选择一组数据进行测试


本次选择的测试数据如下:


;被除数赋值,从20H单元开始存储,低位数存储在低字节地址,高位数存储在高字节地址

MOV 25H,#1DH

MOV 24H,#45H

MOV 23H,#0BAH

MOV 22H,#7FH

MOV 21H,#0A0H

MOV 20H,#39H


;除数赋值,存储规则同1

MOV 32H,#1FH

MOV 31H,#58H

MOV 30H,#0ACH


即:1D 45 BA 7F A0 39 ÷ 1F 58 AC




商:EF0FE2 余数:0D4461

Proteus程序运行结果

5、一些说明

本项目的代码采用Proteus进行编写,但目前的Proteus中的51单片机编程存在一些问题,例如:无法使用PUSH与POP堆栈指令。由于不能使用堆栈,导致子程序中为了保护一部分寄存器而额外使用了额外的寄存器,使得代码逻辑复杂化。若使用伟福进行编程,可针对这部分进行优化。


推荐阅读

史海拾趣

Free2Move公司的发展小趣事

在电子行业中,Free2Move公司的发展故事虽不直接聚焦于传统电子制造或硬件设计,但其作为出行科技领域的创新者,与电子行业有着紧密的联系,尤其是在汽车电子、物联网(IoT)以及数据服务等方面。以下是五个与Free2Move公司发展相关的事实性故事:

1. 电动汽车生态系统的构建

Free2Move eSolutions,作为Stellantis和Engie EPS的合资企业,致力于电动汽车(EV)产品设计、开发、制造和分销的领先地位。它通过与全球科技企业的合作,如埃森哲,推动电动汽车接入电网,加速出行领域的全面电气化。这一举措不仅促进了电动汽车市场的增长,还带动了电动汽车充电基础设施、电池管理系统等电子相关产业的发展。(参考来源:埃森哲公司官网)

2. 远程信息处理与数据分析的集成

Free2Move与Guidepoint Systems合作,利用远程信息处理技术提升车队管理效率。Guidepoint Air数据监控服务能够接收来自符合条件的Stellantis车辆的数据,包括速度、位置、发动机状态等,为经销商、商业和政府车队提供库存管理和车队管理服务。这种数据驱动的解决方案依赖于先进的电子设备和物联网技术,实现了对车辆运营状态的实时监控和数据分析。(参考来源:百家号)

3. 商业车队解决方案的开发

Free2Move与Samsara的合作是另一个值得注意的案例。两家公司共同开发了一个集成解决方案,使Stellantis原厂远程信息处理设备的数据能够导入Samsara的互联运营云。这一合作让车队客户能够通过一个控制面板访问车辆的GPS定位、发动机工作小时数、燃料使用量和胎压等关键信息,从而提高了车队的运营效率和驾驶员的安全性。这一解决方案的成功实施,依赖于电子传感器、云计算和数据分析技术的深度融合。(参考来源:搜狐网)

4. 共享出行服务的全球扩展

Free2Move在全球范围内提供共享出行服务,包括共享汽车、停车位和充电站等。这一业务模式的成功,离不开电子支付系统、移动应用技术和物联网平台的支持。例如,在中国市场,Free2Move通过与当地合作伙伴的合作,推出了易微享共享汽车服务,为用户提供便捷的出行体验。这一过程中,电子支付、移动应用开发和物联网技术的运用,都是不可或缺的关键因素。(参考来源:雪球)

5. 医疗保健领域的跨界合作

虽然Free2Move的核心业务并非直接面向电子医疗行业,但其品牌名称“Free2Move”被另一家公司在医疗保健领域采用,推出了用于患者运动评估的技术系统。这一跨界合作展示了Free2Move品牌在不同领域的广泛影响力和创新能力。尽管这一故事并不直接涉及Free2Move公司的传统业务,但它反映了电子技术在不同行业间的渗透和融合趋势,以及品牌价值的多元化应用。(参考来源:爱迪斯通(北京)科技有限公司官网)

以上五个故事,从不同角度展示了Free2Move公司在电子行业中的发展和影响,体现了其在技术创新、数据服务、市场拓展等方面的综合实力。

E-Switch公司的发展小趣事

随着公司的发展,E-Switch不断推出新产品,以满足不同客户的需求。从最初的轻触开关,到后来的防破坏按钮、摇杆开关、滑动开关等多种类型,E-Switch的产品线逐渐丰富起来。同时,公司也积极拓展市场,将产品销往全球各地,进一步提升了品牌影响力。

屹晶微(EG)公司的发展小趣事

屹晶微的创始人黄米龙,原本在发电厂从事电气运营工作长达八年。这段经历让他对电子领域有了深入的了解和浓厚的兴趣。然而,他并没有满足于现状,而是看到了中国芯片产业的巨大潜力和发展空间。于是,在2007年,他毅然决定从发电厂辞职,利用自己的积蓄和借来的资金,在台州创立了屹晶微电子有限公司。

在创立初期,屹晶微面临着资金短缺、技术落后和市场竞争激烈的困境。但黄米龙凭借对电子行业的深刻理解和坚定的信念,带领团队克服了种种困难。他们不断引进先进技术和设备,加强研发力量,提升产品质量。经过几年的努力,屹晶微逐渐在芯片设计领域崭露头角,并成功推出了多款具有自主知识产权的芯片产品。

FerriShield公司的发展小趣事

在国内市场取得一定成绩后,FerriShield开始将目光投向国际市场。公司积极参加国际电子展,展示其先进的技术和产品。同时,FerriShield还与国际知名电子品牌建立了合作关系,为其提供定制化的电磁屏蔽解决方案。通过这些努力,FerriShield的产品逐渐打入国际市场,并赢得了良好的口碑。

骅讯(Cmedia)公司的发展小趣事

进入21世纪后,随着USB技术的普及,骅讯公司迅速抓住市场机遇,进军USB音频业务。凭借其在音频技术领域的深厚积累,骅讯成功开发出多款USB音频产品,并在市场上取得了良好的反响。这一举措不仅拓展了骅讯的业务范围,也为其在音频领域的持续发展奠定了坚实的基础。

Altitude Technology公司的发展小趣事

随着公司的不断发展,Altitude Technology逐渐在电子行业中崭露头角。然而,市场竞争也日趋激烈,为了保持领先地位,公司决定加大研发投入,致力于技术突破。经过长时间的研发,Altitude Technology成功推出了一款采用最新芯片技术的智能手机,这款手机在性能、功耗和拍照效果等方面均达到了行业领先水平,为公司赢得了更多的市场份额。

问答坊 | AI 解惑

穷移动通信之理

这是以前在其他地方下的,这个相当不错的,绝对值得一看看,讲的很好的…

查看全部问答>

这年头安防工程商不好过呀

由于早期的安防工程项目进入技术的门槛比较低,大部分工程人员只要经过短期培训,懂得接插线就可以胜任安防工程的安装、调试工作,而技术服务则依托供应厂家的技术培训或现场服务来解决。安防工程商的核心竞争力还是着力于“人脉关系”的经营,而维 ...…

查看全部问答>

知道这里达人多,过来请教~~~~~~

我是学软件的,现在是大二。现在想往嵌入式偏软件方面学习。查了许多资料好像应该是往Linux+arm9方面学习。不知道对不对。 下学期本院有操作系统、微机原理与接口技术、软件工程概论、数据库原理与实践。  别的院有个叫《接口技术与单片 ...…

查看全部问答>

第一次提问,关于USB驱动

诸位,第一次来,想问大家个问题,USB设备使用In(1)  Out(2),那么PC主机驱动要与USB设备通讯时,也必须使用In(1)  Out(2)吗?…

查看全部问答>

关于GUI的移植问题for vxworks and wince

想做个VxWorks下的gui程序,尽管windml可以,但是操作太困难,想找个通用的库? 因为以前程序是wince写的,想在这个vxworks成功之后在改写wince版本的,所以希望gui库可以移植到wince下 高手給推荐下吧。…

查看全部问答>

PCI所需资源是怎样申请的?

我现在只知道内存,IO是通过BAR寄存器申请所需资源的 那么中断和DMA又是怎样让系统知道, 所需的资源呢? 是通过inf文件吗?…

查看全部问答>

quartusII Programmable Pre-Emphasis 设置

Programmable Pre-Emphasis 设置芯片: ep3c5 想要把lvds接口上的Programmable Pre-Emphasis关掉,可是在assignment editor->logic option->io feature下面找不到这个选项。  请教大家,Programmable Pre-Emphasis在哪里可以设置? ...…

查看全部问答>

初学者请教STM32的几个问题,望好汉们不吝赐教!!

1、ST例程NVIC/Example2中,用TIM2、TIM3、TIM4分别实现1S、2S、3S的定时 周期,采用的ARR值分别为4AFH,95FH,E0FH,预分频数都是EA5FH,更新时产生中断。照我的算法,定时周期是4AFH/(36MHZ/EA5FH)=2S,TIM3,TIM4分别是3S和4S,哪里算错了 ...…

查看全部问答>

上海礼欧舞台工程有限公司现诚聘LED技术人员!

上海礼欧舞台工程有限公司现诚聘LED技术人员数名,具体要求如下:1、负责公司项目技术方案的实施,根据活动需求(对项目指定的技术负责人员,制作活动系统图);对项目实施从接受任务开始到活动结束设备回库全过程进行跟踪负责; 2、完成培训课 ...…

查看全部问答>

免烧砖机液压系统故障排除方法

免烧砖机液压系统故障排除方法 免烧砖机液压系统故障一般分为几种: 1.免烧砖机压力调不上 排除方法:进油管漏油或溢流阀卡死,有干净的柴油清洗就好了。 2.看油量是否达到油标数,并定期更换液压油。 3.免烧砖机油泵噪音大与气候和有的粘稠度 ...…

查看全部问答>